From: Todd Broch Date: Wed, 15 May 2013 18:14:15 +0000 (-0700) Subject: CHROMIUM: mfd: s5m: Enable RTC as wakeup source in suspend. X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Flinux.git;a=commitdiff_plain;h=d5142a9101a35f3344c5cb46e2df2645ba4fb50a CHROMIUM: mfd: s5m: Enable RTC as wakeup source in suspend. CL adds necessary power management functions to enable PMICs RTC wake alarm as a wake source. Signed-off-by: Todd Broch BUG=chrome-os-partner:19427 TEST=manual, rtc=`readlink /dev/rtc` echo "+10s" > /sys/class/rtc/${rtc}/wakealarm echo mem > /sys/power/state Change-Id: I155ccd6f058cdf8ed362a2c128226c5904379432 Reviewed-on: https://gerrit.chromium.org/gerrit/51338 Tested-by: Todd Broch Reviewed-by: Vincent Palatin Commit-Queue: Todd Broch --- diff --git a/drivers/mfd/s5m-core.c b/drivers/mfd/s5m-core.c index 912216dd3c64..4b031e137cde 100644 --- a/drivers/mfd/s5m-core.c +++ b/drivers/mfd/s5m-core.c @@ -237,6 +237,8 @@ static int s5m87xx_i2c_remove(struct i2c_client *i2c) { struct s5m87xx_dev *s5m87xx = i2c_get_clientdata(i2c); + device_init_wakeup(s5m87xx->dev, 0); + pm_runtime_set_suspended(s5m87xx->dev); mfd_remove_devices(s5m87xx->dev); s5m_irq_exit(s5m87xx); regmap_exit(s5m87xx->pmic); @@ -250,10 +252,43 @@ static const struct i2c_device_id s5m87xx_i2c_id[] = { }; MODULE_DEVICE_TABLE(i2c, s5m87xx_i2c_id); +#ifdef CONFIG_PM +static int s5m87xx_suspend(struct device *dev) +{ + struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); + struct s5m87xx_dev *s5m87xx = i2c_get_clientdata(i2c); + + if (device_may_wakeup(dev)) + enable_irq_wake(s5m87xx->irq); + + return 0; +} + +static int s5m87xx_resume(struct device *dev) +{ + struct i2c_client *i2c = container_of(dev, struct i2c_client, dev); + struct s5m87xx_dev *s5m87xx = i2c_get_clientdata(i2c); + + if (device_may_wakeup(dev)) + disable_irq_wake(s5m87xx->irq); + + s5m_irq_resume(s5m87xx); + return 0; +} + +const struct dev_pm_ops s5m87xx_pm = { + .suspend = s5m87xx_suspend, + .resume = s5m87xx_resume, +}; +#endif + static struct i2c_driver s5m87xx_i2c_driver = { .driver = { .name = "s5m87xx", .owner = THIS_MODULE, +#ifdef CONFIG_PM + .pm = &s5m87xx_pm, +#endif .of_match_table = of_match_ptr(s5m87xx_pmic_dt_match), }, .probe = s5m87xx_i2c_probe,