From 0091337932130ebe9c0a64ac7ef922e9100353be Mon Sep 17 00:00:00 2001 From: Heiko Schocher Date: Wed, 10 Nov 2010 08:57:55 +0100 Subject: [PATCH 1/2] i2c, mpc5xxx: add multibus support Tested on upcoming hydra (mpc5200 based) board. Signed-off-by: Heiko Schocher --- arch/powerpc/cpu/mpc5xxx/i2c.c | 43 ++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/arch/powerpc/cpu/mpc5xxx/i2c.c b/arch/powerpc/cpu/mpc5xxx/i2c.c index 4f7f716328..9fb330f82f 100644 --- a/arch/powerpc/cpu/mpc5xxx/i2c.c +++ b/arch/powerpc/cpu/mpc5xxx/i2c.c @@ -30,6 +30,7 @@ DECLARE_GLOBAL_DATA_PTR; #include #include +#if !defined(CONFIG_I2C_MULTI_BUS) #if (CONFIG_SYS_I2C_MODULE == 2) #define I2C_BASE MPC5XXX_I2C2 #elif (CONFIG_SYS_I2C_MODULE == 1) @@ -37,6 +38,19 @@ DECLARE_GLOBAL_DATA_PTR; #else #error CONFIG_SYS_I2C_MODULE is not properly configured #endif +#else +static unsigned int i2c_bus_num __attribute__ ((section (".data"))) = + CONFIG_SYS_SPD_BUS_NUM; +static unsigned int i2c_bus_speed[2] = {CONFIG_SYS_I2C_SPEED, + CONFIG_SYS_I2C_SPEED}; + +static const unsigned long i2c_dev[2] = { + MPC5XXX_I2C1, + MPC5XXX_I2C2, +}; + +#define I2C_BASE ((struct mpc5xxx_i2c *)i2c_dev[i2c_bus_num]) +#endif #define I2C_TIMEOUT 6667 #define I2C_RETRIES 3 @@ -439,4 +453,33 @@ Done: return ret; } +#if defined(CONFIG_I2C_MULTI_BUS) +int i2c_set_bus_num(unsigned int bus) +{ + if (bus > 1) + return -1; + + i2c_bus_num = bus; + i2c_init(i2c_bus_speed[bus], CONFIG_SYS_I2C_SLAVE); + return 0; +} + +int i2c_set_bus_speed(unsigned int speed) +{ + i2c_init(speed, CONFIG_SYS_I2C_SLAVE); + return 0; +} + +unsigned int i2c_get_bus_num(void) +{ + return i2c_bus_num; +} + +unsigned int i2c_get_bus_speed(void) +{ + return i2c_bus_speed[i2c_bus_num]; +} +#endif + + #endif /* CONFIG_HARD_I2C */ From 9b107e6138e719ea5a0b924862a9b109c020c7ac Mon Sep 17 00:00:00 2001 From: Heiko Schocher Date: Mon, 15 Nov 2010 08:20:39 +0100 Subject: [PATCH 2/2] post, i2c: add missing curly bracket in i2c_post_test If CONFIG_SYS_POST_I2C_ADDRS is not defined and CONFIG_SYS_POST_I2C is activated, i2c_probe() is not called in the for statement, because missing curly bracket. Signed-off-by: Heiko Schocher --- post/drivers/i2c.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/post/drivers/i2c.c b/post/drivers/i2c.c index 4a1b1a49d1..4cbd9f3703 100644 --- a/post/drivers/i2c.c +++ b/post/drivers/i2c.c @@ -63,11 +63,12 @@ int i2c_post_test (int flags) unsigned int i; #ifndef CONFIG_SYS_POST_I2C_ADDRS /* Start at address 1, address 0 is the general call address */ - for (i = 1; i < 128; i++) + for (i = 1; i < 128; i++) { if (i2c_ignore_device(i)) continue; if (i2c_probe (i) == 0) return 0; + } /* No devices found */ return -1;