[U-Boot] [PATCH] driver: i2c:s3c24x0: init each channel during probe

Naveen Krishna Chatradhi ch.naveen at samsung.com
Fri Nov 22 09:48:41 CET 2013


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 at 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;
 	}
 }
 
-- 
1.7.10.4



More information about the U-Boot mailing list