|
@@ -71,6 +71,17 @@ static int acpi_sleep_prepare(u32 acpi_state)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static bool acpi_sleep_state_supported(u8 sleep_state)
|
|
|
|
+{
|
|
|
|
+ acpi_status status;
|
|
|
|
+ u8 type_a, type_b;
|
|
|
|
+
|
|
|
|
+ status = acpi_get_sleep_type_data(sleep_state, &type_a, &type_b);
|
|
|
|
+ return ACPI_SUCCESS(status) && (!acpi_gbl_reduced_hardware
|
|
|
|
+ || (acpi_gbl_FADT.sleep_control.address
|
|
|
|
+ && acpi_gbl_FADT.sleep_status.address));
|
|
|
|
+}
|
|
|
|
+
|
|
#ifdef CONFIG_ACPI_SLEEP
|
|
#ifdef CONFIG_ACPI_SLEEP
|
|
static u32 acpi_target_sleep_state = ACPI_STATE_S0;
|
|
static u32 acpi_target_sleep_state = ACPI_STATE_S0;
|
|
|
|
|
|
@@ -604,15 +615,9 @@ static void acpi_sleep_suspend_setup(void)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
|
|
|
|
- for (i = ACPI_STATE_S1; i < ACPI_STATE_S4; i++) {
|
|
|
|
- acpi_status status;
|
|
|
|
- u8 type_a, type_b;
|
|
|
|
-
|
|
|
|
- status = acpi_get_sleep_type_data(i, &type_a, &type_b);
|
|
|
|
- if (ACPI_SUCCESS(status)) {
|
|
|
|
|
|
+ for (i = ACPI_STATE_S1; i < ACPI_STATE_S4; i++)
|
|
|
|
+ if (acpi_sleep_state_supported(i))
|
|
sleep_states[i] = 1;
|
|
sleep_states[i] = 1;
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
|
|
suspend_set_ops(old_suspend_ordering ?
|
|
suspend_set_ops(old_suspend_ordering ?
|
|
&acpi_suspend_ops_old : &acpi_suspend_ops);
|
|
&acpi_suspend_ops_old : &acpi_suspend_ops);
|
|
@@ -740,11 +745,7 @@ static const struct platform_hibernation_ops acpi_hibernation_ops_old = {
|
|
|
|
|
|
static void acpi_sleep_hibernate_setup(void)
|
|
static void acpi_sleep_hibernate_setup(void)
|
|
{
|
|
{
|
|
- acpi_status status;
|
|
|
|
- u8 type_a, type_b;
|
|
|
|
-
|
|
|
|
- status = acpi_get_sleep_type_data(ACPI_STATE_S4, &type_a, &type_b);
|
|
|
|
- if (ACPI_FAILURE(status))
|
|
|
|
|
|
+ if (!acpi_sleep_state_supported(ACPI_STATE_S4))
|
|
return;
|
|
return;
|
|
|
|
|
|
hibernation_set_ops(old_suspend_ordering ?
|
|
hibernation_set_ops(old_suspend_ordering ?
|
|
@@ -793,8 +794,6 @@ static void acpi_power_off(void)
|
|
|
|
|
|
int __init acpi_sleep_init(void)
|
|
int __init acpi_sleep_init(void)
|
|
{
|
|
{
|
|
- acpi_status status;
|
|
|
|
- u8 type_a, type_b;
|
|
|
|
char supported[ACPI_S_STATE_COUNT * 3 + 1];
|
|
char supported[ACPI_S_STATE_COUNT * 3 + 1];
|
|
char *pos = supported;
|
|
char *pos = supported;
|
|
int i;
|
|
int i;
|
|
@@ -806,8 +805,7 @@ int __init acpi_sleep_init(void)
|
|
acpi_sleep_suspend_setup();
|
|
acpi_sleep_suspend_setup();
|
|
acpi_sleep_hibernate_setup();
|
|
acpi_sleep_hibernate_setup();
|
|
|
|
|
|
- status = acpi_get_sleep_type_data(ACPI_STATE_S5, &type_a, &type_b);
|
|
|
|
- if (ACPI_SUCCESS(status)) {
|
|
|
|
|
|
+ if (acpi_sleep_state_supported(ACPI_STATE_S5)) {
|
|
sleep_states[ACPI_STATE_S5] = 1;
|
|
sleep_states[ACPI_STATE_S5] = 1;
|
|
pm_power_off_prepare = acpi_power_off_prepare;
|
|
pm_power_off_prepare = acpi_power_off_prepare;
|
|
pm_power_off = acpi_power_off;
|
|
pm_power_off = acpi_power_off;
|