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)) { |
