|
@@ -51,6 +51,16 @@
|
|
|
|
|
|
#define _COMPONENT ACPI_EVENTS
|
|
|
ACPI_MODULE_NAME("evxface")
|
|
|
+#if (!ACPI_REDUCED_HARDWARE)
|
|
|
+/* Local prototypes */
|
|
|
+static acpi_status
|
|
|
+acpi_ev_install_gpe_handler(acpi_handle gpe_device,
|
|
|
+ u32 gpe_number,
|
|
|
+ u32 type,
|
|
|
+ u8 is_raw_handler,
|
|
|
+ acpi_gpe_handler address, void *context);
|
|
|
+
|
|
|
+#endif
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
@@ -76,6 +86,7 @@ ACPI_MODULE_NAME("evxface")
|
|
|
* handlers.
|
|
|
*
|
|
|
******************************************************************************/
|
|
|
+
|
|
|
acpi_status
|
|
|
acpi_install_notify_handler(acpi_handle device,
|
|
|
u32 handler_type,
|
|
@@ -717,32 +728,37 @@ ACPI_EXPORT_SYMBOL(acpi_remove_fixed_event_handler)
|
|
|
|
|
|
/*******************************************************************************
|
|
|
*
|
|
|
- * FUNCTION: acpi_install_gpe_handler
|
|
|
+ * FUNCTION: acpi_ev_install_gpe_handler
|
|
|
*
|
|
|
* PARAMETERS: gpe_device - Namespace node for the GPE (NULL for FADT
|
|
|
* defined GPEs)
|
|
|
* gpe_number - The GPE number within the GPE block
|
|
|
* type - Whether this GPE should be treated as an
|
|
|
* edge- or level-triggered interrupt.
|
|
|
+ * is_raw_handler - Whether this GPE should be handled using
|
|
|
+ * the special GPE handler mode.
|
|
|
* address - Address of the handler
|
|
|
* context - Value passed to the handler on each GPE
|
|
|
*
|
|
|
* RETURN: Status
|
|
|
*
|
|
|
- * DESCRIPTION: Install a handler for a General Purpose Event.
|
|
|
+ * DESCRIPTION: Internal function to install a handler for a General Purpose
|
|
|
+ * Event.
|
|
|
*
|
|
|
******************************************************************************/
|
|
|
-acpi_status
|
|
|
-acpi_install_gpe_handler(acpi_handle gpe_device,
|
|
|
- u32 gpe_number,
|
|
|
- u32 type, acpi_gpe_handler address, void *context)
|
|
|
+static acpi_status
|
|
|
+acpi_ev_install_gpe_handler(acpi_handle gpe_device,
|
|
|
+ u32 gpe_number,
|
|
|
+ u32 type,
|
|
|
+ u8 is_raw_handler,
|
|
|
+ acpi_gpe_handler address, void *context)
|
|
|
{
|
|
|
struct acpi_gpe_event_info *gpe_event_info;
|
|
|
struct acpi_gpe_handler_info *handler;
|
|
|
acpi_status status;
|
|
|
acpi_cpu_flags flags;
|
|
|
|
|
|
- ACPI_FUNCTION_TRACE(acpi_install_gpe_handler);
|
|
|
+ ACPI_FUNCTION_TRACE(ev_install_gpe_handler);
|
|
|
|
|
|
/* Parameter validation */
|
|
|
|
|
@@ -775,8 +791,10 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
|
|
|
|
|
|
/* Make sure that there isn't a handler there already */
|
|
|
|
|
|
- if (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) ==
|
|
|
- ACPI_GPE_DISPATCH_HANDLER) {
|
|
|
+ if ((ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) ==
|
|
|
+ ACPI_GPE_DISPATCH_HANDLER) ||
|
|
|
+ (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) ==
|
|
|
+ ACPI_GPE_DISPATCH_RAW_HANDLER)) {
|
|
|
status = AE_ALREADY_EXISTS;
|
|
|
goto free_and_exit;
|
|
|
}
|
|
@@ -817,7 +835,10 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
|
|
|
|
|
|
gpe_event_info->flags &=
|
|
|
~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK);
|
|
|
- gpe_event_info->flags |= (u8)(type | ACPI_GPE_DISPATCH_HANDLER);
|
|
|
+ gpe_event_info->flags |=
|
|
|
+ (u8)(type |
|
|
|
+ (is_raw_handler ? ACPI_GPE_DISPATCH_RAW_HANDLER :
|
|
|
+ ACPI_GPE_DISPATCH_HANDLER));
|
|
|
|
|
|
acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
|
|
|
|
|
@@ -831,8 +852,76 @@ free_and_exit:
|
|
|
goto unlock_and_exit;
|
|
|
}
|
|
|
|
|
|
+/*******************************************************************************
|
|
|
+ *
|
|
|
+ * FUNCTION: acpi_install_gpe_handler
|
|
|
+ *
|
|
|
+ * PARAMETERS: gpe_device - Namespace node for the GPE (NULL for FADT
|
|
|
+ * defined GPEs)
|
|
|
+ * gpe_number - The GPE number within the GPE block
|
|
|
+ * type - Whether this GPE should be treated as an
|
|
|
+ * edge- or level-triggered interrupt.
|
|
|
+ * address - Address of the handler
|
|
|
+ * context - Value passed to the handler on each GPE
|
|
|
+ *
|
|
|
+ * RETURN: Status
|
|
|
+ *
|
|
|
+ * DESCRIPTION: Install a handler for a General Purpose Event.
|
|
|
+ *
|
|
|
+ ******************************************************************************/
|
|
|
+
|
|
|
+acpi_status
|
|
|
+acpi_install_gpe_handler(acpi_handle gpe_device,
|
|
|
+ u32 gpe_number,
|
|
|
+ u32 type, acpi_gpe_handler address, void *context)
|
|
|
+{
|
|
|
+ acpi_status status;
|
|
|
+
|
|
|
+ ACPI_FUNCTION_TRACE(acpi_install_gpe_handler);
|
|
|
+
|
|
|
+ status =
|
|
|
+ acpi_ev_install_gpe_handler(gpe_device, gpe_number, type, FALSE,
|
|
|
+ address, context);
|
|
|
+
|
|
|
+ return_ACPI_STATUS(status);
|
|
|
+}
|
|
|
+
|
|
|
ACPI_EXPORT_SYMBOL(acpi_install_gpe_handler)
|
|
|
|
|
|
+/*******************************************************************************
|
|
|
+ *
|
|
|
+ * FUNCTION: acpi_install_gpe_raw_handler
|
|
|
+ *
|
|
|
+ * PARAMETERS: gpe_device - Namespace node for the GPE (NULL for FADT
|
|
|
+ * defined GPEs)
|
|
|
+ * gpe_number - The GPE number within the GPE block
|
|
|
+ * type - Whether this GPE should be treated as an
|
|
|
+ * edge- or level-triggered interrupt.
|
|
|
+ * address - Address of the handler
|
|
|
+ * context - Value passed to the handler on each GPE
|
|
|
+ *
|
|
|
+ * RETURN: Status
|
|
|
+ *
|
|
|
+ * DESCRIPTION: Install a handler for a General Purpose Event.
|
|
|
+ *
|
|
|
+ ******************************************************************************/
|
|
|
+acpi_status
|
|
|
+acpi_install_gpe_raw_handler(acpi_handle gpe_device,
|
|
|
+ u32 gpe_number,
|
|
|
+ u32 type, acpi_gpe_handler address, void *context)
|
|
|
+{
|
|
|
+ acpi_status status;
|
|
|
+
|
|
|
+ ACPI_FUNCTION_TRACE(acpi_install_gpe_raw_handler);
|
|
|
+
|
|
|
+ status = acpi_ev_install_gpe_handler(gpe_device, gpe_number, type, TRUE,
|
|
|
+ address, context);
|
|
|
+
|
|
|
+ return_ACPI_STATUS(status);
|
|
|
+}
|
|
|
+
|
|
|
+ACPI_EXPORT_SYMBOL(acpi_install_gpe_raw_handler)
|
|
|
+
|
|
|
/*******************************************************************************
|
|
|
*
|
|
|
* FUNCTION: acpi_remove_gpe_handler
|
|
@@ -881,8 +970,10 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
|
|
|
|
|
|
/* Make sure that a handler is indeed installed */
|
|
|
|
|
|
- if (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) !=
|
|
|
- ACPI_GPE_DISPATCH_HANDLER) {
|
|
|
+ if ((ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) !=
|
|
|
+ ACPI_GPE_DISPATCH_HANDLER) &&
|
|
|
+ (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) !=
|
|
|
+ ACPI_GPE_DISPATCH_RAW_HANDLER)) {
|
|
|
status = AE_NOT_EXIST;
|
|
|
goto unlock_and_exit;
|
|
|
}
|