The devices within a gdsc power domain, quite often have additional
clocks to be turned on/off along with the power domain itself.
Once the drivers for these devices are converted to use runtime PM,
it would be possible to remove all clock handling from the drivers if
the gdsc driver can handle it.
Use PM clocks to add support for this. A list of con_ids[] specified
per gdsc would be the clocks turned on/off on every device start/stop
callbacks.

Signed-off-by: Rajendra Nayak <rna...@codeaurora.org>
---
 drivers/clk/qcom/gdsc.c | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/drivers/clk/qcom/gdsc.c b/drivers/clk/qcom/gdsc.c
index a59655b..3125809 100644
--- a/drivers/clk/qcom/gdsc.c
+++ b/drivers/clk/qcom/gdsc.c
@@ -14,6 +14,7 @@
 #include <linux/delay.h>
 #include <linux/err.h>
 #include <linux/jiffies.h>
+#include <linux/pm_clock.h>
 #include <linux/slab.h>
 #include "gdsc.h"
 
@@ -104,6 +105,37 @@ static int gdsc_disable(struct generic_pm_domain *domain)
        return gdsc_toggle_logic(sc, false);
 }
 
+static int gdsc_attach(struct generic_pm_domain *domain, struct device *dev)
+{
+       int ret;
+       struct gdsc *sc = domain_to_gdsc(domain);
+       char **con_id, *con_ids[] = { "core", "iface", NULL };
+
+       ret = pm_clk_create(dev);
+       if (ret) {
+               dev_err(dev, "pm_clk_create failed %d\n", ret);
+               return ret;
+       }
+
+       for (con_id = con_ids; *con_id; con_id++) {
+               ret = pm_clk_add(dev, *con_id);
+               if (ret) {
+                       dev_err(dev, "pm_clk_add failed %d\n", ret);
+                       goto fail;
+               }
+       }
+       return 0;
+fail:
+       pm_clk_destroy(dev);
+       return ret;
+};
+
+static void gdsc_detach(struct generic_pm_domain *domain, struct device *dev)
+{
+       pm_clk_destroy(dev);
+       return;
+};
+
 static int gdsc_init(struct gdsc *sc)
 {
        u32 mask, val;
@@ -127,6 +159,9 @@ static int gdsc_init(struct gdsc *sc)
 
        sc->pd.power_off = gdsc_disable;
        sc->pd.power_on = gdsc_enable;
+       sc->pd.attach_dev = gdsc_attach;
+       sc->pd.detach_dev = gdsc_detach;
+       sc->pd.flags = GENPD_FLAG_PM_CLK;
        pm_genpd_init(&sc->pd, NULL, !on);
 
        return 0;
-- 
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member
of Code Aurora Forum, hosted by The Linux Foundation

--
To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to