diff options
Diffstat (limited to 'drivers/rtc')
| -rw-r--r-- | drivers/rtc/interface.c | 2 | ||||
| -rw-r--r-- | drivers/rtc/rtc-at91sam9.c | 22 | ||||
| -rw-r--r-- | drivers/rtc/rtc-cmos.c | 1 | ||||
| -rw-r--r-- | drivers/rtc/rtc-pcf2123.c | 2 | ||||
| -rw-r--r-- | drivers/rtc/rtc-rs5c348.c | 7 |
5 files changed, 24 insertions, 10 deletions
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index eb415bd76494..9592b936b71b 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c | |||
| @@ -582,6 +582,7 @@ enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer) | |||
| 582 | void rtc_update_irq(struct rtc_device *rtc, | 582 | void rtc_update_irq(struct rtc_device *rtc, |
| 583 | unsigned long num, unsigned long events) | 583 | unsigned long num, unsigned long events) |
| 584 | { | 584 | { |
| 585 | pm_stay_awake(rtc->dev.parent); | ||
| 585 | schedule_work(&rtc->irqwork); | 586 | schedule_work(&rtc->irqwork); |
| 586 | } | 587 | } |
| 587 | EXPORT_SYMBOL_GPL(rtc_update_irq); | 588 | EXPORT_SYMBOL_GPL(rtc_update_irq); |
| @@ -844,6 +845,7 @@ void rtc_timer_do_work(struct work_struct *work) | |||
| 844 | 845 | ||
| 845 | mutex_lock(&rtc->ops_lock); | 846 | mutex_lock(&rtc->ops_lock); |
| 846 | again: | 847 | again: |
| 848 | pm_relax(rtc->dev.parent); | ||
| 847 | __rtc_read_time(rtc, &tm); | 849 | __rtc_read_time(rtc, &tm); |
| 848 | now = rtc_tm_to_ktime(tm); | 850 | now = rtc_tm_to_ktime(tm); |
| 849 | while ((next = timerqueue_getnext(&rtc->timerqueue))) { | 851 | while ((next = timerqueue_getnext(&rtc->timerqueue))) { |
diff --git a/drivers/rtc/rtc-at91sam9.c b/drivers/rtc/rtc-at91sam9.c index 831868904e02..1dd61f402b04 100644 --- a/drivers/rtc/rtc-at91sam9.c +++ b/drivers/rtc/rtc-at91sam9.c | |||
| @@ -58,6 +58,7 @@ struct sam9_rtc { | |||
| 58 | struct rtc_device *rtcdev; | 58 | struct rtc_device *rtcdev; |
| 59 | u32 imr; | 59 | u32 imr; |
| 60 | void __iomem *gpbr; | 60 | void __iomem *gpbr; |
| 61 | int irq; | ||
| 61 | }; | 62 | }; |
| 62 | 63 | ||
| 63 | #define rtt_readl(rtc, field) \ | 64 | #define rtt_readl(rtc, field) \ |
| @@ -292,7 +293,7 @@ static int __devinit at91_rtc_probe(struct platform_device *pdev) | |||
| 292 | { | 293 | { |
| 293 | struct resource *r, *r_gpbr; | 294 | struct resource *r, *r_gpbr; |
| 294 | struct sam9_rtc *rtc; | 295 | struct sam9_rtc *rtc; |
| 295 | int ret; | 296 | int ret, irq; |
| 296 | u32 mr; | 297 | u32 mr; |
| 297 | 298 | ||
| 298 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 299 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| @@ -302,10 +303,18 @@ static int __devinit at91_rtc_probe(struct platform_device *pdev) | |||
| 302 | return -ENODEV; | 303 | return -ENODEV; |
| 303 | } | 304 | } |
| 304 | 305 | ||
| 306 | irq = platform_get_irq(pdev, 0); | ||
| 307 | if (irq < 0) { | ||
| 308 | dev_err(&pdev->dev, "failed to get interrupt resource\n"); | ||
| 309 | return irq; | ||
| 310 | } | ||
| 311 | |||
| 305 | rtc = kzalloc(sizeof *rtc, GFP_KERNEL); | 312 | rtc = kzalloc(sizeof *rtc, GFP_KERNEL); |
| 306 | if (!rtc) | 313 | if (!rtc) |
| 307 | return -ENOMEM; | 314 | return -ENOMEM; |
| 308 | 315 | ||
| 316 | rtc->irq = irq; | ||
| 317 | |||
| 309 | /* platform setup code should have handled this; sigh */ | 318 | /* platform setup code should have handled this; sigh */ |
| 310 | if (!device_can_wakeup(&pdev->dev)) | 319 | if (!device_can_wakeup(&pdev->dev)) |
| 311 | device_init_wakeup(&pdev->dev, 1); | 320 | device_init_wakeup(&pdev->dev, 1); |
| @@ -345,11 +354,10 @@ static int __devinit at91_rtc_probe(struct platform_device *pdev) | |||
| 345 | } | 354 | } |
| 346 | 355 | ||
| 347 | /* register irq handler after we know what name we'll use */ | 356 | /* register irq handler after we know what name we'll use */ |
| 348 | ret = request_irq(AT91_ID_SYS, at91_rtc_interrupt, | 357 | ret = request_irq(rtc->irq, at91_rtc_interrupt, IRQF_SHARED, |
| 349 | IRQF_SHARED, | ||
| 350 | dev_name(&rtc->rtcdev->dev), rtc); | 358 | dev_name(&rtc->rtcdev->dev), rtc); |
| 351 | if (ret) { | 359 | if (ret) { |
| 352 | dev_dbg(&pdev->dev, "can't share IRQ %d?\n", AT91_ID_SYS); | 360 | dev_dbg(&pdev->dev, "can't share IRQ %d?\n", rtc->irq); |
| 353 | rtc_device_unregister(rtc->rtcdev); | 361 | rtc_device_unregister(rtc->rtcdev); |
| 354 | goto fail_register; | 362 | goto fail_register; |
| 355 | } | 363 | } |
| @@ -386,7 +394,7 @@ static int __devexit at91_rtc_remove(struct platform_device *pdev) | |||
| 386 | 394 | ||
| 387 | /* disable all interrupts */ | 395 | /* disable all interrupts */ |
| 388 | rtt_writel(rtc, MR, mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN)); | 396 | rtt_writel(rtc, MR, mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN)); |
| 389 | free_irq(AT91_ID_SYS, rtc); | 397 | free_irq(rtc->irq, rtc); |
| 390 | 398 | ||
| 391 | rtc_device_unregister(rtc->rtcdev); | 399 | rtc_device_unregister(rtc->rtcdev); |
| 392 | 400 | ||
| @@ -423,7 +431,7 @@ static int at91_rtc_suspend(struct platform_device *pdev, | |||
| 423 | rtc->imr = mr & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN); | 431 | rtc->imr = mr & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN); |
| 424 | if (rtc->imr) { | 432 | if (rtc->imr) { |
| 425 | if (device_may_wakeup(&pdev->dev) && (mr & AT91_RTT_ALMIEN)) { | 433 | if (device_may_wakeup(&pdev->dev) && (mr & AT91_RTT_ALMIEN)) { |
| 426 | enable_irq_wake(AT91_ID_SYS); | 434 | enable_irq_wake(rtc->irq); |
| 427 | /* don't let RTTINC cause wakeups */ | 435 | /* don't let RTTINC cause wakeups */ |
| 428 | if (mr & AT91_RTT_RTTINCIEN) | 436 | if (mr & AT91_RTT_RTTINCIEN) |
| 429 | rtt_writel(rtc, MR, mr & ~AT91_RTT_RTTINCIEN); | 437 | rtt_writel(rtc, MR, mr & ~AT91_RTT_RTTINCIEN); |
| @@ -441,7 +449,7 @@ static int at91_rtc_resume(struct platform_device *pdev) | |||
| 441 | 449 | ||
| 442 | if (rtc->imr) { | 450 | if (rtc->imr) { |
| 443 | if (device_may_wakeup(&pdev->dev)) | 451 | if (device_may_wakeup(&pdev->dev)) |
| 444 | disable_irq_wake(AT91_ID_SYS); | 452 | disable_irq_wake(rtc->irq); |
| 445 | mr = rtt_readl(rtc, MR); | 453 | mr = rtt_readl(rtc, MR); |
| 446 | rtt_writel(rtc, MR, mr | rtc->imr); | 454 | rtt_writel(rtc, MR, mr | rtc->imr); |
| 447 | } | 455 | } |
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index 132333d75408..4267789ca995 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
| @@ -568,7 +568,6 @@ static irqreturn_t cmos_interrupt(int irq, void *p) | |||
| 568 | hpet_mask_rtc_irq_bit(RTC_AIE); | 568 | hpet_mask_rtc_irq_bit(RTC_AIE); |
| 569 | 569 | ||
| 570 | CMOS_READ(RTC_INTR_FLAGS); | 570 | CMOS_READ(RTC_INTR_FLAGS); |
| 571 | pm_wakeup_event(cmos_rtc.dev, 0); | ||
| 572 | } | 571 | } |
| 573 | spin_unlock(&rtc_lock); | 572 | spin_unlock(&rtc_lock); |
| 574 | 573 | ||
diff --git a/drivers/rtc/rtc-pcf2123.c b/drivers/rtc/rtc-pcf2123.c index 836118795c0b..13e4df63974f 100644 --- a/drivers/rtc/rtc-pcf2123.c +++ b/drivers/rtc/rtc-pcf2123.c | |||
| @@ -43,6 +43,7 @@ | |||
| 43 | #include <linux/rtc.h> | 43 | #include <linux/rtc.h> |
| 44 | #include <linux/spi/spi.h> | 44 | #include <linux/spi/spi.h> |
| 45 | #include <linux/module.h> | 45 | #include <linux/module.h> |
| 46 | #include <linux/sysfs.h> | ||
| 46 | 47 | ||
| 47 | #define DRV_VERSION "0.6" | 48 | #define DRV_VERSION "0.6" |
| 48 | 49 | ||
| @@ -292,6 +293,7 @@ static int __devinit pcf2123_probe(struct spi_device *spi) | |||
| 292 | pdata->rtc = rtc; | 293 | pdata->rtc = rtc; |
| 293 | 294 | ||
| 294 | for (i = 0; i < 16; i++) { | 295 | for (i = 0; i < 16; i++) { |
| 296 | sysfs_attr_init(&pdata->regs[i].attr.attr); | ||
| 295 | sprintf(pdata->regs[i].name, "%1x", i); | 297 | sprintf(pdata->regs[i].name, "%1x", i); |
| 296 | pdata->regs[i].attr.attr.mode = S_IRUGO | S_IWUSR; | 298 | pdata->regs[i].attr.attr.mode = S_IRUGO | S_IWUSR; |
| 297 | pdata->regs[i].attr.attr.name = pdata->regs[i].name; | 299 | pdata->regs[i].attr.attr.name = pdata->regs[i].name; |
diff --git a/drivers/rtc/rtc-rs5c348.c b/drivers/rtc/rtc-rs5c348.c index 77074ccd2850..fd5c7af04ae5 100644 --- a/drivers/rtc/rtc-rs5c348.c +++ b/drivers/rtc/rtc-rs5c348.c | |||
| @@ -122,9 +122,12 @@ rs5c348_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 122 | tm->tm_min = bcd2bin(rxbuf[RS5C348_REG_MINS] & RS5C348_MINS_MASK); | 122 | tm->tm_min = bcd2bin(rxbuf[RS5C348_REG_MINS] & RS5C348_MINS_MASK); |
| 123 | tm->tm_hour = bcd2bin(rxbuf[RS5C348_REG_HOURS] & RS5C348_HOURS_MASK); | 123 | tm->tm_hour = bcd2bin(rxbuf[RS5C348_REG_HOURS] & RS5C348_HOURS_MASK); |
| 124 | if (!pdata->rtc_24h) { | 124 | if (!pdata->rtc_24h) { |
| 125 | tm->tm_hour %= 12; | 125 | if (rxbuf[RS5C348_REG_HOURS] & RS5C348_BIT_PM) { |
| 126 | if (rxbuf[RS5C348_REG_HOURS] & RS5C348_BIT_PM) | 126 | tm->tm_hour -= 20; |
| 127 | tm->tm_hour %= 12; | ||
| 127 | tm->tm_hour += 12; | 128 | tm->tm_hour += 12; |
| 129 | } else | ||
| 130 | tm->tm_hour %= 12; | ||
| 128 | } | 131 | } |
| 129 | tm->tm_wday = bcd2bin(rxbuf[RS5C348_REG_WDAY] & RS5C348_WDAY_MASK); | 132 | tm->tm_wday = bcd2bin(rxbuf[RS5C348_REG_WDAY] & RS5C348_WDAY_MASK); |
| 130 | tm->tm_mday = bcd2bin(rxbuf[RS5C348_REG_DAY] & RS5C348_DAY_MASK); | 133 | tm->tm_mday = bcd2bin(rxbuf[RS5C348_REG_DAY] & RS5C348_DAY_MASK); |
