aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-cmos.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rtc/rtc-cmos.c')
-rw-r--r--drivers/rtc/rtc-cmos.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
index ab455ddb16cf..ff7539a4dbea 100644
--- a/drivers/rtc/rtc-cmos.c
+++ b/drivers/rtc/rtc-cmos.c
@@ -472,10 +472,22 @@ static struct cmos_rtc cmos_rtc;
472static irqreturn_t cmos_interrupt(int irq, void *p) 472static irqreturn_t cmos_interrupt(int irq, void *p)
473{ 473{
474 u8 irqstat; 474 u8 irqstat;
475 u8 rtc_control;
475 476
476 spin_lock(&rtc_lock); 477 spin_lock(&rtc_lock);
477 irqstat = CMOS_READ(RTC_INTR_FLAGS); 478 irqstat = CMOS_READ(RTC_INTR_FLAGS);
478 irqstat &= (CMOS_READ(RTC_CONTROL) & RTC_IRQMASK) | RTC_IRQF; 479 rtc_control = CMOS_READ(RTC_CONTROL);
480 irqstat &= (rtc_control & RTC_IRQMASK) | RTC_IRQF;
481
482 /* All Linux RTC alarms should be treated as if they were oneshot.
483 * Similar code may be needed in system wakeup paths, in case the
484 * alarm woke the system.
485 */
486 if (irqstat & RTC_AIE) {
487 rtc_control &= ~RTC_AIE;
488 CMOS_WRITE(rtc_control, RTC_CONTROL);
489 CMOS_READ(RTC_INTR_FLAGS);
490 }
479 spin_unlock(&rtc_lock); 491 spin_unlock(&rtc_lock);
480 492
481 if (is_intr(irqstat)) { 493 if (is_intr(irqstat)) {