designware_i2c.c: Added the support for MULTI_BUS
authorArmando Visconti <armando.visconti@st.com>
Thu, 6 Dec 2012 00:04:15 +0000 (00:04 +0000)
committerTom Rini <trini@ti.com>
Tue, 11 Dec 2012 20:17:31 +0000 (13:17 -0700)
This patch adds the capability to switch between 10
different I2C busses (from 0 to 9).

Signed-off-by: Armando Visconti <armando.visconti@st.com>
drivers/i2c/designware_i2c.c

index bf64a2a643ab2871c053188d7f3f8dd061aaeb58..4e4bfd4f57d952eb93f6f664db6833b58a046517 100644 (file)
 #include <asm/arch/hardware.h>
 #include "designware_i2c.h"
 
-static struct i2c_regs *const i2c_regs_p =
+#ifdef CONFIG_I2C_MULTI_BUS
+static unsigned int bus_initialized[CONFIG_SYS_I2C_BUS_MAX];
+static unsigned int current_bus = 0;
+#endif
+
+static struct i2c_regs *i2c_regs_p =
     (struct i2c_regs *)CONFIG_SYS_I2C_BASE;
 
 /*
@@ -150,6 +155,10 @@ void i2c_init(int speed, int slaveadd)
        enbl = readl(&i2c_regs_p->ic_enable);
        enbl |= IC_ENABLE_0B;
        writel(enbl, &i2c_regs_p->ic_enable);
+
+#ifdef CONFIG_I2C_MULTI_BUS
+       bus_initialized[current_bus] = 1;
+#endif
 }
 
 /*
@@ -344,3 +353,74 @@ int i2c_probe(uchar chip)
 
        return ret;
 }
+
+#ifdef CONFIG_I2C_MULTI_BUS
+int i2c_set_bus_num(unsigned int bus)
+{
+       switch (bus) {
+       case 0:
+               i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE;
+               break;
+#ifdef CONFIG_SYS_I2C_BASE1
+       case 1:
+               i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE1;
+               break;
+#endif
+#ifdef CONFIG_SYS_I2C_BASE2
+       case 2:
+               i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE2;
+               break;
+#endif
+#ifdef CONFIG_SYS_I2C_BASE3
+       case 3:
+               i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE3;
+               break;
+#endif
+#ifdef CONFIG_SYS_I2C_BASE4
+       case 4:
+               i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE4;
+               break;
+#endif
+#ifdef CONFIG_SYS_I2C_BASE5
+       case 5:
+               i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE5;
+               break;
+#endif
+#ifdef CONFIG_SYS_I2C_BASE6
+       case 6:
+               i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE6;
+               break;
+#endif
+#ifdef CONFIG_SYS_I2C_BASE7
+       case 7:
+               i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE7;
+               break;
+#endif
+#ifdef CONFIG_SYS_I2C_BASE8
+       case 8:
+               i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE8;
+               break;
+#endif
+#ifdef CONFIG_SYS_I2C_BASE9
+       case 9:
+               i2c_regs_p = (void *)CONFIG_SYS_I2C_BASE9;
+               break;
+#endif
+       default:
+               printf("Bad bus: %d\n", bus);
+               return -1;
+       }
+
+       current_bus = bus;
+
+       if (!bus_initialized[current_bus])
+               i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
+
+       return 0;
+}
+
+int i2c_get_bus_num(void)
+{
+       return current_bus;
+}
+#endif