[U-Boot] [PATCH v2 1/5] regmap: Add size parameter

Mario Six mario.six at gdsys.cc
Fri May 4 08:18:25 UTC 2018


Hi Neil,

On Fri, Apr 27, 2018 at 3:00 PM, Neil Armstrong <narmstrong at baylibre.com> wrote:
> Hi Mario,
>
> On 27/04/2018 14:51, Mario Six wrote:
>> The regmap functions currently assume that all register map accesses
>> have a data width of 32 bits, but there are maps that have different
>> widths.
>>
>> Implement a size parameter for the regmap_read and regmap_write
>> functions to specify the width of a desired read or write operation on a
>> regmap.
>
> This changes the regmap API which is based on the Linux API.
>
> Linux passes a struct defining the regmap access type instead, I think the same should
> happen here.
>

OK, I see what you mean.

I see that the Linux API also has regmap_raw_read/regmap_raw_write functions,
which do have size parameters, so I think those would suite this use case
rather nicely (and won't break the existing API).

> Neil
>

Best regards,
Mario

>>
>> Correct all current clients of the regmap API to use 32 bit width reads
>> and writes to keep backwards compatibility.
>>
>> Signed-off-by: Mario Six <mario.six at gdsys.cc>
>> ---
>>
>> v1 -> v2:
>> New in v2
>>
>> ---
>>  drivers/clk/at91/clk-utmi.c               |  6 +++--
>>  drivers/clk/clk_boston.c                  |  3 ++-
>>  drivers/core/regmap.c                     | 45 ++++++++++++++++++++++++-------
>>  drivers/phy/meson-gxl-usb2.c              | 18 ++++++-------
>>  drivers/phy/meson-gxl-usb3.c              | 22 +++++++--------
>>  drivers/power/regulator/pbias_regulator.c |  5 ++--
>>  drivers/reset/reset-meson.c               | 14 +++++-----
>>  drivers/sysreset/sysreset_syscon.c        |  2 +-
>>  include/regmap.h                          | 11 ++++++--
>>  9 files changed, 82 insertions(+), 44 deletions(-)
>>
>> diff --git a/drivers/clk/at91/clk-utmi.c b/drivers/clk/at91/clk-utmi.c
>> index 875bf293f9..1da625cab1 100644
>> --- a/drivers/clk/at91/clk-utmi.c
>> +++ b/drivers/clk/at91/clk-utmi.c
>> @@ -68,13 +68,15 @@ static int utmi_clk_enable(struct clk *clk)
>>       }
>>
>>       if (plat->regmap_sfr) {
>> -             err = regmap_read(plat->regmap_sfr, AT91_SFR_UTMICKTRIM, &tmp);
>> +             err = regmap_read(plat->regmap_sfr, AT91_SFR_UTMICKTRIM, &tmp,
>> +                               REGMAP_SIZE_32);
>>               if (err)
>>                       return -EINVAL;
>>
>>               tmp &= ~AT91_UTMICKTRIM_FREQ;
>>               tmp |= utmi_ref_clk_freq;
>> -             err = regmap_write(plat->regmap_sfr, AT91_SFR_UTMICKTRIM, tmp);
>> +             err = regmap_write(plat->regmap_sfr, AT91_SFR_UTMICKTRIM, tmp,
>> +                                REGMAP_SIZE_32);
>>               if (err)
>>                       return -EINVAL;
>>       } else if (utmi_ref_clk_freq) {
>> diff --git a/drivers/clk/clk_boston.c b/drivers/clk/clk_boston.c
>> index 5c05e3d78d..e09fd06fa0 100644
>> --- a/drivers/clk/clk_boston.c
>> +++ b/drivers/clk/clk_boston.c
>> @@ -33,7 +33,8 @@ static ulong clk_boston_get_rate(struct clk *clk)
>>       uint mmcmdiv;
>>       int err;
>>
>> -     err = regmap_read(state->regmap, BOSTON_PLAT_MMCMDIV, &mmcmdiv);
>> +     err = regmap_read(state->regmap, BOSTON_PLAT_MMCMDIV, &mmcmdiv,
>> +                       REGMAP_SIZE_32);
>>       if (err)
>>               return 0;
>>
>> diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c
>> index 8a0e00ff9a..c2cdff3979 100644
>> --- a/drivers/core/regmap.c
>> +++ b/drivers/core/regmap.c
>> @@ -130,20 +130,47 @@ int regmap_uninit(struct regmap *map)
>>       return 0;
>>  }
>>
>> -int regmap_read(struct regmap *map, uint offset, uint *valp)
>> +int regmap_read(struct regmap *map, ulong offset, ulong *valp,
>> +             enum regmap_size_t size)
>>  {
>> -     uint32_t *ptr = map_physmem(map->base + offset, 4, MAP_NOCACHE);
>> -
>> -     *valp = le32_to_cpu(readl(ptr));
>> -
>> +     void *ptr;
>> +
>> +     switch (size) {
>> +     case REGMAP_SIZE_8:
>> +             ptr = map_physmem(map->base + offset, 1, MAP_NOCACHE);
>> +             *valp = readb(ptr);
>> +             break;
>> +     case REGMAP_SIZE_16:
>> +             ptr = map_physmem(map->base + offset, 2, MAP_NOCACHE);
>> +             *valp = le16_to_cpu(readw(ptr));
>> +             break;
>> +     case REGMAP_SIZE_32:
>> +             ptr = map_physmem(map->base + offset, 4, MAP_NOCACHE);
>> +             *valp = le32_to_cpu(readl(ptr));
>> +             break;
>> +     }
>>       return 0;
>>  }
>>
>> -int regmap_write(struct regmap *map, uint offset, uint val)
>> +int regmap_write(struct regmap *map, ulong offset, ulong val,
>> +              enum regmap_size_t size)
>>  {
>> -     uint32_t *ptr = map_physmem(map->base + offset, 4, MAP_NOCACHE);
>> -
>> -     writel(cpu_to_le32(val), ptr);
>> +     void *ptr;
>> +
>> +     switch (size) {
>> +     case REGMAP_SIZE_8:
>> +             ptr = map_physmem(map->base + offset, 1, MAP_NOCACHE);
>> +             writel((u8)val, ptr);
>> +             break;
>> +     case REGMAP_SIZE_16:
>> +             ptr = map_physmem(map->base + offset, 2, MAP_NOCACHE);
>> +             writel(cpu_to_le16((u16)val), ptr);
>> +             break;
>> +     case REGMAP_SIZE_32:
>> +             ptr = map_physmem(map->base + offset, 4, MAP_NOCACHE);
>> +             writel(cpu_to_le32((u32)val), ptr);
>> +             break;
>> +     }
>>
>>       return 0;
>>  }
>> diff --git a/drivers/phy/meson-gxl-usb2.c b/drivers/phy/meson-gxl-usb2.c
>> index 15c9c89fd9..704b78747c 100644
>> --- a/drivers/phy/meson-gxl-usb2.c
>> +++ b/drivers/phy/meson-gxl-usb2.c
>> @@ -111,15 +111,15 @@ static void phy_meson_gxl_usb2_reset(struct phy_meson_gxl_usb2_priv *priv)
>>  {
>>       uint val;
>>
>> -     regmap_read(priv->regmap, U2P_R0, &val);
>> +     regmap_read(priv->regmap, U2P_R0, &val, REGMAP_SIZE_32);
>>
>>       /* reset the PHY and wait until settings are stabilized */
>>       val |= U2P_R0_POWER_ON_RESET;
>> -     regmap_write(priv->regmap, U2P_R0, val);
>> +     regmap_write(priv->regmap, U2P_R0, val, REGMAP_SIZE_32);
>>       udelay(RESET_COMPLETE_TIME);
>>
>>       val &= ~U2P_R0_POWER_ON_RESET;
>> -     regmap_write(priv->regmap, U2P_R0, val);
>> +     regmap_write(priv->regmap, U2P_R0, val, REGMAP_SIZE_32);
>>       udelay(RESET_COMPLETE_TIME);
>>  }
>>
>> @@ -128,11 +128,11 @@ phy_meson_gxl_usb2_set_host_mode(struct phy_meson_gxl_usb2_priv *priv)
>>  {
>>       uint val;
>>
>> -     regmap_read(priv->regmap, U2P_R0, &val);
>> +     regmap_read(priv->regmap, U2P_R0, &val, REGMAP_SIZE_32);
>>       val |= U2P_R0_DM_PULLDOWN;
>>       val |= U2P_R0_DP_PULLDOWN;
>>       val &= ~U2P_R0_ID_PULLUP;
>> -     regmap_write(priv->regmap, U2P_R0, val);
>> +     regmap_write(priv->regmap, U2P_R0, val, REGMAP_SIZE_32);
>>
>>       phy_meson_gxl_usb2_reset(priv);
>>  }
>> @@ -143,10 +143,10 @@ static int phy_meson_gxl_usb2_power_on(struct phy *phy)
>>       struct phy_meson_gxl_usb2_priv *priv = dev_get_priv(dev);
>>       uint val;
>>
>> -     regmap_read(priv->regmap, U2P_R0, &val);
>> +     regmap_read(priv->regmap, U2P_R0, &val, REGMAP_SIZE_32);
>>       /* power on the PHY by taking it out of reset mode */
>>       val &= ~U2P_R0_POWER_ON_RESET;
>> -     regmap_write(priv->regmap, U2P_R0, val);
>> +     regmap_write(priv->regmap, U2P_R0, val, REGMAP_SIZE_32);
>>
>>       phy_meson_gxl_usb2_set_host_mode(priv);
>>
>> @@ -167,10 +167,10 @@ static int phy_meson_gxl_usb2_power_off(struct phy *phy)
>>       struct phy_meson_gxl_usb2_priv *priv = dev_get_priv(dev);
>>       uint val;
>>
>> -     regmap_read(priv->regmap, U2P_R0, &val);
>> +     regmap_read(priv->regmap, U2P_R0, &val, REGMAP_SIZE_32);
>>       /* power off the PHY by putting it into reset mode */
>>       val |= U2P_R0_POWER_ON_RESET;
>> -     regmap_write(priv->regmap, U2P_R0, val);
>> +     regmap_write(priv->regmap, U2P_R0, val, REGMAP_SIZE_32);
>>
>>  #if CONFIG_IS_ENABLED(DM_REGULATOR)
>>       if (priv->phy_supply) {
>> diff --git a/drivers/phy/meson-gxl-usb3.c b/drivers/phy/meson-gxl-usb3.c
>> index a385fbdf12..33c24fd989 100644
>> --- a/drivers/phy/meson-gxl-usb3.c
>> +++ b/drivers/phy/meson-gxl-usb3.c
>> @@ -100,13 +100,13 @@ phy_meson_gxl_usb3_set_host_mode(struct phy_meson_gxl_usb3_priv *priv)
>>  {
>>       uint val;
>>
>> -     regmap_read(priv->regmap, USB_R0, &val);
>> +     regmap_read(priv->regmap, USB_R0, &val, REGMAP_SIZE_32);
>>       val &= ~USB_R0_U2D_ACT;
>> -     regmap_write(priv->regmap, USB_R0, val);
>> +     regmap_write(priv->regmap, USB_R0, val, REGMAP_SIZE_32);
>>
>> -     regmap_read(priv->regmap, USB_R4, &val);
>> +     regmap_read(priv->regmap, USB_R4, &val, REGMAP_SIZE_32);
>>       val &= ~USB_R4_P21_SLEEP_M0;
>> -     regmap_write(priv->regmap, USB_R4, val);
>> +     regmap_write(priv->regmap, USB_R4, val, REGMAP_SIZE_32);
>>
>>       return 0;
>>  }
>> @@ -117,12 +117,12 @@ static int phy_meson_gxl_usb3_power_on(struct phy *phy)
>>       struct phy_meson_gxl_usb3_priv *priv = dev_get_priv(dev);
>>       uint val;
>>
>> -     regmap_read(priv->regmap, USB_R5, &val);
>> +     regmap_read(priv->regmap, USB_R5, &val, REGMAP_SIZE_32);
>>       val |= USB_R5_ID_DIG_EN_0;
>>       val |= USB_R5_ID_DIG_EN_1;
>>       val &= ~USB_R5_ID_DIG_TH_MASK;
>>       val |= FIELD_PREP(USB_R5_ID_DIG_TH_MASK, 0xff);
>> -     regmap_write(priv->regmap, USB_R5, val);
>> +     regmap_write(priv->regmap, USB_R5, val, REGMAP_SIZE_32);
>>
>>       return phy_meson_gxl_usb3_set_host_mode(priv);
>>  }
>> @@ -133,10 +133,10 @@ static int phy_meson_gxl_usb3_power_off(struct phy *phy)
>>       struct phy_meson_gxl_usb3_priv *priv = dev_get_priv(dev);
>>       uint val;
>>
>> -     regmap_read(priv->regmap, USB_R5, &val);
>> +     regmap_read(priv->regmap, USB_R5, &val, REGMAP_SIZE_32);
>>       val &= ~USB_R5_ID_DIG_EN_0;
>>       val &= ~USB_R5_ID_DIG_EN_1;
>> -     regmap_write(priv->regmap, USB_R5, val);
>> +     regmap_write(priv->regmap, USB_R5, val, REGMAP_SIZE_32);
>>
>>       return 0;
>>  }
>> @@ -147,10 +147,10 @@ static int phy_meson_gxl_usb3_init(struct phy *phy)
>>       struct phy_meson_gxl_usb3_priv *priv = dev_get_priv(dev);
>>       uint val;
>>
>> -     regmap_read(priv->regmap, USB_R1, &val);
>> +     regmap_read(priv->regmap, USB_R1, &val, REGMAP_SIZE_32);
>>       val &= ~USB_R1_U3H_FLADJ_30MHZ_REG_MASK;
>>       val |= FIELD_PREP(USB_R1_U3H_FLADJ_30MHZ_REG_MASK, 0x20);
>> -     regmap_write(priv->regmap, USB_R1, val);
>> +     regmap_write(priv->regmap, USB_R1, val, REGMAP_SIZE_32);
>>
>>       return 0;
>>  }
>> @@ -169,7 +169,7 @@ int meson_gxl_usb3_phy_probe(struct udevice *dev)
>>       ret = regmap_init_mem(dev, &priv->regmap);
>>       if (ret)
>>               return ret;
>> -
>> +
>>  #if CONFIG_IS_ENABLED(CLK)
>>       ret = clk_get_by_index(dev, 0, &priv->clk);
>>       if (ret < 0)
>> diff --git a/drivers/power/regulator/pbias_regulator.c b/drivers/power/regulator/pbias_regulator.c
>> index adf589b224..386da3a58f 100644
>> --- a/drivers/power/regulator/pbias_regulator.c
>> +++ b/drivers/power/regulator/pbias_regulator.c
>> @@ -46,7 +46,7 @@ static int pbias_write(struct udevice *dev, uint reg, const uint8_t *buff,
>>       if (len != 4)
>>               return -EINVAL;
>>
>> -     return regmap_write(priv->regmap, priv->offset, val);
>> +     return regmap_write(priv->regmap, priv->offset, val, REGMAP_SIZE_32);
>>  }
>>
>>  static int pbias_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
>> @@ -56,7 +56,8 @@ static int pbias_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
>>       if (len != 4)
>>               return -EINVAL;
>>
>> -     return regmap_read(priv->regmap, priv->offset, (u32 *)buff);
>> +     return regmap_read(priv->regmap, priv->offset, (u32 *)buff,
>> +                        REGMAP_SIZE_32);
>>  }
>>
>>  static int pbias_ofdata_to_platdata(struct udevice *dev)
>> diff --git a/drivers/reset/reset-meson.c b/drivers/reset/reset-meson.c
>> index 5324f86f5f..c31f302143 100644
>> --- a/drivers/reset/reset-meson.c
>> +++ b/drivers/reset/reset-meson.c
>> @@ -41,12 +41,12 @@ static int meson_reset_level(struct reset_ctl *reset_ctl, bool assert)
>>       uint reg_offset = LEVEL_OFFSET + (bank << 2);
>>       uint val;
>>
>> -     regmap_read(priv->regmap, reg_offset, &val);
>> +     regmap_read(priv->regmap, reg_offset, &val, REGMAP_SIZE_32);
>>       if (assert)
>>               val &= ~BIT(offset);
>>       else
>>               val |= BIT(offset);
>> -     regmap_write(priv->regmap, reg_offset, val);
>> +     regmap_write(priv->regmap, reg_offset, val, REGMAP_SIZE_32);
>>
>>       return 0;
>>  }
>> @@ -68,15 +68,15 @@ struct reset_ops meson_reset_ops = {
>>       .rst_deassert = meson_reset_deassert,
>>  };
>>
>> -static const struct udevice_id meson_reset_ids[] = {
>> -     { .compatible = "amlogic,meson-gxbb-reset" },
>> -     { }
>> -};
>> +static const struct udevice_id meson_reset_ids[] = {
>> +     { .compatible = "amlogic,meson-gxbb-reset" },
>> +     { }
>> +};
>>
>>  static int meson_reset_probe(struct udevice *dev)
>>  {
>>       struct meson_reset_priv *priv = dev_get_priv(dev);
>> -
>> +
>>       return regmap_init_mem(dev, &priv->regmap);
>>  }
>>
>> diff --git a/drivers/sysreset/sysreset_syscon.c b/drivers/sysreset/sysreset_syscon.c
>> index 22c602a4d2..0c374a7443 100644
>> --- a/drivers/sysreset/sysreset_syscon.c
>> +++ b/drivers/sysreset/sysreset_syscon.c
>> @@ -25,7 +25,7 @@ static int syscon_reboot_request(struct udevice *dev, enum sysreset_t type)
>>  {
>>       struct syscon_reboot_priv *priv = dev_get_priv(dev);
>>
>> -     regmap_write(priv->regmap, priv->offset, priv->mask);
>> +     regmap_write(priv->regmap, priv->offset, priv->mask, REGMAP_SIZE_32);
>>
>>       return -EINPROGRESS;
>>  }
>> diff --git a/include/regmap.h b/include/regmap.h
>> index 493a5d8eff..a6e2fafd27 100644
>> --- a/include/regmap.h
>> +++ b/include/regmap.h
>> @@ -8,6 +8,13 @@
>>  #ifndef __REGMAP_H
>>  #define __REGMAP_H
>>
>> +/* Access sizes for fpgamap reads and writes */
>> +enum regmap_size_t {
>> +     REGMAP_SIZE_8 = 1,
>> +     REGMAP_SIZE_16 = 2,
>> +     REGMAP_SIZE_32 = 4,
>> +};
>> +
>>  /**
>>   * struct regmap_range - a register map range
>>   *
>> @@ -37,8 +44,8 @@ struct regmap {
>>   * Interface to provide access to registers either through a direct memory
>>   * bus or through a peripheral bus like I2C, SPI.
>>   */
>> -int regmap_write(struct regmap *map, uint offset, uint val);
>> -int regmap_read(struct regmap *map, uint offset, uint *valp);
>> +int regmap_write(struct regmap *map, ulong offset, ulong val, enum regmap_size_t size);
>> +int regmap_read(struct regmap *map, ulong offset, ulong *valp, enum regmap_size_t size);
>>
>>  #define regmap_write32(map, ptr, member, val) \
>>       regmap_write(map, (uint32_t *)(ptr)->member - (uint32_t *)(ptr), val)
>>
>


More information about the U-Boot mailing list