summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDerek Basehore <dbasehore@chromium.org>2013-06-12 14:04:45 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2013-06-12 16:29:45 -0700
commitebf8d6c8630bfd3e24683306599cb953c9a2842c (patch)
tree38bf89d51bd1d64d0afc9d3dc85968ad69991597
parent5a280844bb3bcd79076cac6ad002f71d25c798e5 (diff)
downloadop-kernel-dev-ebf8d6c8630bfd3e24683306599cb953c9a2842c.zip
op-kernel-dev-ebf8d6c8630bfd3e24683306599cb953c9a2842c.tar.gz
drivers/rtc/rtc-cmos.c: fix accidentally enabling rtc channel
During resume, we call hpet_rtc_timer_init after masking an irq bit in hpet. This will cause the call to hpet_disable_rtc_channel to be undone if RTC_AIE is the only bit not masked. Allowing the cmos interrupt handler to run before resuming caused some issues where the timer for the alarm was not removed. This would cause other, later timers to not be cleared, so utilities such as hwclock would time out when waiting for the update interrupt. [akpm@linux-foundation.org: coding-style tweak] Signed-off-by: Derek Basehore <dbasehore@chromium.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/rtc/rtc-cmos.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
index cc5bea9..f1cb706 100644
--- a/drivers/rtc/rtc-cmos.c
+++ b/drivers/rtc/rtc-cmos.c
@@ -854,6 +854,9 @@ static int cmos_resume(struct device *dev)
}
spin_lock_irq(&rtc_lock);
+ if (device_may_wakeup(dev))
+ hpet_rtc_timer_init();
+
do {
CMOS_WRITE(tmp, RTC_CONTROL);
hpet_set_rtc_irq_bit(tmp & RTC_IRQMASK);
@@ -869,7 +872,6 @@ static int cmos_resume(struct device *dev)
rtc_update_irq(cmos->rtc, 1, mask);
tmp &= ~RTC_AIE;
hpet_mask_rtc_irq_bit(RTC_AIE);
- hpet_rtc_timer_init();
} while (mask & RTC_AIE);
spin_unlock_irq(&rtc_lock);
}
OpenPOWER on IntegriCloud