Naveen Mamindlapalli 2ef4e45d99 octeontx2-af: Add PTP PPS Errata workaround on CN10K silicon
Errata:
The ptp_clock_hi rollsover to zero one clock cycle before it
reaches one second boundary. As a result, the pps threshold
comparison fails after one second and the pps output signal
won't toggle further.

This patch workarounds the issue by programming the pps_lo_incr
register to 500msec minus one clock cycle period, ensuring that
the pps threshold comparison succeeds at one second rollover
boundary and pps edge toggles. After that point, the driver will
have enough time (~500msec) to reset the pps threshold value.
After each one second boundary, hrtimer is invoked which resets
the pps threshold value.

Signed-off-by: Naveen Mamindlapalli <naveenm@marvell.com>
Signed-off-by: Rakesh Babu Saladi <rsaladi2@marvell.com>
Signed-off-by: Sunil Kovvuri Goutham <sgoutham@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2022-09-17 20:13:41 +01:00

33 lines
612 B
C

/* SPDX-License-Identifier: GPL-2.0 */
/* Marvell PTP driver
*
* Copyright (C) 2020 Marvell.
*
*/
#ifndef PTP_H
#define PTP_H
#include <linux/timecounter.h>
#include <linux/time64.h>
#include <linux/spinlock.h>
struct ptp {
struct pci_dev *pdev;
void __iomem *reg_base;
u64 (*read_ptp_tstmp)(struct ptp *ptp);
spinlock_t ptp_lock; /* lock */
struct hrtimer hrtimer;
ktime_t last_ts;
u32 clock_rate;
u32 clock_period;
};
struct ptp *ptp_get(void);
void ptp_put(struct ptp *ptp);
void ptp_start(struct ptp *ptp, u64 sclk, u32 ext_clk_freq, u32 extts);
extern struct pci_driver ptp_driver;
#endif