Commit 42895116 authored by Ulrik De Bie's avatar Ulrik De Bie Committed by David S. Miller

ptp: gianfar: Use high resolution frequency method.

This patch depends on commit d8d26354 ("ptp: Introduce a high
resolution frequency adjustment method.")

The gianfar devices offer a frequency resolution of about 0.46 ppb
(depends on actual value of tmr_add, for the calculation assumed
0x80000000). This patch lets users of the device benefit from the increased
frequency resolution when tuning the clock. Thanks to the rounding the
maximum error between the requested frequency and the applied frequency
will then be about 0.23 ppb.

Tested on a v3.3.8 kernel on a real gianfar device. Verified compilation
on net-next (currently at v4.9-rc5).
Signed-off-by: default avatarUlrik De Bie <ulrik.debie-os@e2big.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b9972d22
...@@ -280,21 +280,26 @@ static irqreturn_t isr(int irq, void *priv) ...@@ -280,21 +280,26 @@ static irqreturn_t isr(int irq, void *priv)
* PTP clock operations * PTP clock operations
*/ */
static int ptp_gianfar_adjfreq(struct ptp_clock_info *ptp, s32 ppb) static int ptp_gianfar_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
{ {
u64 adj; u64 adj, diff;
u32 diff, tmr_add; u32 tmr_add;
int neg_adj = 0; int neg_adj = 0;
struct etsects *etsects = container_of(ptp, struct etsects, caps); struct etsects *etsects = container_of(ptp, struct etsects, caps);
if (ppb < 0) { if (scaled_ppm < 0) {
neg_adj = 1; neg_adj = 1;
ppb = -ppb; scaled_ppm = -scaled_ppm;
} }
tmr_add = etsects->tmr_add; tmr_add = etsects->tmr_add;
adj = tmr_add; adj = tmr_add;
adj *= ppb;
diff = div_u64(adj, 1000000000ULL); /* calculate diff as adj*(scaled_ppm/65536)/1000000
* and round() to the nearest integer
*/
adj *= scaled_ppm;
diff = div_u64(adj, 8000000);
diff = (diff >> 13) + ((diff >> 12) & 1);
tmr_add = neg_adj ? tmr_add - diff : tmr_add + diff; tmr_add = neg_adj ? tmr_add - diff : tmr_add + diff;
...@@ -415,7 +420,7 @@ static struct ptp_clock_info ptp_gianfar_caps = { ...@@ -415,7 +420,7 @@ static struct ptp_clock_info ptp_gianfar_caps = {
.n_per_out = 0, .n_per_out = 0,
.n_pins = 0, .n_pins = 0,
.pps = 1, .pps = 1,
.adjfreq = ptp_gianfar_adjfreq, .adjfine = ptp_gianfar_adjfine,
.adjtime = ptp_gianfar_adjtime, .adjtime = ptp_gianfar_adjtime,
.gettime64 = ptp_gianfar_gettime, .gettime64 = ptp_gianfar_gettime,
.settime64 = ptp_gianfar_settime, .settime64 = ptp_gianfar_settime,
......
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