|
@@ -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;
|
|
|
}
|