Merge tag 'net-5.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux-2.6-microblaze.git] / drivers / pinctrl / renesas / core.c
index c528c12..2bfd300 100644 (file)
@@ -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);
 }
 
-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)
-               sh_pfc_write_raw_reg(
-                       sh_pfc_phys_to_virt(pfc, pfc->info->unlock_reg), 32,
-                       ~data);
+       u32 unlock;
+
+       if (!pfc->info->unlock_reg)
+               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);
 }
 
@@ -227,11 +239,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(
-                       sh_pfc_phys_to_virt(pfc, pfc->info->unlock_reg), 32,
-                       ~data);
-
+       sh_pfc_unlock_reg(pfc, crp->reg, data);
        sh_pfc_write_raw_reg(mapped_reg, crp->reg_width, data);
 }
 
@@ -315,6 +323,7 @@ int sh_pfc_config_mux(struct sh_pfc *pfc, unsigned mark, int pinmux_type)
                range = NULL;
                break;
 
+#ifdef CONFIG_PINCTRL_SH_PFC_GPIO
        case PINMUX_TYPE_OUTPUT:
                range = &pfc->info->output;
                break;
@@ -322,6 +331,7 @@ int sh_pfc_config_mux(struct sh_pfc *pfc, unsigned mark, int pinmux_type)
        case PINMUX_TYPE_INPUT:
                range = &pfc->info->input;
                break;
+#endif /* CONFIG_PINCTRL_SH_PFC_GPIO */
 
        default:
                return -EINVAL;
@@ -636,6 +646,12 @@ static const struct of_device_id sh_pfc_of_table[] = {
                .data = &r8a77995_pinmux_info,
        },
 #endif
+#ifdef CONFIG_PINCTRL_PFC_R8A779A0
+       {
+               .compatible = "renesas,pfc-r8a779a0",
+               .data = &r8a779a0_pinmux_info,
+       },
+#endif
 #ifdef CONFIG_PINCTRL_PFC_SH73A0
        {
                .compatible = "renesas,pfc-sh73a0",
@@ -1050,6 +1066,10 @@ static void __init sh_pfc_check_driver(const struct platform_driver *pdrv)
 {
        unsigned int i;
 
+       if (!IS_ENABLED(CONFIG_SUPERH) &&
+           !of_find_matching_node(NULL, pdrv->driver.of_match_table))
+               return;
+
        sh_pfc_regs = kcalloc(SH_PFC_MAX_REGS, sizeof(*sh_pfc_regs),
                              GFP_KERNEL);
        if (!sh_pfc_regs)