lkml.org 
[lkml]   [2009]   [Sep]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
SubjectRe: [PATCH 3/3] ACPI: Remove old GPE API and transition code entirely to new one
Date
On Wednesday 02 September 2009, Matthew Garrett wrote:
> Remove the old GPE type handling entirely, which gets rid of various
> quirks like the implicit disabling with GPE type setting and some entirely
> dead code that set flags that were never used by anything else in the
> kernel. Also fix up some comments that erroneously claimed that the code
> they were commenting was actually enabling GPEs.
>
> Signed-off-by: Matthew Garrett <mjg@redhat.com>
> ---
> drivers/acpi/acpica/acevents.h | 6 +-
> drivers/acpi/acpica/evgpe.c | 150 ++++--------------------------------
> drivers/acpi/acpica/evgpeblk.c | 164 +---------------------------------------
> drivers/acpi/acpica/evxface.c | 14 ----
> drivers/acpi/acpica/evxfevnt.c | 48 +-----------
> drivers/acpi/button.c | 5 -
> drivers/acpi/ec.c | 2 -
> drivers/acpi/wakeup.c | 55 ++-----------
> include/acpi/actypes.h | 32 ++------
> 9 files changed, 41 insertions(+), 435 deletions(-)
>
> diff --git a/drivers/acpi/acpica/acevents.h b/drivers/acpi/acpica/acevents.h
> index 0bba148..197aa4f 100644
> --- a/drivers/acpi/acpica/acevents.h
> +++ b/drivers/acpi/acpica/acevents.h
> @@ -76,8 +76,7 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node *node,
> * evgpe - GPE handling and dispatch
> */
> acpi_status
> -acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info,
> - u8 type);
> +acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info);
>
> acpi_status
> acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info,
> @@ -122,9 +121,6 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info,
> u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list);
>
> acpi_status
> -acpi_ev_set_gpe_type(struct acpi_gpe_event_info *gpe_event_info, u8 type);
> -
> -acpi_status
> acpi_ev_check_for_wake_only_gpe(struct acpi_gpe_event_info *gpe_event_info);
>
> acpi_status acpi_ev_gpe_initialize(void);
> diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c
> index b9d8ee6..97c0e0f 100644
> --- a/drivers/acpi/acpica/evgpe.c
> +++ b/drivers/acpi/acpica/evgpe.c
> @@ -54,54 +54,9 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context);
>
> /*******************************************************************************
> *
> - * FUNCTION: acpi_ev_set_gpe_type
> - *
> - * PARAMETERS: gpe_event_info - GPE to set
> - * Type - New type
> - *
> - * RETURN: Status
> - *
> - * DESCRIPTION: Sets the new type for the GPE (wake, run, or wake/run)
> - *
> - ******************************************************************************/
> -
> -acpi_status
> -acpi_ev_set_gpe_type(struct acpi_gpe_event_info *gpe_event_info, u8 type)
> -{
> - acpi_status status;
> -
> - ACPI_FUNCTION_TRACE(ev_set_gpe_type);
> -
> - /* Validate type and update register enable masks */
> -
> - switch (type) {
> - case ACPI_GPE_TYPE_WAKE:
> - case ACPI_GPE_TYPE_RUNTIME:
> - case ACPI_GPE_TYPE_WAKE_RUN:
> - break;
> -
> - default:
> - return_ACPI_STATUS(AE_BAD_PARAMETER);
> - }
> -
> - /* Disable the GPE if currently enabled */
> -
> - status = acpi_ev_disable_gpe(gpe_event_info);
> -
> - /* Clear the type bits and insert the new Type */
> -
> - gpe_event_info->flags &= ~ACPI_GPE_TYPE_MASK;
> - gpe_event_info->flags |= type;
> - return_ACPI_STATUS(status);
> -}
> -
> -/*******************************************************************************
> - *
> * FUNCTION: acpi_ev_update_gpe_enable_masks
> *
> * PARAMETERS: gpe_event_info - GPE to update
> - * Type - What to do: ACPI_GPE_DISABLE or
> - * ACPI_GPE_ENABLE
> *
> * RETURN: Status
> *
> @@ -110,8 +65,7 @@ acpi_ev_set_gpe_type(struct acpi_gpe_event_info *gpe_event_info, u8 type)
> ******************************************************************************/
>
> acpi_status
> -acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info,
> - u8 type)
> +acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info)
> {
> struct acpi_gpe_register_info *gpe_register_info;
> u8 register_bit;
> @@ -127,37 +81,13 @@ acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info,
> (1 <<
> (gpe_event_info->gpe_number - gpe_register_info->base_gpe_number));
>
> - /* 1) Disable case. Simply clear all enable bits */
> -
> - if (type == ACPI_GPE_DISABLE) {
> - ACPI_CLEAR_BIT(gpe_register_info->enable_for_wake,
> - register_bit);
> - ACPI_CLEAR_BIT(gpe_register_info->enable_for_run, register_bit);
> - return_ACPI_STATUS(AE_OK);
> - }
> -
> - /* 2) Enable case. Set/Clear the appropriate enable bits */
> -
> - switch (gpe_event_info->flags & ACPI_GPE_TYPE_MASK) {
> - case ACPI_GPE_TYPE_WAKE:
> - ACPI_SET_BIT(gpe_register_info->enable_for_wake, register_bit);
> - ACPI_CLEAR_BIT(gpe_register_info->enable_for_run, register_bit);
> - break;
> -
> - case ACPI_GPE_TYPE_RUNTIME:
> - ACPI_CLEAR_BIT(gpe_register_info->enable_for_wake,
> - register_bit);
> - ACPI_SET_BIT(gpe_register_info->enable_for_run, register_bit);
> - break;
> -
> - case ACPI_GPE_TYPE_WAKE_RUN:
> - ACPI_SET_BIT(gpe_register_info->enable_for_wake, register_bit);
> - ACPI_SET_BIT(gpe_register_info->enable_for_run, register_bit);
> - break;
> + ACPI_CLEAR_BIT(gpe_register_info->enable_for_wake, register_bit);
> + ACPI_CLEAR_BIT(gpe_register_info->enable_for_run, register_bit);
>
> - default:
> - return_ACPI_STATUS(AE_BAD_PARAMETER);
> - }
> + if (gpe_event_info->runtime_count)
> + ACPI_SET_BIT(gpe_register_info->enable_for_run, register_bit);
> + if (gpe_event_info->wakeup_count)
> + ACPI_SET_BIT(gpe_register_info->enable_for_wake, register_bit);
>
> return_ACPI_STATUS(AE_OK);
> }
> @@ -186,47 +116,22 @@ acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info,
>
> /* Make sure HW enable masks are updated */
>
> - status =
> - acpi_ev_update_gpe_enable_masks(gpe_event_info, ACPI_GPE_ENABLE);
> + status = acpi_ev_update_gpe_enable_masks(gpe_event_info);
> if (ACPI_FAILURE(status)) {
> return_ACPI_STATUS(status);
> }
>
> /* Mark wake-enabled or HW enable, or both */
>
> - switch (gpe_event_info->flags & ACPI_GPE_TYPE_MASK) {
> - case ACPI_GPE_TYPE_WAKE:
> -
> - ACPI_SET_BIT(gpe_event_info->flags, ACPI_GPE_WAKE_ENABLED);
> - break;
> -
> - case ACPI_GPE_TYPE_WAKE_RUN:
> -
> - ACPI_SET_BIT(gpe_event_info->flags, ACPI_GPE_WAKE_ENABLED);
> -
> - /*lint -fallthrough */
> -
> - case ACPI_GPE_TYPE_RUNTIME:
> -
> - ACPI_SET_BIT(gpe_event_info->flags, ACPI_GPE_RUN_ENABLED);
> -
> - if (write_to_hardware) {
> -
> - /* Clear the GPE (of stale events), then enable it */
> -
> - status = acpi_hw_clear_gpe(gpe_event_info);
> - if (ACPI_FAILURE(status)) {
> - return_ACPI_STATUS(status);
> - }
> -
> - /* Enable the requested runtime GPE */
> -
> - status = acpi_hw_write_gpe_enable_reg(gpe_event_info);
> + if (gpe_event_info->runtime_count && write_to_hardware) {
> + /* Clear the GPE (of stale events), then enable it */
> + status = acpi_hw_clear_gpe(gpe_event_info);
> + if (ACPI_FAILURE(status)) {
> + return_ACPI_STATUS(status);
> }
> - break;
>
> - default:
> - return_ACPI_STATUS(AE_BAD_PARAMETER);
> + /* Enable the requested runtime GPE */
> + status = acpi_hw_write_gpe_enable_reg(gpe_event_info);
> }
>
> return_ACPI_STATUS(AE_OK);
> @@ -253,34 +158,11 @@ acpi_status acpi_ev_disable_gpe(struct acpi_gpe_event_info *gpe_event_info)
> /* Make sure HW enable masks are updated */
>
> status =
> - acpi_ev_update_gpe_enable_masks(gpe_event_info, ACPI_GPE_DISABLE);
> + acpi_ev_update_gpe_enable_masks(gpe_event_info);
> if (ACPI_FAILURE(status)) {
> return_ACPI_STATUS(status);
> }
>
> - /* Clear the appropriate enabled flags for this GPE */
> -
> - switch (gpe_event_info->flags & ACPI_GPE_TYPE_MASK) {
> - case ACPI_GPE_TYPE_WAKE:
> - ACPI_CLEAR_BIT(gpe_event_info->flags, ACPI_GPE_WAKE_ENABLED);
> - break;
> -
> - case ACPI_GPE_TYPE_WAKE_RUN:
> - ACPI_CLEAR_BIT(gpe_event_info->flags, ACPI_GPE_WAKE_ENABLED);
> -
> - /* fallthrough */
> -
> - case ACPI_GPE_TYPE_RUNTIME:
> -
> - /* Disable the requested runtime GPE */
> -
> - ACPI_CLEAR_BIT(gpe_event_info->flags, ACPI_GPE_RUN_ENABLED);
> - break;
> -
> - default:
> - break;
> - }
> -
> /*
> * Even if we don't know the GPE type, make sure that we always
> * disable it. low_disable_gpe will just clear the enable bit for this
> diff --git a/drivers/acpi/acpica/evgpeblk.c b/drivers/acpi/acpica/evgpeblk.c
> index 7b34636..51cc875 100644
> --- a/drivers/acpi/acpica/evgpeblk.c
> +++ b/drivers/acpi/acpica/evgpeblk.c
> @@ -54,10 +54,6 @@ static acpi_status
> acpi_ev_save_method_info(acpi_handle obj_handle,
> u32 level, void *obj_desc, void **return_value);
>
> -static acpi_status
> -acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
> - u32 level, void *info, void **return_value);
> -
> static struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32
> interrupt_number);
>
> @@ -325,14 +321,12 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
>
> /*
> * Now we can add this information to the gpe_event_info block for use
> - * during dispatch of this GPE. Default type is RUNTIME, although this may
> - * change when the _PRW methods are executed later.
> + * during dispatch of this GPE.
> */
> gpe_event_info =
> &gpe_block->event_info[gpe_number - gpe_block->block_base_number];
>
> - gpe_event_info->flags = (u8)
> - (type | ACPI_GPE_DISPATCH_METHOD | ACPI_GPE_TYPE_RUNTIME);
> + gpe_event_info->flags = (u8) (type | ACPI_GPE_DISPATCH_METHOD);
>
> gpe_event_info->dispatch.method_node =
> (struct acpi_namespace_node *)obj_handle;
> @@ -349,134 +343,6 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
>
> /*******************************************************************************
> *
> - * FUNCTION: acpi_ev_match_prw_and_gpe
> - *
> - * PARAMETERS: Callback from walk_namespace
> - *
> - * RETURN: Status. NOTE: We ignore errors so that the _PRW walk is
> - * not aborted on a single _PRW failure.
> - *
> - * DESCRIPTION: Called from acpi_walk_namespace. Expects each object to be a
> - * Device. Run the _PRW method. If present, extract the GPE
> - * number and mark the GPE as a WAKE GPE.
> - *
> - ******************************************************************************/
> -
> -static acpi_status
> -acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
> - u32 level, void *info, void **return_value)
> -{
> - struct acpi_gpe_walk_info *gpe_info = (void *)info;
> - struct acpi_namespace_node *gpe_device;
> - struct acpi_gpe_block_info *gpe_block;
> - struct acpi_namespace_node *target_gpe_device;
> - struct acpi_gpe_event_info *gpe_event_info;
> - union acpi_operand_object *pkg_desc;
> - union acpi_operand_object *obj_desc;
> - u32 gpe_number;
> - acpi_status status;
> -
> - ACPI_FUNCTION_TRACE(ev_match_prw_and_gpe);
> -
> - /* Check for a _PRW method under this device */
> -
> - status = acpi_ut_evaluate_object(obj_handle, METHOD_NAME__PRW,
> - ACPI_BTYPE_PACKAGE, &pkg_desc);
> - if (ACPI_FAILURE(status)) {
> -
> - /* Ignore all errors from _PRW, we don't want to abort the subsystem */
> -
> - return_ACPI_STATUS(AE_OK);
> - }
> -
> - /* The returned _PRW package must have at least two elements */
> -
> - if (pkg_desc->package.count < 2) {
> - goto cleanup;
> - }
> -
> - /* Extract pointers from the input context */
> -
> - gpe_device = gpe_info->gpe_device;
> - gpe_block = gpe_info->gpe_block;
> -
> - /*
> - * The _PRW object must return a package, we are only interested in the
> - * first element
> - */
> - obj_desc = pkg_desc->package.elements[0];
> -
> - if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
> -
> - /* Use FADT-defined GPE device (from definition of _PRW) */
> -
> - target_gpe_device = acpi_gbl_fadt_gpe_device;
> -
> - /* Integer is the GPE number in the FADT described GPE blocks */
> -
> - gpe_number = (u32) obj_desc->integer.value;
> - } else if (obj_desc->common.type == ACPI_TYPE_PACKAGE) {
> -
> - /* Package contains a GPE reference and GPE number within a GPE block */
> -
> - if ((obj_desc->package.count < 2) ||
> - ((obj_desc->package.elements[0])->common.type !=
> - ACPI_TYPE_LOCAL_REFERENCE) ||
> - ((obj_desc->package.elements[1])->common.type !=
> - ACPI_TYPE_INTEGER)) {
> - goto cleanup;
> - }
> -
> - /* Get GPE block reference and decode */
> -
> - target_gpe_device =
> - obj_desc->package.elements[0]->reference.node;
> - gpe_number = (u32) obj_desc->package.elements[1]->integer.value;
> - } else {
> - /* Unknown type, just ignore it */
> -
> - goto cleanup;
> - }
> -
> - /*
> - * Is this GPE within this block?
> - *
> - * TRUE if and only if these conditions are true:
> - * 1) The GPE devices match.
> - * 2) The GPE index(number) is within the range of the Gpe Block
> - * associated with the GPE device.
> - */
> - if ((gpe_device == target_gpe_device) &&
> - (gpe_number >= gpe_block->block_base_number) &&
> - (gpe_number < gpe_block->block_base_number +
> - (gpe_block->register_count * 8))) {
> - gpe_event_info = &gpe_block->event_info[gpe_number -
> - gpe_block->
> - block_base_number];
> -
> - /* Mark GPE for WAKE-ONLY but WAKE_DISABLED */
> -
> - gpe_event_info->flags &=
> - ~(ACPI_GPE_WAKE_ENABLED | ACPI_GPE_RUN_ENABLED);
> -
> - status =
> - acpi_ev_set_gpe_type(gpe_event_info, ACPI_GPE_TYPE_WAKE);
> - if (ACPI_FAILURE(status)) {
> - goto cleanup;
> - }
> -
> - status =
> - acpi_ev_update_gpe_enable_masks(gpe_event_info,
> - ACPI_GPE_DISABLE);
> - }
> -
> - cleanup:
> - acpi_ut_remove_reference(pkg_desc);
> - return_ACPI_STATUS(AE_OK);
> -}
> -
> -/*******************************************************************************
> - *
> * FUNCTION: acpi_ev_get_gpe_xrupt_block
> *
> * PARAMETERS: interrupt_number - Interrupt for a GPE block
> @@ -991,7 +857,6 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
> {
> acpi_status status;
> struct acpi_gpe_event_info *gpe_event_info;
> - struct acpi_gpe_walk_info gpe_info;
> u32 wake_gpe_count;
> u32 gpe_enabled_count;
> u32 i;
> @@ -1006,27 +871,6 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
> }
>
> /*
> - * Runtime option: Should wake GPEs be enabled at runtime? The default
> - * is no, they should only be enabled just as the machine goes to sleep.
> - */
> - if (acpi_gbl_leave_wake_gpes_disabled) {
> - /*
> - * Differentiate runtime vs wake GPEs, via the _PRW control methods.
> - * Each GPE that has one or more _PRWs that reference it is by
> - * definition a wake GPE and will not be enabled while the machine
> - * is running.
> - */
> - gpe_info.gpe_block = gpe_block;
> - gpe_info.gpe_device = gpe_device;
> -
> - status =
> - acpi_ns_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
> - ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK,
> - acpi_ev_match_prw_and_gpe, &gpe_info,
> - NULL);
> - }
> -
> - /*
> * Enable all GPEs in this block that have these attributes:
> * 1) are "runtime" or "run/wake" GPEs, and
> * 2) have a corresponding _Lxx or _Exx method
> @@ -1048,11 +892,11 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
>
> if (((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) ==
> ACPI_GPE_DISPATCH_METHOD) &&
> - (gpe_event_info->flags & ACPI_GPE_TYPE_RUNTIME)) {
> + gpe_event_info->runtime_count) {
> gpe_enabled_count++;
> }
>
> - if (gpe_event_info->flags & ACPI_GPE_TYPE_WAKE) {
> + if (gpe_event_info->wakeup_count) {
> wake_gpe_count++;
> }
> }
> diff --git a/drivers/acpi/acpica/evxface.c b/drivers/acpi/acpica/evxface.c
> index 10b8543..90cdeae 100644
> --- a/drivers/acpi/acpica/evxface.c
> +++ b/drivers/acpi/acpica/evxface.c
> @@ -617,13 +617,6 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
> 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);
> @@ -707,13 +700,6 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
> 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);
> diff --git a/drivers/acpi/acpica/evxfevnt.c b/drivers/acpi/acpica/evxfevnt.c
> index 2a98818..4fb451d 100644
> --- a/drivers/acpi/acpica/evxfevnt.c
> +++ b/drivers/acpi/acpica/evxfevnt.c
> @@ -311,8 +311,7 @@ acpi_status acpi_get_wakeup_gpe(acpi_handle gpe_device, u32 gpe_number)
> }
>
> if (++gpe_event_info->wakeup_count == 1)
> - acpi_ev_update_gpe_enable_masks(gpe_event_info,
> - ACPI_GPE_ENABLE);
> + acpi_ev_update_gpe_enable_masks(gpe_event_info);
>
> unlock_and_exit:
> acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
> @@ -351,8 +350,7 @@ acpi_status acpi_put_wakeup_gpe(acpi_handle gpe_device, u32 gpe_number)
> }
>
> if (--gpe_event_info->wakeup_count == 0)
> - acpi_ev_update_gpe_enable_masks(gpe_event_info,
> - ACPI_GPE_DISABLE);
> + acpi_ev_update_gpe_enable_masks(gpe_event_info);
>
> unlock_and_exit:
> acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
> @@ -362,48 +360,6 @@ ACPI_EXPORT_SYMBOL(acpi_put_wakeup_gpe)
>
> /*******************************************************************************
> *
> - * FUNCTION: acpi_set_gpe_type
> - *
> - * PARAMETERS: gpe_device - Parent GPE Device
> - * gpe_number - GPE level within the GPE block
> - * Type - New GPE type
> - *
> - * RETURN: Status
> - *
> - * DESCRIPTION: Set the type of an individual GPE
> - *
> - ******************************************************************************/
> -acpi_status acpi_set_gpe_type(acpi_handle gpe_device, u32 gpe_number, u8 type)
> -{
> - acpi_status status = AE_OK;
> - struct acpi_gpe_event_info *gpe_event_info;
> -
> - ACPI_FUNCTION_TRACE(acpi_set_gpe_type);
> -
> - /* 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;
> - }
> -
> - if ((gpe_event_info->flags & ACPI_GPE_TYPE_MASK) == type) {
> - return_ACPI_STATUS(AE_OK);
> - }
> -
> - /* Set the new type (will disable GPE if currently enabled) */
> -
> - status = acpi_ev_set_gpe_type(gpe_event_info, type);
> -
> - unlock_and_exit:
> - return_ACPI_STATUS(status);
> -}
> -
> -ACPI_EXPORT_SYMBOL(acpi_set_gpe_type)
> -
> -/*******************************************************************************
> - *
> * FUNCTION: acpi_enable_gpe
> *
> * PARAMETERS: gpe_device - Parent GPE Device
> diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c
> index 4dd67b1..1a50241 100644
> --- a/drivers/acpi/button.c
> +++ b/drivers/acpi/button.c
> @@ -372,11 +372,6 @@ static int acpi_button_add(struct acpi_device *device)
>
> if (device->wakeup.flags.valid) {
> /* Button's GPE is run-wake GPE */
> - acpi_set_gpe_type(device->wakeup.gpe_device,
> - device->wakeup.gpe_number,
> - ACPI_GPE_TYPE_WAKE_RUN);
> - acpi_enable_gpe(device->wakeup.gpe_device,
> - device->wakeup.gpe_number);
> acpi_get_wakeup_gpe(device->wakeup.gpe_device,
> device->wakeup.gpe_number);
> device->wakeup.state.enabled = 1;
> diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
> index 56f6ba9..a28373d 100644
> --- a/drivers/acpi/ec.c
> +++ b/drivers/acpi/ec.c
> @@ -899,8 +899,6 @@ static int ec_install_handlers(struct acpi_ec *ec)
> &acpi_ec_gpe_handler, ec);
> if (ACPI_FAILURE(status))
> return -ENODEV;
> - acpi_set_gpe_type(NULL, ec->gpe, ACPI_GPE_TYPE_RUNTIME);
> - acpi_enable_gpe(NULL, ec->gpe);
> acpi_get_runtime_gpe(NULL, ec->gpe);
> status = acpi_install_address_space_handler(ec->handle,
> ACPI_ADR_SPACE_EC,
> diff --git a/drivers/acpi/wakeup.c b/drivers/acpi/wakeup.c
> index 98023ef..ebe7250 100644
> --- a/drivers/acpi/wakeup.c
> +++ b/drivers/acpi/wakeup.c
> @@ -62,25 +62,12 @@ void acpi_enable_wakeup_device(u8 sleep_state)
> struct acpi_device *dev =
> container_of(node, struct acpi_device, wakeup_list);
>
> - if (!dev->wakeup.flags.valid)
> + if (!dev->wakeup.flags.valid ||
> + !dev->wakeup.flags.prepared ||
> + !dev->wakeup.state.enabled ||
> + (sleep_state > (u32) dev->wakeup.sleep_state))
> continue;

That'll need to be updated after the PCI wake-up rework.

> - /* If users want to disable run-wake GPE,
> - * we only disable it for wake and leave it for runtime
> - */
> - if ((!dev->wakeup.state.enabled && !dev->wakeup.flags.prepared)
> - || sleep_state > (u32) dev->wakeup.sleep_state) {
> - if (dev->wakeup.flags.run_wake) {
> - /* set_gpe_type will disable GPE, leave it like that */
> - acpi_set_gpe_type(dev->wakeup.gpe_device,
> - dev->wakeup.gpe_number,
> - ACPI_GPE_TYPE_RUNTIME);
> - }
> - continue;
> - }
> - if (!dev->wakeup.flags.run_wake)
> - acpi_enable_gpe(dev->wakeup.gpe_device,
> - dev->wakeup.gpe_number);
> acpi_get_wakeup_gpe(dev->wakeup.gpe_device,
> dev->wakeup.gpe_number);
> }
> @@ -99,32 +86,13 @@ void acpi_disable_wakeup_device(u8 sleep_state)
> struct acpi_device *dev =
> container_of(node, struct acpi_device, wakeup_list);
>
> - if (!dev->wakeup.flags.valid)
> - continue;
> -
> - if ((!dev->wakeup.state.enabled && !dev->wakeup.flags.prepared)
> - || sleep_state > (u32) dev->wakeup.sleep_state) {
> - if (dev->wakeup.flags.run_wake) {
> - acpi_set_gpe_type(dev->wakeup.gpe_device,
> - dev->wakeup.gpe_number,
> - ACPI_GPE_TYPE_WAKE_RUN);
> - /* Re-enable it, since set_gpe_type will disable it */
> - acpi_enable_gpe(dev->wakeup.gpe_device,
> - dev->wakeup.gpe_number);
> - }
> - continue;
> - }
> + if (dev->wakeup.state.enabled &&
> + dev->wakeup.flags.prepared &&
> + sleep_state <= (u32) dev->wakeup.sleep_state)
> + acpi_put_wakeup_gpe(dev->wakeup.gpe_device,
> + dev->wakeup.gpe_number);

