
This patch fixes a problem introduced with patch eb5eb2b0 [ppc4xx: Cleanup PPC4xx I2C infrastructure]. We need to assign the I2C base address to the "i2c" pointer inside of the controller loop. Otherwise controller 0 is initialized multiple times instead of initializing each I2C controller sequentially.
Tested on Katmai.
Signed-off-by: Stefan Roese sr@denx.de Cc: Heiko Schocher hs@denx.de --- Heiko, I just noticed that this PPC4xx I2C driver is still in the cpu/ppc4xx directory. I suggest that we move it into drivers/i2c after the next release. Is this ok for you? I can provide a patch for this soon.
Please let me know if you see any problems with this patch. I would really like to push it into this release, since it really is a bug fix.
Thanks.
cpu/ppc4xx/i2c.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/cpu/ppc4xx/i2c.c b/cpu/ppc4xx/i2c.c index 7976e75..9b86187 100644 --- a/cpu/ppc4xx/i2c.c +++ b/cpu/ppc4xx/i2c.c @@ -93,7 +93,7 @@ static void _i2c_bus_reset(void)
void i2c_init(int speed, int slaveaddr) { - struct ppc4xx_i2c *i2c = (struct ppc4xx_i2c *)I2C_BASE_ADDR; + struct ppc4xx_i2c *i2c; int val, divisor; int bus;
@@ -109,6 +109,9 @@ void i2c_init(int speed, int slaveaddr) for (bus = 0; bus < CONFIG_SYS_MAX_I2C_BUS; bus++) { I2C_SET_BUS(bus);
+ /* Set i2c pointer after calling I2C_SET_BUS() */ + i2c = (struct ppc4xx_i2c *)I2C_BASE_ADDR; + /* Handle possible failed I2C state */ /* FIXME: put this into i2c_init_board()? */ _i2c_bus_reset();