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

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

[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
Loading
Loading
Loading
Loading
+19 −2
Original line number Diff line number Diff line
@@ -1248,13 +1248,22 @@ EXPORT_SYMBOL(cpufreq_get);

static int cpufreq_suspend(struct sys_device *sysdev, pm_message_t pmsg)
{
	int cpu = sysdev->id;
	int ret = 0;

#ifdef __powerpc__
	int cpu = sysdev->id;
	unsigned int cur_freq = 0;
	struct cpufreq_policy *cpu_policy;

	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))
		return 0;

@@ -1313,6 +1322,7 @@ static int cpufreq_suspend(struct sys_device *sysdev, pm_message_t pmsg)

out:
	cpufreq_cpu_put(cpu_policy);
#endif	/* __powerpc__ */
	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)
{
	int cpu = sysdev->id;
	int ret = 0;

#ifdef __powerpc__
	int cpu = sysdev->id;
	struct cpufreq_policy *cpu_policy;

	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))
		return 0;

@@ -1395,6 +1411,7 @@ static int cpufreq_resume(struct sys_device *sysdev)
	schedule_work(&cpu_policy->update);
fail:
	cpufreq_cpu_put(cpu_policy);
#endif	/* __powerpc__ */
	return ret;
}