Skip to contentSkip to conversation

i2c: designware_i2c: Add ic_enable_status to ic_regs struct

PATCH Superseded Stefan Roese 4 participants 16 messages Mar 23, 2016 – Apr 13, 2016 I2C

v2 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/6 i2c: designware_i2c: Add ic_enable_status to ic_regs struct

Add the ic_enable_status register to the i2c_regs struct. Additionally the register offsets are added, to better check, if the offset matches the register description in the datasheet.

Cc Simon Glass <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Heiko Schocher <[email protected]>

---
v2:
- Fix typo in commit text
- Added Reviewed-by from Bin

 drivers/i2c/designware_i2c.h | 68 +++++++++++++++++++++++---------------------
 1 file changed, 35 insertions(+), 33 deletions(-)
drivers/i2c/designware_i2c.h +35 -33
index 19b09df..270c29c 100644
@@ -9,39 +9,41 @@
 #define __DW_I2C_H_
 
 struct i2c_regs {
-	u32 ic_con;
-	u32 ic_tar;
-	u32 ic_sar;
-	u32 ic_hs_maddr;
-	u32 ic_cmd_data;
-	u32 ic_ss_scl_hcnt;
-	u32 ic_ss_scl_lcnt;
-	u32 ic_fs_scl_hcnt;
-	u32 ic_fs_scl_lcnt;
-	u32 ic_hs_scl_hcnt;
-	u32 ic_hs_scl_lcnt;
-	u32 ic_intr_stat;
-	u32 ic_intr_mask;
-	u32 ic_raw_intr_stat;
-	u32 ic_rx_tl;
-	u32 ic_tx_tl;
-	u32 ic_clr_intr;
-	u32 ic_clr_rx_under;
-	u32 ic_clr_rx_over;
-	u32 ic_clr_tx_over;
-	u32 ic_clr_rd_req;
-	u32 ic_clr_tx_abrt;
-	u32 ic_clr_rx_done;
-	u32 ic_clr_activity;
-	u32 ic_clr_stop_det;
-	u32 ic_clr_start_det;
-	u32 ic_clr_gen_call;
-	u32 ic_enable;
-	u32 ic_status;
-	u32 ic_txflr;
-	u32 ix_rxflr;
-	u32 reserved_1;
-	u32 ic_tx_abrt_source;
+	u32 ic_con;		/* 0x00 */
+	u32 ic_tar;		/* 0x04 */
+	u32 ic_sar;		/* 0x08 */
+	u32 ic_hs_maddr;	/* 0x0c */
+	u32 ic_cmd_data;	/* 0x10 */
+	u32 ic_ss_scl_hcnt;	/* 0x14 */
+	u32 ic_ss_scl_lcnt;	/* 0x18 */
+	u32 ic_fs_scl_hcnt;	/* 0x1c */
+	u32 ic_fs_scl_lcnt;	/* 0x20 */
+	u32 ic_hs_scl_hcnt;	/* 0x24 */
+	u32 ic_hs_scl_lcnt;	/* 0x28 */
+	u32 ic_intr_stat;	/* 0x2c */
+	u32 ic_intr_mask;	/* 0x30 */
+	u32 ic_raw_intr_stat;	/* 0x34 */
+	u32 ic_rx_tl;		/* 0x38 */
+	u32 ic_tx_tl;		/* 0x3c */
+	u32 ic_clr_intr;	/* 0x40 */
+	u32 ic_clr_rx_under;	/* 0x44 */
+	u32 ic_clr_rx_over;	/* 0x48 */
+	u32 ic_clr_tx_over;	/* 0x4c */
+	u32 ic_clr_rd_req;	/* 0x50 */
+	u32 ic_clr_tx_abrt;	/* 0x54 */
+	u32 ic_clr_rx_done;	/* 0x58 */
+	u32 ic_clr_activity;	/* 0x5c */
+	u32 ic_clr_stop_det;	/* 0x60 */
+	u32 ic_clr_start_det;	/* 0x64 */
+	u32 ic_clr_gen_call;	/* 0x68 */
+	u32 ic_enable;		/* 0x6c */
+	u32 ic_status;		/* 0x70 */
+	u32 ic_txflr;		/* 0x74 */
+	u32 ic_rxflr;		/* 0x78 */
+	u32 ic_sda_hold;	/* 0x7c */
+	u32 ic_tx_abrt_source;	/* 0x80 */
+	u8 res1[0x18];		/* 0x84 */
+	u32 ic_enable_status;	/* 0x9c */
 };
 
 #if !defined(IC_CLK)
Signature · 1 line
2.7.4
#1 lore raw

PATCH v2 2/6 i2c: designware_i2c: Add dw_i2c_enable() helper function

dw_i2c_enable() is used to dis-/en-able the I2C controller. It makes sense to add such a function, as the controller is dis-/en-abled multiple times in the code. Additionally, this function now checks, if the controller is really dis-/en-abled. This code is copied from the Linux I2C driver version.

Cc Simon Glass <[email protected]>
Cc Bin Meng <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Heiko Schocher <[email protected]>

---
v2:
- Use true / false for binary values as suggested by Bin

 drivers/i2c/designware_i2c.c | 46 +++++++++++++++++++++++++-------------------
 1 file changed, 26 insertions(+), 20 deletions(-)
drivers/i2c/designware_i2c.c +26 -20
index e768cde..2b0c8cb 100644
@@ -34,6 +34,26 @@ static struct i2c_regs *i2c_get_base(struct i2c_adapter *adap)
 	return NULL;
 }
 
+static void dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
+{
+	int timeout = 100;
+
+	do {
+		writel(enable, &i2c_base->ic_enable);
+		if ((readl(&i2c_base->ic_enable_status) & 1) == enable)
+			return;
+
+		/*
+		 * Wait 10 times the signaling period of the highest I2C
+		 * transfer supported by the driver (for 400KHz this is
+		 * 25us) as described in the DesignWare I2C databook.
+		 */
+		udelay(25);
+	} while (timeout--);
+
+	printf("timeout in %sabling I2C adapter\n", enable ? "en" : "dis");
+}
+
 /*
  * set_speed - Set the i2c speed mode (standard, high, fast)
  * @i2c_spd:	required i2c speed mode
@@ -45,12 +65,9 @@ static void set_speed(struct i2c_adapter *adap, int i2c_spd)
 	struct i2c_regs *i2c_base = i2c_get_base(adap);
 	unsigned int cntl;
 	unsigned int hcnt, lcnt;
-	unsigned int enbl;
 
 	/* to set speed cltr must be disabled */
-	enbl = readl(&i2c_base->ic_enable);
-	enbl &= ~IC_ENABLE_0B;
-	writel(enbl, &i2c_base->ic_enable);
+	dw_i2c_enable(i2c_base, false);
 
 	cntl = (readl(&i2c_base->ic_con) & (~IC_CON_SPD_MSK));
 
@@ -84,8 +101,7 @@ static void set_speed(struct i2c_adapter *adap, int i2c_spd)
 	writel(cntl, &i2c_base->ic_con);
 
 	/* Enable back i2c now speed set */
-	enbl |= IC_ENABLE_0B;
-	writel(enbl, &i2c_base->ic_enable);
+	dw_i2c_enable(i2c_base, true);
 }
 
 /*
@@ -123,12 +139,9 @@ static void dw_i2c_init(struct i2c_adapter *adap, int speed,
 			int slaveaddr)
 {
 	struct i2c_regs *i2c_base = i2c_get_base(adap);
-	unsigned int enbl;
 
 	/* Disable i2c */
-	enbl = readl(&i2c_base->ic_enable);
-	enbl &= ~IC_ENABLE_0B;
-	writel(enbl, &i2c_base->ic_enable);
+	dw_i2c_enable(i2c_base, false);
 
 	writel((IC_CON_SD | IC_CON_SPD_FS | IC_CON_MM), &i2c_base->ic_con);
 	writel(IC_RX_TL, &i2c_base->ic_rx_tl);
@@ -138,9 +151,7 @@ static void dw_i2c_init(struct i2c_adapter *adap, int speed,
 	writel(slaveaddr, &i2c_base->ic_sar);
 
 	/* Enable i2c */
-	enbl = readl(&i2c_base->ic_enable);
-	enbl |= IC_ENABLE_0B;
-	writel(enbl, &i2c_base->ic_enable);
+	dw_i2c_enable(i2c_base, true);
 }
 
 /*
@@ -152,19 +163,14 @@ static void dw_i2c_init(struct i2c_adapter *adap, int speed,
 static void i2c_setaddress(struct i2c_adapter *adap, unsigned int i2c_addr)
 {
 	struct i2c_regs *i2c_base = i2c_get_base(adap);
-	unsigned int enbl;
 
 	/* Disable i2c */
-	enbl = readl(&i2c_base->ic_enable);
-	enbl &= ~IC_ENABLE_0B;
-	writel(enbl, &i2c_base->ic_enable);
+	dw_i2c_enable(i2c_base, false);
 
 	writel(i2c_addr, &i2c_base->ic_tar);
 
 	/* Enable i2c */
-	enbl = readl(&i2c_base->ic_enable);
-	enbl |= IC_ENABLE_0B;
-	writel(enbl, &i2c_base->ic_enable);
+	dw_i2c_enable(i2c_base, true);
 }
 
 /*
Signature · 1 line
2.7.4
#2 lore raw

PATCH v2 2/6 i2c: designware_i2c: Add dw_i2c_enable() helper function

Quoted 23 lines · Stefan Roese

dw_i2c_enable() is used to dis-/en-able the I2C controller. It makes sense to add such a function, as the controller is dis-/en-abled multiple times in the code. Additionally, this function now checks, if the controller is really dis-/en-abled. This code is copied from the Linux I2C driver version.

Cc Simon Glass <[email protected]>
Cc Bin Meng <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Heiko Schocher <[email protected]>

---
v2:
- Use true / false for binary values as suggested by Bin

 drivers/i2c/designware_i2c.c | 46 +++++++++++++++++++++++++-------------------
 1 file changed, 26 insertions(+), 20 deletions(-)
drivers/i2c/designware_i2c.c +0 -0
index e768cde..2b0c8cb 100644

drivers/i2c/designware_i2c.c static struct i2c_regs *i2c_get_base(struct i2c_adapter *adap) · line 42

Quoted 9 lines
drivers/i2c/designware_i2c.c +6 -0
@@ -34,6 +34,26 @@ static struct i2c_regs *i2c_get_base(struct i2c_adapter *adap)
 	return NULL;
 }
 
+static void dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
+{
+	int timeout = 100;
+
+	do {
+		writel(enable, &i2c_base->ic_enable);

I believe boolean true in C can be anything non-zero, not necessarily one (1). It is safer to be explicit and do
enable = enable ? IC_ENABLE_0B : 0;
at the beginning of the function

drivers/i2c/designware_i2c.c static struct i2c_regs *i2c_get_base(struct i2c_adapter *adap) · line 43

Quoted 1 line
drivers/i2c/designware_i2c.c +1 -0
+		if ((readl(&i2c_base->ic_enable_status) & 1) == enable)

Also drop this & 1 and make it IC_ENABLE_0B please.

drivers/i2c/designware_i2c.c static struct i2c_regs *i2c_get_base(struct i2c_adapter *adap) · line 52

Quoted 9 lines
drivers/i2c/designware_i2c.c +9 -0
+			return;
+
+		/*
+		 * Wait 10 times the signaling period of the highest I2C
+		 * transfer supported by the driver (for 400KHz this is
+		 * 25us) as described in the DesignWare I2C databook.
+		 */
+		udelay(25);
+	} while (timeout--);

It's a shame we cannot flip this to wait_for_bit() :(

drivers/i2c/designware_i2c.c static struct i2c_regs *i2c_get_base(struct i2c_adapter *adap) · line 55

Quoted 2 lines
drivers/i2c/designware_i2c.c +2 -0
+	printf("timeout in %sabling I2C adapter\n", enable ? "en" : "dis");
+}

[..]
Best regards,
Marek Vasut

#3 lore raw

PATCH v2 3/6 i2c: designware_i2c: Integrate set_speed() into dw_i2c_set_bus_speed()

In reply to Stefan Roese

Integrating set_speed() into dw_i2c_set_bus_speed() will make the conversion to DM easier for this driver.

Cc Simon Glass <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Heiko Schocher <[email protected]>

---
v2:
- Added Reviewed-by from Bin

 drivers/i2c/designware_i2c.c | 37 +++++++++++++------------------------
 1 file changed, 13 insertions(+), 24 deletions(-)
drivers/i2c/designware_i2c.c +13 -24
index 2b0c8cb..aac56a7 100644
@@ -55,16 +55,25 @@ static void dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
 }
 
 /*
- * set_speed - Set the i2c speed mode (standard, high, fast)
- * @i2c_spd:	required i2c speed mode
+ * i2c_set_bus_speed - Set the i2c speed
+ * @speed:	required i2c speed
  *
- * Set the i2c speed mode (standard, high, fast)
+ * Set the i2c speed.
  */
