vserver 1.9.3
[linux-2.6.git] / drivers / acpi / events / evxfevnt.c
index 640f51f..e941678 100644 (file)
@@ -204,12 +204,11 @@ acpi_enable_event (
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_enable_gpe
+ * FUNCTION:    acpi_set_gpe_type
  *
  * PARAMETERS:  gpe_device      - Parent GPE Device
  *              gpe_number      - GPE level within the GPE block
- *              Flags           - Just enable, or also wake enable?
- *                                Called from ISR or not
+ *              Type            - New GPE type
  *
  * RETURN:      Status
  *
@@ -218,26 +217,17 @@ acpi_enable_event (
  ******************************************************************************/
 
 acpi_status
-acpi_enable_gpe (
+acpi_set_gpe_type (
        acpi_handle                     gpe_device,
        u32                             gpe_number,
-       u32                             flags)
+       u8                              type)
 {
        acpi_status                     status = AE_OK;
        struct acpi_gpe_event_info      *gpe_event_info;
 
 
-       ACPI_FUNCTION_TRACE ("acpi_enable_gpe");
-
+       ACPI_FUNCTION_TRACE ("acpi_set_gpe_type");
 
-       /* Use semaphore lock if not executing at interrupt level */
-
-       if (flags & ACPI_NOT_ISR) {
-               status = acpi_ut_acquire_mutex (ACPI_MTX_EVENTS);
-               if (ACPI_FAILURE (status)) {
-                       return_ACPI_STATUS (status);
-               }
-       }
 
        /* Ensure that we have a valid GPE number */
 
@@ -247,91 +237,72 @@ acpi_enable_gpe (
                goto unlock_and_exit;
        }
 
-       /* Check for Wake vs Runtime GPE */
-
-       if (flags & ACPI_EVENT_WAKE_ENABLE) {
-               /* Ensure the requested wake GPE is disabled */
-
-               status = acpi_hw_disable_gpe (gpe_event_info);
-               if (ACPI_FAILURE (status)) {
-                       goto unlock_and_exit;
-               }
-
-               /* Defer Enable of Wake GPE until sleep time */
-
-               acpi_hw_enable_gpe_for_wakeup (gpe_event_info);
+       if ((gpe_event_info->flags & ACPI_GPE_TYPE_MASK) == type) {
+               return_ACPI_STATUS (AE_OK);
        }
-       else {
-               /* Enable the requested runtime GPE  */
 
-               status = acpi_hw_enable_gpe (gpe_event_info);
-               if (ACPI_FAILURE (status)) {
-                       goto unlock_and_exit;
-               }
-       }
+       /* Set the new type (will disable GPE if currently enabled) */
 
+       status = acpi_ev_set_gpe_type (gpe_event_info, type);
 
 unlock_and_exit:
-       if (flags & ACPI_NOT_ISR) {
-               (void) acpi_ut_release_mutex (ACPI_MTX_EVENTS);
-       }
        return_ACPI_STATUS (status);
 }
 
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_disable_event
+ * FUNCTION:    acpi_enable_gpe
  *
- * PARAMETERS:  Event           - The fixed eventto be enabled
- *              Flags           - Reserved
+ * PARAMETERS:  gpe_device      - Parent GPE Device
+ *              gpe_number      - GPE level within the GPE block
+ *              Flags           - Just enable, or also wake enable?
+ *                                Called from ISR or not
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Disable an ACPI event (fixed)
+ * DESCRIPTION: Enable an ACPI event (general purpose)
  *
  ******************************************************************************/
 
 acpi_status
-acpi_disable_event (
-       u32                             event,
+acpi_enable_gpe (
+       acpi_handle                     gpe_device,
+       u32                             gpe_number,
        u32                             flags)
 {
        acpi_status                     status = AE_OK;
-       u32                             value;
+       struct acpi_gpe_event_info      *gpe_event_info;
 
 
-       ACPI_FUNCTION_TRACE ("acpi_disable_event");
+       ACPI_FUNCTION_TRACE ("acpi_enable_gpe");
 
 
-       /* Decode the Fixed Event */
+       /* Use semaphore lock if not executing at interrupt level */
 
-       if (event > ACPI_EVENT_MAX) {
-               return_ACPI_STATUS (AE_BAD_PARAMETER);
+       if (flags & ACPI_NOT_ISR) {
+               status = acpi_ut_acquire_mutex (ACPI_MTX_EVENTS);
+               if (ACPI_FAILURE (status)) {
+                       return_ACPI_STATUS (status);
+               }
        }
 
-       /*
-        * Disable the requested fixed event (by writing a zero to the
-        * enable register bit)
-        */
-       status = acpi_set_register (acpi_gbl_fixed_event_info[event].enable_register_id,
-                        0, ACPI_MTX_LOCK);
-       if (ACPI_FAILURE (status)) {
-               return_ACPI_STATUS (status);
-       }
+       /* Ensure that we have a valid GPE number */
 
-       status = acpi_get_register (acpi_gbl_fixed_event_info[event].enable_register_id,
-                        &value, ACPI_MTX_LOCK);
-       if (ACPI_FAILURE (status)) {
-               return_ACPI_STATUS (status);
+       gpe_event_info = acpi_ev_get_gpe_event_info (gpe_device, gpe_number);
+       if (!gpe_event_info) {
+               status = AE_BAD_PARAMETER;
+               goto unlock_and_exit;
        }
 
-       if (value != 0) {
-               ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-                       "Could not disable %s events\n", acpi_ut_get_event_name (event)));
-               return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
-       }
+       /* Perform the enable */
+
+       status = acpi_ev_enable_gpe (gpe_event_info, TRUE);
 
+unlock_and_exit:
+       if (flags & ACPI_NOT_ISR) {
+               (void) acpi_ut_release_mutex (ACPI_MTX_EVENTS);
+       }
        return_ACPI_STATUS (status);
 }
 
@@ -342,7 +313,7 @@ acpi_disable_event (
  *
  * PARAMETERS:  gpe_device      - Parent GPE Device
  *              gpe_number      - GPE level within the GPE block
- *              Flags           - Just enable, or also wake enable?
+ *              Flags           - Just disable, or also wake disable?
  *                                Called from ISR or not
  *
  * RETURN:      Status
@@ -381,21 +352,69 @@ acpi_disable_gpe (
                goto unlock_and_exit;
        }
 
+       status = acpi_ev_disable_gpe (gpe_event_info);
+
+unlock_and_exit:
+       if (flags & ACPI_NOT_ISR) {
+               (void) acpi_ut_release_mutex (ACPI_MTX_EVENTS);
+       }
+       return_ACPI_STATUS (status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_disable_event
+ *
+ * PARAMETERS:  Event           - The fixed eventto be enabled
+ *              Flags           - Reserved
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Disable an ACPI event (fixed)
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_disable_event (
+       u32                             event,
+       u32                             flags)
+{
+       acpi_status                     status = AE_OK;
+       u32                             value;
+
+
+       ACPI_FUNCTION_TRACE ("acpi_disable_event");
+
+
+       /* Decode the Fixed Event */
+
+       if (event > ACPI_EVENT_MAX) {
+               return_ACPI_STATUS (AE_BAD_PARAMETER);
+       }
+
        /*
-        * Only disable the requested GPE number for wake if specified.
-        * Otherwise, turn it totally off
+        * Disable the requested fixed event (by writing a zero to the
+        * enable register bit)
         */
-       if (flags & ACPI_EVENT_WAKE_DISABLE) {
-               acpi_hw_disable_gpe_for_wakeup (gpe_event_info);
+       status = acpi_set_register (acpi_gbl_fixed_event_info[event].enable_register_id,
+                        0, ACPI_MTX_LOCK);
+       if (ACPI_FAILURE (status)) {
+               return_ACPI_STATUS (status);
        }
-       else {
-               status = acpi_hw_disable_gpe (gpe_event_info);
+
+       status = acpi_get_register (acpi_gbl_fixed_event_info[event].enable_register_id,
+                        &value, ACPI_MTX_LOCK);
+       if (ACPI_FAILURE (status)) {
+               return_ACPI_STATUS (status);
        }
 
-unlock_and_exit:
-       if (flags & ACPI_NOT_ISR) {
-               (void) acpi_ut_release_mutex (ACPI_MTX_EVENTS);
+       if (value != 0) {
+               ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
+                       "Could not disable %s events\n", acpi_ut_get_event_name (event)));
+               return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
        }
+
        return_ACPI_STATUS (status);
 }