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

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
Loading
Loading
Loading
Loading
+7 −15
Original line number Diff line number Diff line
@@ -6179,34 +6179,26 @@ static int tg3_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info)
	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);
	bool neg_adj = false;
	u32 correction = 0;

	if (ppb < 0) {
		neg_adj = true;
		ppb = -ppb;
	}
	u64 correction;
	bool neg_adj;

	/* Frequency adjustment is performed using hardware with a 24 bit
	 * accumulator and a programmable correction value. On each clk, the
	 * correction value gets added to the accumulator and when it
	 * 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) &
		     TG3_EAV_REF_CLK_CORRECT_MASK;
	neg_adj = diff_by_scaled_ppm(1 << 24, scaled_ppm, &correction);

	tg3_full_lock(tp, 0);

	if (correction)
		tw32(TG3_EAV_REF_CLK_CORRECT_CTL,
		     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
		tw32(TG3_EAV_REF_CLK_CORRECT_CTL, 0);

@@ -6330,7 +6322,7 @@ static const struct ptp_clock_info tg3_ptp_caps = {
	.n_per_out	= 1,
	.n_pins		= 0,
	.pps		= 0,
	.adjfreq	= tg3_ptp_adjfreq,
	.adjfine	= tg3_ptp_adjfine,
	.adjtime	= tg3_ptp_adjtime,
	.gettimex64	= tg3_ptp_gettimex,
	.settime64	= tg3_ptp_settime,