aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2012-09-03 06:34:58 -0400
committerBen Hutchings <bhutchings@solarflare.com>2012-09-07 16:13:28 -0400
commit220a60a425146b0e37998cc0b3082f0541aad866 (patch)
tree44e48c4489f8e354d17269d41db19d015d9b95fe
parentef2c7d7b59708d54213c7556a82d14de9a7e4475 (diff)
pps/ptp: Allow PHC devices to adjust PPS events for known delay
Initial version by Stuart Hodgson <smhodgson@solarflare.com> Some PHC device drivers may deliver PPS events with a significant and variable delay, but still be able to measure precisely what that delay is. Add a pps_sub_ts() function for subtracting a delay from the timestamp(s) in a PPS event, and a PTP event type (PTP_CLOCK_PPSUSR) for which the caller provides a complete PPS event. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
-rw-r--r--drivers/ptp/ptp_clock.c5
-rw-r--r--include/linux/pps_kernel.h9
-rw-r--r--include/linux/ptp_clock_kernel.h10
3 files changed, 22 insertions, 2 deletions
diff --git a/drivers/ptp/ptp_clock.c b/drivers/ptp/ptp_clock.c
index 1e528b539a07..966875dcda56 100644
--- a/drivers/ptp/ptp_clock.c
+++ b/drivers/ptp/ptp_clock.c
@@ -300,6 +300,11 @@ void ptp_clock_event(struct ptp_clock *ptp, struct ptp_clock_event *event)
300 pps_get_ts(&evt); 300 pps_get_ts(&evt);
301 pps_event(ptp->pps_source, &evt, PTP_PPS_EVENT, NULL); 301 pps_event(ptp->pps_source, &evt, PTP_PPS_EVENT, NULL);
302 break; 302 break;
303
304 case PTP_CLOCK_PPSUSR:
305 pps_event(ptp->pps_source, &event->pps_times,
306 PTP_PPS_EVENT, NULL);
307 break;
303 } 308 }
304} 309}
305EXPORT_SYMBOL(ptp_clock_event); 310EXPORT_SYMBOL(ptp_clock_event);
diff --git a/include/linux/pps_kernel.h b/include/linux/pps_kernel.h
index 94048547f29a..0cc45ae1afd5 100644
--- a/include/linux/pps_kernel.h
+++ b/include/linux/pps_kernel.h
@@ -116,5 +116,14 @@ static inline void pps_get_ts(struct pps_event_time *ts)
116 116
117#endif /* CONFIG_NTP_PPS */ 117#endif /* CONFIG_NTP_PPS */
118 118
119/* Subtract known time delay from PPS event time(s) */
120static inline void pps_sub_ts(struct pps_event_time *ts, struct timespec delta)
121{
122 ts->ts_real = timespec_sub(ts->ts_real, delta);
123#ifdef CONFIG_NTP_PPS
124 ts->ts_raw = timespec_sub(ts->ts_raw, delta);
125#endif
126}
127
119#endif /* LINUX_PPS_KERNEL_H */ 128#endif /* LINUX_PPS_KERNEL_H */
120 129
diff --git a/include/linux/ptp_clock_kernel.h b/include/linux/ptp_clock_kernel.h
index 945704c2ed65..a644b29f1161 100644
--- a/include/linux/ptp_clock_kernel.h
+++ b/include/linux/ptp_clock_kernel.h
@@ -21,6 +21,7 @@
21#ifndef _PTP_CLOCK_KERNEL_H_ 21#ifndef _PTP_CLOCK_KERNEL_H_
22#define _PTP_CLOCK_KERNEL_H_ 22#define _PTP_CLOCK_KERNEL_H_
23 23
24#include <linux/pps_kernel.h>
24#include <linux/ptp_clock.h> 25#include <linux/ptp_clock.h>
25 26
26 27
@@ -110,6 +111,7 @@ enum ptp_clock_events {
110 PTP_CLOCK_ALARM, 111 PTP_CLOCK_ALARM,
111 PTP_CLOCK_EXTTS, 112 PTP_CLOCK_EXTTS,
112 PTP_CLOCK_PPS, 113 PTP_CLOCK_PPS,
114 PTP_CLOCK_PPSUSR,
113}; 115};
114 116
115/** 117/**
@@ -117,13 +119,17 @@ enum ptp_clock_events {
117 * 119 *
118 * @type: One of the ptp_clock_events enumeration values. 120 * @type: One of the ptp_clock_events enumeration values.
119 * @index: Identifies the source of the event. 121 * @index: Identifies the source of the event.
120 * @timestamp: When the event occured. 122 * @timestamp: When the event occurred (%PTP_CLOCK_EXTTS only).
123 * @pps_times: When the event occurred (%PTP_CLOCK_PPSUSR only).
121 */ 124 */
122 125
123struct ptp_clock_event { 126struct ptp_clock_event {
124 int type; 127 int type;
125 int index; 128 int index;
126 u64 timestamp; 129 union {
130 u64 timestamp;
131 struct pps_event_time pps_times;
132 };
127}; 133};
128 134
129/** 135/**