summaryrefslogtreecommitdiff
path: root/drivers/soc
diff options
context:
space:
mode:
authorElaine Zhang <zhangqing@rock-chips.com>2018-10-16 15:26:42 +0800
committerTao Huang <huangtao@rock-chips.com>2018-10-19 10:56:29 +0800
commit30b2b0583c6ad3ddf7ca2d0b81cc9d11e6b8efcc (patch)
treeeaf5a46cfafd5e3e6ef1851d234f25b38adaf140 /drivers/soc
parent4ebc216df25ec673fb5eefd1d4f42487c4c2c06c (diff)
soc: rockchip: power-domain: Add regulator support
The power domains are supplied by regulators. Add support for them so that the regulators are properly turned on before a domain is powered up and turned off when a domain is powered down. Change-Id: I43ad569e1b82a8e818cbbf2ffcfa6a965d993bbf Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
Diffstat (limited to 'drivers/soc')
-rw-r--r--drivers/soc/rockchip/pm_domains.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/soc/rockchip/pm_domains.c b/drivers/soc/rockchip/pm_domains.c
index 031aafef33f8..ab3674527ea8 100644
--- a/drivers/soc/rockchip/pm_domains.c
+++ b/drivers/soc/rockchip/pm_domains.c
@@ -18,6 +18,7 @@
#include <linux/clk.h>
#include <linux/regmap.h>
#include <linux/mfd/syscon.h>
+#include <linux/regulator/consumer.h>
#include <soc/rockchip/pm_domains.h>
#include <soc/rockchip/rockchip_dmc.h>
#include <dt-bindings/power/px30-power.h>
@@ -76,6 +77,7 @@ struct rockchip_pm_domain {
int num_clks;
bool is_ignore_pwr;
bool is_qos_saved;
+ struct regulator *supply;
struct clk *clks[];
};
@@ -392,6 +394,21 @@ static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on)
rockchip_pmu_lock(pd);
if (rockchip_pmu_domain_is_on(pd) != power_on) {
+ if (IS_ERR_OR_NULL(pd->supply) &&
+ PTR_ERR(pd->supply) != -ENODEV)
+ pd->supply = devm_regulator_get_optional(pd->pmu->dev,
+ genpd->name);
+
+ if (power_on && !IS_ERR(pd->supply)) {
+ ret = regulator_enable(pd->supply);
+ if (ret < 0) {
+ dev_err(pd->pmu->dev, "failed to set vdd supply enable '%s',\n",
+ genpd->name);
+ rockchip_pmu_unlock(pd);
+ return ret;
+ }
+ }
+
for (i = 0; i < pd->num_clks; i++)
clk_enable(pd->clks[i]);
@@ -430,6 +447,9 @@ static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on)
out:
for (i = pd->num_clks - 1; i >= 0; i--)
clk_disable(pd->clks[i]);
+
+ if (!power_on && !IS_ERR(pd->supply))
+ ret = regulator_disable(pd->supply);
}
rockchip_pmu_unlock(pd);