[PATCH 3/4] soc: rockchip: power-domain: Add regulator support
Sascha Hauer
s.hauer at pengutronix.de
Fri Dec 17 05:09:18 PST 2021
This patch allows to let a domain be supplied by a regulator which
is needed for the GPU on the rk3568-EVB board.
Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
drivers/soc/rockchip/pm_domains.c | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/drivers/soc/rockchip/pm_domains.c b/drivers/soc/rockchip/pm_domains.c
index dcfd3db649f58..e7db888cc226c 100644
--- a/drivers/soc/rockchip/pm_domains.c
+++ b/drivers/soc/rockchip/pm_domains.c
@@ -15,6 +15,7 @@
#include <linux/of_platform.h>
#include <linux/clk.h>
#include <linux/regmap.h>
+#include <linux/regulator/consumer.h>
#include <linux/mfd/syscon.h>
#include <dt-bindings/power/px30-power.h>
#include <dt-bindings/power/rk3036-power.h>
@@ -80,6 +81,7 @@ struct rockchip_pm_domain {
u32 *qos_save_regs[MAX_QOS_REGS_NUM];
int num_clks;
struct clk_bulk_data *clks;
+ struct regulator *regulator;
};
struct rockchip_pmu {
@@ -344,6 +346,14 @@ static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on)
static int rockchip_pd_power_on(struct generic_pm_domain *domain)
{
struct rockchip_pm_domain *pd = to_rockchip_pd(domain);
+ struct rockchip_pmu *pmu = pd->pmu;
+ int ret;
+
+ ret = regulator_enable(pd->regulator);
+ if (ret) {
+ dev_err(pmu->dev, "failed to enable regulator: %d\n", ret);
+ return ret;
+ }
return rockchip_pd_power(pd, true);
}
@@ -351,8 +361,15 @@ static int rockchip_pd_power_on(struct generic_pm_domain *domain)
static int rockchip_pd_power_off(struct generic_pm_domain *domain)
{
struct rockchip_pm_domain *pd = to_rockchip_pd(domain);
+ int ret;
- return rockchip_pd_power(pd, false);
+ ret = rockchip_pd_power(pd, false);
+ if (ret)
+ return ret;
+
+ regulator_disable(pd->regulator);
+
+ return 0;
}
static int rockchip_pd_attach_dev(struct generic_pm_domain *genpd,
@@ -500,6 +517,11 @@ static int rockchip_domain_probe(struct platform_device *pdev)
pd->info = pd_info;
pd->pmu = pd_info->pmu;
+ pd->regulator = devm_regulator_get(&pdev->dev, "power");
+
+ if (IS_ERR(pd->regulator))
+ return PTR_ERR(pd->regulator);
+
pd->num_clks = devm_clk_bulk_get_all(&pdev->dev, &pd->clks);
if (pd->num_clks < 0)
return pd->num_clks;
--
2.30.2
More information about the linux-arm-kernel
mailing list