diff options
Diffstat (limited to 'arch/s390/kernel/time.c')
-rw-r--r-- | arch/s390/kernel/time.c | 38 |
1 files changed, 10 insertions, 28 deletions
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index e3dc28b8075d..34162a0b2caa 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
@@ -184,12 +184,14 @@ static void timing_alert_interrupt(__u16 code) | |||
184 | static void etr_reset(void); | 184 | static void etr_reset(void); |
185 | static void stp_reset(void); | 185 | static void stp_reset(void); |
186 | 186 | ||
187 | unsigned long read_persistent_clock(void) | 187 | void read_persistent_clock(struct timespec *ts) |
188 | { | 188 | { |
189 | struct timespec ts; | 189 | tod_to_timeval(get_clock() - TOD_UNIX_EPOCH, ts); |
190 | } | ||
190 | 191 | ||
191 | tod_to_timeval(get_clock() - TOD_UNIX_EPOCH, &ts); | 192 | void read_boot_clock(struct timespec *ts) |
192 | return ts.tv_sec; | 193 | { |
194 | tod_to_timeval(sched_clock_base_cc - TOD_UNIX_EPOCH, ts); | ||
193 | } | 195 | } |
194 | 196 | ||
195 | static cycle_t read_tod_clock(struct clocksource *cs) | 197 | static cycle_t read_tod_clock(struct clocksource *cs) |
@@ -207,6 +209,10 @@ static struct clocksource clocksource_tod = { | |||
207 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 209 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
208 | }; | 210 | }; |
209 | 211 | ||
212 | struct clocksource * __init clocksource_default_clock(void) | ||
213 | { | ||
214 | return &clocksource_tod; | ||
215 | } | ||
210 | 216 | ||
211 | void update_vsyscall(struct timespec *wall_time, struct clocksource *clock) | 217 | void update_vsyscall(struct timespec *wall_time, struct clocksource *clock) |
212 | { | 218 | { |
@@ -244,10 +250,6 @@ void update_vsyscall_tz(void) | |||
244 | */ | 250 | */ |
245 | void __init time_init(void) | 251 | void __init time_init(void) |
246 | { | 252 | { |
247 | struct timespec ts; | ||
248 | unsigned long flags; | ||
249 | cycle_t now; | ||
250 | |||
251 | /* Reset time synchronization interfaces. */ | 253 | /* Reset time synchronization interfaces. */ |
252 | etr_reset(); | 254 | etr_reset(); |
253 | stp_reset(); | 255 | stp_reset(); |
@@ -263,26 +265,6 @@ void __init time_init(void) | |||
263 | if (clocksource_register(&clocksource_tod) != 0) | 265 | if (clocksource_register(&clocksource_tod) != 0) |
264 | panic("Could not register TOD clock source"); | 266 | panic("Could not register TOD clock source"); |
265 | 267 | ||
266 | /* | ||
267 | * The TOD clock is an accurate clock. The xtime should be | ||
268 | * initialized in a way that the difference between TOD and | ||
269 | * xtime is reasonably small. Too bad that timekeeping_init | ||
270 | * sets xtime.tv_nsec to zero. In addition the clock source | ||
271 | * change from the jiffies clock source to the TOD clock | ||
272 | * source add another error of up to 1/HZ second. The same | ||
273 | * function sets wall_to_monotonic to a value that is too | ||
274 | * small for /proc/uptime to be accurate. | ||
275 | * Reset xtime and wall_to_monotonic to sane values. | ||
276 | */ | ||
277 | write_seqlock_irqsave(&xtime_lock, flags); | ||
278 | now = get_clock(); | ||
279 | tod_to_timeval(now - TOD_UNIX_EPOCH, &xtime); | ||
280 | clocksource_tod.cycle_last = now; | ||
281 | clocksource_tod.raw_time = xtime; | ||
282 | tod_to_timeval(sched_clock_base_cc - TOD_UNIX_EPOCH, &ts); | ||
283 | set_normalized_timespec(&wall_to_monotonic, -ts.tv_sec, -ts.tv_nsec); | ||
284 | write_sequnlock_irqrestore(&xtime_lock, flags); | ||
285 | |||
286 | /* Enable TOD clock interrupts on the boot cpu. */ | 268 | /* Enable TOD clock interrupts on the boot cpu. */ |
287 | init_cpu_timer(); | 269 | init_cpu_timer(); |
288 | 270 | ||