Messages in this thread Patch in this message | | | Date | Fri, 19 Jul 2013 16:26:28 +0200 | From | Borislav Petkov <> | Subject | Re: [PATCH] RTC: Add an alarm disable quirk |
| |
On Fri, Jul 19, 2013 at 12:53:49AM +0200, Borislav Petkov wrote: > > I assumed it was some sort of BIOS issue where any modification of the > > RTC_AIE bit caused the alarm irq line to be left high(or something > > like that) that triggered the immediate power-on on shutdown. But I've > > not been able to dig down on this. > > Ha, this actually fits like an ass on a bucket (don't ask - German > proverb :-)). > > If what you're saying is actually the case, then this explains why not > writing to 0xb doesn't cause the alarm irq to fire. > > Btw, in the trace above we do the disabling twice. Once from > rtc_timer_remove() and then again from rtc_timer_do_work(). > > So, if we disable it once and we touch RTC_AIE again causing the second > time to rearm the alarm irq, this would explain the issue. Which reminds > me: > > Maybe we should read out the alarm interrupt first and disable it only > if it is enabled - that would save us the modification of RTC_AIE. Cool, > I'll try that tomorrow.
Well, the below seems to do the trick. But since I don't trust the BIOS in any way, I'll run it a couple more days here. Btw, I think we should commit this regardless, as it saves us unneeded writes:
--- diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index be06d7150de5..bb265f1651e7 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c @@ -304,6 +304,9 @@ static void cmos_irq_enable(struct cmos_rtc *cmos, unsigned char mask) rtc_control = CMOS_READ(RTC_CONTROL); cmos_checkintr(cmos, rtc_control); + if (rtc_control == mask) + return; + rtc_control |= mask; CMOS_WRITE(rtc_control, RTC_CONTROL); hpet_set_rtc_irq_bit(mask); @@ -316,6 +319,10 @@ static void cmos_irq_disable(struct cmos_rtc *cmos, unsigned char mask) unsigned char rtc_control; rtc_control = CMOS_READ(RTC_CONTROL); + + if (!(rtc_control & mask)) + return; + rtc_control &= ~mask; CMOS_WRITE(rtc_control, RTC_CONTROL); hpet_mask_rtc_irq_bit(mask); -- -- Regards/Gruss, Boris.
Sent from a fat crate under my desk. Formatting is fine. --
| |