diff options
author | Daniel Drake <dsd@laptop.org> | 2011-08-10 21:46:02 +0100 |
---|---|---|
committer | Anton Vorontsov <cbouatmailru@gmail.com> | 2011-08-19 21:03:25 +0400 |
commit | cae659af87288a4b1723cdf94d713ef7fb4c56d9 (patch) | |
tree | ca7f38e6148bc0ac3a5e7f4522b8d8d3718f49d2 /drivers/power/olpc_battery.c | |
parent | c3503fd02558245ebbb0b48f3ae1d62416e3fd2a (diff) |
olpc_battery: Add wakeup support
Battery and AC events can now be used to wake up the system from suspend.
Signed-off-by: Daniel Drake <dsd@laptop.org>
Acked-by: Andres Salomon <dilinger@queued.net>
Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
Diffstat (limited to 'drivers/power/olpc_battery.c')
-rw-r--r-- | drivers/power/olpc_battery.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/power/olpc_battery.c b/drivers/power/olpc_battery.c index 9972268fea72..46a2f07edab1 100644 --- a/drivers/power/olpc_battery.c +++ b/drivers/power/olpc_battery.c @@ -533,6 +533,24 @@ void olpc_battery_trigger_uevent(unsigned long cause) kobject_uevent(&olpc_bat.dev->kobj, KOBJ_CHANGE); } +static int olpc_battery_suspend(struct platform_device *pdev, + pm_message_t state) +{ + if (device_may_wakeup(olpc_ac.dev)) + olpc_ec_wakeup_set(EC_SCI_SRC_ACPWR); + else + olpc_ec_wakeup_clear(EC_SCI_SRC_ACPWR); + + if (device_may_wakeup(olpc_bat.dev)) + olpc_ec_wakeup_set(EC_SCI_SRC_BATTERY | EC_SCI_SRC_BATSOC + | EC_SCI_SRC_BATERR); + else + olpc_ec_wakeup_clear(EC_SCI_SRC_BATTERY | EC_SCI_SRC_BATSOC + | EC_SCI_SRC_BATERR); + + return 0; +} + static int __devinit olpc_battery_probe(struct platform_device *pdev) { int ret; @@ -578,6 +596,11 @@ static int __devinit olpc_battery_probe(struct platform_device *pdev) if (ret) goto error_failed; + if (olpc_ec_wakeup_available()) { + device_set_wakeup_capable(olpc_ac.dev, true); + device_set_wakeup_capable(olpc_bat.dev, true); + } + return 0; error_failed: @@ -612,6 +635,7 @@ static struct platform_driver olpc_battery_drv = { }, .probe = olpc_battery_probe, .remove = __devexit_p(olpc_battery_remove), + .suspend = olpc_battery_suspend, }; static int __init olpc_bat_init(void) |