diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/hrtimer.c | 14 | ||||
| -rw-r--r-- | kernel/posix-timers.c | 6 | ||||
| -rw-r--r-- | kernel/time/timekeeping.c | 20 | 
3 files changed, 38 insertions, 2 deletions
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index cc47812d3fe..258720741d3 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c @@ -83,6 +83,12 @@ DEFINE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases) =  			.get_time = &ktime_get_boottime,  			.resolution = KTIME_LOW_RES,  		}, +		{ +			.index = HRTIMER_BASE_TAI, +			.clockid = CLOCK_TAI, +			.get_time = &ktime_get_clocktai, +			.resolution = KTIME_LOW_RES, +		},  	}  }; @@ -90,6 +96,7 @@ static const int hrtimer_clock_to_base_table[MAX_CLOCKS] = {  	[CLOCK_REALTIME]	= HRTIMER_BASE_REALTIME,  	[CLOCK_MONOTONIC]	= HRTIMER_BASE_MONOTONIC,  	[CLOCK_BOOTTIME]	= HRTIMER_BASE_BOOTTIME, +	[CLOCK_TAI]		= HRTIMER_BASE_TAI,  };  static inline int hrtimer_clockid_to_base(clockid_t clock_id) @@ -106,8 +113,10 @@ static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base)  {  	ktime_t xtim, mono, boot;  	struct timespec xts, tom, slp; +	s32 tai_offset;  	get_xtime_and_monotonic_and_sleep_offset(&xts, &tom, &slp); +	tai_offset = timekeeping_get_tai_offset();  	xtim = timespec_to_ktime(xts);  	mono = ktime_add(xtim, timespec_to_ktime(tom)); @@ -115,6 +124,8 @@ static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base)  	base->clock_base[HRTIMER_BASE_REALTIME].softirq_time = xtim;  	base->clock_base[HRTIMER_BASE_MONOTONIC].softirq_time = mono;  	base->clock_base[HRTIMER_BASE_BOOTTIME].softirq_time = boot; +	base->clock_base[HRTIMER_BASE_TAI].softirq_time = +				ktime_add(xtim,	ktime_set(tai_offset, 0));  }  /* @@ -651,8 +662,9 @@ static inline ktime_t hrtimer_update_base(struct hrtimer_cpu_base *base)  {  	ktime_t *offs_real = &base->clock_base[HRTIMER_BASE_REALTIME].offset;  	ktime_t *offs_boot = &base->clock_base[HRTIMER_BASE_BOOTTIME].offset; +	ktime_t *offs_tai = &base->clock_base[HRTIMER_BASE_TAI].offset; -	return ktime_get_update_offsets(offs_real, offs_boot); +	return ktime_get_update_offsets(offs_real, offs_boot, offs_tai);  }  /* diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c index fbfc5f1b771..2a2e173d0a7 100644 --- a/kernel/posix-timers.c +++ b/kernel/posix-timers.c @@ -269,6 +269,12 @@ static __init int init_posix_timers(void)  	struct k_clock clock_tai = {  		.clock_getres	= hrtimer_get_res,  		.clock_get	= posix_get_tai, +		.nsleep		= common_nsleep, +		.nsleep_restart	= hrtimer_nanosleep_restart, +		.timer_create	= common_timer_create, +		.timer_set	= common_timer_set, +		.timer_get	= common_timer_get, +		.timer_del	= common_timer_del,  	};  	struct k_clock clock_boottime = {  		.clock_getres	= hrtimer_get_res, diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 8a842756572..8061ae0be7b 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -67,6 +67,7 @@ static void tk_set_wall_to_mono(struct timekeeper *tk, struct timespec wtm)  	tk->wall_to_monotonic = wtm;  	set_normalized_timespec(&tmp, -wtm.tv_sec, -wtm.tv_nsec);  	tk->offs_real = timespec_to_ktime(tmp); +	tk->offs_tai = ktime_sub(tk->offs_real, ktime_set(tk->tai_offset, 0));  }  static void tk_set_sleep_time(struct timekeeper *tk, struct timespec t) @@ -409,6 +410,20 @@ void timekeeping_clocktai(struct timespec *ts)  EXPORT_SYMBOL(timekeeping_clocktai); +/** + * ktime_get_clocktai - Returns the TAI time of day in a ktime + * + * Returns the time of day in a ktime. + */ +ktime_t ktime_get_clocktai(void) +{ +	struct timespec ts; + +	timekeeping_clocktai(&ts); +	return timespec_to_ktime(ts); +} +EXPORT_SYMBOL(ktime_get_clocktai); +  #ifdef CONFIG_NTP_PPS  /** @@ -569,6 +584,7 @@ s32 timekeeping_get_tai_offset(void)  void __timekeeping_set_tai_offset(struct timekeeper *tk, s32 tai_offset)  {  	tk->tai_offset = tai_offset; +	tk->offs_tai = ktime_sub(tk->offs_real, ktime_set(tai_offset, 0));  }  /** @@ -1539,7 +1555,8 @@ void get_xtime_and_monotonic_and_sleep_offset(struct timespec *xtim,   * Returns current monotonic time and updates the offsets   * Called from hrtimer_interupt() or retrigger_next_event()   */ -ktime_t ktime_get_update_offsets(ktime_t *offs_real, ktime_t *offs_boot) +ktime_t ktime_get_update_offsets(ktime_t *offs_real, ktime_t *offs_boot, +							ktime_t *offs_tai)  {  	struct timekeeper *tk = &timekeeper;  	ktime_t now; @@ -1554,6 +1571,7 @@ ktime_t ktime_get_update_offsets(ktime_t *offs_real, ktime_t *offs_boot)  		*offs_real = tk->offs_real;  		*offs_boot = tk->offs_boot; +		*offs_tai = tk->offs_tai;  	} while (read_seqretry(&tk->lock, seq));  	now = ktime_add_ns(ktime_set(secs, 0), nsecs);  |