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) | |||
| 42 | { | 42 | { |
| 43 | int real_seconds, real_minutes, cmos_minutes; | 43 | int real_seconds, real_minutes, cmos_minutes; |
| 44 | unsigned char save_control, save_freq_select; | 44 | unsigned char save_control, save_freq_select; |
| 45 | unsigned long flags; | ||
| 45 | int retval = 0; | 46 | int retval = 0; |
| 46 | 47 | ||
| 48 | spin_lock_irqsave(&rtc_lock, flags); | ||
| 49 | |||
| 47 | /* tell the clock it's being set */ | 50 | /* tell the clock it's being set */ |
| 48 | save_control = CMOS_READ(RTC_CONTROL); | 51 | save_control = CMOS_READ(RTC_CONTROL); |
| 49 | CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL); | 52 | CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL); |
| @@ -93,12 +96,17 @@ int mach_set_rtc_mmss(unsigned long nowtime) | |||
| 93 | CMOS_WRITE(save_control, RTC_CONTROL); | 96 | CMOS_WRITE(save_control, RTC_CONTROL); |
| 94 | CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT); | 97 | CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT); |
| 95 | 98 | ||
| 99 | spin_unlock_irqrestore(&rtc_lock, flags); | ||
| 100 | |||
| 96 | return retval; | 101 | return retval; |
| 97 | } | 102 | } |
| 98 | 103 | ||
| 99 | unsigned long mach_get_cmos_time(void) | 104 | unsigned long mach_get_cmos_time(void) |
| 100 | { | 105 | { |
| 101 | unsigned int status, year, mon, day, hour, min, sec, century = 0; | 106 | unsigned int status, year, mon, day, hour, min, sec, century = 0; |
| 107 | unsigned long flags; | ||
| 108 | |||
| 109 | spin_lock_irqsave(&rtc_lock, flags); | ||
| 102 | 110 | ||
| 103 | /* | 111 | /* |
| 104 | * If UIP is clear, then we have >= 244 microseconds before | 112 | * If UIP is clear, then we have >= 244 microseconds before |
| @@ -125,6 +133,8 @@ unsigned long mach_get_cmos_time(void) | |||
| 125 | status = CMOS_READ(RTC_CONTROL); | 133 | status = CMOS_READ(RTC_CONTROL); |
| 126 | WARN_ON_ONCE(RTC_ALWAYS_BCD && (status & RTC_DM_BINARY)); | 134 | WARN_ON_ONCE(RTC_ALWAYS_BCD && (status & RTC_DM_BINARY)); |
| 127 | 135 | ||
| 136 | spin_unlock_irqrestore(&rtc_lock, flags); | ||
| 137 | |||
| 128 | if (RTC_ALWAYS_BCD || !(status & RTC_DM_BINARY)) { | 138 | if (RTC_ALWAYS_BCD || !(status & RTC_DM_BINARY)) { |
| 129 | sec = bcd2bin(sec); | 139 | sec = bcd2bin(sec); |
| 130 | min = bcd2bin(min); | 140 | min = bcd2bin(min); |
| @@ -169,24 +179,15 @@ EXPORT_SYMBOL(rtc_cmos_write); | |||
| 169 | 179 | ||
| 170 | int update_persistent_clock(struct timespec now) | 180 | int update_persistent_clock(struct timespec now) |
| 171 | { | 181 | { |
| 172 | unsigned long flags; | 182 | return x86_platform.set_wallclock(now.tv_sec); |
| 173 | int retval; | ||
| 174 | |||
| 175 | spin_lock_irqsave(&rtc_lock, flags); | ||
| 176 | retval = x86_platform.set_wallclock(now.tv_sec); | ||
| 177 | spin_unlock_irqrestore(&rtc_lock, flags); | ||
| 178 | |||
| 179 | return retval; | ||
| 180 | } | 183 | } |
| 181 | 184 | ||
| 182 | /* not static: needed by APM */ | 185 | /* not static: needed by APM */ |
| 183 | void read_persistent_clock(struct timespec *ts) | 186 | void read_persistent_clock(struct timespec *ts) |
| 184 | { | 187 | { |
| 185 | unsigned long retval, flags; | 188 | unsigned long retval; |
| 186 | 189 | ||
| 187 | spin_lock_irqsave(&rtc_lock, flags); | ||
| 188 | retval = x86_platform.get_wallclock(); | 190 | retval = x86_platform.get_wallclock(); |
| 189 | spin_unlock_irqrestore(&rtc_lock, flags); | ||
| 190 | 191 | ||
| 191 | ts->tv_sec = retval; | 192 | ts->tv_sec = retval; |
| 192 | ts->tv_nsec = 0; | 193 | ts->tv_nsec = 0; |
