[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