acpi_status acpi_ev_enable_gpe ( struct acpi_gpe_event_info *gpe_event_info, u8 write_to_hardware) { acpi_status status; ACPI_FUNCTION_TRACE ("ev_enable_gpe"); /* Make sure HW enable masks are updated */ status = acpi_ev_update_gpe_enable_masks (gpe_event_info, ACPI_GPE_ENABLE); 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; default: return_ACPI_STATUS (AE_BAD_PARAMETER); } return_ACPI_STATUS (AE_OK); }
acpi_status acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 write_to_hardware) { acpi_status status; ACPI_FUNCTION_TRACE(ev_enable_gpe); status = acpi_ev_update_gpe_enable_masks(gpe_event_info, ACPI_GPE_ENABLE); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } 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); case ACPI_GPE_TYPE_RUNTIME: ACPI_SET_BIT(gpe_event_info->flags, ACPI_GPE_RUN_ENABLED); if (write_to_hardware) { status = acpi_hw_clear_gpe(gpe_event_info); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } status = acpi_hw_write_gpe_enable_reg(gpe_event_info); } break; default: return_ACPI_STATUS(AE_BAD_PARAMETER); } return_ACPI_STATUS(AE_OK); }
acpi_status acpi_ev_disable_gpe ( struct acpi_gpe_event_info *gpe_event_info) { acpi_status status; ACPI_FUNCTION_TRACE ("ev_disable_gpe"); if (!(gpe_event_info->flags & ACPI_GPE_ENABLE_MASK)) { return_ACPI_STATUS (AE_OK); } /* Make sure HW enable masks are updated */ status = acpi_ev_update_gpe_enable_masks (gpe_event_info, ACPI_GPE_DISABLE); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } /* Mark wake-disabled or HW disable, or both */ 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); /*lint -fallthrough */ case ACPI_GPE_TYPE_RUNTIME: /* Disable the requested runtime GPE */ ACPI_CLEAR_BIT (gpe_event_info->flags, ACPI_GPE_RUN_ENABLED); status = acpi_hw_write_gpe_enable_reg (gpe_event_info); break; default: return_ACPI_STATUS (AE_BAD_PARAMETER); } return_ACPI_STATUS (AE_OK); }
static void acpi_ev_asynch_enable_gpe(void *context) { struct acpi_gpe_event_info *gpe_event_info = context; acpi_status status; if ((gpe_event_info->flags & ACPI_GPE_XRUPT_TYPE_MASK) == ACPI_GPE_LEVEL_TRIGGERED) { status = acpi_hw_clear_gpe(gpe_event_info); if (ACPI_FAILURE(status)) { return_VOID; } } (void)acpi_hw_write_gpe_enable_reg(gpe_event_info); return_VOID; }
static void acpi_ev_asynch_enable_gpe(void *context) { struct acpi_gpe_event_info *gpe_event_info = context; acpi_status status; if ((gpe_event_info->flags & ACPI_GPE_XRUPT_TYPE_MASK) == ACPI_GPE_LEVEL_TRIGGERED) { /* * GPE is level-triggered, we clear the GPE status bit after handling * the event. */ status = acpi_hw_clear_gpe(gpe_event_info); if (ACPI_FAILURE(status)) { return_VOID; } } /* Enable this GPE */ (void)acpi_hw_write_gpe_enable_reg(gpe_event_info); return_VOID; }