I2C: mv_i2c: fix multi-bus init issue
authorLei Wen <leiwen@marvell.com>
Fri, 30 Sep 2011 05:44:12 +0000 (05:44 +0000)
committerHeiko Schocher <hs@denx.de>
Mon, 3 Oct 2011 09:50:09 +0000 (11:50 +0200)
When enable the multi-bus, the current_bus is not inited in the original
implementation, which make the i2c operation unpredicatable.

Signed-off-by: Lei Wen <leiwen@marvell.com>
drivers/i2c/mv_i2c.c

index 8eb30e7..b93922b 100644 (file)
@@ -67,6 +67,27 @@ struct mv_i2c {
 };
 
 static struct mv_i2c *base;
+static void i2c_board_init(struct mv_i2c *base)
+{
+#ifdef CONFIG_SYS_I2C_INIT_BOARD
+       u32 icr;
+       /*
+        * call board specific i2c bus reset routine before accessing the
+        * environment, which might be in a chip on that bus. For details
+        * about this problem see doc/I2C_Edge_Conditions.
+        *
+        * disable I2C controller first, otherwhise it thinks we want to
+        * talk to the slave port...
+        */
+       icr = readl(&base->icr);
+       writel(readl(&base->icr) & ~(ICR_SCLE | ICR_IUE), &base->icr);
+
+       i2c_init_board();
+
+       writel(icr, &base->icr);
+#endif
+}
+
 #ifdef CONFIG_I2C_MULTI_BUS
 static u32 i2c_regs[CONFIG_MV_I2C_NUM] = CONFIG_MV_I2C_REG;
 static unsigned int bus_initialized[CONFIG_MV_I2C_NUM];
@@ -83,7 +104,7 @@ int i2c_set_bus_num(unsigned int bus)
        current_bus = bus;
 
        if (!bus_initialized[current_bus]) {
-               i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
+               i2c_board_init(base);
                bus_initialized[current_bus] = 1;
        }
 
@@ -264,28 +285,13 @@ i2c_transfer_finish:
 void i2c_init(int speed, int slaveaddr)
 {
 #ifdef CONFIG_I2C_MULTI_BUS
+       current_bus = 0;
        base = (struct mv_i2c *)i2c_regs[current_bus];
 #else
        base = (struct mv_i2c *)CONFIG_MV_I2C_REG;
 #endif
 
-#ifdef CONFIG_SYS_I2C_INIT_BOARD
-       u32 icr;
-       /*
-        * call board specific i2c bus reset routine before accessing the
-        * environment, which might be in a chip on that bus. For details
-        * about this problem see doc/I2C_Edge_Conditions.
-        *
-        * disable I2C controller first, otherwhise it thinks we want to
-        * talk to the slave port...
-        */
-       icr = readl(&base->icr);
-       writel(readl(&base->icr) & ~(ICR_SCLE | ICR_IUE), &base->icr);
-
-       i2c_init_board();
-
-       writel(icr, &base->icr);
-#endif
+       i2c_board_init(base);
 }
 
 /*