-static void set_speed(struct i2c_adapter *adap, int i2c_spd)
+static unsigned int dw_i2c_set_bus_speed(struct i2c_adapter *adap,
+					 unsigned int speed)
 {
 	struct i2c_regs *i2c_base = i2c_get_base(adap);
 	unsigned int cntl;
 	unsigned int hcnt, lcnt;
+	int i2c_spd;
+
+	if (speed >= I2C_MAX_SPEED)
+		i2c_spd = IC_SPEED_MODE_MAX;
+	else if (speed >= I2C_FAST_SPEED)
+		i2c_spd = IC_SPEED_MODE_FAST;
+	else
+		i2c_spd = IC_SPEED_MODE_STANDARD;
 
 	/* to set speed cltr must be disabled */
 	dw_i2c_enable(i2c_base, false);
@@ -102,27 +111,7 @@ static void set_speed(struct i2c_adapter *adap, int i2c_spd)
 
 	/* Enable back i2c now speed set */
 	dw_i2c_enable(i2c_base, true);
-}
-
-/*
- * i2c_set_bus_speed - Set the i2c speed
- * @speed:	required i2c speed
- *
- * Set the i2c speed.
- */
-static unsigned int dw_i2c_set_bus_speed(struct i2c_adapter *adap,
-					 unsigned int speed)
-{
-	int i2c_spd;
-
-	if (speed >= I2C_MAX_SPEED)
-		i2c_spd = IC_SPEED_MODE_MAX;
-	else if (speed >= I2C_FAST_SPEED)
-		i2c_spd = IC_SPEED_MODE_FAST;
-	else
-		i2c_spd = IC_SPEED_MODE_STANDARD;
 
-	set_speed(adap, i2c_spd);
 	adap->speed = speed;
 
 	return 0;
Signature · 1 line
2.7.4
#4 lore raw

PATCH v2 4/6 i2c: designware_i2c: Prepare for DM driver conversion

In reply to Stefan Roese

This patch prepares the designware I2C driver for the DM conversion. This is mainly done by removing struct i2c_adapter from the functions that shall be used by the DM driver version as well.

Cc Simon Glass <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Heiko Schocher <[email protected]>

---
v2:
- Added Reviewed-by from Bin

 drivers/i2c/designware_i2c.c | 173 ++++++++++++++++++++++---------------------
 1 file changed, 90 insertions(+), 83 deletions(-)
drivers/i2c/designware_i2c.c +90 -83
index aac56a7..8dd1de9 100644
@@ -10,30 +10,6 @@
 #include <asm/io.h>
 #include "designware_i2c.h"
 
-static struct i2c_regs *i2c_get_base(struct i2c_adapter *adap)
-{
-	switch (adap->hwadapnr) {
-#if CONFIG_SYS_I2C_BUS_MAX >= 4
-	case 3:
-		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE3;
-#endif
-#if CONFIG_SYS_I2C_BUS_MAX >= 3
-	case 2:
-		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE2;
-#endif
-#if CONFIG_SYS_I2C_BUS_MAX >= 2
-	case 1:
-		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE1;
-#endif
-	case 0:
-		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE;
-	default:
-		printf("Wrong I2C-adapter number %d\n", adap->hwadapnr);
-	}
-
-	return NULL;
-}
-
 static void dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
 {
 	int timeout = 100;
@@ -60,10 +36,9 @@ static void dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
  *
  * Set the i2c speed.
  */
-static unsigned int dw_i2c_set_bus_speed(struct i2c_adapter *adap,
-					 unsigned int speed)
+static unsigned int __dw_i2c_set_bus_speed(struct i2c_regs *i2c_base,
+					   unsigned int speed)
 {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
 	unsigned int cntl;
 	unsigned int hcnt, lcnt;
 	int i2c_spd;
@@ -112,47 +87,17 @@ static unsigned int dw_i2c_set_bus_speed(struct i2c_adapter *adap,
 	/* Enable back i2c now speed set */
 	dw_i2c_enable(i2c_base, true);
 
-	adap->speed = speed;
-
 	return 0;
 }
 
 /*
- * i2c_init - Init function
- * @speed:	required i2c speed
- * @slaveaddr:	slave address for the device
- *
- * Initialization function.
- */
-static void dw_i2c_init(struct i2c_adapter *adap, int speed,
-			int slaveaddr)
-{
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
-
-	/* Disable i2c */
-	dw_i2c_enable(i2c_base, false);
-
-	writel((IC_CON_SD | IC_CON_SPD_FS | IC_CON_MM), &i2c_base->ic_con);
-	writel(IC_RX_TL, &i2c_base->ic_rx_tl);
-	writel(IC_TX_TL, &i2c_base->ic_tx_tl);
-	dw_i2c_set_bus_speed(adap, speed);
-	writel(IC_STOP_DET, &i2c_base->ic_intr_mask);
-	writel(slaveaddr, &i2c_base->ic_sar);
-
-	/* Enable i2c */
-	dw_i2c_enable(i2c_base, true);
-}
-
-/*
  * i2c_setaddress - Sets the target slave address
  * @i2c_addr:	target i2c address
  *
  * Sets the target slave address.
  */
-static void i2c_setaddress(struct i2c_adapter *adap, unsigned int i2c_addr)
+static void i2c_setaddress(struct i2c_regs *i2c_base, unsigned int i2c_addr)
 {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
-
 	/* Disable i2c */
 	dw_i2c_enable(i2c_base, false);
 
@@ -167,10 +112,8 @@ static void i2c_setaddress(struct i2c_adapter *adap, unsigned int i2c_addr)
  *
  * Flushes the i2c RX FIFO
  */
-static void i2c_flush_rxfifo(struct i2c_adapter *adap)
+static void i2c_flush_rxfifo(struct i2c_regs *i2c_base)
 {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
-
 	while (readl(&i2c_base->ic_status) & IC_STATUS_RFNE)
 		readl(&i2c_base->ic_cmd_data);
 }
@@ -180,9 +123,8 @@ static void i2c_flush_rxfifo(struct i2c_adapter *adap)
  *
  * Waits for bus busy
  */
-static int i2c_wait_for_bb(struct i2c_adapter *adap)
+static int i2c_wait_for_bb(struct i2c_regs *i2c_base)
 {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
 	unsigned long start_time_bb = get_timer(0);
 
 	while ((readl(&i2c_base->ic_status) & IC_STATUS_MA) ||
@@ -196,15 +138,13 @@ static int i2c_wait_for_bb(struct i2c_adapter *adap)
 	return 0;
 }
 
-static int i2c_xfer_init(struct i2c_adapter *adap, uchar chip, uint addr,
+static int i2c_xfer_init(struct i2c_regs *i2c_base, uchar chip, uint addr,
 			 int alen)
 {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
-
-	if (i2c_wait_for_bb(adap))
+	if (i2c_wait_for_bb(i2c_base))
 		return 1;
 
-	i2c_setaddress(adap, chip);
+	i2c_setaddress(i2c_base, chip);
 	while (alen) {
 		alen--;
 		/* high byte address going out first */
@@ -214,9 +154,8 @@ static int i2c_xfer_init(struct i2c_adapter *adap, uchar chip, uint addr,
 	return 0;
 }
 
-static int i2c_xfer_finish(struct i2c_adapter *adap)
+static int i2c_xfer_finish(struct i2c_regs *i2c_base)
 {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
 	ulong start_stop_det = get_timer(0);
 
 	while (1) {
@@ -228,12 +167,12 @@ static int i2c_xfer_finish(struct i2c_adapter *adap)
 		}
 	}
 
-	if (i2c_wait_for_bb(adap)) {
+	if (i2c_wait_for_bb(i2c_base)) {
 		printf("Timed out waiting for bus\n");
 		return 1;
 	}
 
-	i2c_flush_rxfifo(adap);
+	i2c_flush_rxfifo(i2c_base);
 
 	return 0;
 }
@@ -248,10 +187,9 @@ static int i2c_xfer_finish(struct i2c_adapter *adap)
  *
  * Read from i2c memory.
  */
-static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
-		       int alen, u8 *buffer, int len)
+static int __dw_i2c_read(struct i2c_regs *i2c_base, u8 dev, uint addr,
+			 int alen, u8 *buffer, int len)
 {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
 	unsigned long start_time_rx;
 
 #ifdef CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW
@@ -273,7 +211,7 @@ static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
 	      addr);
 #endif
 
-	if (i2c_xfer_init(adap, dev, addr, alen))
+	if (i2c_xfer_init(i2c_base, dev, addr, alen))
 		return 1;
 
 	start_time_rx = get_timer(0);
@@ -293,7 +231,7 @@ static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
 		}
 	}
 
-	return i2c_xfer_finish(adap);
+	return i2c_xfer_finish(i2c_base);
 }
 
 /*
@@ -306,10 +244,9 @@ static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
  *
  * Write to i2c memory.
  */
-static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
-			int alen, u8 *buffer, int len)
+static int __dw_i2c_write(struct i2c_regs *i2c_base, u8 dev, uint addr,
+			  int alen, u8 *buffer, int len)
 {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
 	int nb = len;
 	unsigned long start_time_tx;
 
@@ -332,7 +269,7 @@ static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
 	      addr);
 #endif
 
-	if (i2c_xfer_init(adap, dev, addr, alen))
+	if (i2c_xfer_init(i2c_base, dev, addr, alen))
 		return 1;
 
 	start_time_tx = get_timer(0);
@@ -353,7 +290,76 @@ static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
 		}
 	}
 
-	return i2c_xfer_finish(adap);
+	return i2c_xfer_finish(i2c_base);
+}
+
+static struct i2c_regs *i2c_get_base(struct i2c_adapter *adap)
+{
+	switch (adap->hwadapnr) {
+#if CONFIG_SYS_I2C_BUS_MAX >= 4
+	case 3:
+		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE3;
+#endif
+#if CONFIG_SYS_I2C_BUS_MAX >= 3
+	case 2:
+		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE2;
+#endif
+#if CONFIG_SYS_I2C_BUS_MAX >= 2
+	case 1:
+		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE1;
+#endif
+	case 0:
+		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE;
+	default:
+		printf("Wrong I2C-adapter number %d\n", adap->hwadapnr);
+	}
+
+	return NULL;
+}
+
+static unsigned int dw_i2c_set_bus_speed(struct i2c_adapter *adap,
+					 unsigned int speed)
+{
+	adap->speed = speed;
+	return __dw_i2c_set_bus_speed(i2c_get_base(adap), speed);
+}
+
+/*
+ * i2c_init - Init function
+ * @speed:	required i2c speed
+ * @slaveaddr:	slave address for the device
+ *
+ * Initialization function.
+ */
+static void dw_i2c_init(struct i2c_adapter *adap, int speed,
+			int slaveaddr)
+{
+	struct i2c_regs *i2c_base = i2c_get_base(adap);
+
+	/* Disable i2c */
+	dw_i2c_enable(i2c_base, false);
+
+	writel((IC_CON_SD | IC_CON_SPD_FS | IC_CON_MM), &i2c_base->ic_con);
+	writel(IC_RX_TL, &i2c_base->ic_rx_tl);
+	writel(IC_TX_TL, &i2c_base->ic_tx_tl);
+	dw_i2c_set_bus_speed(adap, speed);
+	writel(IC_STOP_DET, &i2c_base->ic_intr_mask);
+	writel(slaveaddr, &i2c_base->ic_sar);
+
+	/* Enable i2c */
+	dw_i2c_enable(i2c_base, true);
+}
+
+static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
+		       int alen, u8 *buffer, int len)
+{
+	return __dw_i2c_read(i2c_get_base(adap), dev, addr, alen, buffer, len);
+}
+
+static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
+			int alen, u8 *buffer, int len)
+{
+	return __dw_i2c_write(i2c_get_base(adap), dev, addr, alen, buffer, len);
 }
 
 /*
@@ -361,13 +367,14 @@ static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
  */
 static int dw_i2c_probe(struct i2c_adapter *adap, u8 dev)
 {
+	struct i2c_regs *i2c_base = i2c_get_base(adap);
 	u32 tmp;
 	int ret;
 
 	/*
 	 * Try to read the first location of the chip.
 	 */
-	ret = dw_i2c_read(adap, dev, 0, 1, (uchar *)&tmp, 1);
+	ret = __dw_i2c_read(i2c_base, dev, 0, 1, (uchar *)&tmp, 1);
 	if (ret)
 		dw_i2c_init(adap, adap->speed, adap->slaveaddr);
 
Signature · 1 line
2.7.4
#5 lore raw

PATCH v2 4/6 i2c: designware_i2c: Prepare for DM driver conversion

Hello Stefan,

Am 23.03.2016 um 06:46 schrieb Stefan Roese:

Quoted 9 lines

This patch prepares the designware I2C driver for the DM conversion. This is mainly done by removing struct i2c_adapter from the functions that shall be used by the DM driver version as well.

Cc Simon Glass <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Heiko Schocher <[email protected]>
Quoted 6 lines

---
v2:
- Added Reviewed-by from Bin

  drivers/i2c/designware_i2c.c | 173 ++++++++++++++++++++++---------------------
  1 file changed, 90 insertions(+), 83 deletions(-)

I tried to apply this patch, but get the following error:

Wende an: i2c: designware_i2c: Prepare for DM driver conversion
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c).
Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zur?ckzufallen. Kann nicht zu 3-Wege-Merge zur?ckfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c: Prepare for DM driver conversion

