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 ab455ddb16c..ff7539a4dbe 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c @@ -472,10 +472,22 @@ static struct cmos_rtc	cmos_rtc;  static irqreturn_t cmos_interrupt(int irq, void *p)  {  	u8		irqstat; +	u8		rtc_control;  	spin_lock(&rtc_lock);  	irqstat = CMOS_READ(RTC_INTR_FLAGS); -	irqstat &= (CMOS_READ(RTC_CONTROL) & RTC_IRQMASK) | RTC_IRQF; +	rtc_control = CMOS_READ(RTC_CONTROL); +	irqstat &= (rtc_control & RTC_IRQMASK) | RTC_IRQF; + +	/* All Linux RTC alarms should be treated as if they were oneshot. +	 * Similar code may be needed in system wakeup paths, in case the +	 * alarm woke the system. +	 */ +	if (irqstat & RTC_AIE) { +		rtc_control &= ~RTC_AIE; +		CMOS_WRITE(rtc_control, RTC_CONTROL); +		CMOS_READ(RTC_INTR_FLAGS); +	}  	spin_unlock(&rtc_lock);  	if (is_intr(irqstat)) {  |