Add a bus_prot_sta_mask field to the mtk_bus_prot structure. This will
be used by power domains that have a separate status mask compared to
the bus_prot_mask.

Signed-off-by: David Lechner <[email protected]>
---
 drivers/power/domain/mtk-power-domain.c | 8 ++++++--
 drivers/power/domain/mtk-power-domain.h | 9 +++++++--
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/power/domain/mtk-power-domain.c 
b/drivers/power/domain/mtk-power-domain.c
index 9eef58d2d57..76f86b65f91 100644
--- a/drivers/power/domain/mtk-power-domain.c
+++ b/drivers/power/domain/mtk-power-domain.c
@@ -47,6 +47,7 @@ static int _scpsys_bus_protect_enable(const struct 
mtk_scpsys_bus_prot_data *bpd
                                      void __iomem *reg)
 {
        u32 val = 0, mask = bpd->bus_prot_mask;
+       u32 sta_mask = bpd->bus_prot_sta_mask;
 
        if (!mask)
                return 0;
@@ -56,13 +57,15 @@ static int _scpsys_bus_protect_enable(const struct 
mtk_scpsys_bus_prot_data *bpd
        else
                writel(mask, reg + bpd->bus_prot_set);
 
-       return readl_poll_timeout(reg + bpd->bus_prot_sta, val, (val & mask) == 
mask, 1000);
+       return readl_poll_timeout(reg + bpd->bus_prot_sta, val,
+                                 (val & sta_mask) == sta_mask, 1000);
 }
 
 static int _scpsys_bus_protect_disable(const struct mtk_scpsys_bus_prot_data 
*bpd,
                                       void __iomem *reg)
 {
        u32 val = 0, mask = bpd->bus_prot_mask;
+       u32 sta_mask = bpd->bus_prot_sta_mask;
 
        if (!mask)
                return 0;
@@ -75,7 +78,8 @@ static int _scpsys_bus_protect_disable(const struct 
mtk_scpsys_bus_prot_data *bp
        if (bpd->ignore_clr_ack)
                return 0;
 
-       return readl_poll_timeout(reg + bpd->bus_prot_sta, val, !(val & mask), 
1000);
+       return readl_poll_timeout(reg + bpd->bus_prot_sta, val,
+                                 !(val & sta_mask), 1000);
 }
 
 static int scpsys_bus_protect_enable(const struct mtk_scpsys_bus_prot_data 
*bpd,
diff --git a/drivers/power/domain/mtk-power-domain.h 
b/drivers/power/domain/mtk-power-domain.h
index 5bf0ca850ec..da7ffa7b722 100644
--- a/drivers/power/domain/mtk-power-domain.h
+++ b/drivers/power/domain/mtk-power-domain.h
@@ -68,6 +68,7 @@ struct mtk_scpsys_bus_prot_data {
        u32 bus_prot_mask;
        u32 bus_prot_set;
        u32 bus_prot_clr;
+       u32 bus_prot_sta_mask;
        u32 bus_prot_sta;
        bool bus_prot_reg_update;
        bool ignore_clr_ack;
@@ -111,17 +112,21 @@ struct mtk_scpsys {
        struct mtk_scp_domain *domains;
 };
 
-#define _BUS_PROT(_mask, _set, _clr, _sta, _update, _ignore) { \
+#define _BUS_PROT(_mask, _set, _clr, _sta_mask, _sta, _update, _ignore) { \
        .bus_prot_mask = (_mask),                               \
        .bus_prot_set = (_set),                                 \
        .bus_prot_clr = (_clr),                                 \
+       .bus_prot_sta_mask = (_sta_mask),                       \
        .bus_prot_sta = (_sta),                                 \
        .bus_prot_reg_update = (_update),                       \
        .ignore_clr_ack = (_ignore),                            \
 }
 
 #define BUS_PROT_WR(_mask, _set, _clr, _sta)                   \
-       _BUS_PROT(_mask, _set, _clr, _sta, false, false)
+       _BUS_PROT(_mask, _set, _clr, _mask, _sta, false, false)
+
+#define BUS_PROT_WR_STA_MASK(_mask, _sta_mask, _set, _clr, _sta) \
+       _BUS_PROT(_mask, _set, _clr, _sta_mask, _sta, false, false)
 
 int mtk_scpsys_probe(struct udevice *dev);
 int mtk_power_controller_probe(struct udevice *dev);

-- 
2.43.0

Reply via email to