Commit 025b40ab authored by Alexander Gordeev's avatar Alexander Gordeev Committed by Linus Torvalds

ntp: add hardpps implementation

This commit adds hardpps() implementation based upon the original one from
the NTPv4 reference kernel code from David Mills.  However, it is highly
optimized towards very fast syncronization and maximum stickness to PPS
signal.  The typical error is less then a microsecond.

To make it sync faster I had to throw away exponential phase filter so
that the full phase offset is corrected immediately.  Then I also had to
throw away median phase filter because it gives a bigger error itself if
used without exponential filter.

Maybe we will find an appropriate filtering scheme in the future but it's
not necessary if the signal quality is ok.
Signed-off-by: default avatarAlexander Gordeev <lasaine@lvk.cs.msu.su>
Acked-by: default avatarJohn Stultz <johnstul@us.ibm.com>
Cc: Rodolfo Giometti <giometti@enneenne.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 12f9b1f9
...@@ -30,6 +30,15 @@ config PPS_DEBUG ...@@ -30,6 +30,15 @@ config PPS_DEBUG
messages to the system log. Select this if you are having a messages to the system log. Select this if you are having a
problem with PPS support and want to see more of what is going on. problem with PPS support and want to see more of what is going on.
config NTP_PPS
bool "PPS kernel consumer support"
depends on PPS && !NO_HZ
help
This option adds support for direct in-kernel time
syncronization using an external PPS signal.
It doesn't work on tickless systems at the moment.
source drivers/pps/clients/Kconfig source drivers/pps/clients/Kconfig
endmenu endmenu
...@@ -268,6 +268,7 @@ extern u64 tick_length; ...@@ -268,6 +268,7 @@ extern u64 tick_length;
extern void second_overflow(void); extern void second_overflow(void);
extern void update_ntp_one_tick(void); extern void update_ntp_one_tick(void);
extern int do_adjtimex(struct timex *); extern int do_adjtimex(struct timex *);
extern void hardpps(const struct timespec *, const struct timespec *);
int read_current_timer(unsigned long *timer_val); int read_current_timer(unsigned long *timer_val);
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment