|
@@ -52,56 +52,11 @@ ACPI_MODULE_NAME("evgpe")
|
|
|
/* Local prototypes */
|
|
|
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,14 @@ 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 */
|
|
|
+ ACPI_CLEAR_BIT(gpe_register_info->enable_for_wake, register_bit);
|
|
|
+ ACPI_CLEAR_BIT(gpe_register_info->enable_for_run, register_bit);
|
|
|
|
|
|
- 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);
|
|
|
+ if (gpe_event_info->runtime_count)
|
|
|
ACPI_SET_BIT(gpe_register_info->enable_for_run, register_bit);
|
|
|
- break;
|
|
|
|
|
|
- case ACPI_GPE_TYPE_WAKE_RUN:
|
|
|
+ if (gpe_event_info->wakeup_count)
|
|
|
ACPI_SET_BIT(gpe_register_info->enable_for_wake, register_bit);
|
|
|
- ACPI_SET_BIT(gpe_register_info->enable_for_run, register_bit);
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- return_ACPI_STATUS(AE_BAD_PARAMETER);
|
|
|
- }
|
|
|
|
|
|
return_ACPI_STATUS(AE_OK);
|
|
|
}
|
|
@@ -186,47 +117,20 @@ 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);
|
|
|
- if (ACPI_FAILURE(status)) {
|
|
|
+ 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);
|
|
|
- }
|
|
|
- break;
|
|
|
+ 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);
|
|
|
|
|
|
- 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);
|
|
@@ -252,34 +156,9 @@ 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);
|
|
|
- if (ACPI_FAILURE(status)) {
|
|
|
+ status = 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
|