|
@@ -1049,6 +1049,14 @@ int hpet_rtc_timer_init(void)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(hpet_rtc_timer_init);
|
|
|
|
|
|
+static void hpet_disable_rtc_channel(void)
|
|
|
+{
|
|
|
+ unsigned long cfg;
|
|
|
+ cfg = hpet_readl(HPET_T1_CFG);
|
|
|
+ cfg &= ~HPET_TN_ENABLE;
|
|
|
+ hpet_writel(cfg, HPET_T1_CFG);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* The functions below are called from rtc driver.
|
|
|
* Return 0 if HPET is not being used.
|
|
@@ -1060,6 +1068,9 @@ int hpet_mask_rtc_irq_bit(unsigned long bit_mask)
|
|
|
return 0;
|
|
|
|
|
|
hpet_rtc_flags &= ~bit_mask;
|
|
|
+ if (unlikely(!hpet_rtc_flags))
|
|
|
+ hpet_disable_rtc_channel();
|
|
|
+
|
|
|
return 1;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(hpet_mask_rtc_irq_bit);
|
|
@@ -1125,15 +1136,11 @@ EXPORT_SYMBOL_GPL(hpet_rtc_dropped_irq);
|
|
|
|
|
|
static void hpet_rtc_timer_reinit(void)
|
|
|
{
|
|
|
- unsigned int cfg, delta;
|
|
|
+ unsigned int delta;
|
|
|
int lost_ints = -1;
|
|
|
|
|
|
- if (unlikely(!hpet_rtc_flags)) {
|
|
|
- cfg = hpet_readl(HPET_T1_CFG);
|
|
|
- cfg &= ~HPET_TN_ENABLE;
|
|
|
- hpet_writel(cfg, HPET_T1_CFG);
|
|
|
- return;
|
|
|
- }
|
|
|
+ if (unlikely(!hpet_rtc_flags))
|
|
|
+ hpet_disable_rtc_channel();
|
|
|
|
|
|
if (!(hpet_rtc_flags & RTC_PIE) || hpet_pie_limit)
|
|
|
delta = hpet_default_delta;
|