I tried the this patch on current mainline, with the following patches applied:

http://patchwork.ozlabs.org/patch/601112/
http://patchwork.ozlabs.org/patch/601128/
http://patchwork.ozlabs.org/patch/601117/

Could you take a look?

Thanks!

bye,
Heiko

Quoted 314 lines
drivers/i2c/designware_i2c.c +90 -83
index aac56a7..8dd1de9 100644
@@ -10,30 +10,6 @@
  #include <asm/io.h>
  #include "designware_i2c.h"
 
-static struct i2c_regs *i2c_get_base(struct i2c_adapter *adap)
-{
-	switch (adap->hwadapnr) {
-#if CONFIG_SYS_I2C_BUS_MAX >= 4
-	case 3:
-		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE3;
-#endif
-#if CONFIG_SYS_I2C_BUS_MAX >= 3
-	case 2:
-		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE2;
-#endif
-#if CONFIG_SYS_I2C_BUS_MAX >= 2
-	case 1:
-		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE1;
-#endif
-	case 0:
-		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE;
-	default:
-		printf("Wrong I2C-adapter number %d\n", adap->hwadapnr);
-	}
-
-	return NULL;
-}
-
  static void dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
  {
  	int timeout = 100;
@@ -60,10 +36,9 @@ static void dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
   *
   * Set the i2c speed.
   */
-static unsigned int dw_i2c_set_bus_speed(struct i2c_adapter *adap,
-					 unsigned int speed)
+static unsigned int __dw_i2c_set_bus_speed(struct i2c_regs *i2c_base,
+					   unsigned int speed)
  {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
  	unsigned int cntl;
  	unsigned int hcnt, lcnt;
  	int i2c_spd;
@@ -112,47 +87,17 @@ static unsigned int dw_i2c_set_bus_speed(struct i2c_adapter *adap,
  	/* Enable back i2c now speed set */
  	dw_i2c_enable(i2c_base, true);
 
-	adap->speed = speed;
-
  	return 0;
  }
 
  /*
- * i2c_init - Init function
- * @speed:	required i2c speed
- * @slaveaddr:	slave address for the device
- *
- * Initialization function.
- */
-static void dw_i2c_init(struct i2c_adapter *adap, int speed,
-			int slaveaddr)
-{
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
-
-	/* Disable i2c */
-	dw_i2c_enable(i2c_base, false);
-
-	writel((IC_CON_SD | IC_CON_SPD_FS | IC_CON_MM), &i2c_base->ic_con);
-	writel(IC_RX_TL, &i2c_base->ic_rx_tl);
-	writel(IC_TX_TL, &i2c_base->ic_tx_tl);
-	dw_i2c_set_bus_speed(adap, speed);
-	writel(IC_STOP_DET, &i2c_base->ic_intr_mask);
-	writel(slaveaddr, &i2c_base->ic_sar);
-
-	/* Enable i2c */
-	dw_i2c_enable(i2c_base, true);
-}
-
-/*
   * i2c_setaddress - Sets the target slave address
   * @i2c_addr:	target i2c address
   *
   * Sets the target slave address.
   */
-static void i2c_setaddress(struct i2c_adapter *adap, unsigned int i2c_addr)
+static void i2c_setaddress(struct i2c_regs *i2c_base, unsigned int i2c_addr)
  {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
-
  	/* Disable i2c */
  	dw_i2c_enable(i2c_base, false);
 
@@ -167,10 +112,8 @@ static void i2c_setaddress(struct i2c_adapter *adap, unsigned int i2c_addr)
   *
   * Flushes the i2c RX FIFO
   */
-static void i2c_flush_rxfifo(struct i2c_adapter *adap)
+static void i2c_flush_rxfifo(struct i2c_regs *i2c_base)
  {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
-
  	while (readl(&i2c_base->ic_status) & IC_STATUS_RFNE)
  		readl(&i2c_base->ic_cmd_data);
  }
@@ -180,9 +123,8 @@ static void i2c_flush_rxfifo(struct i2c_adapter *adap)
   *
   * Waits for bus busy
   */
-static int i2c_wait_for_bb(struct i2c_adapter *adap)
+static int i2c_wait_for_bb(struct i2c_regs *i2c_base)
  {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
  	unsigned long start_time_bb = get_timer(0);
 
  	while ((readl(&i2c_base->ic_status) & IC_STATUS_MA) ||
@@ -196,15 +138,13 @@ static int i2c_wait_for_bb(struct i2c_adapter *adap)
  	return 0;
  }
 
-static int i2c_xfer_init(struct i2c_adapter *adap, uchar chip, uint addr,
+static int i2c_xfer_init(struct i2c_regs *i2c_base, uchar chip, uint addr,
  			 int alen)
  {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
-
-	if (i2c_wait_for_bb(adap))
+	if (i2c_wait_for_bb(i2c_base))
  		return 1;
 
-	i2c_setaddress(adap, chip);
+	i2c_setaddress(i2c_base, chip);
  	while (alen) {
  		alen--;
  		/* high byte address going out first */
@@ -214,9 +154,8 @@ static int i2c_xfer_init(struct i2c_adapter *adap, uchar chip, uint addr,
  	return 0;
  }
 
-static int i2c_xfer_finish(struct i2c_adapter *adap)
+static int i2c_xfer_finish(struct i2c_regs *i2c_base)
  {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
  	ulong start_stop_det = get_timer(0);
 
  	while (1) {
@@ -228,12 +167,12 @@ static int i2c_xfer_finish(struct i2c_adapter *adap)
  		}
  	}
 
-	if (i2c_wait_for_bb(adap)) {
+	if (i2c_wait_for_bb(i2c_base)) {
  		printf("Timed out waiting for bus\n");
  		return 1;
  	}
 
-	i2c_flush_rxfifo(adap);
+	i2c_flush_rxfifo(i2c_base);
 
  	return 0;
  }
@@ -248,10 +187,9 @@ static int i2c_xfer_finish(struct i2c_adapter *adap)
   *
   * Read from i2c memory.
   */
-static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
-		       int alen, u8 *buffer, int len)
+static int __dw_i2c_read(struct i2c_regs *i2c_base, u8 dev, uint addr,
+			 int alen, u8 *buffer, int len)
  {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
  	unsigned long start_time_rx;
 
  #ifdef CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW
@@ -273,7 +211,7 @@ static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
  	      addr);
  #endif
 
-	if (i2c_xfer_init(adap, dev, addr, alen))
+	if (i2c_xfer_init(i2c_base, dev, addr, alen))
  		return 1;
 
  	start_time_rx = get_timer(0);
@@ -293,7 +231,7 @@ static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
  		}
  	}
 
-	return i2c_xfer_finish(adap);
+	return i2c_xfer_finish(i2c_base);
  }
 
  /*
@@ -306,10 +244,9 @@ static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
   *
   * Write to i2c memory.
   */
-static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
-			int alen, u8 *buffer, int len)
+static int __dw_i2c_write(struct i2c_regs *i2c_base, u8 dev, uint addr,
+			  int alen, u8 *buffer, int len)
  {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
  	int nb = len;
  	unsigned long start_time_tx;
 
@@ -332,7 +269,7 @@ static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
  	      addr);
  #endif
 
-	if (i2c_xfer_init(adap, dev, addr, alen))
+	if (i2c_xfer_init(i2c_base, dev, addr, alen))
  		return 1;
 
  	start_time_tx = get_timer(0);
@@ -353,7 +290,76 @@ static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
  		}
  	}
 
-	return i2c_xfer_finish(adap);
+	return i2c_xfer_finish(i2c_base);
+}
+
+static struct i2c_regs *i2c_get_base(struct i2c_adapter *adap)
+{
+	switch (adap->hwadapnr) {
+#if CONFIG_SYS_I2C_BUS_MAX >= 4
+	case 3:
+		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE3;
+#endif
+#if CONFIG_SYS_I2C_BUS_MAX >= 3
+	case 2:
+		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE2;
+#endif
+#if CONFIG_SYS_I2C_BUS_MAX >= 2
+	case 1:
+		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE1;
+#endif
+	case 0:
+		return (struct i2c_regs *)CONFIG_SYS_I2C_BASE;
+	default:
+		printf("Wrong I2C-adapter number %d\n", adap->hwadapnr);
+	}
+
+	return NULL;
+}
+
+static unsigned int dw_i2c_set_bus_speed(struct i2c_adapter *adap,
+					 unsigned int speed)
+{
+	adap->speed = speed;
+	return __dw_i2c_set_bus_speed(i2c_get_base(adap), speed);
+}
+
+/*
+ * i2c_init - Init function
+ * @speed:	required i2c speed
+ * @slaveaddr:	slave address for the device
+ *
+ * Initialization function.
+ */
+static void dw_i2c_init(struct i2c_adapter *adap, int speed,
+			int slaveaddr)
+{
+	struct i2c_regs *i2c_base = i2c_get_base(adap);
+
+	/* Disable i2c */
+	dw_i2c_enable(i2c_base, false);
+
+	writel((IC_CON_SD | IC_CON_SPD_FS | IC_CON_MM), &i2c_base->ic_con);
+	writel(IC_RX_TL, &i2c_base->ic_rx_tl);
+	writel(IC_TX_TL, &i2c_base->ic_tx_tl);
+	dw_i2c_set_bus_speed(adap, speed);
+	writel(IC_STOP_DET, &i2c_base->ic_intr_mask);
+	writel(slaveaddr, &i2c_base->ic_sar);
+
+	/* Enable i2c */
+	dw_i2c_enable(i2c_base, true);
+}
+
+static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
+		       int alen, u8 *buffer, int len)
+{
+	return __dw_i2c_read(i2c_get_base(adap), dev, addr, alen, buffer, len);
+}
+
+static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
+			int alen, u8 *buffer, int len)
+{
+	return __dw_i2c_write(i2c_get_base(adap), dev, addr, alen, buffer, len);
  }
 
  /*
@@ -361,13 +367,14 @@ static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
   */
  static int dw_i2c_probe(struct i2c_adapter *adap, u8 dev)
  {
+	struct i2c_regs *i2c_base = i2c_get_base(adap);
  	u32 tmp;
  	int ret;
 
  	/*
  	 * Try to read the first location of the chip.
  	 */
-	ret = dw_i2c_read(adap, dev, 0, 1, (uchar *)&tmp, 1);
+	ret = __dw_i2c_read(i2c_base, dev, 0, 1, (uchar *)&tmp, 1);
  	if (ret)
  		dw_i2c_init(adap, adap->speed, adap->slaveaddr);
 
Signature · 2 lines
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#6 lore raw

PATCH v2 4/6 i2c: designware_i2c: Prepare for DM driver conversion

Hi Heiko,

Quoted 29 lines · Heiko Schocher

Am 23.03.2016 um 06:46 schrieb Stefan Roese:

Quoted 9 lines

This patch prepares the designware I2C driver for the DM conversion. This is mainly done by removing struct i2c_adapter from the functions that shall be used by the DM driver version as well.

Cc Simon Glass <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Heiko Schocher <[email protected]>
Quoted 7 lines

---
v2:
- Added Reviewed-by from Bin

  drivers/i2c/designware_i2c.c | 173
++++++++++++++++++++++---------------------
  1 file changed, 90 insertions(+), 83 deletions(-)

I tried to apply this patch, but get the following error:

Wende an: i2c: designware_i2c: Prepare for DM driver conversion
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c).
Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zur?ckzufallen.
Kann nicht zu 3-Wege-Merge zur?ckfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c:
Prepare for DM driver conversion

Quoted 8 lines

I tried the this patch on current mainline, with the following patches applied:

http://patchwork.ozlabs.org/patch/601112/
http://patchwork.ozlabs.org/patch/601128/
http://patchwork.ozlabs.org/patch/601117/

Could you take a look?

This should be fixed with v3 of this patch:

https://patchwork.ozlabs.org/patch/609406/

Could you give it another try please?

Thanks,
Stefan

#7 lore raw

PATCH v2 4/6 i2c: designware_i2c: Prepare for DM driver conversion

Hello Stefan,

Am 12.04.2016 um 15:22 schrieb Stefan Roese:

Quoted 39 lines

Hi Heiko,

Quoted 36 lines · Heiko Schocher

Am 23.03.2016 um 06:46 schrieb Stefan Roese:

Quoted 9 lines

This patch prepares the designware I2C driver for the DM conversion. This is mainly done by removing struct i2c_adapter from the functions that shall be used by the DM driver version as well.

Cc Simon Glass <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Heiko Schocher <[email protected]>
Quoted 7 lines

---
v2:
- Added Reviewed-by from Bin

  drivers/i2c/designware_i2c.c | 173
++++++++++++++++++++++---------------------
  1 file changed, 90 insertions(+), 83 deletions(-)

I tried to apply this patch, but get the following error:

Wende an: i2c: designware_i2c: Prepare for DM driver conversion
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c).
Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zur?ckzufallen.
Kann nicht zu 3-Wege-Merge zur?ckfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c:
Prepare for DM driver conversion

I tried the this patch on current mainline, with the following patches applied:

http://patchwork.ozlabs.org/patch/601112/
http://patchwork.ozlabs.org/patch/601128/
http://patchwork.ozlabs.org/patch/601117/

Quoted 7 lines
Quoted 1 line

Could you take a look?

This should be fixed with v3 of this patch:

https://patchwork.ozlabs.org/patch/609406/

Could you give it another try please?

Yes, this patch applies now fine, but the patch:

[U-Boot,5/6,v2] i2c: designware_i2c: Add DM support
http://patchwork.ozlabs.org/patch/601116/

fails now:

--2016-04-13 07:30:54-- http://patchwork.ozlabs.org/patch/601116/mbox
Aufl?sen des Hostnamens ?patchwork.ozlabs.org (patchwork.ozlabs.org)? ? 103.22.144.67, 2401:3900:2:1::2 Verbindungsaufbau zu patchwork.ozlabs.org (patchwork.ozlabs.org)|103.22.144.67|:80 ? verbunden. HTTP-Anforderung gesendet, auf Antwort wird gewartet ? 301 MOVED PERMANENTLY
Platz: http://patchwork.ozlabs.org/patch/601116/mbox/ [folgend]
--2016-04-13 07:30:54-- http://patchwork.ozlabs.org/patch/601116/mbox/
Wiederverwendung der bestehenden Verbindung zu patchwork.ozlabs.org:80. HTTP-Anforderung gesendet, auf Antwort wird gewartet ? 200 OK
L?nge: nicht spezifiziert [text/plain]
Wird in ??mbox?? gespeichert.

mbox [ <=>

                            ]   6,06K  --.-KB/s    in 0,004s
2016-04-13 07:30:54 (1,39 MB/s) - ?mbox? gespeichert [6202]

total: 0 errors, 0 warnings, 0 checks, 181 lines checked

NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE NETWORKING_BLOCK_COMMENT_STYLE PREFER_ETHER_ADDR_COPY USLEEP_RANGE

mbox has no obvious style problems and is ready for submission. Wende an: i2c: designware_i2c: Add DM support
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c). Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zur?ckzufallen. Kann nicht zu 3-Wege-Merge zur?ckfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c: Add DM support Die Kopie des fehlgeschlagenen Patches befindet sich in:

    /home/hs/i2c/u-boot/.git/rebase-apply/patch

Wenn Sie das Problem gel?st haben, f?hren Sie "git am --continue" aus. Falls Sie diesen Patch auslassen m?chten, f?hren Sie stattdessen "git am --skip" aus.
Um den urspr?nglichen Branch wiederherzustellen und die Anwendung der Patches abzubrechen, f?hren Sie "git am --abort" aus. pollux:u-boot hs [master] $

Base is current mainline (with 2 i2c patches from Michal, but they should not interfere with your patches ...):

pollux:u-boot hs [master] $ git log --oneline
2ddd09a i2c: designware_i2c: Prepare for DM driver conversion f824253 i2c: designware_i2c: Integrate set_speed() into dw_i2c_set_bus_speed() 709a9e6 i2c: designware_i2c: Add dw_i2c_enable() helper function 1b89299 i2c: designware_i2c: Add ic_enable_status to ic_regs struct d4cc513 dm: i2c: Add driver for Cadence I2C IP
be332ef i2c: Describe Cadence I2C devicetree bindings
39fbd98 Merge git://www.denx.de/git/u-boot-marvell

patches from you in the above list:
- [U-Boot,1/6,v2] i2c: designware_i2c: Add ic_enable_status to ic_regs struct
http://patchwork.ozlabs.org/patch/601112/
- [U-Boot,2/6,v3] i2c: designware_i2c: Add dw_i2c_enable() helper function
http://patchwork.ozlabs.org/patch/601128/
- [U-Boot,3/6,v2] i2c: designware_i2c: Integrate set_speed() into dw_i2c_set_bus_speed()
http://patchwork.ozlabs.org/patch/601117/
- [U-Boot,v3] i2c: designware_i2c: Prepare for DM driver conversion
http://patchwork.ozlabs.org/patch/609406/

Did I missed an update patch?

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#8 lore raw

PATCH v2 4/6 i2c: designware_i2c: Prepare for DM driver conversion

Hi Heiko,

Quoted 125 lines · Heiko Schocher

Hello Stefan,

Am 12.04.2016 um 15:22 schrieb Stefan Roese:

Quoted 39 lines

Hi Heiko,

Quoted 36 lines · Heiko Schocher

Am 23.03.2016 um 06:46 schrieb Stefan Roese:

Quoted 9 lines

This patch prepares the designware I2C driver for the DM conversion. This is mainly done by removing struct i2c_adapter from the functions that shall be used by the DM driver version as well.

Cc Simon Glass <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Heiko Schocher <[email protected]>
Quoted 7 lines

---
v2:
- Added Reviewed-by from Bin

  drivers/i2c/designware_i2c.c | 173
++++++++++++++++++++++---------------------
  1 file changed, 90 insertions(+), 83 deletions(-)

I tried to apply this patch, but get the following error:

Wende an: i2c: designware_i2c: Prepare for DM driver conversion
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c).
Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zur?ckzufallen.
Kann nicht zu 3-Wege-Merge zur?ckfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c:
Prepare for DM driver conversion

I tried the this patch on current mainline, with the following patches applied:

http://patchwork.ozlabs.org/patch/601112/
http://patchwork.ozlabs.org/patch/601128/
http://patchwork.ozlabs.org/patch/601117/

Quoted 7 lines
Quoted 1 line

Could you take a look?

This should be fixed with v3 of this patch:

https://patchwork.ozlabs.org/patch/609406/

Could you give it another try please?

Yes, this patch applies now fine, but the patch:

[U-Boot,5/6,v2] i2c: designware_i2c: Add DM support
http://patchwork.ozlabs.org/patch/601116/

fails now:

--2016-04-13 07:30:54-- http://patchwork.ozlabs.org/patch/601116/mbox
Aufl?sen des Hostnamens ?patchwork.ozlabs.org (patchwork.ozlabs.org)? ? 103.22.144.67, 2401:3900:2:1::2
Verbindungsaufbau zu patchwork.ozlabs.org (patchwork.ozlabs.org)|103.22.144.67|:80 ? verbunden. HTTP-Anforderung gesendet, auf Antwort wird gewartet ? 301 MOVED PERMANENTLY
Platz: http://patchwork.ozlabs.org/patch/601116/mbox/ [folgend] --2016-04-13 07:30:54-- http://patchwork.ozlabs.org/patch/601116/mbox/
Wiederverwendung der bestehenden Verbindung zu patchwork.ozlabs.org:80. HTTP-Anforderung gesendet, auf Antwort wird gewartet ? 200 OK L?nge: nicht spezifiziert [text/plain]
Wird in ??mbox?? gespeichert.

mbox [ <=>

                            ]   6,06K  --.-KB/s    in 0,004s
2016-04-13 07:30:54 (1,39 MB/s) - ?mbox? gespeichert [6202]

total: 0 errors, 0 warnings, 0 checks, 181 lines checked

NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE NETWORKING_BLOCK_COMMENT_STYLE PREFER_ETHER_ADDR_COPY USLEEP_RANGE

mbox has no obvious style problems and is ready for submission. Wende an: i2c: designware_i2c: Add DM support
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c).
Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zur?ckzufallen.
Kann nicht zu 3-Wege-Merge zur?ckfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c: Add DM support
Die Kopie des fehlgeschlagenen Patches befindet sich in:

    /home/hs/i2c/u-boot/.git/rebase-apply/patch

Wenn Sie das Problem gel?st haben, f?hren Sie "git am --continue" aus. Falls Sie diesen Patch auslassen m?chten, f?hren Sie stattdessen "git am --skip" aus.
Um den urspr?nglichen Branch wiederherzustellen und die Anwendung der Patches abzubrechen, f?hren Sie "git am --abort" aus. pollux:u-boot hs [master] $

Base is current mainline (with 2 i2c patches from Michal, but they should not interfere with your patches ...):

pollux:u-boot hs [master] $ git log --oneline
2ddd09a i2c: designware_i2c: Prepare for DM driver conversion f824253 i2c: designware_i2c: Integrate set_speed() into dw_i2c_set_bus_speed()
709a9e6 i2c: designware_i2c: Add dw_i2c_enable() helper function 1b89299 i2c: designware_i2c: Add ic_enable_status to ic_regs struct d4cc513 dm: i2c: Add driver for Cadence I2C IP
be332ef i2c: Describe Cadence I2C devicetree bindings 39fbd98 Merge git://www.denx.de/git/u-boot-marvell

patches from you in the above list:
- [U-Boot,1/6,v2] i2c: designware_i2c: Add ic_enable_status to ic_regs struct
http://patchwork.ozlabs.org/patch/601112/
- [U-Boot,2/6,v3] i2c: designware_i2c: Add dw_i2c_enable() helper function
http://patchwork.ozlabs.org/patch/601128/
- [U-Boot,3/6,v2] i2c: designware_i2c: Integrate set_speed() into dw_i2c_set_bus_speed()
http://patchwork.ozlabs.org/patch/601117/
- [U-Boot,v3] i2c: designware_i2c: Prepare for DM driver conversion
http://patchwork.ozlabs.org/patch/609406/

Quoted 1 line

Did I missed an update patch?

No, its most likely a problem with the updated patch from yesterday. Could you please use the "-3" option with "git am" to apply this patch? This works for me:

$ git am -3 ~/Downloads/U-Boot-5-6-v2-i2c-designware_i2c-Add-DM-support\(1\).patch
Applying: i2c: designware_i2c: Add DM support
Using index info to reconstruct a base tree...
M       drivers/i2c/designware_i2c.c
Falling back to patching base and 3-way merge...
Auto-merging drivers/i2c/designware_i2c.c

Thanks,
Stefan

#9 lore raw

PATCH v2 4/6 i2c: designware_i2c: Prepare for DM driver conversion

Hello Stefan,

Am 13.04.2016 um 07:56 schrieb Stefan Roese:

Quoted 134 lines

Hi Heiko,

Quoted 125 lines · Heiko Schocher

Hello Stefan,

Am 12.04.2016 um 15:22 schrieb Stefan Roese:

Quoted 39 lines

Hi Heiko,

Quoted 36 lines · Heiko Schocher

Am 23.03.2016 um 06:46 schrieb Stefan Roese:

Quoted 9 lines

This patch prepares the designware I2C driver for the DM conversion. This is mainly done by removing struct i2c_adapter from the functions that shall be used by the DM driver version as well.

Cc Simon Glass <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Heiko Schocher <[email protected]>
Quoted 7 lines

---
v2:
- Added Reviewed-by from Bin

   drivers/i2c/designware_i2c.c | 173
++++++++++++++++++++++---------------------
   1 file changed, 90 insertions(+), 83 deletions(-)

I tried to apply this patch, but get the following error:

Wende an: i2c: designware_i2c: Prepare for DM driver conversion
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c).
Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zur?ckzufallen.
Kann nicht zu 3-Wege-Merge zur?ckfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c:
Prepare for DM driver conversion

I tried the this patch on current mainline, with the following patches applied:

http://patchwork.ozlabs.org/patch/601112/
http://patchwork.ozlabs.org/patch/601128/
http://patchwork.ozlabs.org/patch/601117/

Quoted 7 lines
Quoted 1 line

Could you take a look?

This should be fixed with v3 of this patch:

https://patchwork.ozlabs.org/patch/609406/

Could you give it another try please?

Yes, this patch applies now fine, but the patch:

[U-Boot,5/6,v2] i2c: designware_i2c: Add DM support
http://patchwork.ozlabs.org/patch/601116/

fails now:

--2016-04-13 07:30:54-- http://patchwork.ozlabs.org/patch/601116/mbox
Aufl?sen des Hostnamens ?patchwork.ozlabs.org (patchwork.ozlabs.org)? ? 103.22.144.67, 2401:3900:2:1::2
Verbindungsaufbau zu patchwork.ozlabs.org (patchwork.ozlabs.org)|103.22.144.67|:80 ? verbunden. HTTP-Anforderung gesendet, auf Antwort wird gewartet ? 301 MOVED PERMANENTLY
Platz: http://patchwork.ozlabs.org/patch/601116/mbox/ [folgend] --2016-04-13 07:30:54-- http://patchwork.ozlabs.org/patch/601116/mbox/
Wiederverwendung der bestehenden Verbindung zu patchwork.ozlabs.org:80. HTTP-Anforderung gesendet, auf Antwort wird gewartet ? 200 OK L?nge: nicht spezifiziert [text/plain]
Wird in ??mbox?? gespeichert.

