[U-Boot] [PATCH v5 007/101] i2c: designware: Tidy up PCI support

Simon Glass sjg at chromium.org
Tue Nov 26 17:07:52 UTC 2019


Hi Bin,

On Mon, 25 Nov 2019 at 22:09, Bin Meng <bmeng.cn at gmail.com> wrote:
>
> Hi Simon,
>
>
> On Mon, Nov 25, 2019 at 12:11 PM Simon Glass <sjg at chromium.org> wrote:
> >
> > This is hacked into the driver at present. It seems better to have it as
> > a separate driver that uses the base driver. Create a new file and put
> > the X86 code into it.
> >
> > Actually the Baytrail settings should really come from the device tree.
> >
> > Note that 'has_max_speed' is added as well. This is currently always false
> > but since only Baytrail provides the config, it does not affect operation
> > for other devices.
> >
> > Signed-off-by: Simon Glass <sjg at chromium.org>
> > Reviewed-by: Heiko Schocher <hs at denx.de>
> > ---
> >
> > Changes in v5: None
> > Changes in v4:
> > - Add a comment about the speed logic in __dw_i2c_set_bus_speed()
> > - Add a comment in the commit message about why has_max_speed is added
> > - Drop unwanted debug printf("bad\n")
> > - Fix indentation nit
> > - Rename new file to designware_i2c_pci.c
> >
> > Changes in v3: None
> > Changes in v2: None
> >
> >  drivers/i2c/Makefile             |   3 +
> >  drivers/i2c/designware_i2c.c     | 106 +++++--------------------------
> >  drivers/i2c/designware_i2c.h     |  35 ++++++++++
> >  drivers/i2c/designware_i2c_pci.c |  79 +++++++++++++++++++++++
> >  4 files changed, 134 insertions(+), 89 deletions(-)
> >  create mode 100644 drivers/i2c/designware_i2c_pci.c
> >
> > diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
> > index c2f75d8755..f5a471f887 100644
> > --- a/drivers/i2c/Makefile
> > +++ b/drivers/i2c/Makefile
> > @@ -14,6 +14,9 @@ obj-$(CONFIG_SYS_I2C_AT91) += at91_i2c.o
> >  obj-$(CONFIG_SYS_I2C_CADENCE) += i2c-cdns.o
> >  obj-$(CONFIG_SYS_I2C_DAVINCI) += davinci_i2c.o
> >  obj-$(CONFIG_SYS_I2C_DW) += designware_i2c.o
> > +ifdef CONFIG_DM_PCI
> > +obj-$(CONFIG_SYS_I2C_DW) += designware_i2c_pci.o
> > +endif
> >  obj-$(CONFIG_SYS_I2C_FSL) += fsl_i2c.o
> >  obj-$(CONFIG_SYS_I2C_IHS) += ihs_i2c.o
> >  obj-$(CONFIG_SYS_I2C_INTEL) += intel_i2c.o
> > diff --git a/drivers/i2c/designware_i2c.c b/drivers/i2c/designware_i2c.c
> > index 6daa90e744..99b7d09bb2 100644
> > --- a/drivers/i2c/designware_i2c.c
> > +++ b/drivers/i2c/designware_i2c.c
> > @@ -13,34 +13,6 @@
> >  #include <asm/io.h>
> >  #include "designware_i2c.h"
> >
> > -struct dw_scl_sda_cfg {
> > -       u32 ss_hcnt;
> > -       u32 fs_hcnt;
> > -       u32 ss_lcnt;
> > -       u32 fs_lcnt;
> > -       u32 sda_hold;
> > -};
> > -
> > -#ifdef CONFIG_X86
> > -/* BayTrail HCNT/LCNT/SDA hold time */
> > -static struct dw_scl_sda_cfg byt_config = {
> > -       .ss_hcnt = 0x200,
> > -       .fs_hcnt = 0x55,
> > -       .ss_lcnt = 0x200,
> > -       .fs_lcnt = 0x99,
> > -       .sda_hold = 0x6,
> > -};
> > -#endif
> > -
> > -struct dw_i2c {
> > -       struct i2c_regs *regs;
> > -       struct dw_scl_sda_cfg *scl_sda_cfg;
> > -       struct reset_ctl_bulk resets;
> > -#if CONFIG_IS_ENABLED(CLK)
> > -       struct clk clk;
> > -#endif
> > -};
> > -
> >  #ifdef CONFIG_SYS_I2C_DW_ENABLE_STATUS_UNSUPPORTED
> >  static int  dw_i2c_enable(struct i2c_regs *i2c_base, bool enable)
> >  {
> > @@ -90,7 +62,9 @@ static unsigned int __dw_i2c_set_bus_speed(struct i2c_regs *i2c_base,
> >         unsigned int ena;
> >         int i2c_spd;
> >
> > -       if (speed >= I2C_MAX_SPEED)
> > +       /* Allow max speed if there is no config , or the config allows it */
>
> nits: remove the space before ,

OK done.

>
> > +       if (speed >= I2C_MAX_SPEED &&
> > +           (!scl_sda_cfg || scl_sda_cfg->has_max_speed))
>
> So with this change, for Baytrail, this new logic does not match the old codes.
>
> Baytrail has the config, but its config does not have the
> has_max_speed, so the if () logic evaluates to false.

>From my reading of it, that is correct. The mode_max code is behind an
#ifdef in the old code.

>
> >                 i2c_spd = IC_SPEED_MODE_MAX;
> >         else if (speed >= I2C_FAST_SPEED)
> >                 i2c_spd = IC_SPEED_MODE_FAST;
> > @@ -106,7 +80,6 @@ static unsigned int __dw_i2c_set_bus_speed(struct i2c_regs *i2c_base,
> >         cntl = (readl(&i2c_base->ic_con) & (~IC_CON_SPD_MSK));
> >
> >         switch (i2c_spd) {
> > -#ifndef CONFIG_X86 /* No High-speed for BayTrail yet */
> >         case IC_SPEED_MODE_MAX:
> >                 cntl |= IC_CON_SPD_SS;
> >                 if (scl_sda_cfg) {
> > @@ -119,7 +92,6 @@ static unsigned int __dw_i2c_set_bus_speed(struct i2c_regs *i2c_base,
> >                 writel(hcnt, &i2c_base->ic_hs_scl_hcnt);
> >                 writel(lcnt, &i2c_base->ic_hs_scl_lcnt);
> >                 break;
> > -#endif
[..]

Regards,
Simon


More information about the U-Boot mailing list