aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMars Cheng <mars.cheng@mediatek.com>2017-04-07 21:20:31 -0400
committerMatthias Brugger <matthias.bgg@gmail.com>2017-05-15 04:47:24 -0400
commitf1be4c4e6c4a33859b57f306611e7d25eb503a04 (patch)
tree4066196f89dc53050e0092fe9b424b02903ebe27
parent2ea659a9ef488125eb46da6eb571de5eae5c43f6 (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.c33
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
110struct scp_ctrl_reg {
111 int pwr_sta_offs;
112 int pwr_sta2nd_offs;
113};
114
110struct scp { 115struct 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
118static int scpsys_domain_is_on(struct scp_domain *scpd) 124static 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
348static struct scp *init_scp(struct platform_device *pdev, 355static 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[] = {
556static int __init scpsys_probe_mt2701(struct platform_device *pdev) 567static 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