📄 hwgpe.c
字号:
if (ACPI_FAILURE (status)) { goto unlock_and_exit; } if (bit_mask & in_byte) { local_event_status |= ACPI_EVENT_FLAG_ENABLED; } /* GPE Enabled for wake? */ if (bit_mask & gpe_register_info->wake_enable) { local_event_status |= ACPI_EVENT_FLAG_WAKE_ENABLED; } /* GPE active (set)? */ status = acpi_hw_low_level_read (8, &in_byte, &gpe_register_info->status_address); if (ACPI_FAILURE (status)) { goto unlock_and_exit; } if (bit_mask & in_byte) { local_event_status |= ACPI_EVENT_FLAG_SET; } /* Set return value */ (*event_status) = local_event_status;unlock_and_exit: return (status);}/****************************************************************************** * * FUNCTION: acpi_hw_disable_gpe_block * * PARAMETERS: gpe_xrupt_info - GPE Interrupt info * gpe_block - Gpe Block info * * RETURN: Status * * DESCRIPTION: Disable all GPEs within a GPE block * ******************************************************************************/acpi_statusacpi_hw_disable_gpe_block ( struct acpi_gpe_xrupt_info *gpe_xrupt_info, struct acpi_gpe_block_info *gpe_block){ u32 i; acpi_status status; /* Examine each GPE Register within the block */ for (i = 0; i < gpe_block->register_count; i++) { /* Disable all GPEs in this register */ status = acpi_hw_low_level_write (8, 0x00, &gpe_block->register_info[i].enable_address); if (ACPI_FAILURE (status)) { return (status); } } return (AE_OK);}/****************************************************************************** * * FUNCTION: acpi_hw_clear_gpe_block * * PARAMETERS: gpe_xrupt_info - GPE Interrupt info * gpe_block - Gpe Block info * * RETURN: Status * * DESCRIPTION: Clear status bits for all GPEs within a GPE block * ******************************************************************************/acpi_statusacpi_hw_clear_gpe_block ( struct acpi_gpe_xrupt_info *gpe_xrupt_info, struct acpi_gpe_block_info *gpe_block){ u32 i; acpi_status status; /* Examine each GPE Register within the block */ for (i = 0; i < gpe_block->register_count; i++) { /* Clear status on all GPEs in this register */ status = acpi_hw_low_level_write (8, 0xFF, &gpe_block->register_info[i].status_address); if (ACPI_FAILURE (status)) { return (status); } } return (AE_OK);}/****************************************************************************** * * FUNCTION: acpi_hw_prepare_gpe_block_for_sleep * * PARAMETERS: gpe_xrupt_info - GPE Interrupt info * gpe_block - Gpe Block info * * RETURN: Status * * DESCRIPTION: Disable all runtime GPEs and enable all wakeup GPEs -- within * a single GPE block * ******************************************************************************/static acpi_statusacpi_hw_prepare_gpe_block_for_sleep ( struct acpi_gpe_xrupt_info *gpe_xrupt_info, struct acpi_gpe_block_info *gpe_block){ u32 i; struct acpi_gpe_register_info *gpe_register_info; u32 in_value; acpi_status status; /* Get the register info for the entire GPE block */ gpe_register_info = gpe_block->register_info; /* Examine each GPE Register within the block */ for (i = 0; i < gpe_block->register_count; i++) { /* * Read the enabled/disabled status of all GPEs. We * will be using it to restore all the GPEs later. * * NOTE: Wake GPEs are are ALL disabled at this time, so when we wake * and restore this register, they will be automatically disabled. */ status = acpi_hw_low_level_read (8, &in_value, &gpe_register_info->enable_address); if (ACPI_FAILURE (status)) { return (status); } gpe_register_info->enable = (u8) in_value; /* * 1) Disable all runtime GPEs * 2) Enable all wakeup GPEs */ status = acpi_hw_low_level_write (8, gpe_register_info->wake_enable, &gpe_register_info->enable_address); if (ACPI_FAILURE (status)) { return (status); } /* Point to next GPE register */ gpe_register_info++; } return (AE_OK);}/****************************************************************************** * * FUNCTION: acpi_hw_prepare_gpes_for_sleep * * PARAMETERS: None * * RETURN: Status * * DESCRIPTION: Disable all runtime GPEs, enable all wake GPEs. * Called with interrupts disabled. The interrupt handler also * modifies gpe_register_info->Enable, so it should not be * given the chance to run until after the runtime GPEs are * re-enabled. * ******************************************************************************/acpi_statusacpi_hw_prepare_gpes_for_sleep ( void){ acpi_status status; ACPI_FUNCTION_ENTRY (); status = acpi_ev_walk_gpe_list (acpi_hw_prepare_gpe_block_for_sleep); return (status);}/****************************************************************************** * * FUNCTION: acpi_hw_restore_gpe_block_on_wake * * PARAMETERS: gpe_xrupt_info - GPE Interrupt info * gpe_block - Gpe Block info * * RETURN: Status * * DESCRIPTION: Enable all runtime GPEs and disable all wake GPEs -- in one * GPE block * ******************************************************************************/static acpi_statusacpi_hw_restore_gpe_block_on_wake ( struct acpi_gpe_xrupt_info *gpe_xrupt_info, struct acpi_gpe_block_info *gpe_block){ u32 i; struct acpi_gpe_register_info *gpe_register_info; acpi_status status; /* This callback processes one entire GPE block */ /* Get the register info for the entire GPE block */ gpe_register_info = gpe_block->register_info; /* Examine each GPE register within the block */ for (i = 0; i < gpe_block->register_count; i++) { /* Clear the entire status register */ status = acpi_hw_low_level_write (8, 0xFF, &gpe_block->register_info[i].status_address); if (ACPI_FAILURE (status)) { return (status); } /* * Restore the GPE Enable register, which will do the following: * * 1) Disable all wakeup GPEs * 2) Enable all runtime GPEs * * (On sleep, we saved the enabled status of all GPEs) */ status = acpi_hw_low_level_write (8, gpe_register_info->enable, &gpe_register_info->enable_address); if (ACPI_FAILURE (status)) { return (status); } /* Point to next GPE register */ gpe_register_info++; } return (AE_OK);}/****************************************************************************** * * FUNCTION: acpi_hw_restore_gpes_on_wake * * PARAMETERS: None * * RETURN: Status * * DESCRIPTION: Enable all runtime GPEs and disable all wake GPEs -- in all * GPE blocks * ******************************************************************************/acpi_statusacpi_hw_restore_gpes_on_wake ( void){ acpi_status status; ACPI_FUNCTION_ENTRY (); status = acpi_ev_walk_gpe_list (acpi_hw_restore_gpe_block_on_wake); return (status);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -