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);
 }
 
        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);
 }