aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Baryshkov <dmitry.baryshkov@linaro.org>2020-08-18 17:39:11 +0300
committerDmitry Baryshkov <dmitry.baryshkov@linaro.org>2020-08-24 17:10:18 +0300
commit0339ca2c80cd07113dad608a2e4277ab8d416925 (patch)
treeb67458b96302e4c71d129c103deab61d104092e1
parent97c74c49608f8721e023d531d7258e257bc3bda1 (diff)
clk: qcom: gdsc: enable external switchable power domain
Some GDSCs (SM8250's MDSS_GDSC for example) need switchable power domain to be on to be able to access hardware registers. Use dev_pm/opp to enable corresponding power domain. Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
-rw-r--r--drivers/clk/qcom/gdsc.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/clk/qcom/gdsc.c b/drivers/clk/qcom/gdsc.c
index bfc4ac02f9ea..b119ab145ea4 100644
--- a/drivers/clk/qcom/gdsc.c
+++ b/drivers/clk/qcom/gdsc.c
@@ -11,6 +11,7 @@
#include <linux/kernel.h>
#include <linux/ktime.h>
#include <linux/pm_domain.h>
+#include <linux/pm_opp.h>
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
#include <linux/reset-controller.h>
@@ -398,6 +399,11 @@ int gdsc_register(struct gdsc_desc *desc,
if (!data->domains)
return -ENOMEM;
+ /* For some GDSC an external power domain must be enabled to access registers. */
+ ret = of_get_required_opp_performance_state(dev->of_node, 0);
+ if (ret > 0)
+ dev_pm_genpd_set_performance_state(dev, ret);
+
for (i = 0; i < num; i++) {
if (!scs[i] || !scs[i]->supply)
continue;
@@ -445,6 +451,7 @@ void gdsc_unregister(struct gdsc_desc *desc)
pm_genpd_remove_subdomain(scs[i]->parent, &scs[i]->pd);
}
of_genpd_del_provider(dev->of_node);
+ dev_pm_genpd_set_performance_state(dev, 0);
}
/*