Commit e3f18e9d authored by Jacob Keller's avatar Jacob Keller Committed by David S. Miller

ptp: tg3: convert .adjfreq to .adjfine

The tg3 implementation of .adjfreq is implemented in terms of a
straight forward "base * ppb / 1 billion" calculation.

Convert this to the newer .adjfine, using the recently added
diff_by_scaled_ppm helper function to calculate the difference and
direction of the adjustment.
Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Cc: Siva Reddy Kallam <siva.kallam@broadcom.com>
Cc: Prashant Sreedharan <prashant@broadcom.com>
Cc: Michael Chan <mchan@broadcom.com>
Cc: Richard Cochran <richardcochran@gmail.com>
Reviewed-by: default avatarPavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 319d77e9
...@@ -6179,34 +6179,26 @@ static int tg3_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info) ...@@ -6179,34 +6179,26 @@ static int tg3_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info)
return 0; return 0;
} }
static int tg3_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb) static int tg3_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
{ {
struct tg3 *tp = container_of(ptp, struct tg3, ptp_info); struct tg3 *tp = container_of(ptp, struct tg3, ptp_info);
bool neg_adj = false; u64 correction;
u32 correction = 0; bool neg_adj;
if (ppb < 0) {
neg_adj = true;
ppb = -ppb;
}
/* Frequency adjustment is performed using hardware with a 24 bit /* Frequency adjustment is performed using hardware with a 24 bit
* accumulator and a programmable correction value. On each clk, the * accumulator and a programmable correction value. On each clk, the
* correction value gets added to the accumulator and when it * correction value gets added to the accumulator and when it
* overflows, the time counter is incremented/decremented. * overflows, the time counter is incremented/decremented.
*
* So conversion from ppb to correction value is
* ppb * (1 << 24) / 1000000000
*/ */
correction = div_u64((u64)ppb * (1 << 24), 1000000000ULL) & neg_adj = diff_by_scaled_ppm(1 << 24, scaled_ppm, &correction);
TG3_EAV_REF_CLK_CORRECT_MASK;
tg3_full_lock(tp, 0); tg3_full_lock(tp, 0);
if (correction) if (correction)
tw32(TG3_EAV_REF_CLK_CORRECT_CTL, tw32(TG3_EAV_REF_CLK_CORRECT_CTL,
TG3_EAV_REF_CLK_CORRECT_EN | TG3_EAV_REF_CLK_CORRECT_EN |
(neg_adj ? TG3_EAV_REF_CLK_CORRECT_NEG : 0) | correction); (neg_adj ? TG3_EAV_REF_CLK_CORRECT_NEG : 0) |
((u32)correction & TG3_EAV_REF_CLK_CORRECT_MASK));
else else
tw32(TG3_EAV_REF_CLK_CORRECT_CTL, 0); tw32(TG3_EAV_REF_CLK_CORRECT_CTL, 0);
...@@ -6330,7 +6322,7 @@ static const struct ptp_clock_info tg3_ptp_caps = { ...@@ -6330,7 +6322,7 @@ static const struct ptp_clock_info tg3_ptp_caps = {
.n_per_out = 1, .n_per_out = 1,
.n_pins = 0, .n_pins = 0,
.pps = 0, .pps = 0,
.adjfreq = tg3_ptp_adjfreq, .adjfine = tg3_ptp_adjfine,
.adjtime = tg3_ptp_adjtime, .adjtime = tg3_ptp_adjtime,
.gettimex64 = tg3_ptp_gettimex, .gettimex64 = tg3_ptp_gettimex,
.settime64 = tg3_ptp_settime, .settime64 = tg3_ptp_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