⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 evxface.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
acpi_statusacpi_remove_notify_handler(acpi_handle device,			   u32 handler_type, acpi_notify_handler handler){	union acpi_operand_object *notify_obj;	union acpi_operand_object *obj_desc;	struct acpi_namespace_node *node;	acpi_status status;	ACPI_FUNCTION_TRACE("acpi_remove_notify_handler");	/* Parameter validation */	if ((!device) ||	    (!handler) || (handler_type > ACPI_MAX_NOTIFY_HANDLER_TYPE)) {		return_ACPI_STATUS(AE_BAD_PARAMETER);	}	status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	/* Convert and validate the device handle */	node = acpi_ns_map_handle_to_node(device);	if (!node) {		status = AE_BAD_PARAMETER;		goto unlock_and_exit;	}	/* Root Object */	if (device == ACPI_ROOT_OBJECT) {		ACPI_DEBUG_PRINT((ACPI_DB_INFO,				  "Removing notify handler for ROOT object.\n"));		if (((handler_type & ACPI_SYSTEM_NOTIFY) &&		     !acpi_gbl_system_notify.handler) ||		    ((handler_type & ACPI_DEVICE_NOTIFY) &&		     !acpi_gbl_device_notify.handler)) {			status = AE_NOT_EXIST;			goto unlock_and_exit;		}		/* Make sure all deferred tasks are completed */		(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);		acpi_os_wait_events_complete(NULL);		status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);		if (ACPI_FAILURE(status)) {			return_ACPI_STATUS(status);		}		if (handler_type & ACPI_SYSTEM_NOTIFY) {			acpi_gbl_system_notify.node = NULL;			acpi_gbl_system_notify.handler = NULL;			acpi_gbl_system_notify.context = NULL;		}		if (handler_type & ACPI_DEVICE_NOTIFY) {			acpi_gbl_device_notify.node = NULL;			acpi_gbl_device_notify.handler = NULL;			acpi_gbl_device_notify.context = NULL;		}	}	/* All Other Objects */	else {		/* 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(node);		if (!obj_desc) {			status = AE_NOT_EXIST;			goto unlock_and_exit;		}		/* Object exists - make sure there's an existing handler */		if (handler_type & ACPI_SYSTEM_NOTIFY) {			notify_obj = obj_desc->common_notify.system_notify;			if ((!notify_obj) ||			    (notify_obj->notify.handler != handler)) {				status = AE_BAD_PARAMETER;				goto unlock_and_exit;			}			/* Make sure all deferred tasks are completed */			(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);			acpi_os_wait_events_complete(NULL);			status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);			if (ACPI_FAILURE(status)) {				return_ACPI_STATUS(status);			}			/* Remove the handler */			obj_desc->common_notify.system_notify = NULL;			acpi_ut_remove_reference(notify_obj);		}		if (handler_type & ACPI_DEVICE_NOTIFY) {			notify_obj = obj_desc->common_notify.device_notify;			if ((!notify_obj) ||			    (notify_obj->notify.handler != handler)) {				status = AE_BAD_PARAMETER;				goto unlock_and_exit;			}			/* Make sure all deferred tasks are completed */			(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);			acpi_os_wait_events_complete(NULL);			status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);			if (ACPI_FAILURE(status)) {				return_ACPI_STATUS(status);			}			/* Remove the handler */			obj_desc->common_notify.device_notify = NULL;			acpi_ut_remove_reference(notify_obj);		}	}      unlock_and_exit:	(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);	return_ACPI_STATUS(status);}EXPORT_SYMBOL(acpi_remove_notify_handler);/******************************************************************************* * * 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_statusacpi_install_gpe_handler(acpi_handle gpe_device,			 u32 gpe_number,			 u32 type, acpi_event_handler address, void *context){	struct acpi_gpe_event_info *gpe_event_info;	struct acpi_handler_info *handler;	acpi_status status;	u32 flags;	ACPI_FUNCTION_TRACE("acpi_install_gpe_handler");	/* Parameter validation */	if ((!address) || (type > ACPI_GPE_XRUPT_TYPE_MASK)) {		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 */	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;	}	/* Make sure that there isn't a handler there already */	if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) ==	    ACPI_GPE_DISPATCH_HANDLER) {		status = AE_ALREADY_EXISTS;		goto unlock_and_exit;	}	/* Allocate and init handler object */	handler = ACPI_MEM_CALLOCATE(sizeof(struct acpi_handler_info));	if (!handler) {		status = AE_NO_MEMORY;		goto unlock_and_exit;	}	handler->address = address;	handler->context = context;	handler->method_node = gpe_event_info->dispatch.method_node;	/* Disable the GPE before installing the handler */	status = acpi_ev_disable_gpe(gpe_event_info);	if (ACPI_FAILURE(status)) {		goto unlock_and_exit;	}	/* Install the handler */	flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);	gpe_event_info->dispatch.handler = handler;	/* Setup up dispatch flags to indicate handler (vs. method) */	gpe_event_info->flags &= ~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK);	/* Clear bits */	gpe_event_info->flags |= (u8) (type | ACPI_GPE_DISPATCH_HANDLER);	acpi_os_release_lock(acpi_gbl_gpe_lock, flags);      unlock_and_exit:	(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);	return_ACPI_STATUS(status);}EXPORT_SYMBOL(acpi_install_gpe_handler);/******************************************************************************* * * FUNCTION:    acpi_remove_gpe_handler * * PARAMETERS:  gpe_device      - Namespace node for the GPE (NULL for FADT *                                defined GPEs) *              gpe_number      - The event to remove a handler *              Address         - Address of the handler * * RETURN:      Status * * DESCRIPTION: Remove a handler for a General Purpose acpi_event. * ******************************************************************************/acpi_statusacpi_remove_gpe_handler(acpi_handle gpe_device,			u32 gpe_number, acpi_event_handler address){	struct acpi_gpe_event_info *gpe_event_info;	struct acpi_handler_info *handler;	acpi_status status;	u32 flags;	ACPI_FUNCTION_TRACE("acpi_remove_gpe_handler");	/* Parameter validation */	if (!address) {		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 */	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;	}	/* Make sure that a handler is indeed installed */	if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) !=	    ACPI_GPE_DISPATCH_HANDLER) {		status = AE_NOT_EXIST;		goto unlock_and_exit;	}	/* Make sure that the installed handler is the same */	if (gpe_event_info->dispatch.handler->address != address) {		status = AE_BAD_PARAMETER;		goto unlock_and_exit;	}	/* Disable the GPE before removing the handler */	status = acpi_ev_disable_gpe(gpe_event_info);	if (ACPI_FAILURE(status)) {		goto unlock_and_exit;	}	/* Make sure all deferred tasks are completed */	(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);	acpi_os_wait_events_complete(NULL);	status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	/* Remove the handler */	flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);	handler = gpe_event_info->dispatch.handler;	/* Restore Method node (if any), set dispatch flags */	gpe_event_info->dispatch.method_node = handler->method_node;	gpe_event_info->flags &= ~ACPI_GPE_DISPATCH_MASK;	/* Clear bits */	if (handler->method_node) {		gpe_event_info->flags |= ACPI_GPE_DISPATCH_METHOD;	}	acpi_os_release_lock(acpi_gbl_gpe_lock, flags);	/* Now we can free the handler object */	ACPI_MEM_FREE(handler);      unlock_and_exit:	(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);	return_ACPI_STATUS(status);}EXPORT_SYMBOL(acpi_remove_gpe_handler);/******************************************************************************* * * FUNCTION:    acpi_acquire_global_lock * * PARAMETERS:  Timeout         - How long the caller is willing to wait *              Handle          - Where the handle to the lock is returned *                                (if acquired) * * RETURN:      Status * * DESCRIPTION: Acquire the ACPI Global Lock * ******************************************************************************/acpi_status acpi_acquire_global_lock(u16 timeout, u32 * handle){	acpi_status status;	if (!handle) {		return (AE_BAD_PARAMETER);	}	status = acpi_ex_enter_interpreter();	if (ACPI_FAILURE(status)) {		return (status);	}	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);}EXPORT_SYMBOL(acpi_acquire_global_lock);/******************************************************************************* * * FUNCTION:    acpi_release_global_lock * * PARAMETERS:  Handle      - Returned from acpi_acquire_global_lock * * RETURN:      Status * * DESCRIPTION: Release the ACPI Global Lock. The handle must be valid. * ******************************************************************************/acpi_status acpi_release_global_lock(u32 handle){	acpi_status status;	if (handle != acpi_gbl_global_lock_handle) {		return (AE_NOT_ACQUIRED);	}	status = acpi_ev_release_global_lock();	return (status);}EXPORT_SYMBOL(acpi_release_global_lock);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -