diff options
Diffstat (limited to 'drivers/net/ethernet/freescale/gianfar_ptp.c')
-rw-r--r-- | drivers/net/ethernet/freescale/gianfar_ptp.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/net/ethernet/freescale/gianfar_ptp.c b/drivers/net/ethernet/freescale/gianfar_ptp.c index 57798814160d..721be13081f9 100644 --- a/drivers/net/ethernet/freescale/gianfar_ptp.c +++ b/drivers/net/ethernet/freescale/gianfar_ptp.c @@ -72,7 +72,7 @@ struct gianfar_ptp_registers { /* Bit definitions for the TMR_CTRL register */ #define ALM1P (1<<31) /* Alarm1 output polarity */ #define ALM2P (1<<30) /* Alarm2 output polarity */ -#define FS (1<<28) /* FIPER start indication */ +#define FIPERST (1<<28) /* FIPER start indication */ #define PP1L (1<<27) /* Fiper1 pulse loopback mode enabled. */ #define PP2L (1<<26) /* Fiper2 pulse loopback mode enabled. */ #define TCLK_PERIOD_SHIFT (16) /* 1588 timer reference clock period. */ @@ -280,21 +280,26 @@ static irqreturn_t isr(int irq, void *priv) * 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; - u32 diff, tmr_add; + u64 adj, diff; + u32 tmr_add; int neg_adj = 0; struct etsects *etsects = container_of(ptp, struct etsects, caps); - if (ppb < 0) { + if (scaled_ppm < 0) { neg_adj = 1; - ppb = -ppb; + scaled_ppm = -scaled_ppm; } tmr_add = etsects->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; @@ -415,7 +420,7 @@ static struct ptp_clock_info ptp_gianfar_caps = { .n_per_out = 0, .n_pins = 0, .pps = 1, - .adjfreq = ptp_gianfar_adjfreq, + .adjfine = ptp_gianfar_adjfine, .adjtime = ptp_gianfar_adjtime, .gettime64 = ptp_gianfar_gettime, .settime64 = ptp_gianfar_settime, @@ -502,7 +507,7 @@ static int gianfar_ptp_probe(struct platform_device *dev) gfar_write(&etsects->regs->tmr_fiper1, etsects->tmr_fiper1); gfar_write(&etsects->regs->tmr_fiper2, etsects->tmr_fiper2); set_alarm(etsects); - gfar_write(&etsects->regs->tmr_ctrl, tmr_ctrl|FS|RTPE|TE|FRD); + gfar_write(&etsects->regs->tmr_ctrl, tmr_ctrl|FIPERST|RTPE|TE|FRD); spin_unlock_irqrestore(&etsects->lock, flags); |