Ditto.

> acpi_disable_wakeup_device_power(dev);
> - /* Never disable run-wake GPE */
> - if (!dev->wakeup.flags.run_wake) {
> - acpi_disable_gpe(dev->wakeup.gpe_device,
> - dev->wakeup.gpe_number);
> - acpi_clear_gpe(dev->wakeup.gpe_device,
> - dev->wakeup.gpe_number, ACPI_NOT_ISR);
> - }
> - acpi_put_wakeup_gpe(dev->wakeup.gpe_device,
> - dev->wakeup.gpe_number);
> }
> }
>
> @@ -140,11 +108,6 @@ int __init acpi_wakeup_device_init(void)
> /* In case user doesn't load button driver */
> if (!dev->wakeup.flags.run_wake || dev->wakeup.state.enabled)
> continue;
> - acpi_set_gpe_type(dev->wakeup.gpe_device,
> - dev->wakeup.gpe_number,
> - ACPI_GPE_TYPE_WAKE_RUN);
> - acpi_enable_gpe(dev->wakeup.gpe_device,
> - dev->wakeup.gpe_number);
> acpi_get_wakeup_gpe(dev->wakeup.gpe_device,
> dev->wakeup.gpe_number);
> dev->wakeup.state.enabled = 1;
> diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
> index 37ba576..0c6f8d8 100644
> --- a/include/acpi/actypes.h
> +++ b/include/acpi/actypes.h
> @@ -668,41 +668,27 @@ typedef u32 acpi_event_status;
>
> /*
> * GPE info flags - Per GPE
> - * +-+-+-+---+---+-+
> - * |7|6|5|4:3|2:1|0|
> - * +-+-+-+---+---+-+
> - * | | | | | |
> - * | | | | | +--- Interrupt type: Edge or Level Triggered
> - * | | | | +--- Type: Wake-only, Runtime-only, or wake/runtime
> + * +-+-+-+---+-+-+-+
> + * |7|6|5|4:3|2|1|0|
> + * +-+-+-+---+-+-+-+
> + * | | | | | | |
> + * | | | | | | +--- Interrupt type: Edge or Level Triggered
> + * | | | | | +--- Unused
> + * | | | | +--- Unused
> * | | | +--- Type of dispatch -- to method, handler, or none
> - * | | +--- Enabled for runtime?
> - * | +--- Enabled for wake?
> + * | | +--- Unused
> + * | +--- Unused
> * +--- Unused
> */
> #define ACPI_GPE_XRUPT_TYPE_MASK (u8) 0x01
> #define ACPI_GPE_LEVEL_TRIGGERED (u8) 0x01
> #define ACPI_GPE_EDGE_TRIGGERED (u8) 0x00
>
> -#define ACPI_GPE_TYPE_MASK (u8) 0x06
> -#define ACPI_GPE_TYPE_WAKE_RUN (u8) 0x06
> -#define ACPI_GPE_TYPE_WAKE (u8) 0x02
> -#define ACPI_GPE_TYPE_RUNTIME (u8) 0x04 /* Default */
> -
> #define ACPI_GPE_DISPATCH_MASK (u8) 0x18
> #define ACPI_GPE_DISPATCH_HANDLER (u8) 0x08
> #define ACPI_GPE_DISPATCH_METHOD (u8) 0x10
> #define ACPI_GPE_DISPATCH_NOT_USED (u8) 0x00 /* Default */
>
> -#define ACPI_GPE_RUN_ENABLE_MASK (u8) 0x20
> -#define ACPI_GPE_RUN_ENABLED (u8) 0x20
> -#define ACPI_GPE_RUN_DISABLED (u8) 0x00 /* Default */
> -
> -#define ACPI_GPE_WAKE_ENABLE_MASK (u8) 0x40
> -#define ACPI_GPE_WAKE_ENABLED (u8) 0x40
> -#define ACPI_GPE_WAKE_DISABLED (u8) 0x00 /* Default */
> -
> -#define ACPI_GPE_ENABLE_MASK (u8) 0x60 /* Both run/wake */
> -
> /*
> * Flags for GPE and Lock interfaces
> */

Apart from the comments above, looks really good.

Thanks,
Rafael


\
 
 \ /
  Last update: 2009-09-15 23:53    [W:3.012 / U:0.072 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site