summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2020-09-11 10:40:05 +0200
committerLucas Stach <l.stach@pengutronix.de>2020-09-30 17:33:18 +0200
commit7cf758313b6b3627a70c02b346ca5f450f5c8360 (patch)
treee91b3986b15affae28a6ee085c5dcbd8511ca1ad
parent2103c0556c27ffc19a9bfc0523218e7c319133fc (diff)
downloadlinux-7cf758313b6b3627a70c02b346ca5f450f5c8360.tar.gz
linux-7cf758313b6b3627a70c02b346ca5f450f5c8360.tar.xz
soc: imx: gpcv2: move domain mapping to domain driver probe
As long as the power domain driver is active we want power control over the domain (which is what the mapping bit requests), so there is no point in whacking it for every power control action, simply set the bit in driver probe and clear it when the driver is removed. Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
-rw-r--r--drivers/soc/imx/gpcv2.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/drivers/soc/imx/gpcv2.c b/drivers/soc/imx/gpcv2.c
index 8f91ef2d24de..dc420734b16c 100644
--- a/drivers/soc/imx/gpcv2.c
+++ b/drivers/soc/imx/gpcv2.c
@@ -140,14 +140,11 @@ static int imx_gpc_pu_pgc_sw_pxx_req(struct generic_pm_domain *genpd,
int i, ret = 0;
u32 pxx_req;
- regmap_update_bits(domain->regmap, GPC_PGC_CPU_MAPPING,
- domain->bits.map, domain->bits.map);
-
if (has_regulator && on) {
ret = regulator_enable(domain->regulator);
if (ret) {
dev_err(domain->dev, "failed to enable regulator\n");
- goto unmap;
+ return ret;
}
}
@@ -203,9 +200,7 @@ static int imx_gpc_pu_pgc_sw_pxx_req(struct generic_pm_domain *genpd,
/* Preserve earlier error code */
ret = ret ?: err;
}
-unmap:
- regmap_update_bits(domain->regmap, GPC_PGC_CPU_MAPPING,
- domain->bits.map, 0);
+
return ret;
}
@@ -504,10 +499,13 @@ static int imx_pgc_domain_probe(struct platform_device *pdev)
return ret;
}
+ regmap_update_bits(domain->regmap, GPC_PGC_CPU_MAPPING,
+ domain->bits.map, domain->bits.map);
+
ret = pm_genpd_init(&domain->genpd, NULL, true);
if (ret) {
dev_err(domain->dev, "Failed to init power domain\n");
- goto out_put_clocks;
+ goto out_domain_unmap;
}
ret = of_genpd_add_provider_simple(domain->dev->of_node,
@@ -521,7 +519,9 @@ static int imx_pgc_domain_probe(struct platform_device *pdev)
out_genpd_remove:
pm_genpd_remove(&domain->genpd);
-out_put_clocks:
+out_domain_unmap:
+ regmap_update_bits(domain->regmap, GPC_PGC_CPU_MAPPING,
+ domain->bits.map, 0);
imx_pgc_put_clocks(domain);
return ret;
@@ -533,6 +533,10 @@ static int imx_pgc_domain_remove(struct platform_device *pdev)
of_genpd_del_provider(domain->dev->of_node);
pm_genpd_remove(&domain->genpd);
+
+ regmap_update_bits(domain->regmap, GPC_PGC_CPU_MAPPING,
+ domain->bits.map, 0);
+
imx_pgc_put_clocks(domain);
return 0;