diff options
| author | Armando Visconti <armando.visconti@st.com> | 2012-12-06 00:04:15 +0000 | 
|---|---|---|
| committer | Tom Rini <trini@ti.com> | 2012-12-11 13:17:31 -0700 | 
| commit | ac6e2fe6e4afe54a9c7ef0d93827a86e264814f2 (patch) | |
| tree | c5fa3f06752067c8d079c97573c72c111ce7ef3a /drivers/i2c/designware_i2c.c | |
| parent | c86d9ed3820bbd89e264261fb022bdf9448bfde7 (diff) | |
| download | olio-uboot-2014.01-ac6e2fe6e4afe54a9c7ef0d93827a86e264814f2.tar.xz olio-uboot-2014.01-ac6e2fe6e4afe54a9c7ef0d93827a86e264814f2.zip | |
designware_i2c.c: Added the support for MULTI_BUS
This patch adds the capability to switch between 10
different I2C busses (from 0 to 9).
Signed-off-by: Armando Visconti <armando.visconti@st.com>
Diffstat (limited to 'drivers/i2c/designware_i2c.c')
| -rw-r--r-- | drivers/i2c/designware_i2c.c | 82 | 
1 files changed, 81 insertions, 1 deletions
| diff --git a/drivers/i2c/designware_i2c.c b/drivers/i2c/designware_i2c.c index bf64a2a64..4e4bfd4f5 100644 --- a/drivers/i2c/designware_i2c.c +++ b/drivers/i2c/designware_i2c.c @@ -26,7 +26,12 @@  #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 |