]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/acpi/hardware/hwsleep.c
ACPI: Separate disabling of GPEs from _PTS
[linux-2.6-omap-h63xx.git] / drivers / acpi / hardware / hwsleep.c
index cf69c0040a390d407d0cd2b2da6c4e21882e22af..fd1c4ba63367469f9826460c6b545407491f9f86 100644 (file)
@@ -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) {
@@ -234,15 +229,7 @@ acpi_status acpi_enter_sleep_state_prep(u8 sleep_state)
                                "While executing method _SST"));
        }
 
-       /*
-        * 1) Disable/Clear all GPEs
-        */
-       status = acpi_hw_disable_all_gpes();
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       return_ACPI_STATUS(AE_OK);
+       return_ACPI_STATUS(status);
 }
 
 ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state_prep)
@@ -266,6 +253,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);
@@ -311,10 +300,21 @@ 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_MTX_DO_NOT_LOCK,
-                                      ACPI_REGISTER_PM1_CONTROL, &PM1Acontrol);
+       status = acpi_hw_register_read(ACPI_REGISTER_PM1_CONTROL, &PM1Acontrol);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
@@ -341,15 +341,13 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
 
        /* Write #1: fill in SLP_TYP data */
 
-       status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,
-                                       ACPI_REGISTER_PM1A_CONTROL,
+       status = acpi_hw_register_write(ACPI_REGISTER_PM1A_CONTROL,
                                        PM1Acontrol);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
 
-       status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,
-                                       ACPI_REGISTER_PM1B_CONTROL,
+       status = acpi_hw_register_write(ACPI_REGISTER_PM1B_CONTROL,
                                        PM1Bcontrol);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
@@ -364,15 +362,13 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
 
        ACPI_FLUSH_CPU_CACHE();
 
-       status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,
-                                       ACPI_REGISTER_PM1A_CONTROL,
+       status = acpi_hw_register_write(ACPI_REGISTER_PM1A_CONTROL,
                                        PM1Acontrol);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
 
-       status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,
-                                       ACPI_REGISTER_PM1B_CONTROL,
+       status = acpi_hw_register_write(ACPI_REGISTER_PM1B_CONTROL,
                                        PM1Bcontrol);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
@@ -392,8 +388,7 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
                 */
                acpi_os_stall(10000000);
 
-               status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,
-                                               ACPI_REGISTER_PM1_CONTROL,
+               status = acpi_hw_register_write(ACPI_REGISTER_PM1_CONTROL,
                                                sleep_enable_reg_info->
                                                access_bit_mask);
                if (ACPI_FAILURE(status)) {
@@ -404,7 +399,8 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
        /* Wait until we enter sleep state */
 
        do {
-               status = acpi_get_register(ACPI_BITREG_WAKE_STATUS, &in_value);
+               status = acpi_get_register_unlocked(ACPI_BITREG_WAKE_STATUS,
+                                                   &in_value);
                if (ACPI_FAILURE(status)) {
                        return_ACPI_STATUS(status);
                }
@@ -482,17 +478,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;
@@ -502,7 +499,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.
@@ -520,8 +517,7 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
 
                /* Get current value of PM1A control */
 
-               status = acpi_hw_register_read(ACPI_MTX_DO_NOT_LOCK,
-                                              ACPI_REGISTER_PM1_CONTROL,
+               status = acpi_hw_register_read(ACPI_REGISTER_PM1_CONTROL,
                                               &PM1Acontrol);
                if (ACPI_SUCCESS(status)) {
 
@@ -543,15 +539,48 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
 
                        /* Just ignore any errors */
 
-                       (void)acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,
-                                                    ACPI_REGISTER_PM1A_CONTROL,
+                       (void)acpi_hw_register_write(ACPI_REGISTER_PM1A_CONTROL,
                                                     PM1Acontrol);
-                       (void)acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,
-                                                    ACPI_REGISTER_PM1B_CONTROL,
+                       (void)acpi_hw_register_write(ACPI_REGISTER_PM1B_CONTROL,
                                                     PM1Bcontrol);
                }
        }
 
+       /* 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;
@@ -570,12 +599,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