ACPI / ACPICA: Fix low-level GPE manipulation code
authorRafael J. Wysocki <rjw@sisk.pl>
Tue, 8 Jun 2010 08:49:08 +0000 (10:49 +0200)
committerLen Brown <len.brown@intel.com>
Sat, 12 Jun 2010 04:44:37 +0000 (00:44 -0400)
commitfd247447c1d94a79d5cfc647430784306b3a8323
treed3a58bb5e50068f4d9245f0788e7f14ff56ac711
parente4e9a735991c80fb0fc1bd4a13a93681c3c17ce0
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>
drivers/acpi/acpica/acevents.h
drivers/acpi/acpica/achware.h
drivers/acpi/acpica/evgpe.c
drivers/acpi/acpica/evxfevnt.c
drivers/acpi/acpica/hwgpe.c
include/acpi/actypes.h