diff options
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/s3c24x0_i2c.c | 25 | ||||
| -rw-r--r-- | drivers/i2c/s3c24x0_i2c.h | 1 | 
2 files changed, 19 insertions, 7 deletions
| diff --git a/drivers/i2c/s3c24x0_i2c.c b/drivers/i2c/s3c24x0_i2c.c index c65360d0f..0e6f2414f 100644 --- a/drivers/i2c/s3c24x0_i2c.c +++ b/drivers/i2c/s3c24x0_i2c.c @@ -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;  	} diff --git a/drivers/i2c/s3c24x0_i2c.h b/drivers/i2c/s3c24x0_i2c.h index b4a337a57..882af6206 100644 --- a/drivers/i2c/s3c24x0_i2c.h +++ b/drivers/i2c/s3c24x0_i2c.h @@ -16,6 +16,7 @@ struct s3c24x0_i2c {  };  struct s3c24x0_i2c_bus { +	bool active;	/* port is active and available */  	int node;	/* device tree node */  	int bus_num;	/* i2c bus number */  	struct s3c24x0_i2c *regs; |