Commit e127ef2e authored by Ulrich Hecht's avatar Ulrich Hecht Committed by Geert Uytterhoeven

pinctrl: renesas: Implement unlock register masks

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.
Signed-off-by: default avatarUlrich Hecht <uli+renesas@fpond.eu>
Tested-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
Link: https://lore.kernel.org/r/20210112165912.30876-2-uli+renesas@fpond.euSigned-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
parent 88a1590b
...@@ -175,13 +175,25 @@ u32 sh_pfc_read(struct sh_pfc *pfc, u32 reg) ...@@ -175,13 +175,25 @@ u32 sh_pfc_read(struct sh_pfc *pfc, u32 reg)
return sh_pfc_read_raw_reg(sh_pfc_phys_to_virt(pfc, reg), 32); return sh_pfc_read_raw_reg(sh_pfc_phys_to_virt(pfc, 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)
{ {
if (pfc->info->unlock_reg) u32 unlock;
sh_pfc_write_raw_reg(
sh_pfc_phys_to_virt(pfc, pfc->info->unlock_reg), 32, if (!pfc->info->unlock_reg)
~data); return;
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(sh_pfc_phys_to_virt(pfc, 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(sh_pfc_phys_to_virt(pfc, reg), 32, data); sh_pfc_write_raw_reg(sh_pfc_phys_to_virt(pfc, reg), 32, data);
} }
...@@ -227,11 +239,7 @@ static void sh_pfc_write_config_reg(struct sh_pfc *pfc, ...@@ -227,11 +239,7 @@ static void sh_pfc_write_config_reg(struct sh_pfc *pfc,
data &= mask; data &= mask;
data |= value; data |= value;
if (pfc->info->unlock_reg) sh_pfc_unlock_reg(pfc, crp->reg, data);
sh_pfc_write_raw_reg(
sh_pfc_phys_to_virt(pfc, pfc->info->unlock_reg), 32,
~data);
sh_pfc_write_raw_reg(mapped_reg, crp->reg_width, data); sh_pfc_write_raw_reg(mapped_reg, crp->reg_width, data);
} }
......
...@@ -300,7 +300,7 @@ struct sh_pfc_soc_info { ...@@ -300,7 +300,7 @@ struct sh_pfc_soc_info {
const u16 *pinmux_data; const u16 *pinmux_data;
unsigned int pinmux_data_size; unsigned int pinmux_data_size;
u32 unlock_reg; u32 unlock_reg; /* can be literal address or mask */
}; };
extern const struct sh_pfc_soc_info emev2_pinmux_info; extern const struct sh_pfc_soc_info emev2_pinmux_info;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment