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

