aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/button.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2010-02-17 17:41:07 -0500
committerJesse Barnes <jbarnes@virtuousgeek.org>2010-02-22 19:20:45 -0500
commit9630bdd9b15d2f489c646d8bc04b60e53eb5ec78 (patch)
treeed99f729cb9142492e0cdf2f7d19f2f33069a3f4 /drivers/acpi/button.c
parentc39fae1416d59fd565606793f090cebe3720d50d (diff)
ACPI: Use GPE reference counting to support shared GPEs
ACPI GPEs may map to multiple devices. The current GPE interface only provides a mechanism for enabling and disabling GPEs, making it difficult to change the state of GPEs at runtime without extensive cooperation between devices. Add an API to allow devices to indicate whether or not they want their device's GPE to be enabled for both runtime and wakeup events. Remove the old GPE type handling entirely, which gets rid of various quirks, like the implicit disabling with GPE type setting. This requires a small amount of rework in order to ensure that non-wake GPEs are enabled by default to preserve existing behaviour. Based on patches from Matthew Garrett <mjg@redhat.com>. Signed-off-by: Matthew Garrett <mjg@redhat.com> Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'drivers/acpi/button.c')
-rw-r--r--drivers/acpi/button.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c
index 8a95e8329df7..09ca3ce7a051 100644
--- a/drivers/acpi/button.c
+++ b/drivers/acpi/button.c
@@ -422,11 +422,9 @@ static int acpi_button_add(struct acpi_device *device)
422 422
423 if (device->wakeup.flags.valid) { 423 if (device->wakeup.flags.valid) {
424 /* Button's GPE is run-wake GPE */ 424 /* Button's GPE is run-wake GPE */
425 acpi_set_gpe_type(device->wakeup.gpe_device,
426 device->wakeup.gpe_number,
427 ACPI_GPE_TYPE_WAKE_RUN);
428 acpi_enable_gpe(device->wakeup.gpe_device, 425 acpi_enable_gpe(device->wakeup.gpe_device,
429 device->wakeup.gpe_number); 426 device->wakeup.gpe_number,
427 ACPI_GPE_TYPE_WAKE_RUN);
430 device->wakeup.state.enabled = 1; 428 device->wakeup.state.enabled = 1;
431 } 429 }
432 430
@@ -446,6 +444,13 @@ static int acpi_button_remove(struct acpi_device *device, int type)
446{ 444{
447 struct acpi_button *button = acpi_driver_data(device); 445 struct acpi_button *button = acpi_driver_data(device);
448 446
447 if (device->wakeup.flags.valid) {
448 acpi_disable_gpe(device->wakeup.gpe_device,
449 device->wakeup.gpe_number,
450 ACPI_GPE_TYPE_WAKE_RUN);
451 device->wakeup.state.enabled = 0;
452 }
453
449 acpi_button_remove_fs(device); 454 acpi_button_remove_fs(device);
450 input_unregister_device(button->input); 455 input_unregister_device(button->input);
451 kfree(button); 456 kfree(button);