aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-jz4740.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rtc/rtc-jz4740.c')
-rw-r--r--drivers/rtc/rtc-jz4740.c52
1 files changed, 40 insertions, 12 deletions
diff --git a/drivers/rtc/rtc-jz4740.c b/drivers/rtc/rtc-jz4740.c
index 2619d57b91d7..b6473631d182 100644
--- a/drivers/rtc/rtc-jz4740.c
+++ b/drivers/rtc/rtc-jz4740.c
@@ -1,5 +1,6 @@
1/* 1/*
2 * Copyright (C) 2009-2010, Lars-Peter Clausen <lars@metafoo.de> 2 * Copyright (C) 2009-2010, Lars-Peter Clausen <lars@metafoo.de>
3 * Copyright (C) 2010, Paul Cercueil <paul@crapouillou.net>
3 * JZ4740 SoC RTC driver 4 * JZ4740 SoC RTC driver
4 * 5 *
5 * This program is free software; you can redistribute it and/or modify it 6 * This program is free software; you can redistribute it and/or modify it
@@ -161,17 +162,12 @@ static int jz4740_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
161 162
162 ret = jz4740_rtc_reg_write(rtc, JZ_REG_RTC_SEC_ALARM, secs); 163 ret = jz4740_rtc_reg_write(rtc, JZ_REG_RTC_SEC_ALARM, secs);
163 if (!ret) 164 if (!ret)
164 ret = jz4740_rtc_ctrl_set_bits(rtc, JZ_RTC_CTRL_AE, alrm->enabled); 165 ret = jz4740_rtc_ctrl_set_bits(rtc,
166 JZ_RTC_CTRL_AE | JZ_RTC_CTRL_AF_IRQ, alrm->enabled);
165 167
166 return ret; 168 return ret;
167} 169}
168 170
169static int jz4740_rtc_update_irq_enable(struct device *dev, unsigned int enable)
170{
171 struct jz4740_rtc *rtc = dev_get_drvdata(dev);
172 return jz4740_rtc_ctrl_set_bits(rtc, JZ_RTC_CTRL_1HZ_IRQ, enable);
173}
174
175static int jz4740_rtc_alarm_irq_enable(struct device *dev, unsigned int enable) 171static int jz4740_rtc_alarm_irq_enable(struct device *dev, unsigned int enable)
176{ 172{
177 struct jz4740_rtc *rtc = dev_get_drvdata(dev); 173 struct jz4740_rtc *rtc = dev_get_drvdata(dev);
@@ -183,7 +179,6 @@ static struct rtc_class_ops jz4740_rtc_ops = {
183 .set_mmss = jz4740_rtc_set_mmss, 179 .set_mmss = jz4740_rtc_set_mmss,
184 .read_alarm = jz4740_rtc_read_alarm, 180 .read_alarm = jz4740_rtc_read_alarm,
185 .set_alarm = jz4740_rtc_set_alarm, 181 .set_alarm = jz4740_rtc_set_alarm,
186 .update_irq_enable = jz4740_rtc_update_irq_enable,
187 .alarm_irq_enable = jz4740_rtc_alarm_irq_enable, 182 .alarm_irq_enable = jz4740_rtc_alarm_irq_enable,
188}; 183};
189 184
@@ -258,6 +253,8 @@ static int __devinit jz4740_rtc_probe(struct platform_device *pdev)
258 253
259 platform_set_drvdata(pdev, rtc); 254 platform_set_drvdata(pdev, rtc);
260 255
256 device_init_wakeup(&pdev->dev, 1);
257
261 rtc->rtc = rtc_device_register(pdev->name, &pdev->dev, &jz4740_rtc_ops, 258 rtc->rtc = rtc_device_register(pdev->name, &pdev->dev, &jz4740_rtc_ops,
262 THIS_MODULE); 259 THIS_MODULE);
263 if (IS_ERR(rtc->rtc)) { 260 if (IS_ERR(rtc->rtc)) {
@@ -318,12 +315,43 @@ static int __devexit jz4740_rtc_remove(struct platform_device *pdev)
318 return 0; 315 return 0;
319} 316}
320 317
318
319#ifdef CONFIG_PM
320static int jz4740_rtc_suspend(struct device *dev)
321{
322 struct jz4740_rtc *rtc = dev_get_drvdata(dev);
323
324 if (device_may_wakeup(dev))
325 enable_irq_wake(rtc->irq);
326 return 0;
327}
328
329static int jz4740_rtc_resume(struct device *dev)
330{
331 struct jz4740_rtc *rtc = dev_get_drvdata(dev);
332
333 if (device_may_wakeup(dev))
334 disable_irq_wake(rtc->irq);
335 return 0;
336}
337
338static const struct dev_pm_ops jz4740_pm_ops = {
339 .suspend = jz4740_rtc_suspend,
340 .resume = jz4740_rtc_resume,
341};
342#define JZ4740_RTC_PM_OPS (&jz4740_pm_ops)
343
344#else
345#define JZ4740_RTC_PM_OPS NULL
346#endif /* CONFIG_PM */
347
321struct platform_driver jz4740_rtc_driver = { 348struct platform_driver jz4740_rtc_driver = {
322 .probe = jz4740_rtc_probe, 349 .probe = jz4740_rtc_probe,
323 .remove = __devexit_p(jz4740_rtc_remove), 350 .remove = __devexit_p(jz4740_rtc_remove),
324 .driver = { 351 .driver = {
325 .name = "jz4740-rtc", 352 .name = "jz4740-rtc",
326 .owner = THIS_MODULE, 353 .owner = THIS_MODULE,
354 .pm = JZ4740_RTC_PM_OPS,
327 }, 355 },
328}; 356};
329 357