From mboxrd@z Thu Jan 1 00:00:00 1970 From: Simon Glass Date: Thu, 14 May 2015 09:01:43 -0600 Subject: [U-Boot] [PATCH V4 1/2] i2c: mxc: refactor i2c driver and support dm In-Reply-To: <1431597792-4380-1-git-send-email-Peng.Fan@freescale.com> References: <1431597792-4380-1-git-send-email-Peng.Fan@freescale.com> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Peng, On 14 May 2015 at 04:03, Peng Fan wrote: > 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, but pinctrl is not included. 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_bus_idle. Since bus_i2c_init is not good for > DM I2C and pinctrl is missed, we use a weak function for i2c_idle_bus. > 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_bus_idle(i2c_pads_info0); > else if (i2c_bus->index == 1) > force_bus_idle(i2c_pads_info1); > else > xxxxxx > } > " > 8. Introduce a weak function, enable_i2c_clk > 9. Tested on an i.MX7 platform. Log info: > => dm tree > Class Probed Name > ---------------------------------------- > root [ + ] root_driver > simple_bus [ ] |-- soc > simple_bus [ ] | |-- aips-bus at 30000000 > simple_bus [ ] | | |-- anatop at 30360000 > simple_bus [ ] | | `-- snvs at 30370000 > simple_bus [ ] | |-- aips-bus at 30400000 > simple_bus [ ] | `-- aips-bus at 30800000 > i2c [ ] | |-- i2c at 30a20000 > i2c [ ] | `-- i2c at 30a40000 > simple_bus [ ] `-- regulators > => i2c dev 0 > Setting bus to 0 > => i2c probe > Valid chip addresses: 08 50 > => i2c md 8 31 > 0031: 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 > > Signed-off-by: Peng Fan > Acked-by: Simon Glass > --- > > Changes v4: > 1. fix build errors > 2. Introduce a weak function enable_i2c_clk. > 3. add Simon's Acked-by. > 4. Add test log in commit log. I still get one build break here, fixed by the second commit: 02: i2c: mxc: refactor i2c driver and support dm arm: + apf27 +In file included from ../arch/arm/include/asm/imx-common/mxc_i2c.h:8:0, + from ../drivers/i2c/mxc_i2c.c:21: 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 03: imx: mx27 remove redundant macro arm: apf27 -In file included from ../arch/arm/include/asm/imx-common/mxc_i2c.h:8:0, - from ../drivers/i2c/mxc_i2c.c:21: 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 I'll apply them in the other order. > > 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 | 581 ++++++++++++++++++++---------- > 3 files changed, 433 insertions(+), 193 deletions(-) > [snip] Applied to u-boot-dm, thanks! Regards, Simon