Commit 68de2fe5 authored by Ulf Hansson's avatar Ulf Hansson Committed by Viresh Kumar

PM / Domains: Make genpd performance states orthogonal to the idlestates

It's quite questionable whether genpd internally should care about if the
corresponding PM domain for a device is powered on, as to allow setting a
new performance state for it. The assumptions creates an unnecessary
limitation at this point, for both consumers and providers, but more
importantly it also makes the code more complicated.

Therefore, let's simplify the code to allow setting a performance state, by
invoking the ->set_performance_state() callback, no matter whether the PM
domain is powered on or off.

Do note, this change means genpd providers needs to restore the performance
state themselves during power on, via the ->power_on() callback. Moreover,
they may also need to check that the PM domain is powered on, from their
->set_performance_state() callback, before deciding to update the state.
Tested-by: default avatarRajendra Nayak <rnayak@codeaurora.org>
Acked-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
parent 534245cc
...@@ -311,13 +311,11 @@ int dev_pm_genpd_set_performance_state(struct device *dev, unsigned int state) ...@@ -311,13 +311,11 @@ int dev_pm_genpd_set_performance_state(struct device *dev, unsigned int state)
*/ */
update_state: update_state:
if (genpd_status_on(genpd)) {
ret = genpd->set_performance_state(genpd, state); ret = genpd->set_performance_state(genpd, state);
if (ret) { if (ret) {
gpd_data->performance_state = prev; gpd_data->performance_state = prev;
goto unlock; goto unlock;
} }
}
genpd->performance_state = state; genpd->performance_state = state;
...@@ -347,15 +345,6 @@ static int _genpd_power_on(struct generic_pm_domain *genpd, bool timed) ...@@ -347,15 +345,6 @@ static int _genpd_power_on(struct generic_pm_domain *genpd, bool timed)
return ret; return ret;
elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start)); elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start));
if (unlikely(genpd->set_performance_state)) {
ret = genpd->set_performance_state(genpd, genpd->performance_state);
if (ret) {
pr_warn("%s: Failed to set performance state %d (%d)\n",
genpd->name, genpd->performance_state, ret);
}
}
if (elapsed_ns <= genpd->states[state_idx].power_on_latency_ns) if (elapsed_ns <= genpd->states[state_idx].power_on_latency_ns)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment