diff options
author | Chen Yu <yu.c.chen@intel.com> | 2016-03-21 20:51:10 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2016-04-08 20:11:43 -0400 |
commit | 1373718194ebebc43c00d8f117e03885749495b0 (patch) | |
tree | 8fffff6302b18df6b12cbc2fc79d04c58135faff /drivers/acpi/sleep.c | |
parent | 9735a22799b9214d17d3c231fe377fc852f042e9 (diff) |
ACPI / PM: Introduce efi poweroff for HW-full platforms without _S5
The problem is Linux registers pm_power_off = efi_power_off only if
we are in hardware reduced mode. Actually, what we also want is to do
this when ACPI S5 is simply not supported on non-legacy platforms.
Since some future Intel platforms are HW-full mode where the DSDT
fails to supply an _S5 object(without SLP_TYP), we should let such
kind of platform to leverage efi runtime service to poweroff.
This patch uses efi power off as first choice when S5 is unavailable,
even if there is a customized poweroff(driver provided, eg).
Meanwhile, the legacy platforms will not be affected because there is
no path for them to overwrite the pm_power_off to efi power off.
Suggested-by: Len Brown <len.brown@intel.com>
Reviewed-by: Matt Fleming <matt@codeblueprint.co.uk>
Signed-off-by: Chen Yu <yu.c.chen@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi/sleep.c')
-rw-r--r-- | drivers/acpi/sleep.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index 2a8b59644297..7a2e4d45b266 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c | |||
@@ -26,6 +26,11 @@ | |||
26 | #include "internal.h" | 26 | #include "internal.h" |
27 | #include "sleep.h" | 27 | #include "sleep.h" |
28 | 28 | ||
29 | /* | ||
30 | * Some HW-full platforms do not have _S5, so they may need | ||
31 | * to leverage efi power off for a shutdown. | ||
32 | */ | ||
33 | bool acpi_no_s5; | ||
29 | static u8 sleep_states[ACPI_S_STATE_COUNT]; | 34 | static u8 sleep_states[ACPI_S_STATE_COUNT]; |
30 | 35 | ||
31 | static void acpi_sleep_tts_switch(u32 acpi_state) | 36 | static void acpi_sleep_tts_switch(u32 acpi_state) |
@@ -882,6 +887,8 @@ int __init acpi_sleep_init(void) | |||
882 | sleep_states[ACPI_STATE_S5] = 1; | 887 | sleep_states[ACPI_STATE_S5] = 1; |
883 | pm_power_off_prepare = acpi_power_off_prepare; | 888 | pm_power_off_prepare = acpi_power_off_prepare; |
884 | pm_power_off = acpi_power_off; | 889 | pm_power_off = acpi_power_off; |
890 | } else { | ||
891 | acpi_no_s5 = true; | ||
885 | } | 892 | } |
886 | 893 | ||
887 | supported[0] = 0; | 894 | supported[0] = 0; |