*/
 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
 {
        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;
        }
 
                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;
 {
        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;
        }