aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2015-03-09 12:25:38 +0000
committerMark Brown <broonie@kernel.org>2015-03-09 12:26:10 +0000
commitd255fcab2b5fd066d1ee153a9ae0eb66c124246c (patch)
tree3a36a782bf18e04f5be85e4eded6b14a96b29c93
parent212df5dd3212092602119d03a2f5d3a27be77ce4 (diff)
cpufreq: Revert "cpufreq: Don't iterate over all CPUs when suspending and resuming governors"
This reverts commit 212df5dd3212092602119d03a2f5d3a27be77ce4. The commit it's fixing has too many other dependencies. Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r--drivers/cpufreq/cpufreq.c56
1 files changed, 37 insertions, 19 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index ae9d9dc6b79b..d444bfe83f13 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -1293,6 +1293,7 @@ static struct subsys_interface cpufreq_interface = {
void cpufreq_suspend(void)
{
struct cpufreq_policy *policy;
+ int cpu;
if (!cpufreq_driver)
return;
@@ -1302,15 +1303,20 @@ void cpufreq_suspend(void)
pr_debug("%s: Suspending Governors\n", __func__);
- policy = cpufreq_cpu_get(0);
+ for_each_possible_cpu(cpu) {
+ if (!cpu_online(cpu))
+ continue;
+
+ policy = cpufreq_cpu_get(cpu);
- if (__cpufreq_governor(policy, CPUFREQ_GOV_STOP))
- pr_err("%s: Failed to stop governor for policy: %p\n",
- __func__, policy);
- else if (cpufreq_driver->suspend
- && cpufreq_driver->suspend(policy))
- pr_err("%s: Failed to suspend driver: %p\n", __func__,
- policy);
+ if (__cpufreq_governor(policy, CPUFREQ_GOV_STOP))
+ pr_err("%s: Failed to stop governor for policy: %p\n",
+ __func__, policy);
+ else if (cpufreq_driver->suspend
+ && cpufreq_driver->suspend(policy))
+ pr_err("%s: Failed to suspend driver: %p\n", __func__,
+ policy);
+ }
cpufreq_suspended = true;
}
@@ -1324,6 +1330,7 @@ void cpufreq_suspend(void)
void cpufreq_resume(void)
{
struct cpufreq_policy *policy;
+ int cpu;
if (!cpufreq_driver)
return;
@@ -1335,18 +1342,29 @@ void cpufreq_resume(void)
cpufreq_suspended = false;
- policy = cpufreq_cpu_get(0);
-
- if (__cpufreq_governor(policy, CPUFREQ_GOV_START)
- || __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS))
- pr_err("%s: Failed to start governor for policy: %p\n",
- __func__, policy);
- else if (cpufreq_driver->resume
- && cpufreq_driver->resume(policy))
- pr_err("%s: Failed to resume driver: %p\n", __func__,
- policy);
+ for_each_possible_cpu(cpu) {
+ if (!cpu_online(cpu))
+ continue;
- schedule_work(&policy->update);
+ policy = cpufreq_cpu_get(cpu);
+
+ if (__cpufreq_governor(policy, CPUFREQ_GOV_START)
+ || __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS))
+ pr_err("%s: Failed to start governor for policy: %p\n",
+ __func__, policy);
+ else if (cpufreq_driver->resume
+ && cpufreq_driver->resume(policy))
+ pr_err("%s: Failed to resume driver: %p\n", __func__,
+ policy);
+
+ /*
+ * schedule call cpufreq_update_policy() for boot CPU, i.e. last
+ * policy in list. It will verify that the current freq is in
+ * sync with what we believe it to be.
+ */
+ if (cpu == 0)
+ schedule_work(&policy->update);
+ }
}
/**