mbox [ <=>

                             ]   6,06K  --.-KB/s    in 0,004s
2016-04-13 07:30:54 (1,39 MB/s) - ?mbox? gespeichert [6202]

total: 0 errors, 0 warnings, 0 checks, 181 lines checked

NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE NETWORKING_BLOCK_COMMENT_STYLE PREFER_ETHER_ADDR_COPY USLEEP_RANGE

mbox has no obvious style problems and is ready for submission. Wende an: i2c: designware_i2c: Add DM support
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c).
Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zur?ckzufallen.
Kann nicht zu 3-Wege-Merge zur?ckfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c: Add DM support
Die Kopie des fehlgeschlagenen Patches befindet sich in:

     /home/hs/i2c/u-boot/.git/rebase-apply/patch

Wenn Sie das Problem gel?st haben, f?hren Sie "git am --continue" aus. Falls Sie diesen Patch auslassen m?chten, f?hren Sie stattdessen "git am --skip" aus.
Um den urspr?nglichen Branch wiederherzustellen und die Anwendung der Patches abzubrechen, f?hren Sie "git am --abort" aus. pollux:u-boot hs [master] $

Base is current mainline (with 2 i2c patches from Michal, but they should not interfere with your patches ...):

pollux:u-boot hs [master] $ git log --oneline
2ddd09a i2c: designware_i2c: Prepare for DM driver conversion f824253 i2c: designware_i2c: Integrate set_speed() into dw_i2c_set_bus_speed()
709a9e6 i2c: designware_i2c: Add dw_i2c_enable() helper function 1b89299 i2c: designware_i2c: Add ic_enable_status to ic_regs struct d4cc513 dm: i2c: Add driver for Cadence I2C IP
be332ef i2c: Describe Cadence I2C devicetree bindings 39fbd98 Merge git://www.denx.de/git/u-boot-marvell

patches from you in the above list:
- [U-Boot,1/6,v2] i2c: designware_i2c: Add ic_enable_status to ic_regs struct
http://patchwork.ozlabs.org/patch/601112/
- [U-Boot,2/6,v3] i2c: designware_i2c: Add dw_i2c_enable() helper function
http://patchwork.ozlabs.org/patch/601128/
- [U-Boot,3/6,v2] i2c: designware_i2c: Integrate set_speed() into dw_i2c_set_bus_speed()
http://patchwork.ozlabs.org/patch/601117/
- [U-Boot,v3] i2c: designware_i2c: Prepare for DM driver conversion
http://patchwork.ozlabs.org/patch/609406/

Quoted 1 line

Did I missed an update patch?

No, its most likely a problem with the updated patch from yesterday. Could you please use the "-3" option with "git am" to apply this patch? This works for me:

Quoted 6 lines
$ git am -3 ~/Downloads/U-Boot-5-6-v2-i2c-designware_i2c-Add-DM-support\(1\).patch
Applying: i2c: designware_i2c: Add DM support
Using index info to reconstruct a base tree...
M       drivers/i2c/designware_i2c.c
Falling back to patching base and 3-way merge...
Auto-merging drivers/i2c/designware_i2c.c

Hmm... I use "git am -3" ... I see this log:
">> Kann nicht zu 3-Wege-Merge zur?ckfallen."

Do you really work on mainline, with only the patches I listed?

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#10 lore raw

PATCH v2 4/6 i2c: designware_i2c: Prepare for DM driver conversion

Hi Heiko,

Quoted 144 lines · Heiko Schocher

Am 13.04.2016 um 07:56 schrieb Stefan Roese:

Quoted 135 lines

Hi Heiko,

Quoted 126 lines · Heiko Schocher

Hello Stefan,

Am 12.04.2016 um 15:22 schrieb Stefan Roese:

Quoted 39 lines

Hi Heiko,

Quoted 36 lines · Heiko Schocher

Am 23.03.2016 um 06:46 schrieb Stefan Roese:

Quoted 9 lines

This patch prepares the designware I2C driver for the DM conversion. This is mainly done by removing struct i2c_adapter from the functions that shall be used by the DM driver version as well.

Cc Simon Glass <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Heiko Schocher <[email protected]>
Quoted 7 lines

---
v2:
- Added Reviewed-by from Bin

   drivers/i2c/designware_i2c.c | 173
++++++++++++++++++++++---------------------
   1 file changed, 90 insertions(+), 83 deletions(-)

I tried to apply this patch, but get the following error:

Wende an: i2c: designware_i2c: Prepare for DM driver conversion
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c).
Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zur?ckzufallen.
Kann nicht zu 3-Wege-Merge zur?ckfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c:
Prepare for DM driver conversion

I tried the this patch on current mainline, with the following patches applied:

http://patchwork.ozlabs.org/patch/601112/
http://patchwork.ozlabs.org/patch/601128/
http://patchwork.ozlabs.org/patch/601117/

Quoted 7 lines
Quoted 1 line

Could you take a look?

This should be fixed with v3 of this patch:

https://patchwork.ozlabs.org/patch/609406/

Could you give it another try please?

Yes, this patch applies now fine, but the patch:

[U-Boot,5/6,v2] i2c: designware_i2c: Add DM support
http://patchwork.ozlabs.org/patch/601116/

fails now:

--2016-04-13 07:30:54-- http://patchwork.ozlabs.org/patch/601116/mbox
Aufl?sen des Hostnamens ?patchwork.ozlabs.org (patchwork.ozlabs.org)? ? 103.22.144.67, 2401:3900:2:1::2
Verbindungsaufbau zu patchwork.ozlabs.org (patchwork.ozlabs.org)|103.22.144.67|:80 ? verbunden. HTTP-Anforderung gesendet, auf Antwort wird gewartet ? 301 MOVED PERMANENTLY
Platz: http://patchwork.ozlabs.org/patch/601116/mbox/ [folgend] --2016-04-13 07:30:54-- http://patchwork.ozlabs.org/patch/601116/mbox/
Wiederverwendung der bestehenden Verbindung zu patchwork.ozlabs.org:80. HTTP-Anforderung gesendet, auf Antwort wird gewartet ? 200 OK L?nge: nicht spezifiziert [text/plain]
Wird in ??mbox?? gespeichert.

mbox [ <=>

                             ]   6,06K  --.-KB/s    in 0,004s
2016-04-13 07:30:54 (1,39 MB/s) - ?mbox? gespeichert [6202]

total: 0 errors, 0 warnings, 0 checks, 181 lines checked

NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE NETWORKING_BLOCK_COMMENT_STYLE PREFER_ETHER_ADDR_COPY USLEEP_RANGE

mbox has no obvious style problems and is ready for submission. Wende an: i2c: designware_i2c: Add DM support
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c).
Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zur?ckzufallen.
Kann nicht zu 3-Wege-Merge zur?ckfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c: Add DM support
Die Kopie des fehlgeschlagenen Patches befindet sich in:

     /home/hs/i2c/u-boot/.git/rebase-apply/patch

Wenn Sie das Problem gel?st haben, f?hren Sie "git am --continue" aus. Falls Sie diesen Patch auslassen m?chten, f?hren Sie stattdessen "git am --skip" aus.
Um den urspr?nglichen Branch wiederherzustellen und die Anwendung der Patches abzubrechen, f?hren Sie "git am --abort" aus. pollux:u-boot hs [master] $

Base is current mainline (with 2 i2c patches from Michal, but they should not interfere with your patches ...):

pollux:u-boot hs [master] $ git log --oneline
2ddd09a i2c: designware_i2c: Prepare for DM driver conversion f824253 i2c: designware_i2c: Integrate set_speed() into dw_i2c_set_bus_speed()
709a9e6 i2c: designware_i2c: Add dw_i2c_enable() helper function 1b89299 i2c: designware_i2c: Add ic_enable_status to ic_regs struct d4cc513 dm: i2c: Add driver for Cadence I2C IP
be332ef i2c: Describe Cadence I2C devicetree bindings 39fbd98 Merge git://www.denx.de/git/u-boot-marvell

patches from you in the above list:
- [U-Boot,1/6,v2] i2c: designware_i2c: Add ic_enable_status to ic_regs struct
http://patchwork.ozlabs.org/patch/601112/
- [U-Boot,2/6,v3] i2c: designware_i2c: Add dw_i2c_enable() helper function
http://patchwork.ozlabs.org/patch/601128/
- [U-Boot,3/6,v2] i2c: designware_i2c: Integrate set_speed() into dw_i2c_set_bus_speed()
http://patchwork.ozlabs.org/patch/601117/
- [U-Boot,v3] i2c: designware_i2c: Prepare for DM driver conversion
http://patchwork.ozlabs.org/patch/609406/

Quoted 1 line

Did I missed an update patch?

No, its most likely a problem with the updated patch from yesterday. Could you please use the "-3" option with "git am" to apply this patch? This works for me:

Quoted 7 lines
$ git am -3
~/Downloads/U-Boot-5-6-v2-i2c-designware_i2c-Add-DM-support\(1\).patch
Applying: i2c: designware_i2c: Add DM support
Using index info to reconstruct a base tree...
M       drivers/i2c/designware_i2c.c
Falling back to patching base and 3-way merge...
Auto-merging drivers/i2c/designware_i2c.c
Quoted 4 lines

Hmm... I use "git am -3" ... I see this log:
">> Kann nicht zu 3-Wege-Merge zur?ckfallen."

Do you really work on mainline, with only the patches I listed?

Yes, thats what I use. Perhaps a difference in the git version that explains why this works for me:

$ git --version
git version 2.8.1

If this does not work, I'll rebase all 6 patches again and send them to the list later.

Thanks,
Stefan

#11 lore raw

PATCH v2 4/6 i2c: designware_i2c: Prepare for DM driver conversion

Hello Stefan,

Am 13.04.2016 um 09:05 schrieb Stefan Roese:

Quoted 150 lines

Hi Heiko,

Quoted 147 lines · Heiko Schocher

Am 13.04.2016 um 07:56 schrieb Stefan Roese:

Quoted 135 lines

Hi Heiko,

Quoted 126 lines · Heiko Schocher

Hello Stefan,

Am 12.04.2016 um 15:22 schrieb Stefan Roese:

Quoted 39 lines

Hi Heiko,

Quoted 36 lines · Heiko Schocher

Am 23.03.2016 um 06:46 schrieb Stefan Roese:

Quoted 9 lines

This patch prepares the designware I2C driver for the DM conversion. This is mainly done by removing struct i2c_adapter from the functions that shall be used by the DM driver version as well.

Cc Simon Glass <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Heiko Schocher <[email protected]>
Quoted 7 lines

---
v2:
- Added Reviewed-by from Bin

   drivers/i2c/designware_i2c.c | 173
++++++++++++++++++++++---------------------
   1 file changed, 90 insertions(+), 83 deletions(-)

I tried to apply this patch, but get the following error:

Wende an: i2c: designware_i2c: Prepare for DM driver conversion
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c).
Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zur?ckzufallen.
Kann nicht zu 3-Wege-Merge zur?ckfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c:
Prepare for DM driver conversion

I tried the this patch on current mainline, with the following patches applied:

http://patchwork.ozlabs.org/patch/601112/
http://patchwork.ozlabs.org/patch/601128/
http://patchwork.ozlabs.org/patch/601117/

Quoted 7 lines
Quoted 1 line

Could you take a look?

This should be fixed with v3 of this patch:

https://patchwork.ozlabs.org/patch/609406/

Could you give it another try please?

Yes, this patch applies now fine, but the patch:

[U-Boot,5/6,v2] i2c: designware_i2c: Add DM support
http://patchwork.ozlabs.org/patch/601116/

fails now:

--2016-04-13 07:30:54-- http://patchwork.ozlabs.org/patch/601116/mbox
Aufl?sen des Hostnamens ?patchwork.ozlabs.org (patchwork.ozlabs.org)? ? 103.22.144.67, 2401:3900:2:1::2
Verbindungsaufbau zu patchwork.ozlabs.org (patchwork.ozlabs.org)|103.22.144.67|:80 ? verbunden. HTTP-Anforderung gesendet, auf Antwort wird gewartet ? 301 MOVED PERMANENTLY
Platz: http://patchwork.ozlabs.org/patch/601116/mbox/ [folgend] --2016-04-13 07:30:54-- http://patchwork.ozlabs.org/patch/601116/mbox/
Wiederverwendung der bestehenden Verbindung zu patchwork.ozlabs.org:80. HTTP-Anforderung gesendet, auf Antwort wird gewartet ? 200 OK L?nge: nicht spezifiziert [text/plain]
Wird in ??mbox?? gespeichert.

