diff options
author | Yen Lin <yelin@nvidia.com> | 2015-04-03 16:32:26 -0700 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2015-04-22 08:58:59 +0200 |
commit | cb6bb3bc47bf55e47bdc60c53c5f40617c6a8d9b (patch) | |
tree | 6160182ad050be20305b077850aa88ce55a7113e | |
parent | e1977482638f71904cecb5b251ee687107acdce4 (diff) | |
download | coreboot-cb6bb3bc47bf55e47bdc60c53c5f40617c6a8d9b.tar.xz |
nvidia/tegra*: check bus number for i2c driver APIs
BRANCH=None
BUG=None
TEST=emerge-foster coreboot
Change-Id: I383d2b5f269ed348065a9f270f80514a2ff45742
Signed-off-by: Patrick Georgi <pgeorgi@chromium.org>
Original-Commit-Id: fba6973c304e1612a9869c2e78a08650b6e5fe66
Original-Change-Id: I6d5d0098db8dbfb21529bf112a04b97779a0f381
Original-Signed-off-by: Yen Lin <yelin@nvidia.com>
Original-Reviewed-on: https://chromium-review.googlesource.com/264027
Original-Reviewed-by: Furquan Shaikh <furquan@chromium.org>
Reviewed-on: http://review.coreboot.org/9913
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
-rw-r--r-- | src/soc/nvidia/tegra/i2c.c | 18 | ||||
-rw-r--r-- | src/soc/nvidia/tegra/i2c.h | 2 | ||||
-rw-r--r-- | src/soc/nvidia/tegra124/i2c.c | 2 | ||||
-rw-r--r-- | src/soc/nvidia/tegra132/i2c.c | 2 |
4 files changed, 22 insertions, 2 deletions
diff --git a/src/soc/nvidia/tegra/i2c.c b/src/soc/nvidia/tegra/i2c.c index 1d5df3c342..2ba1700730 100644 --- a/src/soc/nvidia/tegra/i2c.c +++ b/src/soc/nvidia/tegra/i2c.c @@ -194,8 +194,14 @@ static int i2c_transfer_segment(unsigned bus, unsigned chip, int restart, int platform_i2c_transfer(unsigned bus, struct i2c_seg *segments, int count) { struct i2c_seg *seg = segments; - int i; + + if (bus >= g_num_i2c_buses) { + printk(BIOS_ERR, "%s: ERROR: invalid I2C bus (%u)\n", __func__, + bus); + return -1; + } + for (i = 0; i < count; seg++, i++) { if (i2c_transfer_segment(bus, seg->chip, i < count - 1, seg->read, seg->buf, seg->len)) @@ -206,7 +212,15 @@ int platform_i2c_transfer(unsigned bus, struct i2c_seg *segments, int count) void i2c_init(unsigned bus) { - struct tegra_i2c_regs * const regs = tegra_i2c_info[bus].base; + struct tegra_i2c_regs *regs; + + if (bus >= g_num_i2c_buses) { + printk(BIOS_ERR, "%s: ERROR: invalid I2C bus (%u)\n", __func__, + bus); + return; + } + + regs = tegra_i2c_info[bus].base; write32(®s->cnfg, I2C_CNFG_PACKET_MODE_EN); } diff --git a/src/soc/nvidia/tegra/i2c.h b/src/soc/nvidia/tegra/i2c.h index 9d7de14a1e..e81fd1c3e8 100644 --- a/src/soc/nvidia/tegra/i2c.h +++ b/src/soc/nvidia/tegra/i2c.h @@ -172,4 +172,6 @@ struct tegra_i2c_regs { }; check_member(tegra_i2c_regs, config_load, 0x8C); +extern unsigned g_num_i2c_buses; + #endif /* __SOC_NVIDIA_TEGRA_I2C_H__ */ diff --git a/src/soc/nvidia/tegra124/i2c.c b/src/soc/nvidia/tegra124/i2c.c index a7eee686b0..824862b27d 100644 --- a/src/soc/nvidia/tegra124/i2c.c +++ b/src/soc/nvidia/tegra124/i2c.c @@ -53,3 +53,5 @@ struct tegra_i2c_bus_info tegra_i2c_info[] = { .reset_func = &clock_reset_x } }; + +unsigned g_num_i2c_buses = ARRAY_SIZE(tegra_i2c_info); diff --git a/src/soc/nvidia/tegra132/i2c.c b/src/soc/nvidia/tegra132/i2c.c index dc85806967..b0ab31a563 100644 --- a/src/soc/nvidia/tegra132/i2c.c +++ b/src/soc/nvidia/tegra132/i2c.c @@ -53,3 +53,5 @@ struct tegra_i2c_bus_info tegra_i2c_info[] = { .reset_func = &clock_reset_x } }; + +unsigned g_num_i2c_buses = ARRAY_SIZE(tegra_i2c_info); |