]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/i2c/designware_i2c.c
designware_i2c.c: Added the support for MULTI_BUS
[karo-tx-uboot.git] / 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