xref: /linux/drivers/net/phy/microchip_rds_ptp.h (revision d46ef4ee381f0f73b13714f319662f48f0c8b471)
1*d46ef4eeSDivya Koppera /* SPDX-License-Identifier: GPL-2.0
2*d46ef4eeSDivya Koppera  * Copyright (C) 2024 Microchip Technology
3*d46ef4eeSDivya Koppera  */
4*d46ef4eeSDivya Koppera 
5*d46ef4eeSDivya Koppera #ifndef _MICROCHIP_RDS_PTP_H
6*d46ef4eeSDivya Koppera #define _MICROCHIP_RDS_PTP_H
7*d46ef4eeSDivya Koppera 
8*d46ef4eeSDivya Koppera #include <linux/ptp_clock_kernel.h>
9*d46ef4eeSDivya Koppera #include <linux/ptp_clock.h>
10*d46ef4eeSDivya Koppera #include <linux/ptp_classify.h>
11*d46ef4eeSDivya Koppera #include <linux/net_tstamp.h>
12*d46ef4eeSDivya Koppera #include <linux/mii.h>
13*d46ef4eeSDivya Koppera #include <linux/phy.h>
14*d46ef4eeSDivya Koppera 
15*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_CMD_CTL			0x0
16*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_CMD_CTL_LTC_STEP_NSEC	BIT(6)
17*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_CMD_CTL_LTC_STEP_SEC	BIT(5)
18*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_CMD_CTL_CLOCK_LOAD		BIT(4)
19*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_CMD_CTL_CLOCK_READ		BIT(3)
20*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_CMD_CTL_EN			BIT(1)
21*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_CMD_CTL_DIS		BIT(0)
22*d46ef4eeSDivya Koppera 
23*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_REF_CLK_CFG		0x2
24*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_REF_CLK_SRC_250MHZ		0x0
25*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_REF_CLK_PERIOD_OVERRIDE	BIT(9)
26*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_REF_CLK_PERIOD		4
27*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_REF_CLK_CFG_SET	(MCHP_RDS_PTP_REF_CLK_SRC_250MHZ |\
28*d46ef4eeSDivya Koppera 					 MCHP_RDS_PTP_REF_CLK_PERIOD_OVERRIDE |\
29*d46ef4eeSDivya Koppera 					 MCHP_RDS_PTP_REF_CLK_PERIOD)
30*d46ef4eeSDivya Koppera 
31*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_LTC_SEC_HI			0x5
32*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_LTC_SEC_MID		0x6
33*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_LTC_SEC_LO			0x7
34*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_LTC_NS_HI			0x8
35*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_LTC_NS_LO			0x9
36*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_LTC_RATE_ADJ_HI		0xc
37*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_LTC_RATE_ADJ_HI_DIR	BIT(15)
38*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_LTC_RATE_ADJ_LO		0xd
39*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_STEP_ADJ_HI		0x12
40*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_STEP_ADJ_HI_DIR		BIT(15)
41*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_STEP_ADJ_LO		0x13
42*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_LTC_READ_SEC_HI		0x29
43*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_LTC_READ_SEC_MID		0x2a
44*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_LTC_READ_SEC_LO		0x2b
45*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_LTC_READ_NS_HI		0x2c
46*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_LTC_READ_NS_LO		0x2d
47*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_OP_MODE			0x41
48*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_OP_MODE_DIS		0
49*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_OP_MODE_STANDALONE		1
50*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_LATENCY_CORRECTION_CTL	0x44
51*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_PREDICTOR_EN		BIT(6)
52*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TX_PRED_DIS		BIT(1)
53*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_RX_PRED_DIS		BIT(0)
54*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_LATENCY_SETTING		(MCHP_RDS_PTP_PREDICTOR_EN | \
55*d46ef4eeSDivya Koppera 						 MCHP_RDS_PTP_TX_PRED_DIS | \
56*d46ef4eeSDivya Koppera 						 MCHP_RDS_PTP_RX_PRED_DIS)
57*d46ef4eeSDivya Koppera 
58*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_INT_EN			0x0
59*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_INT_STS			0x01
60*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_INT_TX_TS_OVRFL_EN		BIT(3)
61*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_INT_TX_TS_EN		BIT(2)
62*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_INT_RX_TS_OVRFL_EN		BIT(1)
63*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_INT_RX_TS_EN		BIT(0)
64*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_INT_ALL_MSK	(MCHP_RDS_PTP_INT_TX_TS_OVRFL_EN | \
65*d46ef4eeSDivya Koppera 					 MCHP_RDS_PTP_INT_TX_TS_EN | \
66*d46ef4eeSDivya Koppera 					 MCHP_RDS_PTP_INT_RX_TS_OVRFL_EN |\
67*d46ef4eeSDivya Koppera 					 MCHP_RDS_PTP_INT_RX_TS_EN)
68*d46ef4eeSDivya Koppera 
69*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_CAP_INFO			0x2e
70*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TX_TS_CNT(v)		(((v) & GENMASK(11, 8)) >> 8)
71*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_RX_TS_CNT(v)		((v) & GENMASK(3, 0))
72*d46ef4eeSDivya Koppera 
73*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_RX_PARSE_CONFIG		0x42
74*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_RX_PARSE_L2_ADDR_EN	0x44
75*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_RX_PARSE_IPV4_ADDR_EN	0x45
76*d46ef4eeSDivya Koppera 
77*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_RX_TIMESTAMP_CONFIG	0x4e
78*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_RX_TIMESTAMP_CONFIG_PTP_FCS_DIS BIT(0)
79*d46ef4eeSDivya Koppera 
80*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_RX_VERSION			0x48
81*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_RX_TIMESTAMP_EN		0x4d
82*d46ef4eeSDivya Koppera 
83*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_RX_INGRESS_NS_HI		0x54
84*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_RX_INGRESS_NS_HI_TS_VALID	BIT(15)
85*d46ef4eeSDivya Koppera 
86*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_RX_INGRESS_NS_LO		0x55
87*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_RX_INGRESS_SEC_HI		0x56
88*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_RX_INGRESS_SEC_LO		0x57
89*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_RX_MSG_HDR2		0x59
90*d46ef4eeSDivya Koppera 
91*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TX_PARSE_CONFIG		0x82
92*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_PARSE_CONFIG_LAYER2_EN	BIT(0)
93*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_PARSE_CONFIG_IPV4_EN	BIT(1)
94*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_PARSE_CONFIG_IPV6_EN	BIT(2)
95*d46ef4eeSDivya Koppera 
96*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TX_PARSE_L2_ADDR_EN	0x84
97*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TX_PARSE_IPV4_ADDR_EN	0x85
98*d46ef4eeSDivya Koppera 
99*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TX_VERSION			0x88
100*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_MAX_VERSION(x)		(((x) & GENMASK(7, 0)) << 8)
101*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_MIN_VERSION(x)		((x) & GENMASK(7, 0))
102*d46ef4eeSDivya Koppera 
103*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TX_TIMESTAMP_EN		0x8d
104*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TIMESTAMP_EN_SYNC		BIT(0)
105*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TIMESTAMP_EN_DREQ		BIT(1)
106*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TIMESTAMP_EN_PDREQ		BIT(2)
107*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TIMESTAMP_EN_PDRES		BIT(3)
108*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TIMESTAMP_EN_ALL	(MCHP_RDS_PTP_TIMESTAMP_EN_SYNC |\
109*d46ef4eeSDivya Koppera 					 MCHP_RDS_PTP_TIMESTAMP_EN_DREQ |\
110*d46ef4eeSDivya Koppera 					 MCHP_RDS_PTP_TIMESTAMP_EN_PDREQ |\
111*d46ef4eeSDivya Koppera 					 MCHP_RDS_PTP_TIMESTAMP_EN_PDRES)
112*d46ef4eeSDivya Koppera 
113*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TX_TIMESTAMP_CONFIG	0x8e
114*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TX_TIMESTAMP_CONFIG_PTP_FCS_DIS BIT(0)
115*d46ef4eeSDivya Koppera 
116*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TX_MOD			0x8f
117*d46ef4eeSDivya Koppera #define MCHP_RDS_TX_MOD_PTP_SYNC_TS_INSERT	BIT(12)
118*d46ef4eeSDivya Koppera 
119*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TX_EGRESS_NS_HI		0x94
120*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TX_EGRESS_NS_HI_TS_VALID	BIT(15)
121*d46ef4eeSDivya Koppera 
122*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TX_EGRESS_NS_LO		0x95
123*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TX_EGRESS_SEC_HI		0x96
124*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TX_EGRESS_SEC_LO		0x97
125*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TX_MSG_HDR2		0x99
126*d46ef4eeSDivya Koppera 
127*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TSU_GEN_CONFIG		0xc0
128*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TSU_GEN_CFG_TSU_EN		BIT(0)
129*d46ef4eeSDivya Koppera 
130*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TSU_HARD_RESET		0xc1
131*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_TSU_HARDRESET		BIT(0)
132*d46ef4eeSDivya Koppera 
133*d46ef4eeSDivya Koppera /* Represents 1ppm adjustment in 2^32 format with
134*d46ef4eeSDivya Koppera  * each nsec contains 4 clock cycles in 250MHz.
135*d46ef4eeSDivya Koppera  * The value is calculated as following: (1/1000000)/((2^-32)/4)
136*d46ef4eeSDivya Koppera  */
137*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_1PPM_FORMAT		17179
138*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_FIFO_SIZE			8
139*d46ef4eeSDivya Koppera #define MCHP_RDS_PTP_MAX_ADJ			31249999
140*d46ef4eeSDivya Koppera 
141*d46ef4eeSDivya Koppera #define BASE_CLK(p)				((p)->clk_base_addr)
142*d46ef4eeSDivya Koppera #define BASE_PORT(p)				((p)->port_base_addr)
143*d46ef4eeSDivya Koppera #define PTP_MMD(p)				((p)->mmd)
144*d46ef4eeSDivya Koppera 
145*d46ef4eeSDivya Koppera enum mchp_rds_ptp_base {
146*d46ef4eeSDivya Koppera 	MCHP_RDS_PTP_PORT,
147*d46ef4eeSDivya Koppera 	MCHP_RDS_PTP_CLOCK
148*d46ef4eeSDivya Koppera };
149*d46ef4eeSDivya Koppera 
150*d46ef4eeSDivya Koppera enum mchp_rds_ptp_fifo_dir {
151*d46ef4eeSDivya Koppera 	MCHP_RDS_PTP_INGRESS_FIFO,
152*d46ef4eeSDivya Koppera 	MCHP_RDS_PTP_EGRESS_FIFO
153*d46ef4eeSDivya Koppera };
154*d46ef4eeSDivya Koppera 
155*d46ef4eeSDivya Koppera struct mchp_rds_ptp_clock {
156*d46ef4eeSDivya Koppera 	struct mii_timestamper mii_ts;
157*d46ef4eeSDivya Koppera 	struct phy_device *phydev;
158*d46ef4eeSDivya Koppera 	struct ptp_clock *ptp_clock;
159*d46ef4eeSDivya Koppera 
160*d46ef4eeSDivya Koppera 	struct sk_buff_head tx_queue;
161*d46ef4eeSDivya Koppera 	struct sk_buff_head rx_queue;
162*d46ef4eeSDivya Koppera 	struct list_head rx_ts_list;
163*d46ef4eeSDivya Koppera 
164*d46ef4eeSDivya Koppera 	struct ptp_clock_info caps;
165*d46ef4eeSDivya Koppera 
166*d46ef4eeSDivya Koppera 	/* Lock for Rx ts fifo */
167*d46ef4eeSDivya Koppera 	spinlock_t rx_ts_lock;
168*d46ef4eeSDivya Koppera 	int hwts_tx_type;
169*d46ef4eeSDivya Koppera 
170*d46ef4eeSDivya Koppera 	enum hwtstamp_rx_filters rx_filter;
171*d46ef4eeSDivya Koppera 	int layer;
172*d46ef4eeSDivya Koppera 	int version;
173*d46ef4eeSDivya Koppera 	u16 port_base_addr;
174*d46ef4eeSDivya Koppera 	u16 clk_base_addr;
175*d46ef4eeSDivya Koppera 
176*d46ef4eeSDivya Koppera 	/* Lock for phc */
177*d46ef4eeSDivya Koppera 	struct mutex ptp_lock;
178*d46ef4eeSDivya Koppera 	u8 mmd;
179*d46ef4eeSDivya Koppera };
180*d46ef4eeSDivya Koppera 
181*d46ef4eeSDivya Koppera struct mchp_rds_ptp_rx_ts {
182*d46ef4eeSDivya Koppera 	struct list_head list;
183*d46ef4eeSDivya Koppera 	u32 seconds;
184*d46ef4eeSDivya Koppera 	u32 nsec;
185*d46ef4eeSDivya Koppera 	u16 seq_id;
186*d46ef4eeSDivya Koppera };
187*d46ef4eeSDivya Koppera 
188*d46ef4eeSDivya Koppera #if IS_ENABLED(CONFIG_MICROCHIP_PHY_RDS_PTP)
189*d46ef4eeSDivya Koppera 
190*d46ef4eeSDivya Koppera struct mchp_rds_ptp_clock *mchp_rds_ptp_probe(struct phy_device *phydev, u8 mmd,
191*d46ef4eeSDivya Koppera 					      u16 clk_base, u16 port_base);
192*d46ef4eeSDivya Koppera 
193*d46ef4eeSDivya Koppera int mchp_rds_ptp_top_config_intr(struct mchp_rds_ptp_clock *clock,
194*d46ef4eeSDivya Koppera 				 u16 reg, u16 val, bool enable);
195*d46ef4eeSDivya Koppera 
196*d46ef4eeSDivya Koppera irqreturn_t mchp_rds_ptp_handle_interrupt(struct mchp_rds_ptp_clock *clock);
197*d46ef4eeSDivya Koppera 
198*d46ef4eeSDivya Koppera #else
199*d46ef4eeSDivya Koppera 
200*d46ef4eeSDivya Koppera static inline struct mchp_rds_ptp_clock *mchp_rds_ptp_probe(struct phy_device
201*d46ef4eeSDivya Koppera 							    *phydev, u8 mmd,
202*d46ef4eeSDivya Koppera 							    u16 clk_base,
203*d46ef4eeSDivya Koppera 							    u16 port_base)
204*d46ef4eeSDivya Koppera {
205*d46ef4eeSDivya Koppera 	return NULL;
206*d46ef4eeSDivya Koppera }
207*d46ef4eeSDivya Koppera 
208*d46ef4eeSDivya Koppera static inline int mchp_rds_ptp_top_config_intr(struct mchp_rds_ptp_clock *clock,
209*d46ef4eeSDivya Koppera 					       u16 reg, u16 val, bool enable)
210*d46ef4eeSDivya Koppera {
211*d46ef4eeSDivya Koppera 	return 0;
212*d46ef4eeSDivya Koppera }
213*d46ef4eeSDivya Koppera 
214*d46ef4eeSDivya Koppera static inline irqreturn_t mchp_rds_ptp_handle_interrupt(struct
215*d46ef4eeSDivya Koppera 							mchp_rds_ptp_clock
216*d46ef4eeSDivya Koppera 							* clock)
217*d46ef4eeSDivya Koppera {
218*d46ef4eeSDivya Koppera 	return IRQ_NONE;
219*d46ef4eeSDivya Koppera }
220*d46ef4eeSDivya Koppera 
221*d46ef4eeSDivya Koppera #endif //CONFIG_MICROCHIP_PHY_RDS_PTP
222*d46ef4eeSDivya Koppera 
223*d46ef4eeSDivya Koppera #endif //_MICROCHIP_RDS_PTP_H
224