Skip to contentSkip to conversation

i2c: mxc: refactor i2c driver and support dm

PATCH Superseded Peng Fan 3 participants 7 messages Apr 27, 2015 – May 14, 2015

Subsystems (3)

v3 of 5 Superseded Latest is v5 →

lore
Share & tools
lore

Peng Fan

author
#0 lore raw

PATCH v3 1/1 i2c: mxc: refactor i2c driver and support dm

1. Introduce a new structure struct mxc_i2c_bus, this structure will used for non-DM and DM.
2. Remove struct mxc_i2c_regs structure, but use register offset to access registers based on base entry of struct mxc_i2c_bus.
3. Remove most #ifdef I2C_QUIRK_REG. Using driver_data to contain platform flags. A new flag is introduced, I2C_QUIRK_FLAG.
4. Most functions use struct mxc_i2c_bus as one of the parameters. Make most functions common to DM and non-DM, try to avoid duplicated code.
5. Support DM. Pinmux setting is still set by setup_i2c, but we do not need bus_i2c_init for DM.
6. struct i2c_parms and struct sram_data are removed.
7. Remove bus_i2c_read bus_i2c_write prototype in header file. The frist paramter of bus_i2c_init is modified to i2c index. Add new prototype i2c_idle_bus and force_idle_bus. Since bus_i2c_init is not good for DM I2C and pinctrl is missed, we use a weak function for i2c_idle_bus for DM part.
Board file take the responsibility to implement this function, like this:
"
int i2c_idle_bus(struct mxc_i2c_bus *i2c_bus)

   {
	   if (i2c_bus->index == 0)
		   force_idle_bus(i2c_pads_info0);
	   else if (i2c_bus->index == 1)
		   force_idle_bus(i2c_pads_info1);
	   else
		   xxxxxx

}
"

---

Changes v3:
1. remove bus_i2c_init for DM, introuduce a weak function i2c_idle_bus.
2. remove static return type for force_idle_bus, since we need to call it in i2c_idle_bus which may be implemented in board file. This does not hurt for non-DM.

Changes v2:
1. Refactor driver, remove register access based on structure, but use 'base + offset'
2. Introduce mxc_i2c_bus structure
3. Introduce I2C_QUIRK_FLAG and remove most I2C_QUIRK_REG and use driver_data to contain the flags for different platforms
4. Avoid duplicated code between DM and non-DM part
5. The function name i2c_init_transfer is not changed.
6. Remove bus_i2c_read/write prototype from header file
7. change bus_i2c_init's first parameter to i2c index
8. Rename patch name, since refactor non-DM part.

 arch/arm/imx-common/i2c-mxv7.c            |   7 +-
 arch/arm/include/asm/imx-common/mxc_i2c.h |  38 +-
 drivers/i2c/mxc_i2c.c                     | 575 ++++++++++++++++++++----------
 3 files changed, 426 insertions(+), 194 deletions(-)
arch/arm/imx-common/i2c-mxv7.c +4 -3
index 1a632e7..f3a5c3f 100644
@@ -12,7 +12,7 @@
 #include <asm/imx-common/mxc_i2c.h>
 #include <watchdog.h>
 