mbox [ <=>

                             ]   6,06K  --.-KB/s    in 0,004s
2016-04-13 07:30:54 (1,39 MB/s) - ?mbox? gespeichert [6202]

total: 0 errors, 0 warnings, 0 checks, 181 lines checked

NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE NETWORKING_BLOCK_COMMENT_STYLE PREFER_ETHER_ADDR_COPY USLEEP_RANGE

mbox has no obvious style problems and is ready for submission. Wende an: i2c: designware_i2c: Add DM support
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c).
Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zur?ckzufallen.
Kann nicht zu 3-Wege-Merge zur?ckfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c: Add DM support
Die Kopie des fehlgeschlagenen Patches befindet sich in:

     /home/hs/i2c/u-boot/.git/rebase-apply/patch

Wenn Sie das Problem gel?st haben, f?hren Sie "git am --continue" aus. Falls Sie diesen Patch auslassen m?chten, f?hren Sie stattdessen "git am --skip" aus.
Um den urspr?nglichen Branch wiederherzustellen und die Anwendung der Patches abzubrechen, f?hren Sie "git am --abort" aus. pollux:u-boot hs [master] $

Base is current mainline (with 2 i2c patches from Michal, but they should not interfere with your patches ...):

pollux:u-boot hs [master] $ git log --oneline
2ddd09a i2c: designware_i2c: Prepare for DM driver conversion f824253 i2c: designware_i2c: Integrate set_speed() into dw_i2c_set_bus_speed()
709a9e6 i2c: designware_i2c: Add dw_i2c_enable() helper function 1b89299 i2c: designware_i2c: Add ic_enable_status to ic_regs struct d4cc513 dm: i2c: Add driver for Cadence I2C IP
be332ef i2c: Describe Cadence I2C devicetree bindings 39fbd98 Merge git://www.denx.de/git/u-boot-marvell

patches from you in the above list:
- [U-Boot,1/6,v2] i2c: designware_i2c: Add ic_enable_status to ic_regs struct
http://patchwork.ozlabs.org/patch/601112/
- [U-Boot,2/6,v3] i2c: designware_i2c: Add dw_i2c_enable() helper function
http://patchwork.ozlabs.org/patch/601128/
- [U-Boot,3/6,v2] i2c: designware_i2c: Integrate set_speed() into dw_i2c_set_bus_speed()
http://patchwork.ozlabs.org/patch/601117/
- [U-Boot,v3] i2c: designware_i2c: Prepare for DM driver conversion
http://patchwork.ozlabs.org/patch/609406/

Quoted 1 line

Did I missed an update patch?

No, its most likely a problem with the updated patch from yesterday. Could you please use the "-3" option with "git am" to apply this patch? This works for me:

Quoted 7 lines
$ git am -3
~/Downloads/U-Boot-5-6-v2-i2c-designware_i2c-Add-DM-support\(1\).patch
Applying: i2c: designware_i2c: Add DM support
Using index info to reconstruct a base tree...
M       drivers/i2c/designware_i2c.c
Falling back to patching base and 3-way merge...
Auto-merging drivers/i2c/designware_i2c.c

Hmm... I use "git am -3" ... I see this log:
">> Kann nicht zu 3-Wege-Merge zur?ckfallen."

Quoted 7 lines
Quoted 1 line

Do you really work on mainline, with only the patches I listed?

Yes, thats what I use. Perhaps a difference in the git version that explains why this works for me:

$ git --version
git version 2.8.1

May this is the reason .... I have:
pollux:u-boot hs [master] $ git --version
git version 2.5.0
pollux:u-boot hs [master] $

Quoted 2 lines

If this does not work, I'll rebase all 6 patches again and send them to the list later.

Hmm... "patch" works ...

pollux:u-boot hs [i2c_designware] $ patch -p1 < mbox patching file drivers/i2c/designware_i2c.c Hunk #1 succeeded at 6 with fuzz 1.
Hunk #2 succeeded at 299 (offset 1 line). Hunk #3 succeeded at 360 (offset 1 line). Hunk #4 succeeded at 377 (offset 1 line). Hunk #5 succeeded@415 (offset 1 line). pollux:u-boot hs [i2c_designware] $

I pushed this branch to:
http://git.denx.de/?p=u-boot/u-boot-i2c.git;a=shortlog;h=refs/heads/i2c_designware

Could you recheck, if all is correct? (I start in the meanwhile a buildman compile for it ...)

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#12 lore raw

PATCH v2 4/6 i2c: designware_i2c: Prepare for DM driver conversion

Hi Heiko,

Quoted 197 lines · Heiko Schocher

Hello Stefan,

Am 13.04.2016 um 09:05 schrieb Stefan Roese:

Quoted 163 lines

Hi Heiko,

Quoted 159 lines · Heiko Schocher

Am 13.04.2016 um 07:56 schrieb Stefan Roese:

Quoted 145 lines

Hi Heiko,

Quoted 134 lines · Heiko Schocher

Hello Stefan,

Am 12.04.2016 um 15:22 schrieb Stefan Roese:

Quoted 44 lines

Hi Heiko,

Quoted 40 lines · Heiko Schocher

Am 23.03.2016 um 06:46 schrieb Stefan Roese:

Quoted 11 lines

This patch prepares the designware I2C driver for the DM conversion. This is mainly done by removing struct i2c_adapter from the functions
that shall be used by the DM driver version as well.

Cc Simon Glass <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Heiko Schocher <[email protected]>
Quoted 7 lines

---
v2:
- Added Reviewed-by from Bin

   drivers/i2c/designware_i2c.c | 173
++++++++++++++++++++++---------------------
   1 file changed, 90 insertions(+), 83 deletions(-)

I tried to apply this patch, but get the following error:

Wende an: i2c: designware_i2c: Prepare for DM driver conversion
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c).
Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zur?ckzufallen.
Kann nicht zu 3-Wege-Merge zur?ckfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c:
Prepare for DM driver conversion

I tried the this patch on current mainline, with the following patches applied:

http://patchwork.ozlabs.org/patch/601112/
http://patchwork.ozlabs.org/patch/601128/
http://patchwork.ozlabs.org/patch/601117/

Quoted 8 lines
Quoted 1 line

Could you take a look?

This should be fixed with v3 of this patch:

https://patchwork.ozlabs.org/patch/609406/

Could you give it another try please?

Yes, this patch applies now fine, but the patch:

[U-Boot,5/6,v2] i2c: designware_i2c: Add DM support
http://patchwork.ozlabs.org/patch/601116/

fails now:

--2016-04-13 07:30:54-- http://patchwork.ozlabs.org/patch/601116/mbox
Aufl?sen des Hostnamens ?patchwork.ozlabs.org (patchwork.ozlabs.org)? ? 103.22.144.67, 2401:3900:2:1::2
Verbindungsaufbau zu patchwork.ozlabs.org (patchwork.ozlabs.org)|103.22.144.67|:80 ? verbunden. HTTP-Anforderung gesendet, auf Antwort wird gewartet ? 301 MOVED PERMANENTLY
Platz: http://patchwork.ozlabs.org/patch/601116/mbox/ [folgend] --2016-04-13 07:30:54-- http://patchwork.ozlabs.org/patch/601116/mbox/
Wiederverwendung der bestehenden Verbindung zu patchwork.ozlabs.org:80. HTTP-Anforderung gesendet, auf Antwort wird gewartet ? 200 OK L?nge: nicht spezifiziert [text/plain]
Wird in ??mbox?? gespeichert.

mbox [ <=>

                             ]   6,06K  --.-KB/s    in 0,004s
2016-04-13 07:30:54 (1,39 MB/s) - ?mbox? gespeichert [6202]

total: 0 errors, 0 warnings, 0 checks, 181 lines checked

NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE NETWORKING_BLOCK_COMMENT_STYLE PREFER_ETHER_ADDR_COPY USLEEP_RANGE

mbox has no obvious style problems and is ready for submission. Wende an: i2c: designware_i2c: Add DM support
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c).
Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zur?ckzufallen.
Kann nicht zu 3-Wege-Merge zur?ckfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c: Add DM support
Die Kopie des fehlgeschlagenen Patches befindet sich in:

     /home/hs/i2c/u-boot/.git/rebase-apply/patch

Wenn Sie das Problem gel?st haben, f?hren Sie "git am --continue" aus. Falls Sie diesen Patch auslassen m?chten, f?hren Sie stattdessen "git am --skip" aus.
Um den urspr?nglichen Branch wiederherzustellen und die Anwendung der Patches abzubrechen, f?hren Sie "git am --abort" aus. pollux:u-boot hs [master] $

Base is current mainline (with 2 i2c patches from Michal, but they should not interfere with your patches ...):

pollux:u-boot hs [master] $ git log --oneline
2ddd09a i2c: designware_i2c: Prepare for DM driver conversion f824253 i2c: designware_i2c: Integrate set_speed() into dw_i2c_set_bus_speed()
709a9e6 i2c: designware_i2c: Add dw_i2c_enable() helper function 1b89299 i2c: designware_i2c: Add ic_enable_status to ic_regs struct d4cc513 dm: i2c: Add driver for Cadence I2C IP
be332ef i2c: Describe Cadence I2C devicetree bindings 39fbd98 Merge git://www.denx.de/git/u-boot-marvell

patches from you in the above list:
- [U-Boot,1/6,v2] i2c: designware_i2c: Add ic_enable_status to ic_regs struct
http://patchwork.ozlabs.org/patch/601112/
- [U-Boot,2/6,v3] i2c: designware_i2c: Add dw_i2c_enable() helper function
http://patchwork.ozlabs.org/patch/601128/
- [U-Boot,3/6,v2] i2c: designware_i2c: Integrate set_speed() into dw_i2c_set_bus_speed()
http://patchwork.ozlabs.org/patch/601117/
- [U-Boot,v3] i2c: designware_i2c: Prepare for DM driver conversion
http://patchwork.ozlabs.org/patch/609406/

Quoted 1 line

Did I missed an update patch?

No, its most likely a problem with the updated patch from yesterday. Could you please use the "-3" option with "git am" to apply this patch? This works for me:

Quoted 7 lines
$ git am -3
~/Downloads/U-Boot-5-6-v2-i2c-designware_i2c-Add-DM-support\(1\).patch
Applying: i2c: designware_i2c: Add DM support
Using index info to reconstruct a base tree...
M       drivers/i2c/designware_i2c.c
Falling back to patching base and 3-way merge...
Auto-merging drivers/i2c/designware_i2c.c

Hmm... I use "git am -3" ... I see this log:
">> Kann nicht zu 3-Wege-Merge zur?ckfallen."

Quoted 8 lines
Quoted 1 line

Do you really work on mainline, with only the patches I listed?

Yes, thats what I use. Perhaps a difference in the git version that explains why this works for me:

$ git --version
git version 2.8.1

May this is the reason .... I have:
pollux:u-boot hs [master] $ git --version
git version 2.5.0
pollux:u-boot hs [master] $

Quoted 2 lines

If this does not work, I'll rebase all 6 patches again and send them to the list later.

Hmm... "patch" works ...

pollux:u-boot hs [i2c_designware] $ patch -p1 < mbox patching file drivers/i2c/designware_i2c.c Hunk #1 succeeded at 6 with fuzz 1.
Hunk #2 succeeded at 299 (offset 1 line). Hunk #3 succeeded at 360 (offset 1 line). Hunk #4 succeeded at 377 (offset 1 line). Hunk #5 succeeded at 415 (offset 1 line). pollux:u-boot hs [i2c_designware] $

Quoted 6 lines

I pushed this branch to:
http://git.denx.de/?p=u-boot/u-boot-i2c.git;a=shortlog;h=refs/heads/i2c_designware

Could you recheck, if all is correct? (I start in the meanwhile a buildman compile for it ...)

I think we still need wait for Simon's input on dev_get_addr(), before applying this series. Stefan?

Regards,
Bin

#13 lore raw

PATCH v2 4/6 i2c: designware_i2c: Prepare for DM driver conversion

Hi Bin,

(added Simon to Cc)

Quoted 203 lines · Bin Meng

Hi Heiko,

Quoted 200 lines · Heiko Schocher

Hello Stefan,

Am 13.04.2016 um 09:05 schrieb Stefan Roese:

Quoted 163 lines

Hi Heiko,

Quoted 159 lines · Heiko Schocher

Am 13.04.2016 um 07:56 schrieb Stefan Roese:

Quoted 145 lines

Hi Heiko,

Quoted 134 lines · Heiko Schocher

Hello Stefan,

Am 12.04.2016 um 15:22 schrieb Stefan Roese:

Quoted 44 lines

Hi Heiko,

Quoted 40 lines · Heiko Schocher

Am 23.03.2016 um 06:46 schrieb Stefan Roese:

Quoted 11 lines

This patch prepares the designware I2C driver for the DM conversion. This is mainly done by removing struct i2c_adapter from the functions
that shall be used by the DM driver version as well.

Cc Simon Glass <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Heiko Schocher <[email protected]>
Quoted 7 lines

