aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-11-16 21:28:53 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-11-21 16:48:10 -0500
commit08b98d3291652bdcd1029a059e39fbcae5ad93e2 (patch)
tree2a95ceced1563a46095f3c2e7c593dfccba606df
parent406e79385f3223d82272cf2be86bc95cd000a258 (diff)
PM / sleep / ACPI: Use the ACPI_FADT_LOW_POWER_S0 flag
Modify the ACPI system sleep support setup code to select suspend-to-idle as the default system sleep state if the ACPI_FADT_LOW_POWER_S0 flag is set in the FADT and the default sleep state was not selected from the kernel command line. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Tested-by: Mario Limonciello <mario.limonciello@dell.com>
-rw-r--r--Documentation/power/states.txt4
-rw-r--r--drivers/acpi/sleep.c8
-rw-r--r--include/linux/suspend.h2
-rw-r--r--kernel/power/suspend.c4
4 files changed, 15 insertions, 3 deletions
diff --git a/Documentation/power/states.txt b/Documentation/power/states.txt
index 008ecb588317..8a39ce45d8a0 100644
--- a/Documentation/power/states.txt
+++ b/Documentation/power/states.txt
@@ -35,7 +35,9 @@ only one way to cause the system to go into the Suspend-To-RAM state (write
35The default suspend mode (ie. the one to be used without writing anything into 35The default suspend mode (ie. the one to be used without writing anything into
36/sys/power/mem_sleep) is either "deep" (if Suspend-To-RAM is supported) or 36/sys/power/mem_sleep) is either "deep" (if Suspend-To-RAM is supported) or
37"s2idle", but it can be overridden by the value of the "mem_sleep_default" 37"s2idle", but it can be overridden by the value of the "mem_sleep_default"
38parameter in the kernel command line. 38parameter in the kernel command line. On some ACPI-based systems, depending on
39the information in the FADT, the default may be "s2idle" even if Suspend-To-RAM
40is supported.
39 41
40The properties of all of the sleep states are described below. 42The properties of all of the sleep states are described below.
41 43
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
index deb0ff78eba8..ce1855fd584b 100644
--- a/drivers/acpi/sleep.c
+++ b/drivers/acpi/sleep.c
@@ -691,6 +691,14 @@ static void acpi_sleep_suspend_setup(void)
691 if (acpi_sleep_state_supported(i)) 691 if (acpi_sleep_state_supported(i))
692 sleep_states[i] = 1; 692 sleep_states[i] = 1;
693 693
694 /*
695 * Use suspend-to-idle by default if ACPI_FADT_LOW_POWER_S0 is set and
696 * the default suspend mode was not selected from the command line.
697 */
698 if (acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0 &&
699 mem_sleep_default > PM_SUSPEND_MEM)
700 mem_sleep_default = PM_SUSPEND_FREEZE;
701
694 suspend_set_ops(old_suspend_ordering ? 702 suspend_set_ops(old_suspend_ordering ?
695 &acpi_suspend_ops_old : &acpi_suspend_ops); 703 &acpi_suspend_ops_old : &acpi_suspend_ops);
696 freeze_set_ops(&acpi_freeze_ops); 704 freeze_set_ops(&acpi_freeze_ops);
diff --git a/include/linux/suspend.h b/include/linux/suspend.h
index d9718378a8be..0c729c3c8549 100644
--- a/include/linux/suspend.h
+++ b/include/linux/suspend.h
@@ -194,6 +194,8 @@ struct platform_freeze_ops {
194}; 194};
195 195
196#ifdef CONFIG_SUSPEND 196#ifdef CONFIG_SUSPEND
197extern suspend_state_t mem_sleep_default;
198
197/** 199/**
198 * suspend_set_ops - set platform dependent suspend operations 200 * suspend_set_ops - set platform dependent suspend operations
199 * @ops: The new suspend operations to set. 201 * @ops: The new suspend operations to set.
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c
index 15e6baef5c73..f67ceb7768b8 100644
--- a/kernel/power/suspend.c
+++ b/kernel/power/suspend.c
@@ -46,7 +46,7 @@ static const char * const mem_sleep_labels[] = {
46const char *mem_sleep_states[PM_SUSPEND_MAX]; 46const char *mem_sleep_states[PM_SUSPEND_MAX];
47 47
48suspend_state_t mem_sleep_current = PM_SUSPEND_FREEZE; 48suspend_state_t mem_sleep_current = PM_SUSPEND_FREEZE;
49static suspend_state_t mem_sleep_default = PM_SUSPEND_MEM; 49suspend_state_t mem_sleep_default = PM_SUSPEND_MAX;
50 50
51unsigned int pm_suspend_global_flags; 51unsigned int pm_suspend_global_flags;
52EXPORT_SYMBOL_GPL(pm_suspend_global_flags); 52EXPORT_SYMBOL_GPL(pm_suspend_global_flags);
@@ -168,7 +168,7 @@ void suspend_set_ops(const struct platform_suspend_ops *ops)
168 } 168 }
169 if (valid_state(PM_SUSPEND_MEM)) { 169 if (valid_state(PM_SUSPEND_MEM)) {
170 mem_sleep_states[PM_SUSPEND_MEM] = mem_sleep_labels[PM_SUSPEND_MEM]; 170 mem_sleep_states[PM_SUSPEND_MEM] = mem_sleep_labels[PM_SUSPEND_MEM];
171 if (mem_sleep_default == PM_SUSPEND_MEM) 171 if (mem_sleep_default >= PM_SUSPEND_MEM)
172 mem_sleep_current = PM_SUSPEND_MEM; 172 mem_sleep_current = PM_SUSPEND_MEM;
173 } 173 }
174 174