-static int force_idle_bus(void *priv)
+int force_idle_bus(void *priv)
 {
 	int i;
 	int sda, scl;
@@ -99,8 +99,9 @@ int setup_i2c(unsigned i2c_index, int speed, int slave_addr,
 	if (ret)
 		goto err_idle;
 
-	bus_i2c_init(i2c_bases[i2c_index], speed, slave_addr,
-			force_idle_bus, p);
+#ifndef CONFIG_DM_I2C
+	bus_i2c_init(i2c_index, speed, slave_addr, force_idle_bus, p);
+#endif
 
 	return 0;
 
arch/arm/include/asm/imx-common/mxc_i2c.h +33 -5
index af86163..355b25e 100644
@@ -19,6 +19,36 @@ struct i2c_pads_info {
 	struct i2c_pin_ctrl sda;
 };
 
+/*
+ * Information about i2c controller
+ * struct mxc_i2c_bus - information about the i2c[x] bus
+ * @index: i2c bus index
+ * @base: Address of I2C bus controller
+ * @driver_data: Flags for different platforms, such as I2C_QUIRK_FLAG.
+ * @speed: Speed of I2C bus
+ * @pads_info: pinctrl info for this i2c bus, will be used when pinctrl is ok.
+ * The following two is only to be compatible with non-DM part.
+ * @idle_bus_fn: function to force bus idle
+ * @idle_bus_data: parameter for idle_bus_fun
+ */
+struct mxc_i2c_bus {
+	/*
+	 * board file can use this index to locate which i2c_pads_info is for
+	 * i2c_idle_bus. When pinmux is implement, this entry can be
+	 * discarded. Here we do not use dev->seq, because we do not want to
+	 * export device to board file.
+	 */
+	int index;
+	ulong base;
+	ulong driver_data;
+	int speed;
+	struct i2c_pads_info *pads_info;
+#ifndef CONFIG_DM_I2C
+	int (*idle_bus_fn)(void *p);
+	void *idle_bus_data;
+#endif
+};
+
 #if defined(CONFIG_MX6QDL)
 #define I2C_PADS(name, scl_i2c, scl_gpio, scl_gp, sda_i2c, sda_gpio, sda_gp) \
 	struct i2c_pads_info mx6q_##name = {		\
@@ -54,10 +84,8 @@ struct i2c_pads_info {
 
 int setup_i2c(unsigned i2c_index, int speed, int slave_addr,
 	      struct i2c_pads_info *p);
-void bus_i2c_init(void *base, int speed, int slave_addr,
+void bus_i2c_init(int index, int speed, int slave_addr,
 		int (*idle_bus_fn)(void *p), void *p);
-int bus_i2c_read(void *base, uchar chip, uint addr, int alen, uchar *buf,
-		int len);
-int bus_i2c_write(void *base, uchar chip, uint addr, int alen,
-		const uchar *buf, int len);
+int force_idle_bus(void *priv);
+int i2c_idle_bus(struct mxc_i2c_bus *i2c_bus);
 #endif
drivers/i2c/mxc_i2c.c +389 -186

778 lines not on this page · raw message

Signature · 1 line
1.8.4
#1 lore raw

PATCH v3 1/1 i2c: mxc: refactor i2c driver and support dm

Quoted 30 lines · Peng Fan

1. Introduce a new structure struct mxc_i2c_bus, this structure will used for non-DM and DM.
2. Remove struct mxc_i2c_regs structure, but use register offset to access registers based on base entry of struct mxc_i2c_bus.
3. Remove most #ifdef I2C_QUIRK_REG. Using driver_data to contain platform flags. A new flag is introduced, I2C_QUIRK_FLAG.
4. Most functions use struct mxc_i2c_bus as one of the parameters. Make most functions common to DM and non-DM, try to avoid duplicated code.
5. Support DM. Pinmux setting is still set by setup_i2c, but we do not need bus_i2c_init for DM.
6. struct i2c_parms and struct sram_data are removed.
7. Remove bus_i2c_read bus_i2c_write prototype in header file. The frist paramter of bus_i2c_init is modified to i2c index. Add new prototype i2c_idle_bus and force_idle_bus. Since bus_i2c_init is not good for DM I2C and pinctrl is missed, we use a weak function for i2c_idle_bus for DM part.
Board file take the responsibility to implement this function, like this:

   "
   int i2c_idle_bus(struct mxc_i2c_bus *i2c_bus)
   {
           if (i2c_bus->index == 0)
                   force_idle_bus(i2c_pads_info0);
           else if (i2c_bus->index == 1)
                   force_idle_bus(i2c_pads_info1);
           else
                   xxxxxx
   }
   "
Quoted 8 lines

---

Changes v3:
1. remove bus_i2c_init for DM, introuduce a weak function i2c_idle_bus.
2. remove static return type for force_idle_bus, since we need to call it in i2c_idle_bus which may be implemented in board file. This does not hurt for non-DM.

Quoted 18 lines

Changes v2:
1. Refactor driver, remove register access based on structure, but use 'base + offset'
2. Introduce mxc_i2c_bus structure
3. Introduce I2C_QUIRK_FLAG and remove most I2C_QUIRK_REG and use driver_data to contain the flags for different platforms
4. Avoid duplicated code between DM and non-DM part
5. The function name i2c_init_transfer is not changed.
6. Remove bus_i2c_read/write prototype from header file
7. change bus_i2c_init's first parameter to i2c index
8. Rename patch name, since refactor non-DM part.

 arch/arm/imx-common/i2c-mxv7.c            |   7 +-
 arch/arm/include/asm/imx-common/mxc_i2c.h |  38 +-
 drivers/i2c/mxc_i2c.c                     | 575 ++++++++++++++++++++----------
 3 files changed, 426 insertions(+), 194 deletions(-)
author
#2 lore raw

PATCH v3 1/1 i2c: mxc: refactor i2c driver and support dm

Hi,

Is there any further comments? Or this patch will be applied?

Regards,
Peng.

-----Original Message-----
From: [email protected] [mailto:sjg at google.com] On Behalf Of Simon Glass
Sent: Wednesday, May 06, 2015 4:56 AM
To: Fan Peng-B51431
Cc: Stefano Babic; Heiko Schocher; Marek Va?ut; Nikita Kiryanov; U-Boot Mailing List
Subject: Re: [PATCH V3] i2c: mxc: refactor i2c driver and support dm

Quoted 30 lines · Peng Fan

1. Introduce a new structure struct mxc_i2c_bus, this structure will used for non-DM and DM.
2. Remove struct mxc_i2c_regs structure, but use register offset to access registers based on base entry of struct mxc_i2c_bus.
3. Remove most #ifdef I2C_QUIRK_REG. Using driver_data to contain platform flags. A new flag is introduced, I2C_QUIRK_FLAG.
4. Most functions use struct mxc_i2c_bus as one of the parameters. Make most functions common to DM and non-DM, try to avoid duplicated code.
5. Support DM. Pinmux setting is still set by setup_i2c, but we do not need bus_i2c_init for DM.
6. struct i2c_parms and struct sram_data are removed.
7. Remove bus_i2c_read bus_i2c_write prototype in header file. The frist paramter of bus_i2c_init is modified to i2c index. Add new prototype i2c_idle_bus and force_idle_bus. Since bus_i2c_init is not good for DM I2C and pinctrl is missed, we use a weak function for i2c_idle_bus for DM part.
Board file take the responsibility to implement this function, like this:

   "
   int i2c_idle_bus(struct mxc_i2c_bus *i2c_bus)
   {
           if (i2c_bus->index == 0)
                   force_idle_bus(i2c_pads_info0);
           else if (i2c_bus->index == 1)
                   force_idle_bus(i2c_pads_info1);
           else
                   xxxxxx
   }
   "
Quoted 8 lines

---

Changes v3:
1. remove bus_i2c_init for DM, introuduce a weak function i2c_idle_bus.
2. remove static return type for force_idle_bus, since we need to call it in i2c_idle_bus which may be implemented in board file. This does not hurt for non-DM.

Quoted 18 lines

Changes v2:
1. Refactor driver, remove register access based on structure, but use 'base + offset'
2. Introduce mxc_i2c_bus structure
3. Introduce I2C_QUIRK_FLAG and remove most I2C_QUIRK_REG and use driver_data to contain the flags for different platforms 4. Avoid
duplicated code between DM and non-DM part 5. The function name i2c_init_transfer is not changed.
6. Remove bus_i2c_read/write prototype from header file 7. change
bus_i2c_init's first parameter to i2c index 8. Rename patch name, since refactor non-DM part.

 arch/arm/imx-common/i2c-mxv7.c            |   7 +-
 arch/arm/include/asm/imx-common/mxc_i2c.h |  38 +-
 drivers/i2c/mxc_i2c.c                     | 575 ++++++++++++++++++++----------
 3 files changed, 426 insertions(+), 194 deletions(-)
#3 lore raw

PATCH v3 1/1 i2c: mxc: refactor i2c driver and support dm

Hi,

Quoted 5 lines · Fan Peng

Hi,

Is there any further comments? Or this patch will be applied?

I can apply it if you like - Heiko what do you prefer?

- Simon

Quoted 70 lines

Regards,
Peng.

-----Original Message-----
From: sjg at google.com [mailto:sjg at google.com] On Behalf Of Simon Glass
Sent: Wednesday, May 06, 2015 4:56 AM
To: Fan Peng-B51431
Cc: Stefano Babic; Heiko Schocher; Marek Va?ut; Nikita Kiryanov; U-Boot Mailing List
Subject: Re: [PATCH V3] i2c: mxc: refactor i2c driver and support dm

Quoted 30 lines · Peng Fan

1. Introduce a new structure struct mxc_i2c_bus, this structure will used for non-DM and DM.
2. Remove struct mxc_i2c_regs structure, but use register offset to access registers based on base entry of struct mxc_i2c_bus.
3. Remove most #ifdef I2C_QUIRK_REG. Using driver_data to contain platform flags. A new flag is introduced, I2C_QUIRK_FLAG.
4. Most functions use struct mxc_i2c_bus as one of the parameters. Make most functions common to DM and non-DM, try to avoid duplicated code.
5. Support DM. Pinmux setting is still set by setup_i2c, but we do not need bus_i2c_init for DM.
6. struct i2c_parms and struct sram_data are removed.
7. Remove bus_i2c_read bus_i2c_write prototype in header file. The frist paramter of bus_i2c_init is modified to i2c index. Add new prototype i2c_idle_bus and force_idle_bus. Since bus_i2c_init is not good for DM I2C and pinctrl is missed, we use a weak function for i2c_idle_bus for DM part.
Board file take the responsibility to implement this function, like this:

   "
   int i2c_idle_bus(struct mxc_i2c_bus *i2c_bus)
   {
           if (i2c_bus->index == 0)
                   force_idle_bus(i2c_pads_info0);
           else if (i2c_bus->index == 1)
                   force_idle_bus(i2c_pads_info1);
           else
                   xxxxxx
   }
   "
Quoted 8 lines

---

Changes v3:
1. remove bus_i2c_init for DM, introuduce a weak function i2c_idle_bus.
2. remove static return type for force_idle_bus, since we need to call it in i2c_idle_bus which may be implemented in board file. This does not hurt for non-DM.

Quoted 18 lines

Changes v2:
1. Refactor driver, remove register access based on structure, but use 'base + offset'
2. Introduce mxc_i2c_bus structure
3. Introduce I2C_QUIRK_FLAG and remove most I2C_QUIRK_REG and use driver_data to contain the flags for different platforms 4. Avoid
duplicated code between DM and non-DM part 5. The function name i2c_init_transfer is not changed.
6. Remove bus_i2c_read/write prototype from header file 7. change
bus_i2c_init's first parameter to i2c index 8. Rename patch name, since refactor non-DM part.

 arch/arm/imx-common/i2c-mxv7.c            |   7 +-
 arch/arm/include/asm/imx-common/mxc_i2c.h |  38 +-
 drivers/i2c/mxc_i2c.c                     | 575 ++++++++++++++++++++----------
 3 files changed, 426 insertions(+), 194 deletions(-)
#4 lore raw

PATCH v3 1/1 i2c: mxc: refactor i2c driver and support dm

Hello Simon,

Am 13.05.2015 03:44, schrieb Simon Glass:

Quoted 10 lines

Hi,

Quoted 5 lines · Fan Peng

Hi,

Is there any further comments? Or this patch will be applied?

I can apply it if you like - Heiko what do you prefer?

Yes, please. Thanks.

bye,
Heiko

Quoted 74 lines

- Simon

Quoted 70 lines

Regards,
Peng.

-----Original Message-----
From: sjg at google.com [mailto:sjg at google.com] On Behalf Of Simon Glass
Sent: Wednesday, May 06, 2015 4:56 AM
To: Fan Peng-B51431
Cc: Stefano Babic; Heiko Schocher; Marek Va?ut; Nikita Kiryanov; U-Boot Mailing List
Subject: Re: [PATCH V3] i2c: mxc: refactor i2c driver and support dm

Quoted 30 lines · Peng Fan

1. Introduce a new structure struct mxc_i2c_bus, this structure will used for non-DM and DM.
2. Remove struct mxc_i2c_regs structure, but use register offset to access registers based on base entry of struct mxc_i2c_bus.
3. Remove most #ifdef I2C_QUIRK_REG. Using driver_data to contain platform flags. A new flag is introduced, I2C_QUIRK_FLAG.
4. Most functions use struct mxc_i2c_bus as one of the parameters. Make most functions common to DM and non-DM, try to avoid duplicated code.
5. Support DM. Pinmux setting is still set by setup_i2c, but we do not need bus_i2c_init for DM.
6. struct i2c_parms and struct sram_data are removed.
7. Remove bus_i2c_read bus_i2c_write prototype in header file. The frist

    paramter of bus_i2c_init is modified to i2c index. Add new prototype
    i2c_idle_bus and force_idle_bus. Since bus_i2c_init is not good for
    DM I2C and pinctrl is missed, we use a weak function for i2c_idle_bus
    for DM part.
    Board file take the responsibility to implement this function, like this:
    "
    int i2c_idle_bus(struct mxc_i2c_bus *i2c_bus)
    {
            if (i2c_bus->index == 0)
                    force_idle_bus(i2c_pads_info0);
            else if (i2c_bus->index == 1)
                    force_idle_bus(i2c_pads_info1);
            else
                    xxxxxx
    }
    "
Quoted 8 lines

---

Changes v3:
1. remove bus_i2c_init for DM, introuduce a weak function i2c_idle_bus.
2. remove static return type for force_idle_bus, since we need to call it in i2c_idle_bus which may be implemented in board file. This does not hurt for non-DM.

Quoted 18 lines

Changes v2:
1. Refactor driver, remove register access based on structure, but use 'base + offset'
2. Introduce mxc_i2c_bus structure
3. Introduce I2C_QUIRK_FLAG and remove most I2C_QUIRK_REG and use driver_data to contain the flags for different platforms 4. Avoid
duplicated code between DM and non-DM part 5. The function name i2c_init_transfer is not changed.
6. Remove bus_i2c_read/write prototype from header file 7. change
bus_i2c_init's first parameter to i2c index 8. Rename patch name, since refactor non-DM part.

  arch/arm/imx-common/i2c-mxv7.c            |   7 +-
  arch/arm/include/asm/imx-common/mxc_i2c.h |  38 +-
  drivers/i2c/mxc_i2c.c                     | 575 ++++++++++++++++++++----------
  3 files changed, 426 insertions(+), 194 deletions(-)
Signature · 2 lines
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#5 lore raw

PATCH v3 1/1 i2c: mxc: refactor i2c driver and support dm

In reply to Fan Peng

Hi,

Quoted 3 lines · Fan Peng

Hi,

Is there any further comments? Or this patch will be applied?

This gives build errors for me:

02: i2c: mxc: refactor i2c driver and support dm
arm: + nitrogen6dl2g mx53smd ls1021atwr_nor_SECURE_BOOT
tqma6s_mba6_spi apf27 mx6sxsabresd_spl ls1021aqds_nor_lpuart nitrogen6s nitrogen6q ls1021aqds_ddr4_nor wandboard_solo ls1021aqds_nand ls1021atwr_nor novena riotboard mx6dlsabreauto nitrogen6dl titanium ls1021aqds_ddr4_nor_lpuart tqma6s_mba6_mmc mx25pdk ot1200_spl mx53ard nitrogen6q2g ls1021atwr_nor_lpuart wandboard_dl wandboard_quad mx6sxsabresd platinum_titanium m53evk woodburn_sd mx6dlsabresd ls1021aqds_sdcard mx6qsabrelite mx6sabresd_spl ls1021atwr_sdcard ls1021atwr_qspi vf610twr_nand tqma6q_mba6_mmc woodburn vf610twr usbarmory flea3 ot1200 tbs2910 ls1021aqds_nor imx31_phycore_eet mx35pdk mx6slevk_spinor ls1021aqds_qspi cm_fx6 mx6qsabresd imx31_phycore nitrogen6s1g marsboard tqma6q_mba6_spi mx53evk aristainetos mx6slevk platinum_picon mx6qsabreauto mx53loco ls1021aqds_nor_SECURE_BOOT gwventana +../drivers/i2c/mxc_i2c.c:524:11: error: missing binary operator before token "ined"
+../drivers/i2c/mxc_i2c.c:581:2: error: expected ?;? before ?}? token +make[2]: *** [drivers/i2c/mxc_i2c.o] Error 1
+make[1]: *** [drivers/i2c] Error 2 +../drivers/i2c/mxc_i2c.c:532:2: error: #error "architecture not supported" +In file included from ../arch/arm/include/asm/imx-common/mxc_i2c.h:8:0,
+ from ../drivers/i2c/mxc_i2c.c:21:
w+../drivers/i2c/mxc_i2c.c: In function ?bus_i2c_init?:
w+../drivers/i2c/mxc_i2c.c:580:3: warning: ?return? with a value, in function returning void [enabled by default] w+../drivers/i2c/mxc_i2c.c:577:2: warning: implicit declaration of function ?enable_i2c_clk? [-Wimplicit-function-declaration] w+../arch/arm/include/asm/imx-common/iomux-v3.h:175:0: warning:
"GPIO_PORTA" redefined [enabled by default]
w+In file included from ../drivers/i2c/mxc_i2c.c:19:0:
w+include/asm/arch/imx-regs.h:457:0: note: this is the location of the previous definition w+../arch/arm/include/asm/imx-common/iomux-v3.h:176:0: warning:
"GPIO_PORTB" redefined [enabled by default] w+include/asm/arch/imx-regs.h:458:0: note: this is the location of the previous definition w+../arch/arm/include/asm/imx-common/iomux-v3.h:177:0: warning:
"GPIO_PORTC" redefined [enabled by default] w+include/asm/arch/imx-regs.h:459:0: note: this is the location of the previous definition w+../arch/arm/include/asm/imx-common/iomux-v3.h:178:0: warning:
"GPIO_PORTD" redefined [enabled by default] w+include/asm/arch/imx-regs.h:460:0: note: this is the location of the previous definition w+../arch/arm/include/asm/imx-common/iomux-v3.h:179:0: warning:
"GPIO_PORTE" redefined [enabled by default] w+include/asm/arch/imx-regs.h:461:0: note: this is the location of the previous definition w+../arch/arm/include/asm/imx-common/iomux-v3.h:180:0: warning:
"GPIO_PORTF" redefined [enabled by default] w+include/asm/arch/imx-regs.h:462:0: note: this is the location of the previous definition

Regards,
Simon

Quoted 71 lines

Regards,
Peng.

-----Original Message-----
From: sjg at google.com [mailto:sjg at google.com] On Behalf Of Simon Glass
Sent: Wednesday, May 06, 2015 4:56 AM
To: Fan Peng-B51431
Cc: Stefano Babic; Heiko Schocher; Marek Va?ut; Nikita Kiryanov; U-Boot Mailing List
Subject: Re: [PATCH V3] i2c: mxc: refactor i2c driver and support dm

Quoted 30 lines · Peng Fan

1. Introduce a new structure struct mxc_i2c_bus, this structure will used for non-DM and DM.
2. Remove struct mxc_i2c_regs structure, but use register offset to access registers based on base entry of struct mxc_i2c_bus.
3. Remove most #ifdef I2C_QUIRK_REG. Using driver_data to contain platform flags. A new flag is introduced, I2C_QUIRK_FLAG.
4. Most functions use struct mxc_i2c_bus as one of the parameters. Make most functions common to DM and non-DM, try to avoid duplicated code.
5. Support DM. Pinmux setting is still set by setup_i2c, but we do not need bus_i2c_init for DM.
6. struct i2c_parms and struct sram_data are removed.
7. Remove bus_i2c_read bus_i2c_write prototype in header file. The frist paramter of bus_i2c_init is modified to i2c index. Add new prototype i2c_idle_bus and force_idle_bus. Since bus_i2c_init is not good for DM I2C and pinctrl is missed, we use a weak function for i2c_idle_bus for DM part.
Board file take the responsibility to implement this function, like this:

   "
   int i2c_idle_bus(struct mxc_i2c_bus *i2c_bus)
   {
           if (i2c_bus->index == 0)
                   force_idle_bus(i2c_pads_info0);
           else if (i2c_bus->index == 1)
                   force_idle_bus(i2c_pads_info1);
           else
                   xxxxxx
   }
   "
Quoted 8 lines

---

Changes v3:
1. remove bus_i2c_init for DM, introuduce a weak function i2c_idle_bus.
2. remove static return type for force_idle_bus, since we need to call it in i2c_idle_bus which may be implemented in board file. This does not hurt for non-DM.

Quoted 18 lines

Changes v2:
1. Refactor driver, remove register access based on structure, but use 'base + offset'
2. Introduce mxc_i2c_bus structure
3. Introduce I2C_QUIRK_FLAG and remove most I2C_QUIRK_REG and use driver_data to contain the flags for different platforms 4. Avoid
duplicated code between DM and non-DM part 5. The function name i2c_init_transfer is not changed.
6. Remove bus_i2c_read/write prototype from header file 7. change
bus_i2c_init's first parameter to i2c index 8. Rename patch name, since refactor non-DM part.

 arch/arm/imx-common/i2c-mxv7.c            |   7 +-
 arch/arm/include/asm/imx-common/mxc_i2c.h |  38 +-
 drivers/i2c/mxc_i2c.c                     | 575 ++++++++++++++++++++----------
 3 files changed, 426 insertions(+), 194 deletions(-)
author
#6 lore raw

PATCH v3 1/1 i2c: mxc: refactor i2c driver and support dm

Hi, Simon

There may be something wrong in my side. I will fix the build errors and send out new version.

Thanks,
Peng.

-----Original Message-----
From: [email protected] [mailto:sjg at google.com] On Behalf Of Simon Glass
Sent: Wednesday, May 13, 2015 11:25 PM
To: Fan Peng-B51431
Cc: Stefano Babic; Heiko Schocher; Marek Va?ut; Nikita Kiryanov; U-Boot Mailing List
Subject: Re: [PATCH V3] i2c: mxc: refactor i2c driver and support dm

Hi,

Quoted 3 lines · Fan Peng

Hi,

Is there any further comments? Or this patch will be applied?

This gives build errors for me:

02: i2c: mxc: refactor i2c driver and support dm
arm: + nitrogen6dl2g mx53smd ls1021atwr_nor_SECURE_BOOT
tqma6s_mba6_spi apf27 mx6sxsabresd_spl ls1021aqds_nor_lpuart nitrogen6s nitrogen6q ls1021aqds_ddr4_nor wandboard_solo ls1021aqds_nand ls1021atwr_nor novena riotboard mx6dlsabreauto nitrogen6dl titanium ls1021aqds_ddr4_nor_lpuart tqma6s_mba6_mmc mx25pdk ot1200_spl mx53ard nitrogen6q2g ls1021atwr_nor_lpuart wandboard_dl wandboard_quad mx6sxsabresd platinum_titanium m53evk woodburn_sd mx6dlsabresd ls1021aqds_sdcard mx6qsabrelite mx6sabresd_spl ls1021atwr_sdcard ls1021atwr_qspi vf610twr_nand tqma6q_mba6_mmc woodburn vf610twr usbarmory flea3 ot1200 tbs2910 ls1021aqds_nor imx31_phycore_eet mx35pdk mx6slevk_spinor ls1021aqds_qspi cm_fx6 mx6qsabresd imx31_phycore nitrogen6s1g marsboard tqma6q_mba6_spi mx53evk aristainetos mx6slevk platinum_picon mx6qsabreauto mx53loco ls1021aqds_nor_SECURE_BOOT gwventana +../drivers/i2c/mxc_i2c.c:524:11: error: missing binary operator
before token "ined"
+../drivers/i2c/mxc_i2c.c:581:2: error: expected ?;? before ?}? token
+make[2]: *** [drivers/i2c/mxc_i2c.o] Error 1
+make[1]: *** [drivers/i2c] Error 2
+../drivers/i2c/mxc_i2c.c:532:2: error: #error "architecture not supported"
+In file included from ../arch/arm/include/asm/imx-common/mxc_i2c.h:8:0,
+ from ../drivers/i2c/mxc_i2c.c:21:
w+../drivers/i2c/mxc_i2c.c: In function ?bus_i2c_init?:
w+../drivers/i2c/mxc_i2c.c:580:3: warning: ?return? with a value, in
function returning void [enabled by default]
w+../drivers/i2c/mxc_i2c.c:577:2: warning: implicit declaration of
function ?enable_i2c_clk? [-Wimplicit-function-declaration]
w+../arch/arm/include/asm/imx-common/iomux-v3.h:175:0: warning:
"GPIO_PORTA" redefined [enabled by default]
w+In file included from ../drivers/i2c/mxc_i2c.c:19:0:
w+include/asm/arch/imx-regs.h:457:0: note: this is the location of the
previous definition
w+../arch/arm/include/asm/imx-common/iomux-v3.h:176:0: warning:
"GPIO_PORTB" redefined [enabled by default]
w+include/asm/arch/imx-regs.h:458:0: note: this is the location of the
previous definition
w+../arch/arm/include/asm/imx-common/iomux-v3.h:177:0: warning:
"GPIO_PORTC" redefined [enabled by default]
w+include/asm/arch/imx-regs.h:459:0: note: this is the location of the
previous definition
w+../arch/arm/include/asm/imx-common/iomux-v3.h:178:0: warning:
"GPIO_PORTD" redefined [enabled by default]
w+include/asm/arch/imx-regs.h:460:0: note: this is the location of the
previous definition
w+../arch/arm/include/asm/imx-common/iomux-v3.h:179:0: warning:
"GPIO_PORTE" redefined [enabled by default]
w+include/asm/arch/imx-regs.h:461:0: note: this is the location of the
previous definition
w+../arch/arm/include/asm/imx-common/iomux-v3.h:180:0: warning:
"GPIO_PORTF" redefined [enabled by default]
w+include/asm/arch/imx-regs.h:462:0: note: this is the location of the
previous definition

Regards,
Simon

Quoted 72 lines

Regards,
Peng.

-----Original Message-----
From: sjg at google.com [mailto:sjg at google.com] On Behalf Of Simon Glass
Sent: Wednesday, May 06, 2015 4:56 AM
To: Fan Peng-B51431
Cc: Stefano Babic; Heiko Schocher; Marek Va?ut; Nikita Kiryanov; U-Boot Mailing List
Subject: Re: [PATCH V3] i2c: mxc: refactor i2c driver and support dm

Quoted 30 lines · Peng Fan

1. Introduce a new structure struct mxc_i2c_bus, this structure will used for non-DM and DM.
2. Remove struct mxc_i2c_regs structure, but use register offset to access registers based on base entry of struct mxc_i2c_bus.
3. Remove most #ifdef I2C_QUIRK_REG. Using driver_data to contain platform flags. A new flag is introduced, I2C_QUIRK_FLAG.
4. Most functions use struct mxc_i2c_bus as one of the parameters. Make most functions common to DM and non-DM, try to avoid duplicated code.
5. Support DM. Pinmux setting is still set by setup_i2c, but we do not need bus_i2c_init for DM.
6. struct i2c_parms and struct sram_data are removed.
7. Remove bus_i2c_read bus_i2c_write prototype in header file. The frist paramter of bus_i2c_init is modified to i2c index. Add new prototype i2c_idle_bus and force_idle_bus. Since bus_i2c_init is not good for DM I2C and pinctrl is missed, we use a weak function for i2c_idle_bus for DM part.
Board file take the responsibility to implement this function, like this:

   "
   int i2c_idle_bus(struct mxc_i2c_bus *i2c_bus)
   {
           if (i2c_bus->index == 0)
                   force_idle_bus(i2c_pads_info0);
           else if (i2c_bus->index == 1)
                   force_idle_bus(i2c_pads_info1);
           else
                   xxxxxx
   }
   "
Quoted 8 lines

---

Changes v3:
1. remove bus_i2c_init for DM, introuduce a weak function i2c_idle_bus.
2. remove static return type for force_idle_bus, since we need to call it in i2c_idle_bus which may be implemented in board file. This does not hurt for non-DM.

Quoted 18 lines

Changes v2:
1. Refactor driver, remove register access based on structure, but use 'base + offset'
2. Introduce mxc_i2c_bus structure
3. Introduce I2C_QUIRK_FLAG and remove most I2C_QUIRK_REG and use driver_data to contain the flags for different platforms 4.
Avoid duplicated code between DM and non-DM part 5. The function name i2c_init_transfer is not changed.
6. Remove bus_i2c_read/write prototype from header file 7. change
bus_i2c_init's first parameter to i2c index 8. Rename patch name, since refactor non-DM part.

 arch/arm/imx-common/i2c-mxv7.c            |   7 +-
 arch/arm/include/asm/imx-common/mxc_i2c.h |  38 +-
 drivers/i2c/mxc_i2c.c                     | 575 ++++++++++++++++++++----------
 3 files changed, 426 insertions(+), 194 deletions(-)