CHROMIUM: mfd: s5m: Enable RTC as wakeup source in suspend.
authorTodd Broch <tbroch@chromium.org>
Wed, 15 May 2013 18:14:15 +0000 (11:14 -0700)
committerChromeBot <chrome-bot@google.com>
Wed, 15 May 2013 21:41:48 +0000 (14:41 -0700)
CL adds necessary power management functions to enable PMICs RTC wake
alarm as a wake source.

Signed-off-by: Todd Broch <tbroch@chromium.org>
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 <tbroch@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Commit-Queue: Todd Broch <tbroch@chromium.org>

drivers/mfd/s5m-core.c

index 912216d..4b031e1 100644 (file)
@@ -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,