[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 42d4dc3f4e
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: Dave Jones <davej@redhat.com>
This commit is contained in:
parent
d5194decd0
commit
4bc5d34135
1 changed files with 19 additions and 2 deletions
|
@ -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)
|
||||||
|
|
||||||
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)
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue