Messages in this thread Patch in this message | | | From | Daniel Drake <> | Subject | [PATCH 2/2] olpc_battery: add wakeup support | Date | Wed, 27 Jul 2011 19:24:26 +0100 (BST) |
| |
Battery and AC events can now be used to wake up the system from suspend.
Signed-off-by: Daniel Drake <dsd@laptop.org> --- drivers/power/olpc_battery.c | 24 ++++++++++++++++++++++++ 1 files changed, 24 insertions(+), 0 deletions(-)
Depends on power management patches that were merged into linus master yesterday.
diff --git a/drivers/power/olpc_battery.c b/drivers/power/olpc_battery.c index 9972268..46a2f07 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) -- 1.7.6
| |