The per-SoC match data currently points directly at the array of
mtk_scp_domain_data. Wrap it in a new struct mtk_scp_soc_data that
carries the table pointer together with its size, and add a
MTK_SCP_SOC_DATA() helper that fills both from a single table definition
via ARRAY_SIZE().

The num_domains field is not used yet; it is added here so that upcoming
SoC support can validate the domain index coming from the device tree
against the size of the table.

No functional change intended.

Signed-off-by: Julien Stephan <[email protected]>
---
 drivers/power/domain/mt2701-power-domain.c |  6 ++++--
 drivers/power/domain/mt7622-power-domain.c |  4 +++-
 drivers/power/domain/mtk-power-domain.c    |  8 ++++----
 drivers/power/domain/mtk-power-domain.h    | 14 +++++++++++++-
 4 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/drivers/power/domain/mt2701-power-domain.c 
b/drivers/power/domain/mt2701-power-domain.c
index 5626235360e..58ef47c3001 100644
--- a/drivers/power/domain/mt2701-power-domain.c
+++ b/drivers/power/domain/mt2701-power-domain.c
@@ -65,14 +65,16 @@ static const struct mtk_scp_domain_data mt2701_scp_domain[] 
= {
        },
 };
 
+MTK_SCP_SOC_DATA(mt2701, mt2701_scp_domain);
+
 static const struct udevice_id mt2701_power_domain_ids[] = {
        {
                .compatible = "mediatek,mt2701-scpsys",
-               .data = (ulong)&mt2701_scp_domain,
+               .data = (ulong)&mt2701_scp_soc_data,
        },
        {
                .compatible = "mediatek,mt7623-scpsys",
-               .data = (ulong)&mt2701_scp_domain,
+               .data = (ulong)&mt2701_scp_soc_data,
        },
        { /* sentinel */ }
 };
diff --git a/drivers/power/domain/mt7622-power-domain.c 
b/drivers/power/domain/mt7622-power-domain.c
index 487ae477bb0..b98c384c3b1 100644
--- a/drivers/power/domain/mt7622-power-domain.c
+++ b/drivers/power/domain/mt7622-power-domain.c
@@ -36,10 +36,12 @@ static const struct mtk_scp_domain_data mt7622_scp_domain[] 
= {
        },
 };
 
+MTK_SCP_SOC_DATA(mt7622, mt7622_scp_domain);
+
 static const struct udevice_id mt7622_power_domain_ids[] = {
        {
                .compatible = "mediatek,mt7622-scpsys",
-               .data = (ulong)&mt7622_scp_domain,
+               .data = (ulong)&mt7622_scp_soc_data,
        },
        { /* sentinel */ }
 };
diff --git a/drivers/power/domain/mtk-power-domain.c 
b/drivers/power/domain/mtk-power-domain.c
index a8045c1f91e..752ca404875 100644
--- a/drivers/power/domain/mtk-power-domain.c
+++ b/drivers/power/domain/mtk-power-domain.c
@@ -44,7 +44,7 @@ static int mtk_infracfg_clear_bus_protection(void __iomem 
*infracfg,
 static int mtk_scpsys_domain_is_on(struct power_domain *power_domain)
 {
        struct mtk_scp_domain *scpd = dev_get_priv(power_domain->dev);
-       const struct mtk_scp_domain_data *data = &scpd->data[power_domain->id];
+       const struct mtk_scp_domain_data *data = 
&scpd->soc_data->data[power_domain->id];
        u32 sta = readl(scpd->base + SPM_PWR_STATUS) &
                        data->sta_mask;
        u32 sta2 = readl(scpd->base + SPM_PWR_STATUS_2ND) &
@@ -65,7 +65,7 @@ static int mtk_scpsys_domain_is_on(struct power_domain 
*power_domain)
 static int mtk_scpsys_power_on(struct power_domain *power_domain)
 {
        struct mtk_scp_domain *scpd = dev_get_priv(power_domain->dev);
-       const struct mtk_scp_domain_data *data = &scpd->data[power_domain->id];
+       const struct mtk_scp_domain_data *data = 
&scpd->soc_data->data[power_domain->id];
        void __iomem *ctl_addr = scpd->base + data->ctl_offs;
        u32 pdn_ack = data->sram_pdn_ack_bits;
        u32 val;
@@ -114,7 +114,7 @@ static int mtk_scpsys_power_on(struct power_domain 
*power_domain)
 static int mtk_scpsys_power_off(struct power_domain *power_domain)
 {
        struct mtk_scp_domain *scpd = dev_get_priv(power_domain->dev);
-       const struct mtk_scp_domain_data *data = &scpd->data[power_domain->id];
+       const struct mtk_scp_domain_data *data = 
&scpd->soc_data->data[power_domain->id];
        void __iomem *ctl_addr = scpd->base + data->ctl_offs;
        u32 pdn_ack = data->sram_pdn_ack_bits;
        u32 val;
@@ -170,7 +170,7 @@ int mtk_power_domain_probe(struct udevice *dev)
        if (!scpd->base)
                return -ENOENT;
 
-       scpd->data = (const struct mtk_scp_domain_data 
*)dev_get_driver_data(dev);
+       scpd->soc_data = (const struct mtk_scp_soc_data 
*)dev_get_driver_data(dev);
 
        /* get corresponding syscon phandle */
        err = dev_read_phandle_with_args(dev, "infracfg", NULL, 0, 0, &args);
diff --git a/drivers/power/domain/mtk-power-domain.h 
b/drivers/power/domain/mtk-power-domain.h
index 0c2c06a045f..ade77af8f33 100644
--- a/drivers/power/domain/mtk-power-domain.h
+++ b/drivers/power/domain/mtk-power-domain.h
@@ -12,6 +12,7 @@
 #include <power-domain-uclass.h>
 #include <linux/bitops.h>
 #include <linux/compiler.h>
+#include <linux/kernel.h>
 #include <linux/types.h>
 
 struct udevice;
@@ -68,10 +69,21 @@ struct mtk_scp_domain_data {
        u32 bus_prot_mask;
 };
 
+struct mtk_scp_soc_data {
+       const struct mtk_scp_domain_data *data;
+       int num_domains;
+};
+
+#define MTK_SCP_SOC_DATA(_name, _domains)                      \
+static const struct mtk_scp_soc_data _name##_scp_soc_data = {  \
+       .data = _domains,                                       \
+       .num_domains = ARRAY_SIZE(_domains),                    \
+}
+
 struct mtk_scp_domain {
        void __iomem *base;
        void __iomem *infracfg;
-       const struct mtk_scp_domain_data *data;
+       const struct mtk_scp_soc_data *soc_data;
 };
 
 int mtk_power_domain_probe(struct udevice *dev);

-- 
2.54.0

Reply via email to