
Each I2C channel must be inited during the probe and then set "active" instead of initing the channel for every time we select the bus using "i2c dev bus"
Signed-off-by: Naveen Krishna Chatradhi ch.naveen@samsung.com --- drivers/i2c/s3c24x0_i2c.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-)
diff --git a/drivers/i2c/s3c24x0_i2c.c b/drivers/i2c/s3c24x0_i2c.c index f77a9d1..7136771 100644 --- a/drivers/i2c/s3c24x0_i2c.c +++ b/drivers/i2c/s3c24x0_i2c.c @@ -408,22 +408,7 @@ static void exynos5_i2c_reset(struct s3c24x0_i2c_bus *i2c_bus) #ifdef CONFIG_I2C_MULTI_BUS int i2c_set_bus_num(unsigned int bus) { - struct s3c24x0_i2c_bus *i2c_bus; - - i2c_bus = get_bus(bus); - if (!i2c_bus) - return -1; g_current_bus = bus; - - if (i2c_bus->is_highspeed) { - if (hsi2c_get_clk_details(i2c_bus)) - return -1; - hsi2c_ch_init(i2c_bus); - } else { - i2c_ch_init(i2c_bus->regs, i2c_bus->clock_frequency, - CONFIG_SYS_I2C_SLAVE); - } - return 0; }
@@ -989,7 +974,6 @@ static void process_nodes(const void *blob, int node_list[], int count, continue;
bus = &i2c_bus[i]; - bus->active = true; bus->is_highspeed = is_highspeed;
if (is_highspeed) @@ -1009,6 +993,19 @@ static void process_nodes(const void *blob, int node_list[], int count,
/* Mark position as used */ node_list[i] = -1; + + if (bus->is_highspeed) { + if (hsi2c_get_clk_details(bus)) { + bus->active = false; + break; + } + hsi2c_ch_init(bus); + exynos5_i2c_reset(bus); + } else { + i2c_ch_init(bus->regs, bus->clock_frequency, + CONFIG_SYS_I2C_SLAVE); + } + bus->active = true; } }