Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 075d3db8 authored by Rajendra Nayak's avatar Rajendra Nayak Committed by Andy Gross
Browse files

soc: qcom: rpmpd: Add support for get/set performance state



Add support for the .set_performace_state() and .opp_to_performance_state()
callbacks in the rpmpd driver.

Reviewed-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Reviewed-by: default avatarStephen Boyd <swboyd@chromium.org>
Signed-off-by: default avatarRajendra Nayak <rnayak@codeaurora.org>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: default avatarAndy Gross <andy.gross@linaro.org>
parent bbe3a66c
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -10,6 +10,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>
@@ -26,6 +27,8 @@
#define KEY_ENABLE		0x6e657773 /* swen */
#define KEY_FLOOR_CORNER	0x636676   /* vfc */

#define MAX_RPMPD_STATE		6

#define DEFINE_RPMPD_CORNER_SMPA(_platform, _name, _active, r_id)		\
	static struct rpmpd _platform##_##_active;			\
	static struct rpmpd _platform##_##_name = {			\
@@ -218,6 +221,36 @@ 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);

	if (state > MAX_RPMPD_STATE)
		goto out;

	mutex_lock(&rpmpd_lock);

	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)
{
	return dev_pm_opp_get_level(opp);
}

static int rpmpd_probe(struct platform_device *pdev)
{
	int i;
@@ -258,6 +291,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.opp_to_performance_state = rpmpd_get_performance;
		pm_genpd_init(&rpmpds[i]->pd, NULL, true);

		data->domains[i] = &rpmpds[i]->pd;