diff options
Diffstat (limited to 'arch/x86/kernel/rtc.c')
| -rw-r--r-- | arch/x86/kernel/rtc.c | 23 | 
1 files changed, 12 insertions, 11 deletions
| diff --git a/arch/x86/kernel/rtc.c b/arch/x86/kernel/rtc.c index 3f2ad2640d85..ccdbc16b8941 100644 --- a/arch/x86/kernel/rtc.c +++ b/arch/x86/kernel/rtc.c @@ -42,8 +42,11 @@ int mach_set_rtc_mmss(unsigned long nowtime)  {  	int real_seconds, real_minutes, cmos_minutes;  	unsigned char save_control, save_freq_select; +	unsigned long flags;  	int retval = 0; +	spin_lock_irqsave(&rtc_lock, flags); +  	 /* tell the clock it's being set */  	save_control = CMOS_READ(RTC_CONTROL);  	CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL); @@ -93,12 +96,17 @@ int mach_set_rtc_mmss(unsigned long nowtime)  	CMOS_WRITE(save_control, RTC_CONTROL);  	CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT); +	spin_unlock_irqrestore(&rtc_lock, flags); +  	return retval;  }  unsigned long mach_get_cmos_time(void)  {  	unsigned int status, year, mon, day, hour, min, sec, century = 0; +	unsigned long flags; + +	spin_lock_irqsave(&rtc_lock, flags);  	/*  	 * If UIP is clear, then we have >= 244 microseconds before @@ -125,6 +133,8 @@ unsigned long mach_get_cmos_time(void)  	status = CMOS_READ(RTC_CONTROL);  	WARN_ON_ONCE(RTC_ALWAYS_BCD && (status & RTC_DM_BINARY)); +	spin_unlock_irqrestore(&rtc_lock, flags); +  	if (RTC_ALWAYS_BCD || !(status & RTC_DM_BINARY)) {  		sec = bcd2bin(sec);  		min = bcd2bin(min); @@ -169,24 +179,15 @@ EXPORT_SYMBOL(rtc_cmos_write);  int update_persistent_clock(struct timespec now)  { -	unsigned long flags; -	int retval; - -	spin_lock_irqsave(&rtc_lock, flags); -	retval = x86_platform.set_wallclock(now.tv_sec); -	spin_unlock_irqrestore(&rtc_lock, flags); - -	return retval; +	return x86_platform.set_wallclock(now.tv_sec);  }  /* not static: needed by APM */  void read_persistent_clock(struct timespec *ts)  { -	unsigned long retval, flags; +	unsigned long retval; -	spin_lock_irqsave(&rtc_lock, flags);  	retval = x86_platform.get_wallclock(); -	spin_unlock_irqrestore(&rtc_lock, flags);  	ts->tv_sec = retval;  	ts->tv_nsec = 0; | 
