xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/cavium/common/cavium_ptp.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /* cavium_ptp.h - PTP 1588 clock on Cavium hardware
3*4882a593Smuzhiyun  * Copyright (c) 2003-2015, 2017 Cavium, Inc.
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #ifndef CAVIUM_PTP_H
7*4882a593Smuzhiyun #define CAVIUM_PTP_H
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <linux/ptp_clock_kernel.h>
10*4882a593Smuzhiyun #include <linux/timecounter.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun struct cavium_ptp {
13*4882a593Smuzhiyun 	struct pci_dev *pdev;
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun 	/* Serialize access to cycle_counter, time_counter and hw_registers */
16*4882a593Smuzhiyun 	spinlock_t spin_lock;
17*4882a593Smuzhiyun 	struct cyclecounter cycle_counter;
18*4882a593Smuzhiyun 	struct timecounter time_counter;
19*4882a593Smuzhiyun 	void __iomem *reg_base;
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun 	u32 clock_rate;
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun 	struct ptp_clock_info ptp_info;
24*4882a593Smuzhiyun 	struct ptp_clock *ptp_clock;
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #if IS_REACHABLE(CONFIG_CAVIUM_PTP)
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun struct cavium_ptp *cavium_ptp_get(void);
30*4882a593Smuzhiyun void cavium_ptp_put(struct cavium_ptp *ptp);
31*4882a593Smuzhiyun 
cavium_ptp_tstamp2time(struct cavium_ptp * ptp,u64 tstamp)32*4882a593Smuzhiyun static inline u64 cavium_ptp_tstamp2time(struct cavium_ptp *ptp, u64 tstamp)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun 	unsigned long flags;
35*4882a593Smuzhiyun 	u64 ret;
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 	spin_lock_irqsave(&ptp->spin_lock, flags);
38*4882a593Smuzhiyun 	ret = timecounter_cyc2time(&ptp->time_counter, tstamp);
39*4882a593Smuzhiyun 	spin_unlock_irqrestore(&ptp->spin_lock, flags);
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun 	return ret;
42*4882a593Smuzhiyun }
43*4882a593Smuzhiyun 
cavium_ptp_clock_index(struct cavium_ptp * clock)44*4882a593Smuzhiyun static inline int cavium_ptp_clock_index(struct cavium_ptp *clock)
45*4882a593Smuzhiyun {
46*4882a593Smuzhiyun 	return ptp_clock_index(clock->ptp_clock);
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun #else
50*4882a593Smuzhiyun 
cavium_ptp_get(void)51*4882a593Smuzhiyun static inline struct cavium_ptp *cavium_ptp_get(void)
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun 	return ERR_PTR(-ENODEV);
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun 
cavium_ptp_put(struct cavium_ptp * ptp)56*4882a593Smuzhiyun static inline void cavium_ptp_put(struct cavium_ptp *ptp) {}
57*4882a593Smuzhiyun 
cavium_ptp_tstamp2time(struct cavium_ptp * ptp,u64 tstamp)58*4882a593Smuzhiyun static inline u64 cavium_ptp_tstamp2time(struct cavium_ptp *ptp, u64 tstamp)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun 	return 0;
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun 
cavium_ptp_clock_index(struct cavium_ptp * clock)63*4882a593Smuzhiyun static inline int cavium_ptp_clock_index(struct cavium_ptp *clock)
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun 	return -1;
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun #endif
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #endif
71