diff options
Diffstat (limited to 'drivers/rtc/rtc-cmos.c')
-rw-r--r-- | drivers/rtc/rtc-cmos.c | 14 |
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; | |||
472 | static irqreturn_t cmos_interrupt(int irq, void *p) | 472 | static 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)) { |