|
@@ -192,18 +192,13 @@ acpi_status acpi_enter_sleep_state_prep(u8 sleep_state)
|
|
|
arg.type = ACPI_TYPE_INTEGER;
|
|
|
arg.integer.value = sleep_state;
|
|
|
|
|
|
- /* Run the _PTS and _GTS methods */
|
|
|
+ /* Run the _PTS method */
|
|
|
|
|
|
status = acpi_evaluate_object(NULL, METHOD_NAME__PTS, &arg_list, NULL);
|
|
|
if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
|
|
|
return_ACPI_STATUS(status);
|
|
|
}
|
|
|
|
|
|
- status = acpi_evaluate_object(NULL, METHOD_NAME__GTS, &arg_list, NULL);
|
|
|
- if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
|
|
|
- return_ACPI_STATUS(status);
|
|
|
- }
|
|
|
-
|
|
|
/* Setup the argument to _SST */
|
|
|
|
|
|
switch (sleep_state) {
|
|
@@ -262,6 +257,8 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
|
|
|
struct acpi_bit_register_info *sleep_type_reg_info;
|
|
|
struct acpi_bit_register_info *sleep_enable_reg_info;
|
|
|
u32 in_value;
|
|
|
+ struct acpi_object_list arg_list;
|
|
|
+ union acpi_object arg;
|
|
|
acpi_status status;
|
|
|
|
|
|
ACPI_FUNCTION_TRACE(acpi_enter_sleep_state);
|
|
@@ -307,6 +304,18 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
|
|
|
return_ACPI_STATUS(status);
|
|
|
}
|
|
|
|
|
|
+ /* Execute the _GTS method */
|
|
|
+
|
|
|
+ arg_list.count = 1;
|
|
|
+ arg_list.pointer = &arg;
|
|
|
+ arg.type = ACPI_TYPE_INTEGER;
|
|
|
+ arg.integer.value = sleep_state;
|
|
|
+
|
|
|
+ status = acpi_evaluate_object(NULL, METHOD_NAME__GTS, &arg_list, NULL);
|
|
|
+ if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
|
|
|
+ return_ACPI_STATUS(status);
|
|
|
+ }
|
|
|
+
|
|
|
/* Get current value of PM1A control */
|
|
|
|
|
|
status = acpi_hw_register_read(ACPI_REGISTER_PM1_CONTROL, &PM1Acontrol);
|
|
@@ -473,17 +482,18 @@ ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state_s4bios)
|
|
|
|
|
|
/*******************************************************************************
|
|
|
*
|
|
|
- * FUNCTION: acpi_leave_sleep_state
|
|
|
+ * FUNCTION: acpi_leave_sleep_state_prep
|
|
|
*
|
|
|
- * PARAMETERS: sleep_state - Which sleep state we just exited
|
|
|
+ * PARAMETERS: sleep_state - Which sleep state we are exiting
|
|
|
*
|
|
|
* RETURN: Status
|
|
|
*
|
|
|
- * DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep
|
|
|
- * Called with interrupts ENABLED.
|
|
|
+ * DESCRIPTION: Perform the first state of OS-independent ACPI cleanup after a
|
|
|
+ * sleep.
|
|
|
+ * Called with interrupts DISABLED.
|
|
|
*
|
|
|
******************************************************************************/
|
|
|
-acpi_status acpi_leave_sleep_state(u8 sleep_state)
|
|
|
+acpi_status acpi_leave_sleep_state_prep(u8 sleep_state)
|
|
|
{
|
|
|
struct acpi_object_list arg_list;
|
|
|
union acpi_object arg;
|
|
@@ -493,7 +503,7 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
|
|
|
u32 PM1Acontrol;
|
|
|
u32 PM1Bcontrol;
|
|
|
|
|
|
- ACPI_FUNCTION_TRACE(acpi_leave_sleep_state);
|
|
|
+ ACPI_FUNCTION_TRACE(acpi_leave_sleep_state_prep);
|
|
|
|
|
|
/*
|
|
|
* Set SLP_TYPE and SLP_EN to state S0.
|
|
@@ -540,6 +550,41 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /* Execute the _BFS method */
|
|
|
+
|
|
|
+ arg_list.count = 1;
|
|
|
+ arg_list.pointer = &arg;
|
|
|
+ arg.type = ACPI_TYPE_INTEGER;
|
|
|
+ arg.integer.value = sleep_state;
|
|
|
+
|
|
|
+ status = acpi_evaluate_object(NULL, METHOD_NAME__BFS, &arg_list, NULL);
|
|
|
+ if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
|
|
|
+ ACPI_EXCEPTION((AE_INFO, status, "During Method _BFS"));
|
|
|
+ }
|
|
|
+
|
|
|
+ return_ACPI_STATUS(status);
|
|
|
+}
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+ *
|
|
|
+ * FUNCTION: acpi_leave_sleep_state
|
|
|
+ *
|
|
|
+ * PARAMETERS: sleep_state - Which sleep state we just exited
|
|
|
+ *
|
|
|
+ * RETURN: Status
|
|
|
+ *
|
|
|
+ * DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep
|
|
|
+ * Called with interrupts ENABLED.
|
|
|
+ *
|
|
|
+ ******************************************************************************/
|
|
|
+acpi_status acpi_leave_sleep_state(u8 sleep_state)
|
|
|
+{
|
|
|
+ struct acpi_object_list arg_list;
|
|
|
+ union acpi_object arg;
|
|
|
+ acpi_status status;
|
|
|
+
|
|
|
+ ACPI_FUNCTION_TRACE(acpi_leave_sleep_state);
|
|
|
+
|
|
|
/* Ensure enter_sleep_state_prep -> enter_sleep_state ordering */
|
|
|
|
|
|
acpi_gbl_sleep_type_a = ACPI_SLEEP_TYPE_INVALID;
|
|
@@ -558,12 +603,6 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
|
|
|
ACPI_EXCEPTION((AE_INFO, status, "During Method _SST"));
|
|
|
}
|
|
|
|
|
|
- arg.integer.value = sleep_state;
|
|
|
- status = acpi_evaluate_object(NULL, METHOD_NAME__BFS, &arg_list, NULL);
|
|
|
- if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
|
|
|
- ACPI_EXCEPTION((AE_INFO, status, "During Method _BFS"));
|
|
|
- }
|
|
|
-
|
|
|
/*
|
|
|
* GPEs must be enabled before _WAK is called as GPEs
|
|
|
* might get fired there
|