diff options
author | Mars Cheng <mars.cheng@mediatek.com> | 2017-04-07 21:20:31 -0400 |
---|---|---|
committer | Matthias Brugger <matthias.bgg@gmail.com> | 2017-05-15 04:47:24 -0400 |
commit | f1be4c4e6c4a33859b57f306611e7d25eb503a04 (patch) | |
tree | 4066196f89dc53050e0092fe9b424b02903ebe27 | |
parent | 2ea659a9ef488125eb46da6eb571de5eae5c43f6 (diff) |
soc: mediatek: avoid using fixed spm power status defines
Use variables to replace fixed defines since the offset
of the status of spm power might be different for some chips
Signed-off-by: Mars Cheng <mars.cheng@mediatek.com>
Signed-off-by: Kevin-CW Chen <kevin-cw.chen@mediatek.com>
Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
-rw-r--r-- | drivers/soc/mediatek/mtk-scpsys.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/drivers/soc/mediatek/mtk-scpsys.c b/drivers/soc/mediatek/mtk-scpsys.c index beb79162369a..eadbf0d13e34 100644 --- a/drivers/soc/mediatek/mtk-scpsys.c +++ b/drivers/soc/mediatek/mtk-scpsys.c | |||
@@ -107,21 +107,28 @@ struct scp_domain { | |||
107 | struct regulator *supply; | 107 | struct regulator *supply; |
108 | }; | 108 | }; |
109 | 109 | ||
110 | struct scp_ctrl_reg { | ||
111 | int pwr_sta_offs; | ||
112 | int pwr_sta2nd_offs; | ||
113 | }; | ||
114 | |||
110 | struct scp { | 115 | struct scp { |
111 | struct scp_domain *domains; | 116 | struct scp_domain *domains; |
112 | struct genpd_onecell_data pd_data; | 117 | struct genpd_onecell_data pd_data; |
113 | struct device *dev; | 118 | struct device *dev; |
114 | void __iomem *base; | 119 | void __iomem *base; |
115 | struct regmap *infracfg; | 120 | struct regmap *infracfg; |
121 | struct scp_ctrl_reg ctrl_reg; | ||
116 | }; | 122 | }; |
117 | 123 | ||
118 | static int scpsys_domain_is_on(struct scp_domain *scpd) | 124 | static int scpsys_domain_is_on(struct scp_domain *scpd) |
119 | { | 125 | { |
120 | struct scp *scp = scpd->scp; | 126 | struct scp *scp = scpd->scp; |
121 | 127 | ||
122 | u32 status = readl(scp->base + SPM_PWR_STATUS) & scpd->data->sta_mask; | 128 | u32 status = readl(scp->base + scp->ctrl_reg.pwr_sta_offs) & |
123 | u32 status2 = readl(scp->base + SPM_PWR_STATUS_2ND) & | 129 | scpd->data->sta_mask; |
124 | scpd->data->sta_mask; | 130 | u32 status2 = readl(scp->base + scp->ctrl_reg.pwr_sta2nd_offs) & |
131 | scpd->data->sta_mask; | ||
125 | 132 | ||
126 | /* | 133 | /* |
127 | * A domain is on when both status bits are set. If only one is set | 134 | * A domain is on when both status bits are set. If only one is set |
@@ -346,7 +353,8 @@ static void init_clks(struct platform_device *pdev, struct clk **clk) | |||
346 | } | 353 | } |
347 | 354 | ||
348 | static struct scp *init_scp(struct platform_device *pdev, | 355 | static struct scp *init_scp(struct platform_device *pdev, |
349 | const struct scp_domain_data *scp_domain_data, int num) | 356 | const struct scp_domain_data *scp_domain_data, int num, |
357 | struct scp_ctrl_reg *scp_ctrl_reg) | ||
350 | { | 358 | { |
351 | struct genpd_onecell_data *pd_data; | 359 | struct genpd_onecell_data *pd_data; |
352 | struct resource *res; | 360 | struct resource *res; |
@@ -358,6 +366,9 @@ static struct scp *init_scp(struct platform_device *pdev, | |||
358 | if (!scp) | 366 | if (!scp) |
359 | return ERR_PTR(-ENOMEM); | 367 | return ERR_PTR(-ENOMEM); |
360 | 368 | ||
369 | scp->ctrl_reg.pwr_sta_offs = scp_ctrl_reg->pwr_sta_offs; | ||
370 | scp->ctrl_reg.pwr_sta2nd_offs = scp_ctrl_reg->pwr_sta2nd_offs; | ||
371 | |||
361 | scp->dev = &pdev->dev; | 372 | scp->dev = &pdev->dev; |
362 | 373 | ||
363 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 374 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
@@ -556,8 +567,13 @@ static const struct scp_domain_data scp_domain_data_mt2701[] = { | |||
556 | static int __init scpsys_probe_mt2701(struct platform_device *pdev) | 567 | static int __init scpsys_probe_mt2701(struct platform_device *pdev) |
557 | { | 568 | { |
558 | struct scp *scp; | 569 | struct scp *scp; |
570 | struct scp_ctrl_reg scp_reg; | ||
559 | 571 | ||
560 | scp = init_scp(pdev, scp_domain_data_mt2701, NUM_DOMAINS_MT2701); | 572 | scp_reg.pwr_sta_offs = SPM_PWR_STATUS; |
573 | scp_reg.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND; | ||
574 | |||
575 | scp = init_scp(pdev, scp_domain_data_mt2701, NUM_DOMAINS_MT2701, | ||
576 | &scp_reg); | ||
561 | if (IS_ERR(scp)) | 577 | if (IS_ERR(scp)) |
562 | return PTR_ERR(scp); | 578 | return PTR_ERR(scp); |
563 | 579 | ||
@@ -667,8 +683,13 @@ static int __init scpsys_probe_mt8173(struct platform_device *pdev) | |||
667 | struct scp *scp; | 683 | struct scp *scp; |
668 | struct genpd_onecell_data *pd_data; | 684 | struct genpd_onecell_data *pd_data; |
669 | int ret; | 685 | int ret; |
686 | struct scp_ctrl_reg scp_reg; | ||
687 | |||
688 | scp_reg.pwr_sta_offs = SPM_PWR_STATUS; | ||
689 | scp_reg.pwr_sta2nd_offs = SPM_PWR_STATUS_2ND; | ||
670 | 690 | ||
671 | scp = init_scp(pdev, scp_domain_data_mt8173, NUM_DOMAINS_MT8173); | 691 | scp = init_scp(pdev, scp_domain_data_mt8173, NUM_DOMAINS_MT8173, |
692 | &scp_reg); | ||
672 | if (IS_ERR(scp)) | 693 | if (IS_ERR(scp)) |
673 | return PTR_ERR(scp); | 694 | return PTR_ERR(scp); |
674 | 695 | ||