diff options
author | Bjørn Mork <bjorn@mork.no> | 2013-12-04 10:06:58 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-01-06 08:08:39 -0500 |
commit | 362e77d1cb30c9a98e037641fae425687afa932e (patch) | |
tree | 9cd10a9336eccd52b6a75b2b250fe0c31fef4e2e /kernel/power | |
parent | fbd22402164e687fd1be9a1372ee4f6b9373c860 (diff) |
PM / hibernate: Call platform_leave() in suspend path too
Since create_image() only executes platform_leave() if in_suspend is
not set, enable_nonboot_cpus() is run by it with EC transactions
blocked (on ACPI systems) in the image creation code path (that is,
for in_suspend set), which may cause CPU online to fail for the CPUs
in question. In particular, this causes the acpi_cpufreq driver's
initialization to fail for those CPUs on some systems with the
following dmesg:
cpufreq: adding CPU 1
acpi_cpufreq_cpu_init
cpufreq: FREQ: 1401000 - CPU: 0
ACPI Exception: AE_BAD_PARAMETER, Returned by Handler for [EmbeddedControl] (20130725/evregion-287)
ACPI Error: Method parse/execution failed [\_SB_.PCI0.LPC_.EC__.LPMD] (Node ffff88023249ab28), AE_BAD_PARAMETER (20130725/psparse-536)
ACPI Error: Method parse/execution failed [\_PR_.CPU0._PPC] (Node ffff88023270e3f8), AE_BAD_PARAMETER (20130725/psparse-536)
ACPI Error: Method parse/execution failed [\_PR_.CPU1._PPC] (Node ffff88023270e290), AE_BAD_PARAMETER (20130725/psparse-536)
ACPI Exception: AE_BAD_PARAMETER, Evaluating _PPC (20130725/processor_perflib-140)
cpufreq: initialization failed
CPU1 is up
To fix this problem, modify create_image() to execute platform_leave()
unconditionally. [rjw: This shouldn't lead to any significant side
effects on ACPI systems.]
Signed-off-by: Bjørn Mork <bjorn@mork.no>
[rjw: Changelog]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'kernel/power')
-rw-r--r-- | kernel/power/hibernate.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index bc13d087ea14..37170d4dd9a6 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c | |||
@@ -294,10 +294,10 @@ static int create_image(int platform_mode) | |||
294 | error); | 294 | error); |
295 | /* Restore control flow magically appears here */ | 295 | /* Restore control flow magically appears here */ |
296 | restore_processor_state(); | 296 | restore_processor_state(); |
297 | if (!in_suspend) { | 297 | if (!in_suspend) |
298 | events_check_enabled = false; | 298 | events_check_enabled = false; |
299 | platform_leave(platform_mode); | 299 | |
300 | } | 300 | platform_leave(platform_mode); |
301 | 301 | ||
302 | Power_up: | 302 | Power_up: |
303 | syscore_resume(); | 303 | syscore_resume(); |