ptp: dp83640: Use the high resolution frequency method.
authorRichard Cochran <richardcochran@gmail.com>
Tue, 8 Nov 2016 21:49:18 +0000 (22:49 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 10 Nov 2016 02:19:53 +0000 (21:19 -0500)
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>
drivers/net/phy/dp83640.c

index 7a240fce3a7ea09edc9f10c6b93fadd94b2de3f5..e2460a57e4b1105ed398e207aa8cdfd84d03707d 100644 (file)
@@ -375,7 +375,7 @@ static int periodic_output(struct dp83640_clock *clock,
 
 /* ptp clock methods */
 
-static int ptp_dp83640_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
+static int ptp_dp83640_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
 {
        struct dp83640_clock *clock =
                container_of(ptp, struct dp83640_clock, caps);
@@ -384,13 +384,13 @@ static int ptp_dp83640_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
        int neg_adj = 0;
        u16 hi, lo;
 
-       if (ppb < 0) {
+       if (scaled_ppm < 0) {
                neg_adj = 1;
-               ppb = -ppb;
+               scaled_ppm = -scaled_ppm;
        }
-       rate = ppb;
-       rate <<= 26;
-       rate = div_u64(rate, 1953125);
+       rate = scaled_ppm;
+       rate <<= 13;
+       rate = div_u64(rate, 15625);
 
        hi = (rate >> 16) & PTP_RATE_HI_MASK;
        if (neg_adj)
@@ -1035,7 +1035,7 @@ static void dp83640_clock_init(struct dp83640_clock *clock, struct mii_bus *bus)
        clock->caps.n_per_out   = N_PER_OUT;
        clock->caps.n_pins      = DP83640_N_PINS;
        clock->caps.pps         = 0;
-       clock->caps.adjfreq     = ptp_dp83640_adjfreq;
+       clock->caps.adjfine     = ptp_dp83640_adjfine;
        clock->caps.adjtime     = ptp_dp83640_adjtime;
        clock->caps.gettime64   = ptp_dp83640_gettime;
        clock->caps.settime64   = ptp_dp83640_settime;