diff options
Diffstat (limited to 'drivers/rtc/rtc-at32ap700x.c')
| -rw-r--r-- | drivers/rtc/rtc-at32ap700x.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/rtc/rtc-at32ap700x.c b/drivers/rtc/rtc-at32ap700x.c index 42244f14b41c..90b9a6503e15 100644 --- a/drivers/rtc/rtc-at32ap700x.c +++ b/drivers/rtc/rtc-at32ap700x.c | |||
| @@ -94,8 +94,11 @@ static int at32_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 94 | { | 94 | { |
| 95 | struct rtc_at32ap700x *rtc = dev_get_drvdata(dev); | 95 | struct rtc_at32ap700x *rtc = dev_get_drvdata(dev); |
| 96 | 96 | ||
| 97 | spin_lock_irq(&rtc->lock); | ||
| 97 | rtc_time_to_tm(rtc->alarm_time, &alrm->time); | 98 | rtc_time_to_tm(rtc->alarm_time, &alrm->time); |
| 98 | alrm->pending = rtc_readl(rtc, IMR) & RTC_BIT(IMR_TOPI) ? 1 : 0; | 99 | alrm->enabled = rtc_readl(rtc, IMR) & RTC_BIT(IMR_TOPI) ? 1 : 0; |
| 100 | alrm->pending = rtc_readl(rtc, ISR) & RTC_BIT(ISR_TOPI) ? 1 : 0; | ||
| 101 | spin_unlock_irq(&rtc->lock); | ||
| 99 | 102 | ||
| 100 | return 0; | 103 | return 0; |
| 101 | } | 104 | } |
| @@ -119,7 +122,7 @@ static int at32_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 119 | spin_lock_irq(&rtc->lock); | 122 | spin_lock_irq(&rtc->lock); |
| 120 | rtc->alarm_time = alarm_unix_time; | 123 | rtc->alarm_time = alarm_unix_time; |
| 121 | rtc_writel(rtc, TOP, rtc->alarm_time); | 124 | rtc_writel(rtc, TOP, rtc->alarm_time); |
| 122 | if (alrm->pending) | 125 | if (alrm->enabled) |
| 123 | rtc_writel(rtc, CTRL, rtc_readl(rtc, CTRL) | 126 | rtc_writel(rtc, CTRL, rtc_readl(rtc, CTRL) |
| 124 | | RTC_BIT(CTRL_TOPEN)); | 127 | | RTC_BIT(CTRL_TOPEN)); |
| 125 | else | 128 | else |
| @@ -262,6 +265,7 @@ static int __init at32_rtc_probe(struct platform_device *pdev) | |||
| 262 | } | 265 | } |
| 263 | 266 | ||
| 264 | platform_set_drvdata(pdev, rtc); | 267 | platform_set_drvdata(pdev, rtc); |
| 268 | device_init_wakeup(&pdev->dev, 1); | ||
| 265 | 269 | ||
| 266 | dev_info(&pdev->dev, "Atmel RTC for AT32AP700x at %08lx irq %ld\n", | 270 | dev_info(&pdev->dev, "Atmel RTC for AT32AP700x at %08lx irq %ld\n", |
| 267 | (unsigned long)rtc->regs, rtc->irq); | 271 | (unsigned long)rtc->regs, rtc->irq); |
| @@ -281,6 +285,8 @@ static int __exit at32_rtc_remove(struct platform_device *pdev) | |||
| 281 | { | 285 | { |
| 282 | struct rtc_at32ap700x *rtc = platform_get_drvdata(pdev); | 286 | struct rtc_at32ap700x *rtc = platform_get_drvdata(pdev); |
| 283 | 287 | ||
| 288 | device_init_wakeup(&pdev->dev, 0); | ||
| 289 | |||
| 284 | free_irq(rtc->irq, rtc); | 290 | free_irq(rtc->irq, rtc); |
| 285 | iounmap(rtc->regs); | 291 | iounmap(rtc->regs); |
| 286 | rtc_device_unregister(rtc->rtc); | 292 | rtc_device_unregister(rtc->rtc); |