---
v2:
- Added Reviewed-by from Bin

    drivers/i2c/designware_i2c.c | 173
++++++++++++++++++++++---------------------
    1 file changed, 90 insertions(+), 83 deletions(-)

I tried to apply this patch, but get the following error:

Wende an: i2c: designware_i2c: Prepare for DM driver conversion
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c).
Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zur?ckzufallen.
Kann nicht zu 3-Wege-Merge zur?ckfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c:
Prepare for DM driver conversion

I tried the this patch on current mainline, with the following patches applied:

http://patchwork.ozlabs.org/patch/601112/
http://patchwork.ozlabs.org/patch/601128/
http://patchwork.ozlabs.org/patch/601117/

Quoted 8 lines
Quoted 1 line

Could you take a look?

This should be fixed with v3 of this patch:

https://patchwork.ozlabs.org/patch/609406/

Could you give it another try please?

Yes, this patch applies now fine, but the patch:

[U-Boot,5/6,v2] i2c: designware_i2c: Add DM support
http://patchwork.ozlabs.org/patch/601116/

fails now:

--2016-04-13 07:30:54-- http://patchwork.ozlabs.org/patch/601116/mbox
Aufl?sen des Hostnamens ?patchwork.ozlabs.org (patchwork.ozlabs.org)? ? 103.22.144.67, 2401:3900:2:1::2
Verbindungsaufbau zu patchwork.ozlabs.org (patchwork.ozlabs.org)|103.22.144.67|:80 ? verbunden. HTTP-Anforderung gesendet, auf Antwort wird gewartet ? 301 MOVED PERMANENTLY
Platz: http://patchwork.ozlabs.org/patch/601116/mbox/ [folgend] --2016-04-13 07:30:54-- http://patchwork.ozlabs.org/patch/601116/mbox/
Wiederverwendung der bestehenden Verbindung zu patchwork.ozlabs.org:80. HTTP-Anforderung gesendet, auf Antwort wird gewartet ? 200 OK L?nge: nicht spezifiziert [text/plain]
Wird in ??mbox?? gespeichert.

mbox [ <=>

                              ]   6,06K  --.-KB/s    in 0,004s
2016-04-13 07:30:54 (1,39 MB/s) - ?mbox? gespeichert [6202]

total: 0 errors, 0 warnings, 0 checks, 181 lines checked

NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE NETWORKING_BLOCK_COMMENT_STYLE PREFER_ETHER_ADDR_COPY USLEEP_RANGE

mbox has no obvious style problems and is ready for submission. Wende an: i2c: designware_i2c: Add DM support
fatal: sha1 information is lacking or useless (drivers/i2c/designware_i2c.c).
Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge zur?ckzufallen.
Kann nicht zu 3-Wege-Merge zur?ckfallen.
Anwendung des Patches fehlgeschlagen bei 0001 i2c: designware_i2c: Add DM support
Die Kopie des fehlgeschlagenen Patches befindet sich in:

      /home/hs/i2c/u-boot/.git/rebase-apply/patch

Wenn Sie das Problem gel?st haben, f?hren Sie "git am --continue" aus. Falls Sie diesen Patch auslassen m?chten, f?hren Sie stattdessen "git am --skip" aus.
Um den urspr?nglichen Branch wiederherzustellen und die Anwendung der Patches abzubrechen, f?hren Sie "git am --abort" aus. pollux:u-boot hs [master] $

Base is current mainline (with 2 i2c patches from Michal, but they should not interfere with your patches ...):

pollux:u-boot hs [master] $ git log --oneline
2ddd09a i2c: designware_i2c: Prepare for DM driver conversion f824253 i2c: designware_i2c: Integrate set_speed() into dw_i2c_set_bus_speed()
709a9e6 i2c: designware_i2c: Add dw_i2c_enable() helper function 1b89299 i2c: designware_i2c: Add ic_enable_status to ic_regs struct d4cc513 dm: i2c: Add driver for Cadence I2C IP
be332ef i2c: Describe Cadence I2C devicetree bindings 39fbd98 Merge git://www.denx.de/git/u-boot-marvell

patches from you in the above list:
- [U-Boot,1/6,v2] i2c: designware_i2c: Add ic_enable_status to ic_regs struct
http://patchwork.ozlabs.org/patch/601112/
- [U-Boot,2/6,v3] i2c: designware_i2c: Add dw_i2c_enable() helper function
http://patchwork.ozlabs.org/patch/601128/
- [U-Boot,3/6,v2] i2c: designware_i2c: Integrate set_speed() into dw_i2c_set_bus_speed()
http://patchwork.ozlabs.org/patch/601117/
- [U-Boot,v3] i2c: designware_i2c: Prepare for DM driver conversion
http://patchwork.ozlabs.org/patch/609406/

Quoted 1 line

Did I missed an update patch?

No, its most likely a problem with the updated patch from yesterday. Could you please use the "-3" option with "git am" to apply this patch? This works for me:

Quoted 7 lines
$ git am -3
~/Downloads/U-Boot-5-6-v2-i2c-designware_i2c-Add-DM-support\(1\).patch
Applying: i2c: designware_i2c: Add DM support
Using index info to reconstruct a base tree...
M       drivers/i2c/designware_i2c.c
Falling back to patching base and 3-way merge...
Auto-merging drivers/i2c/designware_i2c.c

Hmm... I use "git am -3" ... I see this log:
">> Kann nicht zu 3-Wege-Merge zur?ckfallen."

Quoted 8 lines
Quoted 1 line

Do you really work on mainline, with only the patches I listed?

Yes, thats what I use. Perhaps a difference in the git version that explains why this works for me:

$ git --version
git version 2.8.1

May this is the reason .... I have:
pollux:u-boot hs [master] $ git --version
git version 2.5.0
pollux:u-boot hs [master] $

Quoted 2 lines

If this does not work, I'll rebase all 6 patches again and send them to the list later.

Hmm... "patch" works ...

pollux:u-boot hs [i2c_designware] $ patch -p1 < mbox patching file drivers/i2c/designware_i2c.c Hunk #1 succeeded at 6 with fuzz 1.
Hunk #2 succeeded at 299 (offset 1 line). Hunk #3 succeeded at 360 (offset 1 line). Hunk #4 succeeded at 377 (offset 1 line). Hunk #5 succeeded at 415 (offset 1 line). pollux:u-boot hs [i2c_designware] $

I pushed this branch to:
http://git.denx.de/?p=u-boot/u-boot-i2c.git;a=shortlog;h=refs/heads/i2c_designware

Quoted 6 lines
Quoted 3 lines

Could you recheck, if all is correct? (I start in the meanwhile a buildman compile for it ...)

I think we still need wait for Simon's input on dev_get_addr(), before applying this series. Stefan?

Yes, I would also like to have a comment from Simon on this. I've asked Simon a few times in the past days. But I would really like to see these driver changes integrated in this release. If Simon (or somebody else) has some better ideas to handle this, I can provide some follow-up patches.

Thanks,
Stefan

#14 lore raw

PATCH v2 5/6 i2c: designware_i2c: Add DM support

In reply to Stefan Roese

This patch adds DM support to the designware I2C driver. It currently supports DM and the legacy I2C support. The legacy support should be removed, once all platforms using it have DM enabled.

Cc Simon Glass <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Heiko Schocher <[email protected]>

---
v2:
- Fix typos in comments
- Use single line comments where appropriate
- Added Reviewed-by from Bin

 drivers/i2c/designware_i2c.c | 149 +++++++++++++++++++++++++++++++++++--------
 1 file changed, 123 insertions(+), 26 deletions(-)
drivers/i2c/designware_i2c.c +123 -26
index 8dd1de9..886897c 100644
@@ -6,10 +6,15 @@
  */
 
 #include <common.h>
+#include <dm.h>
 #include <i2c.h>
 #include <asm/io.h>
 #include "designware_i2c.h"
 
