[PATCH 20/30] pinctrl: renesas: Implement unlock register masks
Lad, Prabhakar
prabhakar.csengg at gmail.com
Thu May 20 19:06:33 CEST 2021
Hi Marek,
Thank you for the patch.
On Wed, Apr 28, 2021 at 8:33 PM Marek Vasut <marek.vasut at gmail.com> wrote:
>
> The V3U SoC has several unlock registers, one per register group. They
> reside at offset zero in each 0x200 bytes-sized block.
>
> To avoid adding yet another table to the PFC implementation, this
> patch adds the option to specify an address mask instead of the fixed
> address in sh_pfc_soc_info::unlock_reg.
>
> This is a direct port of Linux 5.12 commit e127ef2ed0a6
> ("pinctrl: renesas: Implement unlock register masks") by
> Ulrich Hecht <uli+renesas at fpond.eu>
>
> Signed-off-by: Marek Vasut <marek.vasut+renesas at gmail.com>
> ---
> drivers/pinctrl/renesas/pfc.c | 39 ++++++++++++++++----------------
> drivers/pinctrl/renesas/sh_pfc.h | 2 +-
> 2 files changed, 20 insertions(+), 21 deletions(-)
>
Tested on RZ/G2{EHMN} boards
Tested-by: Lad Prabhakar <prabhakar.mahadev-lad.rj at bp.renesas.com>
Cheers,
Prabhakar
> diff --git a/drivers/pinctrl/renesas/pfc.c b/drivers/pinctrl/renesas/pfc.c
> index 07fcc3d393..2498eb5716 100644
> --- a/drivers/pinctrl/renesas/pfc.c
> +++ b/drivers/pinctrl/renesas/pfc.c
> @@ -131,14 +131,25 @@ u32 sh_pfc_read(struct sh_pfc *pfc, u32 reg)
> return sh_pfc_read_raw_reg((void __iomem *)(uintptr_t)reg, 32);
> }
>
> -void sh_pfc_write(struct sh_pfc *pfc, u32 reg, u32 data)
> +static void sh_pfc_unlock_reg(struct sh_pfc *pfc, u32 reg, u32 data)
> {
> - void __iomem *unlock_reg =
> - (void __iomem *)(uintptr_t)pfc->info->unlock_reg;
> + u32 unlock;
> +
> + if (!pfc->info->unlock_reg)
> + return;
>
> - if (pfc->info->unlock_reg)
> - sh_pfc_write_raw_reg(unlock_reg, 32, ~data);
> + if (pfc->info->unlock_reg >= 0x80000000UL)
> + unlock = pfc->info->unlock_reg;
> + else
> + /* unlock_reg is a mask */
> + unlock = reg & ~pfc->info->unlock_reg;
> +
> + sh_pfc_write_raw_reg((void __iomem *)(uintptr_t)unlock, 32, ~data);
> +}
>
> +void sh_pfc_write(struct sh_pfc *pfc, u32 reg, u32 data)
> +{
> + sh_pfc_unlock_reg(pfc, reg, data);
> sh_pfc_write_raw_reg((void __iomem *)(uintptr_t)reg, 32, data);
> }
>
> @@ -168,8 +179,6 @@ static void sh_pfc_write_config_reg(struct sh_pfc *pfc,
> unsigned int field, u32 value)
> {
> void __iomem *mapped_reg;
> - void __iomem *unlock_reg =
> - (void __iomem *)(uintptr_t)pfc->info->unlock_reg;
> unsigned int pos;
> u32 mask, data;
>
> @@ -186,9 +195,7 @@ static void sh_pfc_write_config_reg(struct sh_pfc *pfc,
> data &= mask;
> data |= value;
>
> - if (pfc->info->unlock_reg)
> - sh_pfc_write_raw_reg(unlock_reg, 32, ~data);
> -
> + sh_pfc_unlock_reg(pfc, crp->reg, data);
> sh_pfc_write_raw_reg(mapped_reg, crp->reg_width, data);
> }
>
> @@ -679,8 +686,6 @@ static int sh_pfc_pinconf_set_drive_strength(struct sh_pfc *pfc,
> unsigned int size;
> unsigned int step;
> void __iomem *reg;
> - void __iomem *unlock_reg =
> - (void __iomem *)(uintptr_t)pfc->info->unlock_reg;
> u32 val;
>
> reg = sh_pfc_pinconf_find_drive_strength_reg(pfc, pin, &offset, &size);
> @@ -701,9 +706,7 @@ static int sh_pfc_pinconf_set_drive_strength(struct sh_pfc *pfc,
> val &= ~GENMASK(offset + 4 - 1, offset);
> val |= strength << offset;
>
> - if (unlock_reg)
> - sh_pfc_write_raw_reg(unlock_reg, 32, ~val);
> -
> + sh_pfc_unlock_reg(pfc, (uintptr_t)reg, val);
> sh_pfc_write_raw_reg(reg, 32, val);
>
> return 0;
> @@ -743,8 +746,6 @@ static int sh_pfc_pinconf_set(struct sh_pfc_pinctrl *pmx, unsigned _pin,
> {
> struct sh_pfc *pfc = pmx->pfc;
> void __iomem *pocctrl;
> - void __iomem *unlock_reg =
> - (void __iomem *)(uintptr_t)pfc->info->unlock_reg;
> u32 addr, val;
> int bit, ret;
>
> @@ -790,9 +791,7 @@ static int sh_pfc_pinconf_set(struct sh_pfc_pinctrl *pmx, unsigned _pin,
> else
> val &= ~BIT(bit);
>
> - if (unlock_reg)
> - sh_pfc_write_raw_reg(unlock_reg, 32, ~val);
> -
> + sh_pfc_unlock_reg(pfc, addr, val);
> sh_pfc_write_raw_reg(pocctrl, 32, val);
>
> break;
> diff --git a/drivers/pinctrl/renesas/sh_pfc.h b/drivers/pinctrl/renesas/sh_pfc.h
> index 9d74f5fb4e..48d737a141 100644
> --- a/drivers/pinctrl/renesas/sh_pfc.h
> +++ b/drivers/pinctrl/renesas/sh_pfc.h
> @@ -294,7 +294,7 @@ struct sh_pfc_soc_info {
> const struct pinmux_irq *gpio_irq;
> unsigned int gpio_irq_size;
>
> - u32 unlock_reg;
> + u32 unlock_reg; /* can be literal address or mask */
> };
>
> u32 sh_pfc_read(struct sh_pfc *pfc, u32 reg);
> --
> 2.30.2
>
More information about the U-Boot
mailing list