pmdomain: mediatek: Create bus protection operation functions
authorMarkus Schneider-Pargmann <msp@baylibre.com>
Mon, 18 Sep 2023 09:37:48 +0000 (11:37 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Tue, 17 Oct 2023 09:41:42 +0000 (11:41 +0200)
Separate the register access used for bus protection enable/disable into
their own functions. These will be used later for WAY_EN support.

Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: Alexandre Mergnat <amergnat@baylibre.com>
Tested-by: Alexandre Mergnat <amergnat@baylibre.com>
Link: https://lore.kernel.org/r/20230918093751.1188668-5-msp@baylibre.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/pmdomain/mediatek/mtk-pm-domains.c

index dbb268e..5b694fd 100644 (file)
@@ -118,26 +118,50 @@ static int scpsys_sram_disable(struct scpsys_domain *pd)
                                        MTK_POLL_TIMEOUT);
 }
 
+static int scpsys_bus_protect_clear(const struct scpsys_bus_prot_data *bpd,
+                                   struct regmap *regmap)
+{
+       u32 sta_mask = bpd->bus_prot_sta_mask;
+       u32 val;
+
+       if (bpd->flags & BUS_PROT_REG_UPDATE)
+               regmap_clear_bits(regmap, bpd->bus_prot_clr, bpd->bus_prot_set_clr_mask);
+       else
+               regmap_write(regmap, bpd->bus_prot_clr, bpd->bus_prot_set_clr_mask);
+
+       if (bpd->flags & BUS_PROT_IGNORE_CLR_ACK)
+               return 0;
+
+       return regmap_read_poll_timeout(regmap, bpd->bus_prot_sta,
+                                       val, !(val & sta_mask),
+                                       MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
+}
+
+static int scpsys_bus_protect_set(const struct scpsys_bus_prot_data *bpd,
+                                 struct regmap *regmap)
+{
+       u32 sta_mask = bpd->bus_prot_sta_mask;
+       u32 val;
+
+       if (bpd->flags & BUS_PROT_REG_UPDATE)
+               regmap_set_bits(regmap, bpd->bus_prot_set, bpd->bus_prot_set_clr_mask);
+       else
+               regmap_write(regmap, bpd->bus_prot_set, bpd->bus_prot_set_clr_mask);
+
+       return regmap_read_poll_timeout(regmap, bpd->bus_prot_sta,
+                                       val, (val & sta_mask) == sta_mask,
+                                       MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
+}
+
 static int _scpsys_bus_protect_enable(const struct scpsys_bus_prot_data *bpd, struct regmap *regmap)
 {
        int i, ret;
 
        for (i = 0; i < SPM_MAX_BUS_PROT_DATA; i++) {
-               u32 set_clr_mask = bpd[i].bus_prot_set_clr_mask;
-               u32 sta_mask = bpd[i].bus_prot_sta_mask;
-               u32 val;
-
-               if (!set_clr_mask)
+               if (!bpd[i].bus_prot_set_clr_mask)
                        break;
 
-               if (bpd[i].flags & BUS_PROT_REG_UPDATE)
-                       regmap_set_bits(regmap, bpd[i].bus_prot_set, set_clr_mask);
-               else
-                       regmap_write(regmap, bpd[i].bus_prot_set, set_clr_mask);
-
-               ret = regmap_read_poll_timeout(regmap, bpd[i].bus_prot_sta,
-                                              val, (val & sta_mask) == sta_mask,
-                                              MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
+               ret = scpsys_bus_protect_set(&bpd[i], regmap);
                if (ret)
                        return ret;
        }
@@ -162,24 +186,10 @@ static int _scpsys_bus_protect_disable(const struct scpsys_bus_prot_data *bpd,
        int i, ret;
 
        for (i = SPM_MAX_BUS_PROT_DATA - 1; i >= 0; i--) {
-               u32 set_clr_mask = bpd[i].bus_prot_set_clr_mask;
-               u32 sta_mask = bpd[i].bus_prot_sta_mask;
-               u32 val;
-
-               if (!set_clr_mask)
-                       continue;
-
-               if (bpd[i].flags & BUS_PROT_REG_UPDATE)
-                       regmap_clear_bits(regmap, bpd[i].bus_prot_clr, set_clr_mask);
-               else
-                       regmap_write(regmap, bpd[i].bus_prot_clr, set_clr_mask);
-
-               if (bpd[i].flags & BUS_PROT_IGNORE_CLR_ACK)
+               if (!bpd[i].bus_prot_set_clr_mask)
                        continue;
 
-               ret = regmap_read_poll_timeout(regmap, bpd[i].bus_prot_sta,
-                                              val, !(val & sta_mask),
-                                              MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
+               ret = scpsys_bus_protect_clear(&bpd[i], regmap);
                if (ret)
                        return ret;
        }