aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/pps_kernel.h
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2015-09-28 16:21:31 -0400
committerJohn Stultz <john.stultz@linaro.org>2015-10-01 12:59:16 -0400
commitade1bdffe90e59cd257cb9bd4f5abe4de5f14911 (patch)
tree5ad7a6da9470e70915ea5d1640a5bd665ef2957b /include/linux/pps_kernel.h
parent5fd96c421ff2c76ec441aa4139c3b87dfea93e3a (diff)
ntp/pps: use y2038 safe types in pps_event_time
The pps_event_time uses two 'timespec' structures internally, which suffer from the y2038 problem. The uses of this structure are fairly self-contained in the pps code, so this replaces them all at once. Unfortunately, this includes the sfc ethernet driver aside from the pps subsystem, so we change that one as well. Both touch the same data structure, and there probably is no good way to split the patch into smaller units. Acked-by: Richard Cochran <richardcochran@gmail.com> Acked-by: David S. Miller <davem@davemloft.net> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: John Stultz <john.stultz@linaro.org>
Diffstat (limited to 'include/linux/pps_kernel.h')
-rw-r--r--include/linux/pps_kernel.h21
1 files changed, 8 insertions, 13 deletions
diff --git a/include/linux/pps_kernel.h b/include/linux/pps_kernel.h
index b2fbd62ab18d..54bf1484d41f 100644
--- a/include/linux/pps_kernel.h
+++ b/include/linux/pps_kernel.h
@@ -48,9 +48,9 @@ struct pps_source_info {
48 48
49struct pps_event_time { 49struct pps_event_time {
50#ifdef CONFIG_NTP_PPS 50#ifdef CONFIG_NTP_PPS
51 struct timespec ts_raw; 51 struct timespec64 ts_raw;
52#endif /* CONFIG_NTP_PPS */ 52#endif /* CONFIG_NTP_PPS */
53 struct timespec ts_real; 53 struct timespec64 ts_real;
54}; 54};
55 55
56/* The main struct */ 56/* The main struct */
@@ -105,7 +105,7 @@ extern void pps_event(struct pps_device *pps,
105struct pps_device *pps_lookup_dev(void const *cookie); 105struct pps_device *pps_lookup_dev(void const *cookie);
106 106
107static inline void timespec_to_pps_ktime(struct pps_ktime *kt, 107static inline void timespec_to_pps_ktime(struct pps_ktime *kt,
108 struct timespec ts) 108 struct timespec64 ts)
109{ 109{
110 kt->sec = ts.tv_sec; 110 kt->sec = ts.tv_sec;
111 kt->nsec = ts.tv_nsec; 111 kt->nsec = ts.tv_nsec;
@@ -115,29 +115,24 @@ static inline void timespec_to_pps_ktime(struct pps_ktime *kt,
115 115
116static inline void pps_get_ts(struct pps_event_time *ts) 116static inline void pps_get_ts(struct pps_event_time *ts)
117{ 117{
118 struct timespec64 raw, real; 118 ktime_get_raw_and_real_ts64(&ts->ts_raw, &ts->ts_real);
119
120 ktime_get_raw_and_real_ts64(&raw, &real);
121
122 ts->ts_raw = timespec64_to_timespec(raw);
123 ts->ts_real = timespec64_to_timespec(real);
124} 119}
125 120
126#else /* CONFIG_NTP_PPS */ 121#else /* CONFIG_NTP_PPS */
127 122
128static inline void pps_get_ts(struct pps_event_time *ts) 123static inline void pps_get_ts(struct pps_event_time *ts)
129{ 124{
130 getnstimeofday(&ts->ts_real); 125 ktime_get_real_ts64(&ts->ts_real);
131} 126}
132 127
133#endif /* CONFIG_NTP_PPS */ 128#endif /* CONFIG_NTP_PPS */
134 129
135/* Subtract known time delay from PPS event time(s) */ 130/* Subtract known time delay from PPS event time(s) */
136static inline void pps_sub_ts(struct pps_event_time *ts, struct timespec delta) 131static inline void pps_sub_ts(struct pps_event_time *ts, struct timespec64 delta)
137{ 132{
138 ts->ts_real = timespec_sub(ts->ts_real, delta); 133 ts->ts_real = timespec64_sub(ts->ts_real, delta);
139#ifdef CONFIG_NTP_PPS 134#ifdef CONFIG_NTP_PPS
140 ts->ts_raw = timespec_sub(ts->ts_raw, delta); 135 ts->ts_raw = timespec64_sub(ts->ts_raw, delta);
141#endif 136#endif
142} 137}
143 138