summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2011-02-08 23:41:13 +0100
committerRafael J. Wysocki <rjw@sisk.pl>2011-02-24 19:58:53 +0100
commitc19f9a84ec807da57fd75bbd9a3f2b8269611f79 (patch)
tree5c497337c44ed1ae8fbb16439ebe1a19e9991024
parent5190726765b40774c069e187a958e10ccd970e65 (diff)
downloadlinux-3.10-c19f9a84ec807da57fd75bbd9a3f2b8269611f79.tar.gz
linux-3.10-c19f9a84ec807da57fd75bbd9a3f2b8269611f79.tar.bz2
linux-3.10-c19f9a84ec807da57fd75bbd9a3f2b8269611f79.zip
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>
-rw-r--r--drivers/acpi/button.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c
index e643a0936dc..12c28f4adb6 100644
--- a/drivers/acpi/button.c
+++ b/drivers/acpi/button.c
@@ -98,6 +98,7 @@ struct acpi_button {
struct input_dev *input;
char phys[32]; /* for input device */
unsigned long pushed;
+ bool wakeup_enabled;
};
static const struct file_operations acpi_button_info_fops = {
@@ -430,7 +431,10 @@ static int acpi_button_add(struct acpi_device *device)
/* Button's GPE is run-wake GPE */
acpi_enable_gpe(device->wakeup.gpe_device,
device->wakeup.gpe_number);
- device_set_wakeup_enable(&device->dev, true);
+ if (!device_may_wakeup(&device->dev)) {
+ device_set_wakeup_enable(&device->dev, true);
+ button->wakeup_enabled = true;
+ }
}
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)
if (device->wakeup.flags.valid) {
acpi_disable_gpe(device->wakeup.gpe_device,
device->wakeup.gpe_number);
- device_set_wakeup_enable(&device->dev, false);
+ if (button->wakeup_enabled)
+ device_set_wakeup_enable(&device->dev, false);
}
acpi_button_remove_fs(device);