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