|
@@ -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;
|