With genpd now expecting powerdomain drivers supporting performance
state to support get/set performance state callbacks, add support for it
in the rpmpd driver.

Signed-off-by: Rajendra Nayak <rna...@codeaurora.org>
Signed-off-by: Viresh Kumar <viresh.ku...@linaro.org>
---
 drivers/soc/qcom/rpmpd.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/drivers/soc/qcom/rpmpd.c b/drivers/soc/qcom/rpmpd.c
index c8754d867c33..4058c5b450c6 100644
--- a/drivers/soc/qcom/rpmpd.c
+++ b/drivers/soc/qcom/rpmpd.c
@@ -14,6 +14,7 @@
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
+#include <linux/pm_opp.h>
 #include <linux/soc/qcom/smd-rpm.h>
 
 #include <dt-bindings/mfd/qcom-rpm.h>
@@ -29,6 +30,8 @@
 #define KEY_ENABLE             0x6e657773 /* swen */
 #define KEY_FLOOR_CORNER       0x636676   /* vfc */
 
+#define MAX_RPMPD_STATE                6
+
 #define DEFINE_RPMPD_CORN_SMPA(_platform, _name, _active, r_id)                
\
        static struct rpmpd _platform##_##_active;                      \
        static struct rpmpd _platform##_##_name = {                     \
@@ -222,6 +225,43 @@ static int rpmpd_power_off(struct generic_pm_domain 
*domain)
        return ret;
 }
 
+static int rpmpd_set_performance(struct generic_pm_domain *domain,
+                            unsigned int state)
+{
+       int ret = 0;
+       struct rpmpd *pd = domain_to_rpmpd(domain);
+
+       mutex_lock(&rpmpd_lock);
+
+       if (state > MAX_RPMPD_STATE)
+               goto out;
+
+       pd->corner = state;
+
+       if (!pd->enabled && (pd->key != KEY_FLOOR_CORNER))
+               goto out;
+
+       ret = rpmpd_aggregate_corner(pd);
+
+out:
+       mutex_unlock(&rpmpd_lock);
+
+       return ret;
+}
+
+static unsigned int rpmpd_get_performance(struct generic_pm_domain *genpd,
+                                         struct dev_pm_opp *opp)
+{
+       struct device_node *np;
+       unsigned int corner = 0;
+
+       np = dev_pm_opp_get_of_node(opp);
+       of_property_read_u32(np, "qcom,level", &corner);
+       of_node_put(np);
+
+       return corner;
+}
+
 static int rpmpd_probe(struct platform_device *pdev)
 {
        int i;
@@ -259,6 +299,8 @@ static int rpmpd_probe(struct platform_device *pdev)
                rpmpds[i]->rpm = rpm;
                rpmpds[i]->pd.power_off = rpmpd_power_off;
                rpmpds[i]->pd.power_on = rpmpd_power_on;
+               rpmpds[i]->pd.set_performance_state = rpmpd_set_performance;
+               rpmpds[i]->pd.get_performance_state = rpmpd_get_performance;
                pm_genpd_init(&rpmpds[i]->pd, NULL, true);
 
                data->domains[i] = &rpmpds[i]->pd;
-- 
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member
of Code Aurora Forum, hosted by The Linux Foundation

Reply via email to