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