net: Move CDP out of net.c
[oweals/u-boot.git] / drivers / i2c / mv_i2c.c
index 7ea66d4819fc841e7e2fd64b8049b592260f3134..b93922bdb21f65f0b927d209389e1c114f594e92 100644 (file)
@@ -66,7 +66,56 @@ struct mv_i2c {
        u32 isar;
 };
 
-static struct mv_i2c *base = (struct mv_i2c *)CONFIG_MV_I2C_REG;
+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];
+static unsigned int current_bus;
+
+int i2c_set_bus_num(unsigned int bus)
+{
+       if ((bus < 0) || (bus >= CONFIG_MV_I2C_NUM)) {
+               printf("Bad bus: %d\n", bus);
+               return -1;
+       }
+
+       base = (struct mv_i2c *)i2c_regs[bus];
+       current_bus = bus;
+
+       if (!bus_initialized[current_bus]) {
+               i2c_board_init(base);
+               bus_initialized[current_bus] = 1;
+       }
+
+       return 0;
+}
+
+unsigned int i2c_get_bus_num(void)
+{
+       return current_bus;
+}
+#endif
 
 /*
  * i2c_reset: - reset the host controller
@@ -225,7 +274,7 @@ transfer_error_bus_busy:
                ret = -6; goto i2c_transfer_finish;
 
 i2c_transfer_finish:
-               PRINTD(("i2c_transfer: ISR: 0x%04x\n", ISR));
+               PRINTD(("i2c_transfer: ISR: 0x%04x\n", readl(&base->isr)));
                i2c_reset();
                return ret;
 }
@@ -235,23 +284,14 @@ i2c_transfer_finish:
 /* ------------------------------------------------------------------------ */
 void i2c_init(int speed, int slaveaddr)
 {
-#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);
+#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
+
+       i2c_board_init(base);
 }
 
 /*