diff options
author | Dmitry Baryshkov <dmitry.baryshkov@linaro.org> | 2020-08-18 17:39:11 +0300 |
---|---|---|
committer | Dmitry Baryshkov <dmitry.baryshkov@linaro.org> | 2020-08-24 17:10:18 +0300 |
commit | 0339ca2c80cd07113dad608a2e4277ab8d416925 (patch) | |
tree | b67458b96302e4c71d129c103deab61d104092e1 | |
parent | 97c74c49608f8721e023d531d7258e257bc3bda1 (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.c | 7 |
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); } /* |