+struct dw_i2c {
+	struct i2c_regs *regs;
+};
+
 static void dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
 {
 	int timeout = 100;
@@ -293,6 +298,36 @@ static int __dw_i2c_write(struct i2c_regs *i2c_base, u8 dev, uint addr,
 	return i2c_xfer_finish(i2c_base);
 }
 
+/*
+ * __dw_i2c_init - Init function
+ * @speed:	required i2c speed
+ * @slaveaddr:	slave address for the device
+ *
+ * Initialization function.
+ */
+static void __dw_i2c_init(struct i2c_regs *i2c_base, int speed, int slaveaddr)
+{
+	/* Disable i2c */
+	dw_i2c_enable(i2c_base, false);
+
+	writel((IC_CON_SD | IC_CON_SPD_FS | IC_CON_MM), &i2c_base->ic_con);
+	writel(IC_RX_TL, &i2c_base->ic_rx_tl);
+	writel(IC_TX_TL, &i2c_base->ic_tx_tl);
+	writel(IC_STOP_DET, &i2c_base->ic_intr_mask);
+#ifndef CONFIG_DM_I2C
+	__dw_i2c_set_bus_speed(i2c_base, speed);
+	writel(slaveaddr, &i2c_base->ic_sar);
+#endif
+
+	/* Enable i2c */
+	dw_i2c_enable(i2c_base, true);
+}
+
+#ifndef CONFIG_DM_I2C
+/*
+ * The legacy I2C functions. These need to get removed once
+ * all users of this driver are converted to DM.
+ */
 static struct i2c_regs *i2c_get_base(struct i2c_adapter *adap)
 {
 	switch (adap->hwadapnr) {
@@ -324,30 +359,9 @@ static unsigned int dw_i2c_set_bus_speed(struct i2c_adapter *adap,
 	return __dw_i2c_set_bus_speed(i2c_get_base(adap), speed);
 }
 
-/*
- * i2c_init - Init function
- * @speed:	required i2c speed
- * @slaveaddr:	slave address for the device
- *
- * Initialization function.
- */
-static void dw_i2c_init(struct i2c_adapter *adap, int speed,
-			int slaveaddr)
+static void dw_i2c_init(struct i2c_adapter *adap, int speed, int slaveaddr)
 {
-	struct i2c_regs *i2c_base = i2c_get_base(adap);
-
-	/* Disable i2c */
-	dw_i2c_enable(i2c_base, false);
-
-	writel((IC_CON_SD | IC_CON_SPD_FS | IC_CON_MM), &i2c_base->ic_con);
-	writel(IC_RX_TL, &i2c_base->ic_rx_tl);
-	writel(IC_TX_TL, &i2c_base->ic_tx_tl);
-	dw_i2c_set_bus_speed(adap, speed);
-	writel(IC_STOP_DET, &i2c_base->ic_intr_mask);
-	writel(slaveaddr, &i2c_base->ic_sar);
-
-	/* Enable i2c */
-	dw_i2c_enable(i2c_base, true);
+	__dw_i2c_init(i2c_get_base(adap), speed, slaveaddr);
 }
 
 static int dw_i2c_read(struct i2c_adapter *adap, u8 dev, uint addr,
@@ -362,9 +376,7 @@ static int dw_i2c_write(struct i2c_adapter *adap, u8 dev, uint addr,
 	return __dw_i2c_write(i2c_get_base(adap), dev, addr, alen, buffer, len);
 }
 
-/*
- * i2c_probe - Probe the i2c chip
- */
+/* dw_i2c_probe - Probe the i2c chip */
 static int dw_i2c_probe(struct i2c_adapter *adap, u8 dev)
 {
 	struct i2c_regs *i2c_base = i2c_get_base(adap);
@@ -402,3 +414,88 @@ U_BOOT_I2C_ADAP_COMPLETE(dw_3, dw_i2c_init, dw_i2c_probe, dw_i2c_read,
 			 dw_i2c_write, dw_i2c_set_bus_speed,
 			 CONFIG_SYS_I2C_SPEED3, CONFIG_SYS_I2C_SLAVE3, 3)
 #endif
+
+#else /* CONFIG_DM_I2C */
+/* The DM I2C functions */
+
+static int designware_i2c_xfer(struct udevice *bus, struct i2c_msg *msg,
+			       int nmsgs)
+{
+	struct dw_i2c *i2c = dev_get_priv(bus);
+	int ret;
+
+	debug("i2c_xfer: %d messages\n", nmsgs);
+	for (; nmsgs > 0; nmsgs--, msg++) {
+		debug("i2c_xfer: chip=0x%x, len=0x%x\n", msg->addr, msg->len);
+		if (msg->flags & I2C_M_RD) {
+			ret = __dw_i2c_read(i2c->regs, msg->addr, 0, 0,
+					    msg->buf, msg->len);
+		} else {
+			ret = __dw_i2c_write(i2c->regs, msg->addr, 0, 0,
+					     msg->buf, msg->len);
+		}
+		if (ret) {
+			debug("i2c_write: error sending\n");
+			return -EREMOTEIO;
+		}
+	}
+
+	return 0;
+}
+
+static int designware_i2c_set_bus_speed(struct udevice *bus, unsigned int speed)
+{
+	struct dw_i2c *i2c = dev_get_priv(bus);
+
+	return __dw_i2c_set_bus_speed(i2c->regs, speed);
+}
+
+static int designware_i2c_probe_chip(struct udevice *bus, uint chip_addr,
+				     uint chip_flags)
+{
+	struct dw_i2c *i2c = dev_get_priv(bus);
+	struct i2c_regs *i2c_base = i2c->regs;
+	u32 tmp;
+	int ret;
+
+	/* Try to read the first location of the chip */
+	ret = __dw_i2c_read(i2c_base, chip_addr, 0, 1, (uchar *)&tmp, 1);
+	if (ret)
+		__dw_i2c_init(i2c_base, 0, 0);
+
+	return ret;
+}
+
+static int designware_i2c_probe(struct udevice *bus)
+{
+	struct dw_i2c *priv = dev_get_priv(bus);
+
+	/* Save base address from device-tree */
+	priv->regs = (struct i2c_regs *)dev_get_addr(bus);
+
+	__dw_i2c_init(priv->regs, 0, 0);
+
+	return 0;
+}
+
+static const struct dm_i2c_ops designware_i2c_ops = {
+	.xfer		= designware_i2c_xfer,
+	.probe_chip	= designware_i2c_probe_chip,
+	.set_bus_speed	= designware_i2c_set_bus_speed,
+};
+
+static const struct udevice_id designware_i2c_ids[] = {
+	{ .compatible = "snps,designware-i2c" },
+	{ }
+};
+
+U_BOOT_DRIVER(i2c_designware) = {
+	.name	= "i2c_designware",
+	.id	= UCLASS_I2C,
+	.of_match = designware_i2c_ids,
+	.probe	= designware_i2c_probe,
+	.priv_auto_alloc_size = sizeof(struct dw_i2c),
+	.ops	= &designware_i2c_ops,
+};
+
+#endif /* CONFIG_DM_I2C */
Signature · 1 line
2.7.4
#15 lore raw

PATCH v2 6/6 i2c: designware_i2c: Add support for PCI(e) based I2C cores (x86)

In reply to Stefan Roese

This patch adds support for the PCI(e) based I2C cores. Which can be found for example on the Intel Bay Trail SoC. It has 7 I2C controllers implemented as PCI devices.

This patch also adds the fixed values for the timing registers for BayTrail which are taken from the Linux designware I2C driver.

Cc Simon Glass <[email protected]>
Cc Bin Meng <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Heiko Schocher <[email protected]>

---
v2:
- Use device_is_on_pci_bus(dev) in designware_i2c_probe()

 drivers/i2c/designware_i2c.c | 131 +++++++++++++++++++++++++++++++++++++++----
 1 file changed, 119 insertions(+), 12 deletions(-)
drivers/i2c/designware_i2c.c +119 -12
index 886897c..23c5985 100644
@@ -8,11 +8,32 @@
 #include <common.h>
 #include <dm.h>
 #include <i2c.h>
+#include <pci.h>
 #include <asm/io.h>
 #include "designware_i2c.h"
 
+struct dw_scl_sda_cfg {
+	u32 ss_hcnt;
+	u32 fs_hcnt;
+	u32 ss_lcnt;
+	u32 fs_lcnt;
+	u32 sda_hold;
+};
+
+#ifdef CONFIG_X86
+/* BayTrail HCNT/LCNT/SDA hold time */
+static struct dw_scl_sda_cfg byt_config = {
+	.ss_hcnt = 0x200,
+	.fs_hcnt = 0x55,
+	.ss_lcnt = 0x200,
+	.fs_lcnt = 0x99,
+	.sda_hold = 0x6,
+};
+#endif
+
 struct dw_i2c {
 	struct i2c_regs *regs;
+	struct dw_scl_sda_cfg *scl_sda_cfg;
 };
 
 static void dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
@@ -42,6 +63,7 @@ static void dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
  * Set the i2c speed.
  */
 static unsigned int __dw_i2c_set_bus_speed(struct i2c_regs *i2c_base,
+					   struct dw_scl_sda_cfg *scl_sda_cfg,
 					   unsigned int speed)
 {
 	unsigned int cntl;
@@ -61,34 +83,55 @@ static unsigned int __dw_i2c_set_bus_speed(struct i2c_regs *i2c_base,
 	cntl = (readl(&i2c_base->ic_con) & (~IC_CON_SPD_MSK));
 
 	switch (i2c_spd) {
+#ifndef CONFIG_X86 /* No High-speed for BayTrail yet */
 	case IC_SPEED_MODE_MAX:
-		cntl |= IC_CON_SPD_HS;
-		hcnt = (IC_CLK * MIN_HS_SCL_HIGHTIME) / NANO_TO_MICRO;
+		cntl |= IC_CON_SPD_SS;
+		if (scl_sda_cfg) {
+			hcnt = scl_sda_cfg->fs_hcnt;
+			lcnt = scl_sda_cfg->fs_lcnt;
+		} else {
+			hcnt = (IC_CLK * MIN_HS_SCL_HIGHTIME) / NANO_TO_MICRO;
+			lcnt = (IC_CLK * MIN_HS_SCL_LOWTIME) / NANO_TO_MICRO;
+		}
 		writel(hcnt, &i2c_base->ic_hs_scl_hcnt);
-		lcnt = (IC_CLK * MIN_HS_SCL_LOWTIME) / NANO_TO_MICRO;
 		writel(lcnt, &i2c_base->ic_hs_scl_lcnt);
 		break;
+#endif
 
 	case IC_SPEED_MODE_STANDARD:
 		cntl |= IC_CON_SPD_SS;
-		hcnt = (IC_CLK * MIN_SS_SCL_HIGHTIME) / NANO_TO_MICRO;
+		if (scl_sda_cfg) {
+			hcnt = scl_sda_cfg->ss_hcnt;
+			lcnt = scl_sda_cfg->ss_lcnt;
+		} else {
+			hcnt = (IC_CLK * MIN_SS_SCL_HIGHTIME) / NANO_TO_MICRO;
+			lcnt = (IC_CLK * MIN_SS_SCL_LOWTIME) / NANO_TO_MICRO;
+		}
 		writel(hcnt, &i2c_base->ic_ss_scl_hcnt);
-		lcnt = (IC_CLK * MIN_SS_SCL_LOWTIME) / NANO_TO_MICRO;
 		writel(lcnt, &i2c_base->ic_ss_scl_lcnt);
 		break;
 
 	case IC_SPEED_MODE_FAST:
 	default:
 		cntl |= IC_CON_SPD_FS;
-		hcnt = (IC_CLK * MIN_FS_SCL_HIGHTIME) / NANO_TO_MICRO;
+		if (scl_sda_cfg) {
+			hcnt = scl_sda_cfg->fs_hcnt;
+			lcnt = scl_sda_cfg->fs_lcnt;
+		} else {
+			hcnt = (IC_CLK * MIN_FS_SCL_HIGHTIME) / NANO_TO_MICRO;
+			lcnt = (IC_CLK * MIN_FS_SCL_LOWTIME) / NANO_TO_MICRO;
+		}
 		writel(hcnt, &i2c_base->ic_fs_scl_hcnt);
-		lcnt = (IC_CLK * MIN_FS_SCL_LOWTIME) / NANO_TO_MICRO;
 		writel(lcnt, &i2c_base->ic_fs_scl_lcnt);
 		break;
 	}
 
 	writel(cntl, &i2c_base->ic_con);
 
+	/* Configure SDA Hold Time if required */
+	if (scl_sda_cfg)
+		writel(scl_sda_cfg->sda_hold, &i2c_base->ic_sda_hold);
+
 	/* Enable back i2c now speed set */
 	dw_i2c_enable(i2c_base, true);
 
@@ -315,7 +358,7 @@ static void __dw_i2c_init(struct i2c_regs *i2c_base, int speed, int slaveaddr)
 	writel(IC_TX_TL, &i2c_base->ic_tx_tl);
 	writel(IC_STOP_DET, &i2c_base->ic_intr_mask);
 #ifndef CONFIG_DM_I2C
-	__dw_i2c_set_bus_speed(i2c_base, speed);
+	__dw_i2c_set_bus_speed(i2c_base, NULL, speed);
 	writel(slaveaddr, &i2c_base->ic_sar);
 #endif
 
@@ -356,7 +399,7 @@ static unsigned int dw_i2c_set_bus_speed(struct i2c_adapter *adap,
 					 unsigned int speed)
 {
 	adap->speed = speed;
-	return __dw_i2c_set_bus_speed(i2c_get_base(adap), speed);
+	return __dw_i2c_set_bus_speed(i2c_get_base(adap), NULL, speed);
 }
 
 static void dw_i2c_init(struct i2c_adapter *adap, int speed, int slaveaddr)
@@ -447,7 +490,7 @@ static int designware_i2c_set_bus_speed(struct udevice *bus, unsigned int speed)
 {
 	struct dw_i2c *i2c = dev_get_priv(bus);
 
-	return __dw_i2c_set_bus_speed(i2c->regs, speed);
+	return __dw_i2c_set_bus_speed(i2c->regs, i2c->scl_sda_cfg, speed);
 }
 
 static int designware_i2c_probe_chip(struct udevice *bus, uint chip_addr,
@@ -470,14 +513,61 @@ static int designware_i2c_probe(struct udevice *bus)
 {
 	struct dw_i2c *priv = dev_get_priv(bus);
 
-	/* Save base address from device-tree */
-	priv->regs = (struct i2c_regs *)dev_get_addr(bus);
+	if (device_is_on_pci_bus(bus)) {
+#ifdef CONFIG_DM_PCI
+		/* Save base address from PCI BAR */
+		priv->regs = (struct i2c_regs *)
+			dm_pci_map_bar(bus, PCI_BASE_ADDRESS_0, PCI_REGION_MEM);
+#ifdef CONFIG_X86
+		/* Use BayTrail specific timing values */
+		priv->scl_sda_cfg = &byt_config;
+#endif
+#endif
+	} else {
+		/* Save base address from device-tree */
+
+		/*
+		 * On x86, "fdt_addr_t" is 64bit but "void *" only 32bit.
+		 * So assigning the register base directly in dev_get_addr()
+		 * results in this compilation warning:
+		 *   warning: cast to pointer from integer of different size
+		 *
+		 * Using this macro __UINTPTR_TYPE__, allows us to cast the
+		 * result of dev_get_addr() into a 32bit value before casting
+		 * it to the pointer (struct i2c_regs *).
+		 */
+		priv->regs =
+			(struct i2c_regs *)(__UINTPTR_TYPE__)dev_get_addr(bus);
+	}
 
 	__dw_i2c_init(priv->regs, 0, 0);
 
 	return 0;
 }
 
+static int designware_i2c_bind(struct udevice *dev)
+{
+	static int num_cards;
+	char name[20];
+
+	/* Create a unique device name for PCI type devices */
+	if (device_is_on_pci_bus(dev)) {
+		/*
+		 * ToDo:
+		 * Setting req_seq in the driver is probably not recommended.
+		 * But without a DT alias the number is not configured. And
+		 * using this driver is impossible for PCIe I2C devices.
+		 * This can be removed, once a better (correct) way for this
+		 * is found and implemented.
+		 */
+		dev->req_seq = num_cards;
+		sprintf(name, "i2c_designware#%u", num_cards++);
+		device_set_name(dev, name);
+	}
+
+	return 0;
+}
+
 static const struct dm_i2c_ops designware_i2c_ops = {
 	.xfer		= designware_i2c_xfer,
 	.probe_chip	= designware_i2c_probe_chip,
@@ -493,9 +583,26 @@ U_BOOT_DRIVER(i2c_designware) = {
 	.name	= "i2c_designware",
 	.id	= UCLASS_I2C,
 	.of_match = designware_i2c_ids,
+	.bind	= designware_i2c_bind,
 	.probe	= designware_i2c_probe,
 	.priv_auto_alloc_size = sizeof(struct dw_i2c),
 	.ops	= &designware_i2c_ops,
 };
 
+#ifdef CONFIG_X86
+static struct pci_device_id designware_pci_supported[] = {
+	/* Intel BayTrail has 7 I2C controller located on the PCI bus */
+	{ PCI_VDEVICE(INTEL, 0x0f41) },
+	{ PCI_VDEVICE(INTEL, 0x0f42) },
+	{ PCI_VDEVICE(INTEL, 0x0f43) },
+	{ PCI_VDEVICE(INTEL, 0x0f44) },
+	{ PCI_VDEVICE(INTEL, 0x0f45) },
+	{ PCI_VDEVICE(INTEL, 0x0f46) },
+	{ PCI_VDEVICE(INTEL, 0x0f47) },
+	{},
+};
+
+U_BOOT_PCI_DEVICE(i2c_designware, designware_pci_supported);
+#endif
+
 #endif /* CONFIG_DM_I2C */
Signature · 1 line
2.7.4