diff options
| author | Alexander Gordeev <lasaine@lvk.cs.msu.su> | 2011-01-12 20:00:57 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-13 11:03:21 -0500 |
| commit | e2c18e49a0d4f822ffc29fb4958943beb1ff08b7 (patch) | |
| tree | 227dbb544277f7908fa1666ce21a15e6b2282ccb /kernel/time | |
| parent | 025b40abe715d638e60516a657d354e8560c1a85 (diff) | |
pps: capture MONOTONIC_RAW timestamps as well
MONOTONIC_RAW clock timestamps are ideally suited for frequency
calculation and also fit well into the original NTP hardpps design. Now
phase and frequency can be adjusted separately: the former based on
REALTIME clock and the latter based on MONOTONIC_RAW clock.
A new function getnstime_raw_and_real is added to timekeeping subsystem to
capture both timestamps at the same time and atomically.
Signed-off-by: Alexander Gordeev <lasaine@lvk.cs.msu.su>
Acked-by: John Stultz <johnstul@us.ibm.com>
Cc: Rodolfo Giometti <giometti@enneenne.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/time')
| -rw-r--r-- | kernel/time/timekeeping.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 5bb86da82003..5536aaf3ba36 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
| @@ -288,6 +288,49 @@ void ktime_get_ts(struct timespec *ts) | |||
| 288 | } | 288 | } |
| 289 | EXPORT_SYMBOL_GPL(ktime_get_ts); | 289 | EXPORT_SYMBOL_GPL(ktime_get_ts); |
| 290 | 290 | ||
| 291 | #ifdef CONFIG_NTP_PPS | ||
| 292 | |||
| 293 | /** | ||
| 294 | * getnstime_raw_and_real - get day and raw monotonic time in timespec format | ||
| 295 | * @ts_raw: pointer to the timespec to be set to raw monotonic time | ||
| 296 | * @ts_real: pointer to the timespec to be set to the time of day | ||
| 297 | * | ||
| 298 | * This function reads both the time of day and raw monotonic time at the | ||
| 299 | * same time atomically and stores the resulting timestamps in timespec | ||
| 300 | * format. | ||
| 301 | */ | ||
| 302 | void getnstime_raw_and_real(struct timespec *ts_raw, struct timespec *ts_real) | ||
| 303 | { | ||
| 304 | unsigned long seq; | ||
| 305 | s64 nsecs_raw, nsecs_real; | ||
| 306 | |||
| 307 | WARN_ON_ONCE(timekeeping_suspended); | ||
| 308 | |||
| 309 | do { | ||
| 310 | u32 arch_offset; | ||
| 311 | |||
| 312 | seq = read_seqbegin(&xtime_lock); | ||
| 313 | |||
| 314 | *ts_raw = raw_time; | ||
| 315 | *ts_real = xtime; | ||
| 316 | |||
| 317 | nsecs_raw = timekeeping_get_ns_raw(); | ||
| 318 | nsecs_real = timekeeping_get_ns(); | ||
| 319 | |||
| 320 | /* If arch requires, add in gettimeoffset() */ | ||
| 321 | arch_offset = arch_gettimeoffset(); | ||
| 322 | nsecs_raw += arch_offset; | ||
| 323 | nsecs_real += arch_offset; | ||
| 324 | |||
| 325 | } while (read_seqretry(&xtime_lock, seq)); | ||
| 326 | |||
| 327 | timespec_add_ns(ts_raw, nsecs_raw); | ||
| 328 | timespec_add_ns(ts_real, nsecs_real); | ||
| 329 | } | ||
| 330 | EXPORT_SYMBOL(getnstime_raw_and_real); | ||
| 331 | |||
| 332 | #endif /* CONFIG_NTP_PPS */ | ||
| 333 | |||
| 291 | /** | 334 | /** |
| 292 | * do_gettimeofday - Returns the time of day in a timeval | 335 | * do_gettimeofday - Returns the time of day in a timeval |
| 293 | * @tv: pointer to the timeval to be set | 336 | * @tv: pointer to the timeval to be set |
