diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2010-06-08 10:49:08 +0200 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2010-06-12 06:44:37 +0200 |
commit | fd247447c1d94a79d5cfc647430784306b3a8323 (patch) | |
tree | d3a58bb5e50068f4d9245f0788e7f14ff56ac711 /include/acpi | |
parent | ACPI / ACPICA: Use helper function for computing GPE masks (diff) | |
download | linux-fd247447c1d94a79d5cfc647430784306b3a8323.tar.xz linux-fd247447c1d94a79d5cfc647430784306b3a8323.zip |
ACPI / ACPICA: Fix low-level GPE manipulation code
ACPICA uses acpi_ev_enable_gpe() for enabling GPEs at the low level,
which is incorrect, because this function only enables the GPE if the
corresponding bit in its enable register's enable_for_run mask is set.
This causes acpi_set_gpe() to work incorrectly if used for enabling
GPEs that were not previously enabled with acpi_enable_gpe(). As a
result, among other things, wakeup-only GPEs are never enabled by
acpi_enable_wakeup_device(), so the devices that use them are unable
to wake up the system.
To fix this issue remove acpi_ev_enable_gpe() and its counterpart
acpi_ev_disable_gpe() and replace acpi_hw_low_disable_gpe() with
acpi_hw_low_set_gpe() that will be used instead to manipulate GPE
enable bits at the low level. Make the users of acpi_ev_enable_gpe()
and acpi_ev_disable_gpe() call acpi_hw_low_set_gpe() instead and
make sure that GPE enable masks are only updated by acpi_enable_gpe()
and acpi_disable_gpe() when GPE reference counters change from 0
to 1 and from 1 to 0, respectively.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'include/acpi')
-rw-r--r-- | include/acpi/actypes.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index de5e99a99530..6881f5b7b7be 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h @@ -663,7 +663,7 @@ typedef u32 acpi_event_status; #define ACPI_GPE_MAX 0xFF #define ACPI_NUM_GPE 256 -/* Actions for acpi_set_gpe */ +/* Actions for acpi_set_gpe and acpi_hw_low_set_gpe */ #define ACPI_GPE_ENABLE 0 #define ACPI_GPE_DISABLE 1 |