|
@@ -697,21 +697,6 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device,
|
|
|
acpi_gbl_global_event_handler_context);
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * If edge-triggered, clear the GPE status bit now. Note that
|
|
|
- * level-triggered events are cleared after the GPE is serviced.
|
|
|
- */
|
|
|
- if ((gpe_event_info->flags & ACPI_GPE_XRUPT_TYPE_MASK) ==
|
|
|
- ACPI_GPE_EDGE_TRIGGERED) {
|
|
|
- status = acpi_hw_clear_gpe(gpe_event_info);
|
|
|
- if (ACPI_FAILURE(status)) {
|
|
|
- ACPI_EXCEPTION((AE_INFO, status,
|
|
|
- "Unable to clear GPE %02X",
|
|
|
- gpe_number));
|
|
|
- return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
/*
|
|
|
* Always disable the GPE so that it does not keep firing before
|
|
|
* any asynchronous activity completes (either from the execution
|
|
@@ -728,6 +713,23 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device,
|
|
|
return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * If edge-triggered, clear the GPE status bit now. Note that
|
|
|
+ * level-triggered events are cleared after the GPE is serviced.
|
|
|
+ */
|
|
|
+ if ((gpe_event_info->flags & ACPI_GPE_XRUPT_TYPE_MASK) ==
|
|
|
+ ACPI_GPE_EDGE_TRIGGERED) {
|
|
|
+ status = acpi_hw_clear_gpe(gpe_event_info);
|
|
|
+ if (ACPI_FAILURE(status)) {
|
|
|
+ ACPI_EXCEPTION((AE_INFO, status,
|
|
|
+ "Unable to clear GPE %02X",
|
|
|
+ gpe_number));
|
|
|
+ (void)acpi_hw_low_set_gpe(gpe_event_info,
|
|
|
+ ACPI_GPE_CONDITIONAL_ENABLE);
|
|
|
+ return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* Dispatch the GPE to either an installed handler or the control
|
|
|
* method associated with this GPE (_Lxx or _Exx). If a handler
|