Commit 4bc5d341 authored by Dave Jones's avatar Dave Jones

[CPUFREQ] Make cpufreq suspend code conditional on powerpc.

The suspend code runs with interrupts disabled, and the powerpc workaround we
do in the cpufreq suspend hook calls the drivers ->get method.

powernow-k8's ->get does an smp_call_function_single
which needs interrupts enabled

cpufreq's suspend/resume code was added in 42d4dc3f to work around
a hardware problem on ppc powerbooks.  If we make all this code
conditional on powerpc, we avoid the issue above.
Signed-off-by: default avatarDave Jones <davej@redhat.com>
parent d5194dec
...@@ -1248,13 +1248,22 @@ EXPORT_SYMBOL(cpufreq_get); ...@@ -1248,13 +1248,22 @@ EXPORT_SYMBOL(cpufreq_get);
static int cpufreq_suspend(struct sys_device *sysdev, pm_message_t pmsg) static int cpufreq_suspend(struct sys_device *sysdev, pm_message_t pmsg)
{ {
int cpu = sysdev->id;
int ret = 0; int ret = 0;
#ifdef __powerpc__
int cpu = sysdev->id;
unsigned int cur_freq = 0; unsigned int cur_freq = 0;
struct cpufreq_policy *cpu_policy; struct cpufreq_policy *cpu_policy;
dprintk("suspending cpu %u\n", cpu); dprintk("suspending cpu %u\n", cpu);
/*
* This whole bogosity is here because Powerbooks are made of fail.
* No sane platform should need any of the code below to be run.
* (it's entirely the wrong thing to do, as driver->get may
* reenable interrupts on some architectures).
*/
if (!cpu_online(cpu)) if (!cpu_online(cpu))
return 0; return 0;
...@@ -1313,6 +1322,7 @@ static int cpufreq_suspend(struct sys_device *sysdev, pm_message_t pmsg) ...@@ -1313,6 +1322,7 @@ static int cpufreq_suspend(struct sys_device *sysdev, pm_message_t pmsg)
out: out:
cpufreq_cpu_put(cpu_policy); cpufreq_cpu_put(cpu_policy);
#endif /* __powerpc__ */
return ret; return ret;
} }
...@@ -1326,12 +1336,18 @@ static int cpufreq_suspend(struct sys_device *sysdev, pm_message_t pmsg) ...@@ -1326,12 +1336,18 @@ static int cpufreq_suspend(struct sys_device *sysdev, pm_message_t pmsg)
*/ */
static int cpufreq_resume(struct sys_device *sysdev) static int cpufreq_resume(struct sys_device *sysdev)
{ {
int cpu = sysdev->id;
int ret = 0; int ret = 0;
#ifdef __powerpc__
int cpu = sysdev->id;
struct cpufreq_policy *cpu_policy; struct cpufreq_policy *cpu_policy;
dprintk("resuming cpu %u\n", cpu); dprintk("resuming cpu %u\n", cpu);
/* As with the ->suspend method, all the code below is
* only necessary because Powerbooks suck.
* See commit 42d4dc3f4e1e for jokes. */
if (!cpu_online(cpu)) if (!cpu_online(cpu))
return 0; return 0;
...@@ -1395,6 +1411,7 @@ static int cpufreq_resume(struct sys_device *sysdev) ...@@ -1395,6 +1411,7 @@ static int cpufreq_resume(struct sys_device *sysdev)
schedule_work(&cpu_policy->update); schedule_work(&cpu_policy->update);
fail: fail:
cpufreq_cpu_put(cpu_policy); cpufreq_cpu_put(cpu_policy);
#endif /* __powerpc__ */
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