timekeeping: Move TAI managment into timekeeping core from ntp

Currently NTP manages the TAI offset. Since there's plans for a
CLOCK_TAI clockid, push the TAI management into the timekeeping
core.

CC: Thomas Gleixner <tglx@linutronix.de>
CC: Eric Dumazet <eric.dumazet@gmail.com>
CC: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
This commit is contained in:
John Stultz
2012-05-03 12:30:07 -07:00
parent e445cf1c42
commit cc244ddae6
4 changed files with 59 additions and 8 deletions

View File

@@ -513,6 +513,48 @@ error: /* even if we error out, we forwarded the time, so call update */
}
EXPORT_SYMBOL(timekeeping_inject_offset);
/**
* timekeeping_get_tai_offset - Returns current TAI offset from UTC
*
*/
s32 timekeeping_get_tai_offset(void)
{
struct timekeeper *tk = &timekeeper;
unsigned int seq;
s32 ret;
do {
seq = read_seqbegin(&tk->lock);
ret = tk->tai_offset;
} while (read_seqretry(&tk->lock, seq));
return ret;
}
/**
* __timekeeping_set_tai_offset - Lock free worker function
*
*/
void __timekeeping_set_tai_offset(struct timekeeper *tk, s32 tai_offset)
{
tk->tai_offset = tai_offset;
}
/**
* timekeeping_set_tai_offset - Sets the current TAI offset from UTC
*
*/
void timekeeping_set_tai_offset(s32 tai_offset)
{
struct timekeeper *tk = &timekeeper;
unsigned long flags;
write_seqlock_irqsave(&tk->lock, flags);
__timekeeping_set_tai_offset(tk, tai_offset);
write_sequnlock_irqrestore(&tk->lock, flags);
}
/**
* change_clocksource - Swaps clocksources if a new one is available
*
@@ -1143,6 +1185,8 @@ static inline void accumulate_nsecs_to_secs(struct timekeeper *tk)
tk_set_wall_to_mono(tk,
timespec_sub(tk->wall_to_monotonic, ts));
__timekeeping_set_tai_offset(tk, tk->tai_offset - leap);
clock_was_set_delayed();
}
}