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>
This commit is contained in:
Родитель
ef2c7d7b59
Коммит
220a60a425
|
@ -300,6 +300,11 @@ void ptp_clock_event(struct ptp_clock *ptp, struct ptp_clock_event *event)
|
||||||
pps_get_ts(&evt);
|
pps_get_ts(&evt);
|
||||||
pps_event(ptp->pps_source, &evt, PTP_PPS_EVENT, NULL);
|
pps_event(ptp->pps_source, &evt, PTP_PPS_EVENT, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PTP_CLOCK_PPSUSR:
|
||||||
|
pps_event(ptp->pps_source, &event->pps_times,
|
||||||
|
PTP_PPS_EVENT, NULL);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ptp_clock_event);
|
EXPORT_SYMBOL(ptp_clock_event);
|
||||||
|
|
|
@ -116,5 +116,14 @@ static inline void pps_get_ts(struct pps_event_time *ts)
|
||||||
|
|
||||||
#endif /* CONFIG_NTP_PPS */
|
#endif /* CONFIG_NTP_PPS */
|
||||||
|
|
||||||
|
/* Subtract known time delay from PPS event time(s) */
|
||||||
|
static inline void pps_sub_ts(struct pps_event_time *ts, struct timespec delta)
|
||||||
|
{
|
||||||
|
ts->ts_real = timespec_sub(ts->ts_real, delta);
|
||||||
|
#ifdef CONFIG_NTP_PPS
|
||||||
|
ts->ts_raw = timespec_sub(ts->ts_raw, delta);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* LINUX_PPS_KERNEL_H */
|
#endif /* LINUX_PPS_KERNEL_H */
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#ifndef _PTP_CLOCK_KERNEL_H_
|
#ifndef _PTP_CLOCK_KERNEL_H_
|
||||||
#define _PTP_CLOCK_KERNEL_H_
|
#define _PTP_CLOCK_KERNEL_H_
|
||||||
|
|
||||||
|
#include <linux/pps_kernel.h>
|
||||||
#include <linux/ptp_clock.h>
|
#include <linux/ptp_clock.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -110,6 +111,7 @@ enum ptp_clock_events {
|
||||||
PTP_CLOCK_ALARM,
|
PTP_CLOCK_ALARM,
|
||||||
PTP_CLOCK_EXTTS,
|
PTP_CLOCK_EXTTS,
|
||||||
PTP_CLOCK_PPS,
|
PTP_CLOCK_PPS,
|
||||||
|
PTP_CLOCK_PPSUSR,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -117,13 +119,17 @@ enum ptp_clock_events {
|
||||||
*
|
*
|
||||||
* @type: One of the ptp_clock_events enumeration values.
|
* @type: One of the ptp_clock_events enumeration values.
|
||||||
* @index: Identifies the source of the event.
|
* @index: Identifies the source of the event.
|
||||||
* @timestamp: When the event occured.
|
* @timestamp: When the event occurred (%PTP_CLOCK_EXTTS only).
|
||||||
|
* @pps_times: When the event occurred (%PTP_CLOCK_PPSUSR only).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct ptp_clock_event {
|
struct ptp_clock_event {
|
||||||
int type;
|
int type;
|
||||||
int index;
|
int index;
|
||||||
u64 timestamp;
|
union {
|
||||||
|
u64 timestamp;
|
||||||
|
struct pps_event_time pps_times;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Загрузка…
Ссылка в новой задаче