All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bin Meng <bmeng.cn@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 4/6] i2c: designware_i2c: Prepare for DM driver conversion
Date: Mon, 21 Mar 2016 16:54:46 +0800	[thread overview]
Message-ID: <CAEUhbmW_k0m_TiBycNHsizinCff=dMFq=Kv3-xPq4hX8-Hu_fw@mail.gmail.com> (raw)
In-Reply-To: <1458287661-21745-4-git-send-email-sr@denx.de>

On Fri, Mar 18, 2016 at 3:54 PM, Stefan Roese <sr@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@denx.de>
> Cc: Simon Glass <sjg@chromium.org>
> Cc: Bin Meng <bmeng.cn@gmail.com>
> Cc: Marek Vasut <marex@denx.de>
> Cc: Heiko Schocher <hs@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@gmail.com>

  reply	other threads:[~2016-03-21  8:54 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-18  7:54 [U-Boot] [PATCH 1/6] i2c: designware_i2c: Add ic_enable_status to ic_regs struct Stefan Roese
2016-03-18  7:54 ` [U-Boot] [PATCH 2/6] i2c: designware_i2c: Add dw_i2c_enable() helper function Stefan Roese
2016-03-18 11:12   ` Marek Vasut
2016-03-18 12:04     ` Stefan Roese
2016-03-18 12:14       ` Marek Vasut
2016-03-21  8:54   ` Bin Meng
2016-03-18  7:54 ` [U-Boot] [PATCH 3/6] i2c: designware_i2c: Integrate set_speed() into dw_i2c_set_bus_speed() Stefan Roese
2016-03-18 11:13   ` Marek Vasut
2016-03-21  8:54   ` Bin Meng
2016-03-18  7:54 ` [U-Boot] [PATCH 4/6] i2c: designware_i2c: Prepare for DM driver conversion Stefan Roese
2016-03-21  8:54   ` Bin Meng [this message]
2016-03-18  7:54 ` [U-Boot] [PATCH 5/6] i2c: designware_i2c: Add DM support Stefan Roese
2016-03-21  8:54   ` Bin Meng
2016-04-09 18:35   ` Simon Glass
2016-03-18  7:54 ` [U-Boot] [PATCH 6/6] i2c: designware_i2c: Add support for PCI(e) based I2C cores (x86) Stefan Roese
2016-03-21  8:54   ` Bin Meng
2016-03-21  9:03     ` Stefan Roese
2016-03-21  9:05       ` Bin Meng
2016-03-21 12:04       ` Stefan Roese
2016-03-21 12:43         ` Bin Meng
2016-03-21 12:52           ` Stefan Roese
2016-03-21 14:04           ` Stefan Roese
2016-03-28  6:01             ` Bin Meng
2016-04-04 14:53               ` Stefan Roese
2016-04-11 15:03                 ` Stefan Roese
2016-04-20 14:40                   ` Simon Glass
2016-04-20 14:58                     ` Stefan Roese
2016-04-20 15:09                       ` Simon Glass
2016-04-20 15:17                         ` Stefan Roese
2016-03-18 11:09 ` [U-Boot] [PATCH 1/6] i2c: designware_i2c: Add ic_enable_status to ic_regs struct Marek Vasut
2016-03-21  8:54 ` Bin Meng

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAEUhbmW_k0m_TiBycNHsizinCff=dMFq=Kv3-xPq4hX8-Hu_fw@mail.gmail.com' \
    --to=bmeng.cn@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.