]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/i2c/s3c24x0_i2c.c
exynos: i2c: Change FDT bus setup code to enumerate ports correctly
[karo-tx-uboot.git] / drivers / i2c / s3c24x0_i2c.c
index c65360d0ffce51b5447cf51d0a3b0eb9722c133a..0e6f2414f0c96d61dcea283134a247ebb030bfe1 100644 (file)
@@ -52,7 +52,6 @@
  */
 static unsigned int g_current_bus __attribute__((section(".data")));
 #ifdef CONFIG_OF_CONTROL
-static int i2c_busses __attribute__((section(".data")));
 static struct s3c24x0_i2c_bus i2c_bus[CONFIG_MAX_I2C_NUM]
                        __attribute__((section(".data")));
 #endif
@@ -164,8 +163,8 @@ int i2c_set_bus_num(unsigned int bus)
 {
        struct s3c24x0_i2c *i2c;
 
-       if ((bus < 0) || (bus >= CONFIG_MAX_I2C_NUM)) {
-               debug("Bad bus: %d\n", bus);
+       i2c_bus = get_bus(bus);
+       if (!i2c_bus)
                return -1;
        }
 
@@ -483,19 +482,31 @@ void board_i2c_init(const void *blob)
                if (node <= 0)
                        continue;
                bus = &i2c_bus[i];
+               bus->active = true;
                bus->regs = (struct s3c24x0_i2c *)
                        fdtdec_get_addr(blob, node, "reg");
                bus->id = pinmux_decode_periph_id(blob, node);
                bus->node = node;
-               bus->bus_num = i2c_busses++;
+               bus->bus_num = i;
                exynos_pinmux_config(bus->id, 0);
        }
 }
 
+/**
+ * Get a pointer to the given bus index
+ *
+ * @bus_idx: Bus index to look up
+ * @return pointer to bus, or NULL if invalid or not available
+ */
 static struct s3c24x0_i2c_bus *get_bus(unsigned int bus_idx)
 {
-       if (bus_idx < i2c_busses)
-               return &i2c_bus[bus_idx];
+       if (bus_idx < ARRAY_SIZE(i2c_bus)) {
+               struct s3c24x0_i2c_bus *bus;
+
+               bus = &i2c_bus[bus_idx];
+               if (bus->active)
+                       return bus;
+       }
 
        debug("Undefined bus: %d\n", bus_idx);
        return NULL;
@@ -505,7 +516,7 @@ int i2c_get_bus_num_fdt(int node)
 {
        int i;
 
-       for (i = 0; i < i2c_busses; i++) {
+       for (i = 0; i < ARRAY_SIZE(i2c_bus); i++) {
                if (node == i2c_bus[i].node)
                        return i;
        }