|
@@ -51,222 +51,6 @@
|
|
|
#define _COMPONENT ACPI_EVENTS
|
|
|
ACPI_MODULE_NAME("evxface")
|
|
|
|
|
|
-/*******************************************************************************
|
|
|
- *
|
|
|
- * FUNCTION: acpi_install_exception_handler
|
|
|
- *
|
|
|
- * PARAMETERS: Handler - Pointer to the handler function for the
|
|
|
- * event
|
|
|
- *
|
|
|
- * RETURN: Status
|
|
|
- *
|
|
|
- * DESCRIPTION: Saves the pointer to the handler function
|
|
|
- *
|
|
|
- ******************************************************************************/
|
|
|
-#ifdef ACPI_FUTURE_USAGE
|
|
|
-acpi_status acpi_install_exception_handler(acpi_exception_handler handler)
|
|
|
-{
|
|
|
- acpi_status status;
|
|
|
-
|
|
|
- ACPI_FUNCTION_TRACE(acpi_install_exception_handler);
|
|
|
-
|
|
|
- status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
|
|
|
- if (ACPI_FAILURE(status)) {
|
|
|
- return_ACPI_STATUS(status);
|
|
|
- }
|
|
|
-
|
|
|
- /* Don't allow two handlers. */
|
|
|
-
|
|
|
- if (acpi_gbl_exception_handler) {
|
|
|
- status = AE_ALREADY_EXISTS;
|
|
|
- goto cleanup;
|
|
|
- }
|
|
|
-
|
|
|
- /* Install the handler */
|
|
|
-
|
|
|
- acpi_gbl_exception_handler = handler;
|
|
|
-
|
|
|
- cleanup:
|
|
|
- (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
|
|
- return_ACPI_STATUS(status);
|
|
|
-}
|
|
|
-
|
|
|
-ACPI_EXPORT_SYMBOL(acpi_install_exception_handler)
|
|
|
-#endif /* ACPI_FUTURE_USAGE */
|
|
|
-
|
|
|
-/*******************************************************************************
|
|
|
- *
|
|
|
- * FUNCTION: acpi_install_global_event_handler
|
|
|
- *
|
|
|
- * PARAMETERS: Handler - Pointer to the global event handler function
|
|
|
- * Context - Value passed to the handler on each event
|
|
|
- *
|
|
|
- * RETURN: Status
|
|
|
- *
|
|
|
- * DESCRIPTION: Saves the pointer to the handler function. The global handler
|
|
|
- * is invoked upon each incoming GPE and Fixed Event. It is
|
|
|
- * invoked at interrupt level at the time of the event dispatch.
|
|
|
- * Can be used to update event counters, etc.
|
|
|
- *
|
|
|
- ******************************************************************************/
|
|
|
-acpi_status
|
|
|
-acpi_install_global_event_handler(ACPI_GBL_EVENT_HANDLER handler, void *context)
|
|
|
-{
|
|
|
- acpi_status status;
|
|
|
-
|
|
|
- ACPI_FUNCTION_TRACE(acpi_install_global_event_handler);
|
|
|
-
|
|
|
- /* Parameter validation */
|
|
|
-
|
|
|
- if (!handler) {
|
|
|
- return_ACPI_STATUS(AE_BAD_PARAMETER);
|
|
|
- }
|
|
|
-
|
|
|
- status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
|
|
|
- if (ACPI_FAILURE(status)) {
|
|
|
- return_ACPI_STATUS(status);
|
|
|
- }
|
|
|
-
|
|
|
- /* Don't allow two handlers. */
|
|
|
-
|
|
|
- if (acpi_gbl_global_event_handler) {
|
|
|
- status = AE_ALREADY_EXISTS;
|
|
|
- goto cleanup;
|
|
|
- }
|
|
|
-
|
|
|
- acpi_gbl_global_event_handler = handler;
|
|
|
- acpi_gbl_global_event_handler_context = context;
|
|
|
-
|
|
|
- cleanup:
|
|
|
- (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
|
|
- return_ACPI_STATUS(status);
|
|
|
-}
|
|
|
-
|
|
|
-ACPI_EXPORT_SYMBOL(acpi_install_global_event_handler)
|
|
|
-
|
|
|
-/*******************************************************************************
|
|
|
- *
|
|
|
- * FUNCTION: acpi_install_fixed_event_handler
|
|
|
- *
|
|
|
- * PARAMETERS: Event - Event type to enable.
|
|
|
- * Handler - Pointer to the handler function for the
|
|
|
- * event
|
|
|
- * Context - Value passed to the handler on each GPE
|
|
|
- *
|
|
|
- * RETURN: Status
|
|
|
- *
|
|
|
- * DESCRIPTION: Saves the pointer to the handler function and then enables the
|
|
|
- * event.
|
|
|
- *
|
|
|
- ******************************************************************************/
|
|
|
-acpi_status
|
|
|
-acpi_install_fixed_event_handler(u32 event,
|
|
|
- acpi_event_handler handler, void *context)
|
|
|
-{
|
|
|
- acpi_status status;
|
|
|
-
|
|
|
- ACPI_FUNCTION_TRACE(acpi_install_fixed_event_handler);
|
|
|
-
|
|
|
- /* Parameter validation */
|
|
|
-
|
|
|
- if (event > ACPI_EVENT_MAX) {
|
|
|
- return_ACPI_STATUS(AE_BAD_PARAMETER);
|
|
|
- }
|
|
|
-
|
|
|
- status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
|
|
|
- if (ACPI_FAILURE(status)) {
|
|
|
- return_ACPI_STATUS(status);
|
|
|
- }
|
|
|
-
|
|
|
- /* Don't allow two handlers. */
|
|
|
-
|
|
|
- if (NULL != acpi_gbl_fixed_event_handlers[event].handler) {
|
|
|
- status = AE_ALREADY_EXISTS;
|
|
|
- goto cleanup;
|
|
|
- }
|
|
|
-
|
|
|
- /* Install the handler before enabling the event */
|
|
|
-
|
|
|
- acpi_gbl_fixed_event_handlers[event].handler = handler;
|
|
|
- acpi_gbl_fixed_event_handlers[event].context = context;
|
|
|
-
|
|
|
- status = acpi_clear_event(event);
|
|
|
- if (ACPI_SUCCESS(status))
|
|
|
- status = acpi_enable_event(event, 0);
|
|
|
- if (ACPI_FAILURE(status)) {
|
|
|
- ACPI_WARNING((AE_INFO, "Could not enable fixed event 0x%X",
|
|
|
- event));
|
|
|
-
|
|
|
- /* Remove the handler */
|
|
|
-
|
|
|
- acpi_gbl_fixed_event_handlers[event].handler = NULL;
|
|
|
- acpi_gbl_fixed_event_handlers[event].context = NULL;
|
|
|
- } else {
|
|
|
- ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
|
|
- "Enabled fixed event %X, Handler=%p\n", event,
|
|
|
- handler));
|
|
|
- }
|
|
|
-
|
|
|
- cleanup:
|
|
|
- (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
|
|
- return_ACPI_STATUS(status);
|
|
|
-}
|
|
|
-
|
|
|
-ACPI_EXPORT_SYMBOL(acpi_install_fixed_event_handler)
|
|
|
-
|
|
|
-/*******************************************************************************
|
|
|
- *
|
|
|
- * FUNCTION: acpi_remove_fixed_event_handler
|
|
|
- *
|
|
|
- * PARAMETERS: Event - Event type to disable.
|
|
|
- * Handler - Address of the handler
|
|
|
- *
|
|
|
- * RETURN: Status
|
|
|
- *
|
|
|
- * DESCRIPTION: Disables the event and unregisters the event handler.
|
|
|
- *
|
|
|
- ******************************************************************************/
|
|
|
-acpi_status
|
|
|
-acpi_remove_fixed_event_handler(u32 event, acpi_event_handler handler)
|
|
|
-{
|
|
|
- acpi_status status = AE_OK;
|
|
|
-
|
|
|
- ACPI_FUNCTION_TRACE(acpi_remove_fixed_event_handler);
|
|
|
-
|
|
|
- /* Parameter validation */
|
|
|
-
|
|
|
- if (event > ACPI_EVENT_MAX) {
|
|
|
- return_ACPI_STATUS(AE_BAD_PARAMETER);
|
|
|
- }
|
|
|
-
|
|
|
- status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
|
|
|
- if (ACPI_FAILURE(status)) {
|
|
|
- return_ACPI_STATUS(status);
|
|
|
- }
|
|
|
-
|
|
|
- /* Disable the event before removing the handler */
|
|
|
-
|
|
|
- status = acpi_disable_event(event, 0);
|
|
|
-
|
|
|
- /* Always Remove the handler */
|
|
|
-
|
|
|
- acpi_gbl_fixed_event_handlers[event].handler = NULL;
|
|
|
- acpi_gbl_fixed_event_handlers[event].context = NULL;
|
|
|
-
|
|
|
- if (ACPI_FAILURE(status)) {
|
|
|
- ACPI_WARNING((AE_INFO,
|
|
|
- "Could not write to fixed event enable register 0x%X",
|
|
|
- event));
|
|
|
- } else {
|
|
|
- ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Disabled fixed event %X\n",
|
|
|
- event));
|
|
|
- }
|
|
|
-
|
|
|
- (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
|
|
- return_ACPI_STATUS(status);
|
|
|
-}
|
|
|
-
|
|
|
-ACPI_EXPORT_SYMBOL(acpi_remove_fixed_event_handler)
|
|
|
|
|
|
/*******************************************************************************
|
|
|
*
|
|
@@ -334,6 +118,7 @@ acpi_add_handler_object(struct acpi_object_notify_handler *parent_obj,
|
|
|
return AE_OK;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/*******************************************************************************
|
|
|
*
|
|
|
* FUNCTION: acpi_install_notify_handler
|
|
@@ -703,6 +488,224 @@ acpi_remove_notify_handler(acpi_handle device,
|
|
|
|
|
|
ACPI_EXPORT_SYMBOL(acpi_remove_notify_handler)
|
|
|
|
|
|
+/*******************************************************************************
|
|
|
+ *
|
|
|
+ * FUNCTION: acpi_install_exception_handler
|
|
|
+ *
|
|
|
+ * PARAMETERS: Handler - Pointer to the handler function for the
|
|
|
+ * event
|
|
|
+ *
|
|
|
+ * RETURN: Status
|
|
|
+ *
|
|
|
+ * DESCRIPTION: Saves the pointer to the handler function
|
|
|
+ *
|
|
|
+ ******************************************************************************/
|
|
|
+#ifdef ACPI_FUTURE_USAGE
|
|
|
+acpi_status acpi_install_exception_handler(acpi_exception_handler handler)
|
|
|
+{
|
|
|
+ acpi_status status;
|
|
|
+
|
|
|
+ ACPI_FUNCTION_TRACE(acpi_install_exception_handler);
|
|
|
+
|
|
|
+ status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
|
|
|
+ if (ACPI_FAILURE(status)) {
|
|
|
+ return_ACPI_STATUS(status);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Don't allow two handlers. */
|
|
|
+
|
|
|
+ if (acpi_gbl_exception_handler) {
|
|
|
+ status = AE_ALREADY_EXISTS;
|
|
|
+ goto cleanup;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Install the handler */
|
|
|
+
|
|
|
+ acpi_gbl_exception_handler = handler;
|
|
|
+
|
|
|
+ cleanup:
|
|
|
+ (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
|
|
+ return_ACPI_STATUS(status);
|
|
|
+}
|
|
|
+
|
|
|
+ACPI_EXPORT_SYMBOL(acpi_install_exception_handler)
|
|
|
+#endif /* ACPI_FUTURE_USAGE */
|
|
|
+
|
|
|
+#if (!ACPI_REDUCED_HARDWARE)
|
|
|
+/*******************************************************************************
|
|
|
+ *
|
|
|
+ * FUNCTION: acpi_install_global_event_handler
|
|
|
+ *
|
|
|
+ * PARAMETERS: Handler - Pointer to the global event handler function
|
|
|
+ * Context - Value passed to the handler on each event
|
|
|
+ *
|
|
|
+ * RETURN: Status
|
|
|
+ *
|
|
|
+ * DESCRIPTION: Saves the pointer to the handler function. The global handler
|
|
|
+ * is invoked upon each incoming GPE and Fixed Event. It is
|
|
|
+ * invoked at interrupt level at the time of the event dispatch.
|
|
|
+ * Can be used to update event counters, etc.
|
|
|
+ *
|
|
|
+ ******************************************************************************/
|
|
|
+acpi_status
|
|
|
+acpi_install_global_event_handler(ACPI_GBL_EVENT_HANDLER handler, void *context)
|
|
|
+{
|
|
|
+ acpi_status status;
|
|
|
+
|
|
|
+ ACPI_FUNCTION_TRACE(acpi_install_global_event_handler);
|
|
|
+
|
|
|
+ /* Parameter validation */
|
|
|
+
|
|
|
+ if (!handler) {
|
|
|
+ return_ACPI_STATUS(AE_BAD_PARAMETER);
|
|
|
+ }
|
|
|
+
|
|
|
+ status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
|
|
|
+ if (ACPI_FAILURE(status)) {
|
|
|
+ return_ACPI_STATUS(status);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Don't allow two handlers. */
|
|
|
+
|
|
|
+ if (acpi_gbl_global_event_handler) {
|
|
|
+ status = AE_ALREADY_EXISTS;
|
|
|
+ goto cleanup;
|
|
|
+ }
|
|
|
+
|
|
|
+ acpi_gbl_global_event_handler = handler;
|
|
|
+ acpi_gbl_global_event_handler_context = context;
|
|
|
+
|
|
|
+ cleanup:
|
|
|
+ (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
|
|
+ return_ACPI_STATUS(status);
|
|
|
+}
|
|
|
+
|
|
|
+ACPI_EXPORT_SYMBOL(acpi_install_global_event_handler)
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+ *
|
|
|
+ * FUNCTION: acpi_install_fixed_event_handler
|
|
|
+ *
|
|
|
+ * PARAMETERS: Event - Event type to enable.
|
|
|
+ * Handler - Pointer to the handler function for the
|
|
|
+ * event
|
|
|
+ * Context - Value passed to the handler on each GPE
|
|
|
+ *
|
|
|
+ * RETURN: Status
|
|
|
+ *
|
|
|
+ * DESCRIPTION: Saves the pointer to the handler function and then enables the
|
|
|
+ * event.
|
|
|
+ *
|
|
|
+ ******************************************************************************/
|
|
|
+acpi_status
|
|
|
+acpi_install_fixed_event_handler(u32 event,
|
|
|
+ acpi_event_handler handler, void *context)
|
|
|
+{
|
|
|
+ acpi_status status;
|
|
|
+
|
|
|
+ ACPI_FUNCTION_TRACE(acpi_install_fixed_event_handler);
|
|
|
+
|
|
|
+ /* Parameter validation */
|
|
|
+
|
|
|
+ if (event > ACPI_EVENT_MAX) {
|
|
|
+ return_ACPI_STATUS(AE_BAD_PARAMETER);
|
|
|
+ }
|
|
|
+
|
|
|
+ status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
|
|
|
+ if (ACPI_FAILURE(status)) {
|
|
|
+ return_ACPI_STATUS(status);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Don't allow two handlers. */
|
|
|
+
|
|
|
+ if (NULL != acpi_gbl_fixed_event_handlers[event].handler) {
|
|
|
+ status = AE_ALREADY_EXISTS;
|
|
|
+ goto cleanup;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Install the handler before enabling the event */
|
|
|
+
|
|
|
+ acpi_gbl_fixed_event_handlers[event].handler = handler;
|
|
|
+ acpi_gbl_fixed_event_handlers[event].context = context;
|
|
|
+
|
|
|
+ status = acpi_clear_event(event);
|
|
|
+ if (ACPI_SUCCESS(status))
|
|
|
+ status = acpi_enable_event(event, 0);
|
|
|
+ if (ACPI_FAILURE(status)) {
|
|
|
+ ACPI_WARNING((AE_INFO, "Could not enable fixed event 0x%X",
|
|
|
+ event));
|
|
|
+
|
|
|
+ /* Remove the handler */
|
|
|
+
|
|
|
+ acpi_gbl_fixed_event_handlers[event].handler = NULL;
|
|
|
+ acpi_gbl_fixed_event_handlers[event].context = NULL;
|
|
|
+ } else {
|
|
|
+ ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
|
|
+ "Enabled fixed event %X, Handler=%p\n", event,
|
|
|
+ handler));
|
|
|
+ }
|
|
|
+
|
|
|
+ cleanup:
|
|
|
+ (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
|
|
+ return_ACPI_STATUS(status);
|
|
|
+}
|
|
|
+
|
|
|
+ACPI_EXPORT_SYMBOL(acpi_install_fixed_event_handler)
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+ *
|
|
|
+ * FUNCTION: acpi_remove_fixed_event_handler
|
|
|
+ *
|
|
|
+ * PARAMETERS: Event - Event type to disable.
|
|
|
+ * Handler - Address of the handler
|
|
|
+ *
|
|
|
+ * RETURN: Status
|
|
|
+ *
|
|
|
+ * DESCRIPTION: Disables the event and unregisters the event handler.
|
|
|
+ *
|
|
|
+ ******************************************************************************/
|
|
|
+acpi_status
|
|
|
+acpi_remove_fixed_event_handler(u32 event, acpi_event_handler handler)
|
|
|
+{
|
|
|
+ acpi_status status = AE_OK;
|
|
|
+
|
|
|
+ ACPI_FUNCTION_TRACE(acpi_remove_fixed_event_handler);
|
|
|
+
|
|
|
+ /* Parameter validation */
|
|
|
+
|
|
|
+ if (event > ACPI_EVENT_MAX) {
|
|
|
+ return_ACPI_STATUS(AE_BAD_PARAMETER);
|
|
|
+ }
|
|
|
+
|
|
|
+ status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
|
|
|
+ if (ACPI_FAILURE(status)) {
|
|
|
+ return_ACPI_STATUS(status);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Disable the event before removing the handler */
|
|
|
+
|
|
|
+ status = acpi_disable_event(event, 0);
|
|
|
+
|
|
|
+ /* Always Remove the handler */
|
|
|
+
|
|
|
+ acpi_gbl_fixed_event_handlers[event].handler = NULL;
|
|
|
+ acpi_gbl_fixed_event_handlers[event].context = NULL;
|
|
|
+
|
|
|
+ if (ACPI_FAILURE(status)) {
|
|
|
+ ACPI_WARNING((AE_INFO,
|
|
|
+ "Could not write to fixed event enable register 0x%X",
|
|
|
+ event));
|
|
|
+ } else {
|
|
|
+ ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Disabled fixed event %X\n",
|
|
|
+ event));
|
|
|
+ }
|
|
|
+
|
|
|
+ (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
|
|
+ return_ACPI_STATUS(status);
|
|
|
+}
|
|
|
+
|
|
|
+ACPI_EXPORT_SYMBOL(acpi_remove_fixed_event_handler)
|
|
|
+
|
|
|
/*******************************************************************************
|
|
|
*
|
|
|
* FUNCTION: acpi_install_gpe_handler
|
|
@@ -984,3 +987,4 @@ acpi_status acpi_release_global_lock(u32 handle)
|
|
|
}
|
|
|
|
|
|
ACPI_EXPORT_SYMBOL(acpi_release_global_lock)
|
|
|
+#endif /* !ACPI_REDUCED_HARDWARE */
|