patch-2.4.22 linux-2.4.22/drivers/acpi/events/evxface.c
Next file: linux-2.4.22/drivers/acpi/events/evxfevnt.c
Previous file: linux-2.4.22/drivers/acpi/events/evsci.c
Back to the patch index
Back to the overall index
- Lines: 846
- Date:
2003-08-25 04:44:41.000000000 -0700
- Orig file:
linux-2.4.21/drivers/acpi/events/evxface.c
- Orig date:
2001-10-24 14:06:22.000000000 -0700
diff -urN linux-2.4.21/drivers/acpi/events/evxface.c linux-2.4.22/drivers/acpi/events/evxface.c
@@ -1,43 +1,59 @@
/******************************************************************************
*
* Module Name: evxface - External interfaces for ACPI events
- * $Revision: 116 $
*
*****************************************************************************/
/*
- * Copyright (C) 2000, 2001 R. Byron Moore
+ * Copyright (C) 2000 - 2003, R. Byron Moore
+ * All rights reserved.
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions, and the following disclaimer,
+ * without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ * substantially similar to the "NO WARRANTY" disclaimer below
+ * ("Disclaimer") and any redistribution must be conditioned upon
+ * including a substantially similar Disclaimer requirement for further
+ * binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ * of any contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
*/
-#include "acpi.h"
-#include "achware.h"
-#include "acnamesp.h"
-#include "acevents.h"
-#include "amlcode.h"
-#include "acinterp.h"
+#include <acpi/acpi.h>
+#include <acpi/acnamesp.h>
+#include <acpi/acevents.h>
+#include <acpi/acinterp.h>
#define _COMPONENT ACPI_EVENTS
- MODULE_NAME ("evxface")
+ ACPI_MODULE_NAME ("evxface")
/*******************************************************************************
*
- * FUNCTION: Acpi_install_fixed_event_handler
+ * FUNCTION: acpi_install_fixed_event_handler
*
* PARAMETERS: Event - Event type to enable.
* Handler - Pointer to the handler function for the
@@ -53,14 +69,14 @@
acpi_status
acpi_install_fixed_event_handler (
- u32 event,
- acpi_event_handler handler,
- void *context)
+ u32 event,
+ acpi_event_handler handler,
+ void *context)
{
- acpi_status status;
+ acpi_status status;
- FUNCTION_TRACE ("Acpi_install_fixed_event_handler");
+ ACPI_FUNCTION_TRACE ("acpi_install_fixed_event_handler");
/* Parameter validation */
@@ -69,23 +85,25 @@
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
- acpi_ut_acquire_mutex (ACPI_MTX_EVENTS);
+ 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_EXIST;
+ 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_enable_event (event, ACPI_EVENT_FIXED, 0);
- if (!ACPI_SUCCESS (status)) {
+ status = acpi_enable_event (event, 0);
+ if (ACPI_FAILURE (status)) {
ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Could not enable fixed event.\n"));
/* Remove the handler */
@@ -93,7 +111,6 @@
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));
@@ -101,14 +118,14 @@
cleanup:
- acpi_ut_release_mutex (ACPI_MTX_EVENTS);
+ (void) acpi_ut_release_mutex (ACPI_MTX_EVENTS);
return_ACPI_STATUS (status);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_remove_fixed_event_handler
+ * FUNCTION: acpi_remove_fixed_event_handler
*
* PARAMETERS: Event - Event type to disable.
* Handler - Address of the handler
@@ -121,13 +138,13 @@
acpi_status
acpi_remove_fixed_event_handler (
- u32 event,
- acpi_event_handler handler)
+ u32 event,
+ acpi_event_handler handler)
{
- acpi_status status = AE_OK;
+ acpi_status status = AE_OK;
- FUNCTION_TRACE ("Acpi_remove_fixed_event_handler");
+ ACPI_FUNCTION_TRACE ("acpi_remove_fixed_event_handler");
/* Parameter validation */
@@ -136,18 +153,21 @@
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
- acpi_ut_acquire_mutex (ACPI_MTX_EVENTS);
+ 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, ACPI_EVENT_FIXED, 0);
+ 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_SUCCESS (status)) {
+ if (ACPI_FAILURE (status)) {
ACPI_DEBUG_PRINT ((ACPI_DB_WARN,
"Could not write to fixed event enable register.\n"));
}
@@ -155,19 +175,19 @@
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Disabled fixed event %X.\n", event));
}
- acpi_ut_release_mutex (ACPI_MTX_EVENTS);
+ (void) acpi_ut_release_mutex (ACPI_MTX_EVENTS);
return_ACPI_STATUS (status);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_install_notify_handler
+ * FUNCTION: acpi_install_notify_handler
*
* PARAMETERS: Device - The device for which notifies will be handled
- * Handler_type - The type of handler:
- * ACPI_SYSTEM_NOTIFY: System_handler (00-7f)
- * ACPI_DEVICE_NOTIFY: Driver_handler (80-ff)
+ * handler_type - The type of handler:
+ * ACPI_SYSTEM_NOTIFY: system_handler (00-7f)
+ * ACPI_DEVICE_NOTIFY: driver_handler (80-ff)
* Handler - Address of the handler
* Context - Value passed to the handler on each GPE
*
@@ -179,33 +199,37 @@
acpi_status
acpi_install_notify_handler (
- acpi_handle device,
- u32 handler_type,
- acpi_notify_handler handler,
- void *context)
+ acpi_handle device,
+ u32 handler_type,
+ acpi_notify_handler handler,
+ void *context)
{
- acpi_operand_object *obj_desc;
- acpi_operand_object *notify_obj;
- acpi_namespace_node *device_node;
- acpi_status status = AE_OK;
+ union acpi_operand_object *obj_desc;
+ union acpi_operand_object *notify_obj;
+ struct acpi_namespace_node *node;
+ acpi_status status;
- FUNCTION_TRACE ("Acpi_install_notify_handler");
+ ACPI_FUNCTION_TRACE ("acpi_install_notify_handler");
/* Parameter validation */
- if ((!handler) ||
+ if ((!device) ||
+ (!handler) ||
(handler_type > ACPI_MAX_NOTIFY_HANDLER_TYPE)) {
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
- acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
+ status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
/* Convert and validate the device handle */
- device_node = acpi_ns_map_handle_to_node (device);
- if (!device_node) {
+ node = acpi_ns_map_handle_to_node (device);
+ if (!node) {
status = AE_BAD_PARAMETER;
goto unlock_and_exit;
}
@@ -220,22 +244,22 @@
/* Make sure the handler is not already installed */
if (((handler_type == ACPI_SYSTEM_NOTIFY) &&
- acpi_gbl_sys_notify.handler) ||
+ acpi_gbl_system_notify.handler) ||
((handler_type == ACPI_DEVICE_NOTIFY) &&
- acpi_gbl_drv_notify.handler)) {
- status = AE_EXIST;
+ acpi_gbl_device_notify.handler)) {
+ status = AE_ALREADY_EXISTS;
goto unlock_and_exit;
}
if (handler_type == ACPI_SYSTEM_NOTIFY) {
- acpi_gbl_sys_notify.node = device_node;
- acpi_gbl_sys_notify.handler = handler;
- acpi_gbl_sys_notify.context = context;
+ acpi_gbl_system_notify.node = node;
+ acpi_gbl_system_notify.handler = handler;
+ acpi_gbl_system_notify.context = context;
}
else /* ACPI_DEVICE_NOTIFY */ {
- acpi_gbl_drv_notify.node = device_node;
- acpi_gbl_drv_notify.handler = handler;
- acpi_gbl_drv_notify.context = context;
+ acpi_gbl_device_notify.node = node;
+ acpi_gbl_device_notify.handler = handler;
+ acpi_gbl_device_notify.context = context;
}
/* Global notify handler installed */
@@ -247,37 +271,31 @@
* Note that only certain object types can receive notifications.
*/
else {
- /*
- * These are the ONLY objects that can receive ACPI notifications
- */
- if ((device_node->type != ACPI_TYPE_DEVICE) &&
- (device_node->type != ACPI_TYPE_PROCESSOR) &&
- (device_node->type != ACPI_TYPE_POWER) &&
- (device_node->type != ACPI_TYPE_THERMAL)) {
- status = AE_BAD_PARAMETER;
+ /* Notifies allowed on this object? */
+
+ if (!acpi_ev_is_notify_object (node)) {
+ status = AE_TYPE;
goto unlock_and_exit;
}
/* Check for an existing internal object */
- obj_desc = acpi_ns_get_attached_object (device_node);
+ obj_desc = acpi_ns_get_attached_object (node);
if (obj_desc) {
-
/* Object exists - make sure there's no handler */
if (((handler_type == ACPI_SYSTEM_NOTIFY) &&
- obj_desc->device.sys_handler) ||
+ obj_desc->common_notify.system_notify) ||
((handler_type == ACPI_DEVICE_NOTIFY) &&
- obj_desc->device.drv_handler)) {
- status = AE_EXIST;
+ obj_desc->common_notify.device_notify)) {
+ status = AE_ALREADY_EXISTS;
goto unlock_and_exit;
}
}
-
else {
/* Create a new object */
- obj_desc = acpi_ut_create_internal_object (device_node->type);
+ obj_desc = acpi_ut_create_internal_object (node->type);
if (!obj_desc) {
status = AE_NO_MEMORY;
goto unlock_and_exit;
@@ -285,7 +303,12 @@
/* Attach new object to the Node */
- status = acpi_ns_attach_object (device, obj_desc, (u8) device_node->type);
+ status = acpi_ns_attach_object (device, obj_desc, node->type);
+
+ /* Remove local reference to the object */
+
+ acpi_ut_remove_reference (obj_desc);
+
if (ACPI_FAILURE (status)) {
goto unlock_and_exit;
}
@@ -293,41 +316,39 @@
/* Install the handler */
- notify_obj = acpi_ut_create_internal_object (INTERNAL_TYPE_NOTIFY);
+ notify_obj = acpi_ut_create_internal_object (ACPI_TYPE_LOCAL_NOTIFY);
if (!notify_obj) {
status = AE_NO_MEMORY;
goto unlock_and_exit;
}
- notify_obj->notify_handler.node = device_node;
- notify_obj->notify_handler.handler = handler;
- notify_obj->notify_handler.context = context;
-
+ notify_obj->notify.node = node;
+ notify_obj->notify.handler = handler;
+ notify_obj->notify.context = context;
if (handler_type == ACPI_SYSTEM_NOTIFY) {
- obj_desc->device.sys_handler = notify_obj;
+ obj_desc->common_notify.system_notify = notify_obj;
}
-
else /* ACPI_DEVICE_NOTIFY */ {
- obj_desc->device.drv_handler = notify_obj;
+ obj_desc->common_notify.device_notify = notify_obj;
}
}
unlock_and_exit:
- acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
+ (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
return_ACPI_STATUS (status);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_remove_notify_handler
+ * FUNCTION: acpi_remove_notify_handler
*
* PARAMETERS: Device - The device for which notifies will be handled
- * Handler_type - The type of handler:
- * ACPI_SYSTEM_NOTIFY: System_handler (00-7f)
- * ACPI_DEVICE_NOTIFY: Driver_handler (80-ff)
+ * handler_type - The type of handler:
+ * ACPI_SYSTEM_NOTIFY: system_handler (00-7f)
+ * ACPI_DEVICE_NOTIFY: driver_handler (80-ff)
* Handler - Address of the handler
* RETURN: Status
*
@@ -337,32 +358,36 @@
acpi_status
acpi_remove_notify_handler (
- acpi_handle device,
- u32 handler_type,
- acpi_notify_handler handler)
+ acpi_handle device,
+ u32 handler_type,
+ acpi_notify_handler handler)
{
- acpi_operand_object *notify_obj;
- acpi_operand_object *obj_desc;
- acpi_namespace_node *device_node;
- acpi_status status = AE_OK;
+ union acpi_operand_object *notify_obj;
+ union acpi_operand_object *obj_desc;
+ struct acpi_namespace_node *node;
+ acpi_status status;
- FUNCTION_TRACE ("Acpi_remove_notify_handler");
+ ACPI_FUNCTION_TRACE ("acpi_remove_notify_handler");
/* Parameter validation */
- if ((!handler) ||
+ if ((!device) ||
+ (!handler) ||
(handler_type > ACPI_MAX_NOTIFY_HANDLER_TYPE)) {
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
- acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
+ status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
/* Convert and validate the device handle */
- device_node = acpi_ns_map_handle_to_node (device);
- if (!device_node) {
+ node = acpi_ns_map_handle_to_node (device);
+ if (!node) {
status = AE_BAD_PARAMETER;
goto unlock_and_exit;
}
@@ -374,22 +399,22 @@
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Removing notify handler for ROOT object.\n"));
if (((handler_type == ACPI_SYSTEM_NOTIFY) &&
- !acpi_gbl_sys_notify.handler) ||
+ !acpi_gbl_system_notify.handler) ||
((handler_type == ACPI_DEVICE_NOTIFY) &&
- !acpi_gbl_drv_notify.handler)) {
+ !acpi_gbl_device_notify.handler)) {
status = AE_NOT_EXIST;
goto unlock_and_exit;
}
if (handler_type == ACPI_SYSTEM_NOTIFY) {
- acpi_gbl_sys_notify.node = NULL;
- acpi_gbl_sys_notify.handler = NULL;
- acpi_gbl_sys_notify.context = NULL;
+ acpi_gbl_system_notify.node = NULL;
+ acpi_gbl_system_notify.handler = NULL;
+ acpi_gbl_system_notify.context = NULL;
}
else {
- acpi_gbl_drv_notify.node = NULL;
- acpi_gbl_drv_notify.handler = NULL;
- acpi_gbl_drv_notify.context = NULL;
+ acpi_gbl_device_notify.node = NULL;
+ acpi_gbl_device_notify.handler = NULL;
+ acpi_gbl_device_notify.context = NULL;
}
}
@@ -397,20 +422,16 @@
* All Other Objects
*/
else {
- /*
- * These are the ONLY objects that can receive ACPI notifications
- */
- if ((device_node->type != ACPI_TYPE_DEVICE) &&
- (device_node->type != ACPI_TYPE_PROCESSOR) &&
- (device_node->type != ACPI_TYPE_POWER) &&
- (device_node->type != ACPI_TYPE_THERMAL)) {
- status = AE_BAD_PARAMETER;
+ /* Notifies allowed on this object? */
+
+ if (!acpi_ev_is_notify_object (node)) {
+ status = AE_TYPE;
goto unlock_and_exit;
}
/* Check for an existing internal object */
- obj_desc = acpi_ns_get_attached_object (device_node);
+ obj_desc = acpi_ns_get_attached_object (node);
if (!obj_desc) {
status = AE_NOT_EXIST;
goto unlock_and_exit;
@@ -419,14 +440,14 @@
/* Object exists - make sure there's an existing handler */
if (handler_type == ACPI_SYSTEM_NOTIFY) {
- notify_obj = obj_desc->device.sys_handler;
+ notify_obj = obj_desc->common_notify.system_notify;
}
else {
- notify_obj = obj_desc->device.drv_handler;
+ notify_obj = obj_desc->common_notify.device_notify;
}
if ((!notify_obj) ||
- (notify_obj->notify_handler.handler != handler)) {
+ (notify_obj->notify.handler != handler)) {
status = AE_BAD_PARAMETER;
goto unlock_and_exit;
}
@@ -434,10 +455,10 @@
/* Remove the handler */
if (handler_type == ACPI_SYSTEM_NOTIFY) {
- obj_desc->device.sys_handler = NULL;
+ obj_desc->common_notify.system_notify = NULL;
}
else {
- obj_desc->device.drv_handler = NULL;
+ obj_desc->common_notify.device_notify = NULL;
}
acpi_ut_remove_reference (notify_obj);
@@ -445,17 +466,17 @@
unlock_and_exit:
- acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
+ (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
return_ACPI_STATUS (status);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_install_gpe_handler
+ * FUNCTION: acpi_install_gpe_handler
*
- * PARAMETERS: Gpe_number - The GPE number. The numbering scheme is
- * bank 0 first, then bank 1.
+ * PARAMETERS: gpe_number - The GPE number within the GPE block
+ * gpe_block - GPE block (NULL == FADT GPEs)
* Type - Whether this GPE should be treated as an
* edge- or level-triggered interrupt.
* Handler - Address of the handler
@@ -469,124 +490,150 @@
acpi_status
acpi_install_gpe_handler (
- u32 gpe_number,
- u32 type,
- acpi_gpe_handler handler,
- void *context)
+ acpi_handle gpe_device,
+ u32 gpe_number,
+ u32 type,
+ acpi_gpe_handler handler,
+ void *context)
{
- acpi_status status = AE_OK;
+ acpi_status status;
+ struct acpi_gpe_event_info *gpe_event_info;
- FUNCTION_TRACE ("Acpi_install_gpe_handler");
+ ACPI_FUNCTION_TRACE ("acpi_install_gpe_handler");
/* Parameter validation */
- if (!handler || (gpe_number > ACPI_GPE_MAX)) {
+ if (!handler) {
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
+ status = acpi_ut_acquire_mutex (ACPI_MTX_EVENTS);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
+
/* Ensure that we have a valid GPE number */
- if (acpi_gbl_gpe_valid[gpe_number] == ACPI_GPE_INVALID) {
- return_ACPI_STATUS (AE_BAD_PARAMETER);
+ 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;
}
- acpi_ut_acquire_mutex (ACPI_MTX_EVENTS);
-
/* Make sure that there isn't a handler there already */
- if (acpi_gbl_gpe_info[gpe_number].handler) {
- status = AE_EXIST;
- goto cleanup;
+ if (gpe_event_info->handler) {
+ status = AE_ALREADY_EXISTS;
+ goto unlock_and_exit;
}
/* Install the handler */
- acpi_gbl_gpe_info[gpe_number].handler = handler;
- acpi_gbl_gpe_info[gpe_number].context = context;
- acpi_gbl_gpe_info[gpe_number].type = (u8) type;
+ acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR);
+ gpe_event_info->handler = handler;
+ gpe_event_info->context = context;
+ gpe_event_info->flags = (u8) type;
+ acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR);
/* Clear the GPE (of stale events), the enable it */
- acpi_hw_clear_gpe (gpe_number);
- acpi_hw_enable_gpe (gpe_number);
+ status = acpi_hw_clear_gpe (gpe_event_info);
+ if (ACPI_FAILURE (status)) {
+ goto unlock_and_exit;
+ }
+
+ status = acpi_hw_enable_gpe (gpe_event_info);
-cleanup:
- acpi_ut_release_mutex (ACPI_MTX_EVENTS);
+unlock_and_exit:
+ (void) acpi_ut_release_mutex (ACPI_MTX_EVENTS);
return_ACPI_STATUS (status);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_remove_gpe_handler
+ * FUNCTION: acpi_remove_gpe_handler
*
- * PARAMETERS: Gpe_number - The event to remove a handler
+ * PARAMETERS: gpe_number - The event to remove a handler
+ * gpe_block - GPE block (NULL == FADT GPEs)
* Handler - Address of the handler
*
* RETURN: Status
*
- * DESCRIPTION: Remove a handler for a General Purpose Acpi_event.
+ * DESCRIPTION: Remove a handler for a General Purpose acpi_event.
*
******************************************************************************/
acpi_status
acpi_remove_gpe_handler (
- u32 gpe_number,
- acpi_gpe_handler handler)
+ acpi_handle gpe_device,
+ u32 gpe_number,
+ acpi_gpe_handler handler)
{
- acpi_status status = AE_OK;
+ acpi_status status;
+ struct acpi_gpe_event_info *gpe_event_info;
- FUNCTION_TRACE ("Acpi_remove_gpe_handler");
+ ACPI_FUNCTION_TRACE ("acpi_remove_gpe_handler");
/* Parameter validation */
- if (!handler || (gpe_number > ACPI_GPE_MAX)) {
+ if (!handler) {
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
+ status = acpi_ut_acquire_mutex (ACPI_MTX_EVENTS);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
+
/* Ensure that we have a valid GPE number */
- if (acpi_gbl_gpe_valid[gpe_number] == ACPI_GPE_INVALID) {
- return_ACPI_STATUS (AE_BAD_PARAMETER);
+ 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;
}
/* Disable the GPE before removing the handler */
- acpi_hw_disable_gpe (gpe_number);
-
- acpi_ut_acquire_mutex (ACPI_MTX_EVENTS);
+ status = acpi_hw_disable_gpe (gpe_event_info);
+ if (ACPI_FAILURE (status)) {
+ goto unlock_and_exit;
+ }
/* Make sure that the installed handler is the same */
- if (acpi_gbl_gpe_info[gpe_number].handler != handler) {
- acpi_hw_enable_gpe (gpe_number);
+ if (gpe_event_info->handler != handler) {
+ (void) acpi_hw_enable_gpe (gpe_event_info);
status = AE_BAD_PARAMETER;
- goto cleanup;
+ goto unlock_and_exit;
}
/* Remove the handler */
- acpi_gbl_gpe_info[gpe_number].handler = NULL;
- acpi_gbl_gpe_info[gpe_number].context = NULL;
+ acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR);
+ gpe_event_info->handler = NULL;
+ gpe_event_info->context = NULL;
+ acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR);
-cleanup:
- acpi_ut_release_mutex (ACPI_MTX_EVENTS);
+unlock_and_exit:
+ (void) acpi_ut_release_mutex (ACPI_MTX_EVENTS);
return_ACPI_STATUS (status);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_acquire_global_lock
+ * FUNCTION: acpi_acquire_global_lock
*
* PARAMETERS: Timeout - How long the caller is willing to wait
- * Out_handle - A handle to the lock if acquired
+ * out_handle - A handle to the lock if acquired
*
* RETURN: Status
*
@@ -596,32 +643,38 @@
acpi_status
acpi_acquire_global_lock (
- void)
+ u16 timeout,
+ u32 *handle)
{
- acpi_status status;
+ acpi_status status;
+
+ if (!handle) {
+ return (AE_BAD_PARAMETER);
+ }
status = acpi_ex_enter_interpreter ();
if (ACPI_FAILURE (status)) {
return (status);
}
- /*
- * TBD: [Restructure] add timeout param to internal interface, and
- * perhaps INTERPRETER_LOCKED
- */
- status = acpi_ev_acquire_global_lock ();
+ status = acpi_ev_acquire_global_lock (timeout);
acpi_ex_exit_interpreter ();
+ if (ACPI_SUCCESS (status)) {
+ acpi_gbl_global_lock_handle++;
+ *handle = acpi_gbl_global_lock_handle;
+ }
+
return (status);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_release_global_lock
+ * FUNCTION: acpi_release_global_lock
*
- * PARAMETERS: Handle - Returned from Acpi_acquire_global_lock
+ * PARAMETERS: Handle - Returned from acpi_acquire_global_lock
*
* RETURN: Status
*
@@ -631,11 +684,17 @@
acpi_status
acpi_release_global_lock (
- void)
+ u32 handle)
{
+ acpi_status status;
+
- acpi_ev_release_global_lock ();
- return (AE_OK);
+ if (handle != acpi_gbl_global_lock_handle) {
+ return (AE_NOT_ACQUIRED);
+ }
+
+ status = acpi_ev_release_global_lock ();
+ return (status);
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)