diff options
Diffstat (limited to 'arch/x86/kernel/hpet.c')
| -rw-r--r-- | arch/x86/kernel/hpet.c | 21 | 
1 files changed, 14 insertions, 7 deletions
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index b946a9eac7d..1bb0bf4d92c 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c @@ -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;  |