[U-Boot] [PATCH 4/6] i2c: designware_i2c: Prepare for DM driver conversion
Bin Meng
bmeng.cn at gmail.com
Mon Mar 21 09:54:46 CET 2016
On Fri, Mar 18, 2016 at 3:54 PM, Stefan Roese <sr at denx.de> wrote:
> 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.
>
> Signed-off-by: Stefan Roese <sr at denx.de>
> Cc: Simon Glass <sjg at chromium.org>
> Cc: Bin Meng <bmeng.cn at gmail.com>
> Cc: Marek Vasut <marex at denx.de>
> Cc: Heiko Schocher <hs at denx.de>
> ---
> drivers/i2c/designware_i2c.c | 173 ++++++++++++++++++++++---------------------
> 1 file changed, 90 insertions(+), 83 deletions(-)
>
> diff --git a/drivers/i2c/designware_i2c.c b/drivers/i2c/designware_i2c.c
> index 508dac9..e51e6de 100644
> --- a/drivers/i2c/designware_i2c.c
> +++ b/drivers/i2c/designware_i2c.c
> @@ -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, 1);
>
> - 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, 0);
> -
> - 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, 1);
> -}
> -
> -/*
> * 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, 0);
>
> @@ -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
dw_i2c_init
> + * @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, 0);
> +
> + 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, 1);
> +}
> +
Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
More information about the U-Boot
mailing list