diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2011-02-08 17:41:13 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rjw@sisk.pl> | 2011-02-24 13:58:53 -0500 |
commit | c19f9a84ec807da57fd75bbd9a3f2b8269611f79 (patch) | |
tree | 5c497337c44ed1ae8fbb16439ebe1a19e9991024 /drivers/acpi/button.c | |
parent | 5190726765b40774c069e187a958e10ccd970e65 (diff) |
ACPI / Button: Avoid disabling wakeup unnecessarily on remove
If a button device had already been enabled to wake up the system
from sleep states before the button driver saw it, the driver
shouldn't disable the device's wakeup capability when being detached
from the device.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Diffstat (limited to 'drivers/acpi/button.c')
-rw-r--r-- | drivers/acpi/button.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c index e643a0936dc4..12c28f4adb67 100644 --- a/drivers/acpi/button.c +++ b/drivers/acpi/button.c | |||
@@ -98,6 +98,7 @@ struct acpi_button { | |||
98 | struct input_dev *input; | 98 | struct input_dev *input; |
99 | char phys[32]; /* for input device */ | 99 | char phys[32]; /* for input device */ |
100 | unsigned long pushed; | 100 | unsigned long pushed; |
101 | bool wakeup_enabled; | ||
101 | }; | 102 | }; |
102 | 103 | ||
103 | static const struct file_operations acpi_button_info_fops = { | 104 | static const struct file_operations acpi_button_info_fops = { |
@@ -430,7 +431,10 @@ static int acpi_button_add(struct acpi_device *device) | |||
430 | /* Button's GPE is run-wake GPE */ | 431 | /* Button's GPE is run-wake GPE */ |
431 | acpi_enable_gpe(device->wakeup.gpe_device, | 432 | acpi_enable_gpe(device->wakeup.gpe_device, |
432 | device->wakeup.gpe_number); | 433 | device->wakeup.gpe_number); |
433 | device_set_wakeup_enable(&device->dev, true); | 434 | if (!device_may_wakeup(&device->dev)) { |
435 | device_set_wakeup_enable(&device->dev, true); | ||
436 | button->wakeup_enabled = true; | ||
437 | } | ||
434 | } | 438 | } |
435 | 439 | ||
436 | printk(KERN_INFO PREFIX "%s [%s]\n", name, acpi_device_bid(device)); | 440 | printk(KERN_INFO PREFIX "%s [%s]\n", name, acpi_device_bid(device)); |
@@ -452,7 +456,8 @@ static int acpi_button_remove(struct acpi_device *device, int type) | |||
452 | if (device->wakeup.flags.valid) { | 456 | if (device->wakeup.flags.valid) { |
453 | acpi_disable_gpe(device->wakeup.gpe_device, | 457 | acpi_disable_gpe(device->wakeup.gpe_device, |
454 | device->wakeup.gpe_number); | 458 | device->wakeup.gpe_number); |
455 | device_set_wakeup_enable(&device->dev, false); | 459 | if (button->wakeup_enabled) |
460 | device_set_wakeup_enable(&device->dev, false); | ||
456 | } | 461 | } |
457 | 462 | ||
458 | acpi_button_remove_fs(device); | 463 | acpi_button_remove_fs(device); |