Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ptp: dp83640: Use the high resolution frequency method.

The dp83640 has a frequency resolution of about 0.029 ppb.
This patch lets users of the device benefit from the
increased frequency resolution when tuning the clock.

Signed-off-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Richard Cochran and committed by
David S. Miller
e4788b80 c79e975e

+7 -7
+7 -7
drivers/net/phy/dp83640.c
··· 375 375 376 376 /* ptp clock methods */ 377 377 378 - static int ptp_dp83640_adjfreq(struct ptp_clock_info *ptp, s32 ppb) 378 + static int ptp_dp83640_adjfine(struct ptp_clock_info *ptp, long scaled_ppm) 379 379 { 380 380 struct dp83640_clock *clock = 381 381 container_of(ptp, struct dp83640_clock, caps); ··· 384 384 int neg_adj = 0; 385 385 u16 hi, lo; 386 386 387 - if (ppb < 0) { 387 + if (scaled_ppm < 0) { 388 388 neg_adj = 1; 389 - ppb = -ppb; 389 + scaled_ppm = -scaled_ppm; 390 390 } 391 - rate = ppb; 392 - rate <<= 26; 393 - rate = div_u64(rate, 1953125); 391 + rate = scaled_ppm; 392 + rate <<= 13; 393 + rate = div_u64(rate, 15625); 394 394 395 395 hi = (rate >> 16) & PTP_RATE_HI_MASK; 396 396 if (neg_adj) ··· 1035 1035 clock->caps.n_per_out = N_PER_OUT; 1036 1036 clock->caps.n_pins = DP83640_N_PINS; 1037 1037 clock->caps.pps = 0; 1038 - clock->caps.adjfreq = ptp_dp83640_adjfreq; 1038 + clock->caps.adjfine = ptp_dp83640_adjfine; 1039 1039 clock->caps.adjtime = ptp_dp83640_adjtime; 1040 1040 clock->caps.gettime64 = ptp_dp83640_gettime; 1041 1041 clock->caps.settime64 = ptp_dp83640_settime;