xref: /linux/drivers/phy/phy-airoha-pcie.c (revision 27c8f12e972d3647e9d759d7cafd4c34fa513432)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2024 AIROHA Inc
4  * Author: Lorenzo Bianconi <lorenzo@kernel.org>
5  */
6 
7 #include <linux/bitfield.h>
8 #include <linux/delay.h>
9 #include <linux/io.h>
10 #include <linux/module.h>
11 #include <linux/of.h>
12 #include <linux/phy/phy.h>
13 #include <linux/platform_device.h>
14 #include <linux/slab.h>
15 
16 #include "phy-airoha-pcie-regs.h"
17 
18 #define LEQ_LEN_CTRL_MAX_VAL	7
19 #define FREQ_LOCK_MAX_ATTEMPT	10
20 
21 enum airoha_pcie_port_gen {
22 	PCIE_PORT_GEN1 = 1,
23 	PCIE_PORT_GEN2,
24 	PCIE_PORT_GEN3,
25 };
26 
27 /**
28  * struct airoha_pcie_phy - PCIe phy driver main structure
29  * @dev: pointer to device
30  * @phy: pointer to generic phy
31  * @csr_2l: Analogic lane IO mapped register base address
32  * @pma0: IO mapped register base address of PMA0-PCIe
33  * @pma1: IO mapped register base address of PMA1-PCIe
34  * @p0_xr_dtime: IO mapped register base address of port0 Tx-Rx detection time
35  * @p1_xr_dtime: IO mapped register base address of port1 Tx-Rx detection time
36  * @rx_aeq: IO mapped register base address of Rx AEQ training
37  */
38 struct airoha_pcie_phy {
39 	struct device *dev;
40 	struct phy *phy;
41 	void __iomem *csr_2l;
42 	void __iomem *pma0;
43 	void __iomem *pma1;
44 	void __iomem *p0_xr_dtime;
45 	void __iomem *p1_xr_dtime;
46 	void __iomem *rx_aeq;
47 };
48 
49 static void airoha_phy_clear_bits(void __iomem *reg, u32 mask)
50 {
51 	u32 val = readl(reg) & ~mask;
52 
53 	writel(val, reg);
54 }
55 
56 static void airoha_phy_set_bits(void __iomem *reg, u32 mask)
57 {
58 	u32 val = readl(reg) | mask;
59 
60 	writel(val, reg);
61 }
62 
63 static void airoha_phy_update_bits(void __iomem *reg, u32 mask, u32 val)
64 {
65 	u32 tmp = readl(reg);
66 
67 	tmp &= ~mask;
68 	tmp |= val & mask;
69 	writel(tmp, reg);
70 }
71 
72 #define airoha_phy_update_field(reg, mask, val)					\
73 	do {									\
74 		BUILD_BUG_ON_MSG(!__builtin_constant_p((mask)),			\
75 				 "mask is not constant");			\
76 		airoha_phy_update_bits((reg), (mask),				\
77 				       FIELD_PREP((mask), (val)));		\
78 	} while (0)
79 
80 #define airoha_phy_csr_2l_clear_bits(pcie_phy, reg, mask)			\
81 	airoha_phy_clear_bits((pcie_phy)->csr_2l + (reg), (mask))
82 #define airoha_phy_csr_2l_set_bits(pcie_phy, reg, mask)				\
83 	airoha_phy_set_bits((pcie_phy)->csr_2l + (reg), (mask))
84 #define airoha_phy_csr_2l_update_field(pcie_phy, reg, mask, val)		\
85 	airoha_phy_update_field((pcie_phy)->csr_2l + (reg), (mask), (val))
86 #define airoha_phy_pma0_clear_bits(pcie_phy, reg, mask)				\
87 	airoha_phy_clear_bits((pcie_phy)->pma0 + (reg), (mask))
88 #define airoha_phy_pma1_clear_bits(pcie_phy, reg, mask)				\
89 	airoha_phy_clear_bits((pcie_phy)->pma1 + (reg), (mask))
90 #define airoha_phy_pma0_set_bits(pcie_phy, reg, mask)				\
91 	airoha_phy_set_bits((pcie_phy)->pma0 + (reg), (mask))
92 #define airoha_phy_pma1_set_bits(pcie_phy, reg, mask)				\
93 	airoha_phy_set_bits((pcie_phy)->pma1 + (reg), (mask))
94 #define airoha_phy_pma0_update_field(pcie_phy, reg, mask, val)			\
95 	airoha_phy_update_field((pcie_phy)->pma0 + (reg), (mask), (val))
96 #define airoha_phy_pma1_update_field(pcie_phy, reg, mask, val)			\
97 	airoha_phy_update_field((pcie_phy)->pma1 + (reg), (mask), (val))
98 
99 static void
100 airoha_phy_init_lane0_rx_fw_pre_calib(struct airoha_pcie_phy *pcie_phy,
101 				      enum airoha_pcie_port_gen gen)
102 {
103 	u32 fl_out_target = gen == PCIE_PORT_GEN3 ? 41600 : 41941;
104 	u32 lock_cyclecnt = gen == PCIE_PORT_GEN3 ? 26000 : 32767;
105 	u32 pr_idac, val, cdr_pr_idac_tmp = 0;
106 	int i;
107 
108 	airoha_phy_pma0_set_bits(pcie_phy,
109 				 REG_PCIE_PMA_SS_LCPLL_PWCTL_SETTING_1,
110 				 PCIE_LCPLL_MAN_PWDB);
111 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET2,
112 				     PCIE_LOCK_TARGET_BEG,
113 				     fl_out_target - 100);
114 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET2,
115 				     PCIE_LOCK_TARGET_END,
116 				     fl_out_target + 100);
117 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET1,
118 				     PCIE_PLL_FT_LOCK_CYCLECNT, lock_cyclecnt);
119 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4,
120 				     PCIE_LOCK_LOCKTH, 0x3);
121 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET3,
122 				     PCIE_UNLOCK_TARGET_BEG,
123 				     fl_out_target - 100);
124 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET3,
125 				     PCIE_UNLOCK_TARGET_END,
126 				     fl_out_target + 100);
127 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET1,
128 				     PCIE_PLL_FT_UNLOCK_CYCLECNT,
129 				     lock_cyclecnt);
130 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4,
131 				     PCIE_UNLOCK_LOCKTH, 0x3);
132 
133 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR0_PR_INJ_MODE,
134 				   CSR_2L_PXP_CDR0_INJ_FORCE_OFF);
135 
136 	airoha_phy_pma0_set_bits(pcie_phy,
137 				 REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
138 				 PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_R_EN);
139 	airoha_phy_pma0_set_bits(pcie_phy,
140 				 REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
141 				 PCIE_FORCE_DA_PXP_CDR_PR_LPF_R_EN);
142 	airoha_phy_pma0_set_bits(pcie_phy,
143 				 REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
144 				 PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_C_EN);
145 	airoha_phy_pma0_clear_bits(pcie_phy,
146 				   REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
147 				   PCIE_FORCE_DA_PXP_CDR_PR_LPF_C_EN);
148 	airoha_phy_pma0_set_bits(pcie_phy,
149 				 REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
150 				 PCIE_FORCE_SEL_DA_PXP_CDR_PR_IDAC);
151 
152 	airoha_phy_pma0_set_bits(pcie_phy,
153 				 REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB,
154 				 PCIE_FORCE_SEL_DA_PXP_CDR_PR_PWDB);
155 	airoha_phy_pma0_clear_bits(pcie_phy,
156 				   REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB,
157 				   PCIE_FORCE_DA_PXP_CDR_PR_PWDB);
158 	airoha_phy_pma0_set_bits(pcie_phy,
159 				 REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB,
160 				 PCIE_FORCE_DA_PXP_CDR_PR_PWDB);
161 
162 	for (i = 0; i < LEQ_LEN_CTRL_MAX_VAL; i++) {
163 		airoha_phy_pma0_update_field(pcie_phy,
164 				REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
165 				PCIE_FORCE_DA_PXP_CDR_PR_IDAC, i << 8);
166 		airoha_phy_pma0_clear_bits(pcie_phy,
167 					   REG_PCIE_PMA_SS_RX_FREQ_DET4,
168 					   PCIE_FREQLOCK_DET_EN);
169 		airoha_phy_pma0_update_field(pcie_phy,
170 					     REG_PCIE_PMA_SS_RX_FREQ_DET4,
171 					     PCIE_FREQLOCK_DET_EN, 0x3);
172 
173 		usleep_range(10000, 15000);
174 
175 		val = FIELD_GET(PCIE_RO_FL_OUT,
176 				readl(pcie_phy->pma0 +
177 				      REG_PCIE_PMA_RO_RX_FREQDET));
178 		if (val > fl_out_target)
179 			cdr_pr_idac_tmp = i << 8;
180 	}
181 
182 	for (i = LEQ_LEN_CTRL_MAX_VAL; i >= 0; i--) {
183 		pr_idac = cdr_pr_idac_tmp | (0x1 << i);
184 		airoha_phy_pma0_update_field(pcie_phy,
185 				REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
186 				PCIE_FORCE_DA_PXP_CDR_PR_IDAC, pr_idac);
187 		airoha_phy_pma0_clear_bits(pcie_phy,
188 					   REG_PCIE_PMA_SS_RX_FREQ_DET4,
189 					   PCIE_FREQLOCK_DET_EN);
190 		airoha_phy_pma0_update_field(pcie_phy,
191 					     REG_PCIE_PMA_SS_RX_FREQ_DET4,
192 					     PCIE_FREQLOCK_DET_EN, 0x3);
193 
194 		usleep_range(10000, 15000);
195 
196 		val = FIELD_GET(PCIE_RO_FL_OUT,
197 				readl(pcie_phy->pma0 +
198 				      REG_PCIE_PMA_RO_RX_FREQDET));
199 		if (val < fl_out_target)
200 			pr_idac &= ~(0x1 << i);
201 
202 		cdr_pr_idac_tmp = pr_idac;
203 	}
204 
205 	airoha_phy_pma0_update_field(pcie_phy,
206 				     REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
207 				     PCIE_FORCE_DA_PXP_CDR_PR_IDAC,
208 				     cdr_pr_idac_tmp);
209 
210 	for (i = 0; i < FREQ_LOCK_MAX_ATTEMPT; i++) {
211 		u32 val;
212 
213 		airoha_phy_pma0_clear_bits(pcie_phy,
214 					   REG_PCIE_PMA_SS_RX_FREQ_DET4,
215 					   PCIE_FREQLOCK_DET_EN);
216 		airoha_phy_pma0_update_field(pcie_phy,
217 					     REG_PCIE_PMA_SS_RX_FREQ_DET4,
218 					     PCIE_FREQLOCK_DET_EN, 0x3);
219 
220 		usleep_range(10000, 15000);
221 
222 		val = readl(pcie_phy->pma0 + REG_PCIE_PMA_RO_RX_FREQDET);
223 		if (val & PCIE_RO_FBCK_LOCK)
224 			break;
225 	}
226 
227 	/* turn off force mode and update band values */
228 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR0_PR_INJ_MODE,
229 				     CSR_2L_PXP_CDR0_INJ_FORCE_OFF);
230 
231 	airoha_phy_pma0_clear_bits(pcie_phy,
232 				   REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
233 				   PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_R_EN);
234 	airoha_phy_pma0_clear_bits(pcie_phy,
235 				   REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
236 				   PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_C_EN);
237 	airoha_phy_pma0_clear_bits(pcie_phy,
238 				   REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB,
239 				   PCIE_FORCE_SEL_DA_PXP_CDR_PR_PWDB);
240 	airoha_phy_pma0_clear_bits(pcie_phy,
241 				   REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
242 				   PCIE_FORCE_SEL_DA_PXP_CDR_PR_IDAC);
243 	if (gen == PCIE_PORT_GEN3) {
244 		airoha_phy_pma0_update_field(pcie_phy,
245 					     REG_PCIE_PMA_DIG_RESERVE_14,
246 					     PCIE_FLL_IDAC_PCIEG3,
247 					     cdr_pr_idac_tmp);
248 	} else {
249 		airoha_phy_pma0_update_field(pcie_phy,
250 					     REG_PCIE_PMA_DIG_RESERVE_13,
251 					     PCIE_FLL_IDAC_PCIEG1,
252 					     cdr_pr_idac_tmp);
253 		airoha_phy_pma0_update_field(pcie_phy,
254 					     REG_PCIE_PMA_DIG_RESERVE_13,
255 					     PCIE_FLL_IDAC_PCIEG2,
256 					     cdr_pr_idac_tmp);
257 	}
258 }
259 
260 static void
261 airoha_phy_init_lane1_rx_fw_pre_calib(struct airoha_pcie_phy *pcie_phy,
262 				      enum airoha_pcie_port_gen gen)
263 {
264 	u32 fl_out_target = gen == PCIE_PORT_GEN3 ? 41600 : 41941;
265 	u32 lock_cyclecnt = gen == PCIE_PORT_GEN3 ? 26000 : 32767;
266 	u32 pr_idac, val, cdr_pr_idac_tmp = 0;
267 	int i;
268 
269 	airoha_phy_pma1_set_bits(pcie_phy,
270 				 REG_PCIE_PMA_SS_LCPLL_PWCTL_SETTING_1,
271 				 PCIE_LCPLL_MAN_PWDB);
272 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET2,
273 				     PCIE_LOCK_TARGET_BEG,
274 				     fl_out_target - 100);
275 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET2,
276 				     PCIE_LOCK_TARGET_END,
277 				     fl_out_target + 100);
278 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET1,
279 				     PCIE_PLL_FT_LOCK_CYCLECNT, lock_cyclecnt);
280 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4,
281 				     PCIE_LOCK_LOCKTH, 0x3);
282 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET3,
283 				     PCIE_UNLOCK_TARGET_BEG,
284 				     fl_out_target - 100);
285 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET3,
286 				     PCIE_UNLOCK_TARGET_END,
287 				     fl_out_target + 100);
288 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET1,
289 				     PCIE_PLL_FT_UNLOCK_CYCLECNT,
290 				     lock_cyclecnt);
291 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4,
292 				     PCIE_UNLOCK_LOCKTH, 0x3);
293 
294 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR1_PR_INJ_MODE,
295 				   CSR_2L_PXP_CDR1_INJ_FORCE_OFF);
296 
297 	airoha_phy_pma1_set_bits(pcie_phy,
298 				 REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
299 				 PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_R_EN);
300 	airoha_phy_pma1_set_bits(pcie_phy,
301 				 REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
302 				 PCIE_FORCE_DA_PXP_CDR_PR_LPF_R_EN);
303 	airoha_phy_pma1_set_bits(pcie_phy,
304 				 REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
305 				 PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_C_EN);
306 	airoha_phy_pma1_clear_bits(pcie_phy,
307 				   REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
308 				   PCIE_FORCE_DA_PXP_CDR_PR_LPF_C_EN);
309 	airoha_phy_pma1_set_bits(pcie_phy,
310 				 REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
311 				 PCIE_FORCE_SEL_DA_PXP_CDR_PR_IDAC);
312 	airoha_phy_pma1_set_bits(pcie_phy,
313 				 REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB,
314 				 PCIE_FORCE_SEL_DA_PXP_CDR_PR_PWDB);
315 	airoha_phy_pma1_clear_bits(pcie_phy,
316 				   REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB,
317 				   PCIE_FORCE_DA_PXP_CDR_PR_PWDB);
318 	airoha_phy_pma1_set_bits(pcie_phy,
319 				 REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB,
320 				 PCIE_FORCE_DA_PXP_CDR_PR_PWDB);
321 
322 	for (i = 0; i < LEQ_LEN_CTRL_MAX_VAL; i++) {
323 		airoha_phy_pma1_update_field(pcie_phy,
324 				REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
325 				PCIE_FORCE_DA_PXP_CDR_PR_IDAC, i << 8);
326 		airoha_phy_pma1_clear_bits(pcie_phy,
327 					   REG_PCIE_PMA_SS_RX_FREQ_DET4,
328 					   PCIE_FREQLOCK_DET_EN);
329 		airoha_phy_pma1_update_field(pcie_phy,
330 					     REG_PCIE_PMA_SS_RX_FREQ_DET4,
331 					     PCIE_FREQLOCK_DET_EN, 0x3);
332 
333 		usleep_range(10000, 15000);
334 
335 		val = FIELD_GET(PCIE_RO_FL_OUT,
336 				readl(pcie_phy->pma1 +
337 				      REG_PCIE_PMA_RO_RX_FREQDET));
338 		if (val > fl_out_target)
339 			cdr_pr_idac_tmp = i << 8;
340 	}
341 
342 	for (i = LEQ_LEN_CTRL_MAX_VAL; i >= 0; i--) {
343 		pr_idac = cdr_pr_idac_tmp | (0x1 << i);
344 		airoha_phy_pma1_update_field(pcie_phy,
345 				REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
346 				PCIE_FORCE_DA_PXP_CDR_PR_IDAC, pr_idac);
347 		airoha_phy_pma1_clear_bits(pcie_phy,
348 					   REG_PCIE_PMA_SS_RX_FREQ_DET4,
349 					   PCIE_FREQLOCK_DET_EN);
350 		airoha_phy_pma1_update_field(pcie_phy,
351 					     REG_PCIE_PMA_SS_RX_FREQ_DET4,
352 					     PCIE_FREQLOCK_DET_EN, 0x3);
353 
354 		usleep_range(10000, 15000);
355 
356 		val = FIELD_GET(PCIE_RO_FL_OUT,
357 				readl(pcie_phy->pma1 +
358 				      REG_PCIE_PMA_RO_RX_FREQDET));
359 		if (val < fl_out_target)
360 			pr_idac &= ~(0x1 << i);
361 
362 		cdr_pr_idac_tmp = pr_idac;
363 	}
364 
365 	airoha_phy_pma1_update_field(pcie_phy,
366 				     REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
367 				     PCIE_FORCE_DA_PXP_CDR_PR_IDAC,
368 				     cdr_pr_idac_tmp);
369 
370 	for (i = 0; i < FREQ_LOCK_MAX_ATTEMPT; i++) {
371 		u32 val;
372 
373 		airoha_phy_pma1_clear_bits(pcie_phy,
374 					   REG_PCIE_PMA_SS_RX_FREQ_DET4,
375 					   PCIE_FREQLOCK_DET_EN);
376 		airoha_phy_pma1_update_field(pcie_phy,
377 					     REG_PCIE_PMA_SS_RX_FREQ_DET4,
378 					     PCIE_FREQLOCK_DET_EN, 0x3);
379 
380 		usleep_range(10000, 15000);
381 
382 		val = readl(pcie_phy->pma1 + REG_PCIE_PMA_RO_RX_FREQDET);
383 		if (val & PCIE_RO_FBCK_LOCK)
384 			break;
385 	}
386 
387 	/* turn off force mode and update band values */
388 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR1_PR_INJ_MODE,
389 				     CSR_2L_PXP_CDR1_INJ_FORCE_OFF);
390 
391 	airoha_phy_pma1_clear_bits(pcie_phy,
392 				   REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
393 				   PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_R_EN);
394 	airoha_phy_pma1_clear_bits(pcie_phy,
395 				   REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
396 				   PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_C_EN);
397 	airoha_phy_pma1_clear_bits(pcie_phy,
398 				   REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB,
399 				   PCIE_FORCE_SEL_DA_PXP_CDR_PR_PWDB);
400 	airoha_phy_pma1_clear_bits(pcie_phy,
401 				   REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
402 				   PCIE_FORCE_SEL_DA_PXP_CDR_PR_IDAC);
403 	if (gen == PCIE_PORT_GEN3) {
404 		airoha_phy_pma1_update_field(pcie_phy,
405 					     REG_PCIE_PMA_DIG_RESERVE_14,
406 					     PCIE_FLL_IDAC_PCIEG3,
407 					     cdr_pr_idac_tmp);
408 	} else {
409 		airoha_phy_pma1_update_field(pcie_phy,
410 					     REG_PCIE_PMA_DIG_RESERVE_13,
411 					     PCIE_FLL_IDAC_PCIEG1,
412 					     cdr_pr_idac_tmp);
413 		airoha_phy_pma1_update_field(pcie_phy,
414 					     REG_PCIE_PMA_DIG_RESERVE_13,
415 					     PCIE_FLL_IDAC_PCIEG2,
416 					     cdr_pr_idac_tmp);
417 	}
418 }
419 
420 static void airoha_pcie_phy_init_default(struct airoha_pcie_phy *pcie_phy)
421 {
422 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CMN,
423 				       CSR_2L_PXP_CMN_TRIM_MASK, 0x10);
424 	writel(0xcccbcccb, pcie_phy->pma0 + REG_PCIE_PMA_DIG_RESERVE_21);
425 	writel(0xcccb, pcie_phy->pma0 + REG_PCIE_PMA_DIG_RESERVE_22);
426 	writel(0xcccbcccb, pcie_phy->pma1 + REG_PCIE_PMA_DIG_RESERVE_21);
427 	writel(0xcccb, pcie_phy->pma1 + REG_PCIE_PMA_DIG_RESERVE_22);
428 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CMN,
429 				   CSR_2L_PXP_CMN_LANE_EN);
430 }
431 
432 static void airoha_pcie_phy_init_clk_out(struct airoha_pcie_phy *pcie_phy)
433 {
434 	airoha_phy_csr_2l_update_field(pcie_phy,
435 				       REG_CSR_2L_TXPLL_POSTDIV_D256,
436 				       CSR_2L_PXP_CLKTX0_AMP, 0x5);
437 	airoha_phy_csr_2l_update_field(pcie_phy,
438 				       REG_CSR_2L_CLKTX0_FORCE_OUT1,
439 				       CSR_2L_PXP_CLKTX1_AMP, 0x5);
440 	airoha_phy_csr_2l_update_field(pcie_phy,
441 				       REG_CSR_2L_TXPLL_POSTDIV_D256,
442 				       CSR_2L_PXP_CLKTX0_OFFSET, 0x2);
443 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CLKTX1_OFFSET,
444 				       CSR_2L_PXP_CLKTX1_OFFSET, 0x2);
445 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CLKTX0_FORCE_OUT1,
446 				     CSR_2L_PXP_CLKTX0_HZ);
447 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CLKTX1_OFFSET,
448 				     CSR_2L_PXP_CLKTX1_HZ);
449 	airoha_phy_csr_2l_update_field(pcie_phy,
450 				       REG_CSR_2L_CLKTX0_FORCE_OUT1,
451 				       CSR_2L_PXP_CLKTX0_IMP_SEL, 0x12);
452 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CLKTX1_IMP_SEL,
453 				       CSR_2L_PXP_CLKTX1_IMP_SEL, 0x12);
454 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_POSTDIV_D256,
455 				     CSR_2L_PXP_CLKTX0_SR);
456 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CLKTX1_OFFSET,
457 				     CSR_2L_PXP_CLKTX1_SR);
458 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_PLL_CMN_RESERVE0,
459 				       CSR_2L_PXP_PLL_RESERVE_MASK, 0xdd);
460 }
461 
462 static void airoha_pcie_phy_init_csr_2l(struct airoha_pcie_phy *pcie_phy)
463 {
464 	airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_SW_RESET,
465 				 PCIE_SW_XFI_RXPCS_RST | PCIE_SW_REF_RST |
466 				 PCIE_SW_RX_RST);
467 	airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_SW_RESET,
468 				 PCIE_SW_XFI_RXPCS_RST | PCIE_SW_REF_RST |
469 				 PCIE_SW_RX_RST);
470 	airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_TX_RESET,
471 				 PCIE_TX_TOP_RST | REG_PCIE_PMA_TX_RESET);
472 	airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_TX_RESET,
473 				 PCIE_TX_TOP_RST | REG_PCIE_PMA_TX_RESET);
474 }
475 
476 static void airoha_pcie_phy_init_rx(struct airoha_pcie_phy *pcie_phy)
477 {
478 	writel(0x2a00090b, pcie_phy->pma0 + REG_PCIE_PMA_DIG_RESERVE_17);
479 	writel(0x2a00090b, pcie_phy->pma1 + REG_PCIE_PMA_DIG_RESERVE_17);
480 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR0_PR_MONPI,
481 				   CSR_2L_PXP_CDR0_PR_XFICK_EN);
482 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR1_PR_MONPI,
483 				   CSR_2L_PXP_CDR1_PR_XFICK_EN);
484 	airoha_phy_csr_2l_clear_bits(pcie_phy,
485 				     REG_CSR_2L_CDR0_PD_PICAL_CKD8_INV,
486 				     CSR_2L_PXP_CDR0_PD_EDGE_DISABLE);
487 	airoha_phy_csr_2l_clear_bits(pcie_phy,
488 				     REG_CSR_2L_CDR1_PD_PICAL_CKD8_INV,
489 				     CSR_2L_PXP_CDR1_PD_EDGE_DISABLE);
490 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_PHYCK_DIV,
491 				       CSR_2L_PXP_RX0_PHYCK_SEL, 0x1);
492 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_PHYCK_DIV,
493 				       CSR_2L_PXP_RX1_PHYCK_SEL, 0x1);
494 }
495 
496 static void airoha_pcie_phy_init_jcpll(struct airoha_pcie_phy *pcie_phy)
497 {
498 	airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
499 				 PCIE_FORCE_SEL_DA_PXP_JCPLL_EN);
500 	airoha_phy_pma0_clear_bits(pcie_phy,
501 				   REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
502 				   PCIE_FORCE_DA_PXP_JCPLL_EN);
503 	airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
504 				 PCIE_FORCE_SEL_DA_PXP_JCPLL_EN);
505 	airoha_phy_pma1_clear_bits(pcie_phy,
506 				   REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
507 				   PCIE_FORCE_DA_PXP_JCPLL_EN);
508 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_TCL_VTP_EN,
509 				       CSR_2L_PXP_JCPLL_SPARE_LOW, 0x20);
510 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_RST_DLY,
511 				   CSR_2L_PXP_JCPLL_RST);
512 	writel(0x0, pcie_phy->csr_2l + REG_CSR_2L_JCPLL_SSC_DELTA1);
513 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC_PERIOD,
514 				     CSR_2L_PXP_JCPLL_SSC_PERIOD);
515 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC,
516 				     CSR_2L_PXP_JCPLL_SSC_PHASE_INI);
517 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC,
518 				     CSR_2L_PXP_JCPLL_SSC_TRI_EN);
519 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BR,
520 				       CSR_2L_PXP_JCPLL_LPF_BR, 0xa);
521 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BR,
522 				       CSR_2L_PXP_JCPLL_LPF_BP, 0xc);
523 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BR,
524 				       CSR_2L_PXP_JCPLL_LPF_BC, 0x1f);
525 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BWC,
526 				       CSR_2L_PXP_JCPLL_LPF_BWC, 0x1e);
527 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BR,
528 				       CSR_2L_PXP_JCPLL_LPF_BWR, 0xa);
529 	airoha_phy_csr_2l_update_field(pcie_phy,
530 				       REG_CSR_2L_JCPLL_MMD_PREDIV_MODE,
531 				       CSR_2L_PXP_JCPLL_MMD_PREDIV_MODE,
532 				       0x1);
533 	airoha_phy_csr_2l_clear_bits(pcie_phy, CSR_2L_PXP_JCPLL_MONCK,
534 				     CSR_2L_PXP_JCPLL_REFIN_DIV);
535 
536 	airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_VOS,
537 				 PCIE_FORCE_SEL_DA_PXP_JCPLL_SDM_PCW);
538 	airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_VOS,
539 				 PCIE_FORCE_SEL_DA_PXP_JCPLL_SDM_PCW);
540 	airoha_phy_pma0_update_field(pcie_phy,
541 				     REG_PCIE_PMA_FORCE_DA_PXP_JCPLL_SDM_PCW,
542 				     PCIE_FORCE_DA_PXP_JCPLL_SDM_PCW,
543 				     0x50000000);
544 	airoha_phy_pma1_update_field(pcie_phy,
545 				     REG_PCIE_PMA_FORCE_DA_PXP_JCPLL_SDM_PCW,
546 				     PCIE_FORCE_DA_PXP_JCPLL_SDM_PCW,
547 				     0x50000000);
548 
549 	airoha_phy_csr_2l_set_bits(pcie_phy,
550 				   REG_CSR_2L_JCPLL_MMD_PREDIV_MODE,
551 				   CSR_2L_PXP_JCPLL_POSTDIV_D5);
552 	airoha_phy_csr_2l_set_bits(pcie_phy,
553 				   REG_CSR_2L_JCPLL_MMD_PREDIV_MODE,
554 				   CSR_2L_PXP_JCPLL_POSTDIV_D2);
555 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_RST_DLY,
556 				       CSR_2L_PXP_JCPLL_RST_DLY, 0x4);
557 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_RST_DLY,
558 				     CSR_2L_PXP_JCPLL_SDM_DI_LS);
559 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_TCL_KBAND_VREF,
560 				     CSR_2L_PXP_JCPLL_VCO_KBAND_MEAS_EN);
561 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_IB_EXT,
562 				     CSR_2L_PXP_JCPLL_CHP_IOFST);
563 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_IB_EXT,
564 				       CSR_2L_PXP_JCPLL_CHP_IBIAS, 0xc);
565 	airoha_phy_csr_2l_update_field(pcie_phy,
566 				       REG_CSR_2L_JCPLL_MMD_PREDIV_MODE,
567 				       CSR_2L_PXP_JCPLL_MMD_PREDIV_MODE,
568 				       0x1);
569 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_VCODIV,
570 				   CSR_2L_PXP_JCPLL_VCO_HALFLSB_EN);
571 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_VCODIV,
572 				       CSR_2L_PXP_JCPLL_VCO_CFIX, 0x1);
573 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_VCODIV,
574 				       CSR_2L_PXP_JCPLL_VCO_SCAPWR, 0x4);
575 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_IB_EXT,
576 				     REG_CSR_2L_JCPLL_LPF_SHCK_EN);
577 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_KBAND_KFC,
578 				   CSR_2L_PXP_JCPLL_POSTDIV_EN);
579 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_KBAND_KFC,
580 				     CSR_2L_PXP_JCPLL_KBAND_KFC);
581 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_KBAND_KFC,
582 				       CSR_2L_PXP_JCPLL_KBAND_KF, 0x3);
583 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_KBAND_KFC,
584 				     CSR_2L_PXP_JCPLL_KBAND_KS);
585 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BWC,
586 				       CSR_2L_PXP_JCPLL_KBAND_DIV, 0x1);
587 
588 	airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_SCAN_MODE,
589 				 PCIE_FORCE_SEL_DA_PXP_JCPLL_KBAND_LOAD_EN);
590 	airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_SCAN_MODE,
591 				   PCIE_FORCE_DA_PXP_JCPLL_KBAND_LOAD_EN);
592 
593 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BWC,
594 				       CSR_2L_PXP_JCPLL_KBAND_CODE, 0xe4);
595 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SDM_HREN,
596 				   CSR_2L_PXP_JCPLL_TCL_AMP_EN);
597 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_TCL_CMP,
598 				   CSR_2L_PXP_JCPLL_TCL_LPF_EN);
599 	airoha_phy_csr_2l_update_field(pcie_phy,
600 				       REG_CSR_2L_JCPLL_TCL_KBAND_VREF,
601 				       CSR_2L_PXP_JCPLL_TCL_KBAND_VREF, 0xf);
602 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_SDM_HREN,
603 				       CSR_2L_PXP_JCPLL_TCL_AMP_GAIN, 0x1);
604 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_SDM_HREN,
605 				       CSR_2L_PXP_JCPLL_TCL_AMP_VREF, 0x5);
606 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_TCL_CMP,
607 				       CSR_2L_PXP_JCPLL_TCL_LPF_BW, 0x1);
608 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_VCO_TCLVAR,
609 				       CSR_2L_PXP_JCPLL_VCO_TCLVAR, 0x3);
610 
611 	airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
612 				 PCIE_FORCE_SEL_DA_PXP_JCPLL_CKOUT_EN);
613 	airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
614 				 PCIE_FORCE_DA_PXP_JCPLL_CKOUT_EN);
615 	airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
616 				 PCIE_FORCE_SEL_DA_PXP_JCPLL_CKOUT_EN);
617 	airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
618 				 PCIE_FORCE_DA_PXP_JCPLL_CKOUT_EN);
619 	airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
620 				 PCIE_FORCE_SEL_DA_PXP_JCPLL_EN);
621 	airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
622 				 PCIE_FORCE_DA_PXP_JCPLL_EN);
623 	airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
624 				 PCIE_FORCE_SEL_DA_PXP_JCPLL_EN);
625 	airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
626 				 PCIE_FORCE_DA_PXP_JCPLL_EN);
627 }
628 
629 static void airoha_pcie_phy_txpll(struct airoha_pcie_phy *pcie_phy)
630 {
631 	airoha_phy_pma0_set_bits(pcie_phy,
632 				 REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
633 				 PCIE_FORCE_SEL_DA_PXP_TXPLL_EN);
634 	airoha_phy_pma0_clear_bits(pcie_phy,
635 				   REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
636 				   PCIE_FORCE_DA_PXP_TXPLL_EN);
637 	airoha_phy_pma1_set_bits(pcie_phy,
638 				 REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
639 				 PCIE_FORCE_SEL_DA_PXP_TXPLL_EN);
640 	airoha_phy_pma1_clear_bits(pcie_phy,
641 				   REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
642 				   PCIE_FORCE_DA_PXP_TXPLL_EN);
643 
644 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_REFIN_DIV,
645 				   CSR_2L_PXP_TXPLL_PLL_RSTB);
646 	writel(0x0, pcie_phy->csr_2l + REG_CSR_2L_TXPLL_SSC_DELTA1);
647 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SSC_PERIOD,
648 				     CSR_2L_PXP_txpll_SSC_PERIOD);
649 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_CHP_IOFST,
650 				       CSR_2L_PXP_TXPLL_CHP_IOFST, 0x1);
651 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_750M_SYS_CK,
652 				       CSR_2L_PXP_TXPLL_CHP_IBIAS, 0x2d);
653 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_REFIN_DIV,
654 				     CSR_2L_PXP_TXPLL_REFIN_DIV);
655 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_TCL_LPF_BW,
656 				       CSR_2L_PXP_TXPLL_VCO_CFIX, 0x3);
657 
658 	airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
659 				 PCIE_FORCE_SEL_DA_PXP_TXPLL_SDM_PCW);
660 	airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
661 				 PCIE_FORCE_SEL_DA_PXP_TXPLL_SDM_PCW);
662 	airoha_phy_pma0_update_field(pcie_phy,
663 				     REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_SDM_PCW,
664 				     PCIE_FORCE_DA_PXP_TXPLL_SDM_PCW,
665 				     0xc800000);
666 	airoha_phy_pma1_update_field(pcie_phy,
667 				     REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_SDM_PCW,
668 				     PCIE_FORCE_DA_PXP_TXPLL_SDM_PCW,
669 				     0xc800000);
670 
671 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SDM_DI_LS,
672 				     CSR_2L_PXP_TXPLL_SDM_IFM);
673 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SSC,
674 				     CSR_2L_PXP_TXPLL_SSC_PHASE_INI);
675 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_REFIN_DIV,
676 				       CSR_2L_PXP_TXPLL_RST_DLY, 0x4);
677 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SDM_DI_LS,
678 				     CSR_2L_PXP_TXPLL_SDM_DI_LS);
679 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_SDM_DI_LS,
680 				       CSR_2L_PXP_TXPLL_SDM_ORD, 0x3);
681 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_TCL_KBAND_VREF,
682 				     CSR_2L_PXP_TXPLL_VCO_KBAND_MEAS_EN);
683 	writel(0x0, pcie_phy->csr_2l + REG_CSR_2L_TXPLL_SSC_DELTA1);
684 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_CHP_IOFST,
685 				       CSR_2L_PXP_TXPLL_LPF_BP, 0x1);
686 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_CHP_IOFST,
687 				       CSR_2L_PXP_TXPLL_LPF_BC, 0x18);
688 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_CHP_IOFST,
689 				       CSR_2L_PXP_TXPLL_LPF_BR, 0x5);
690 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_CHP_IOFST,
691 				       CSR_2L_PXP_TXPLL_CHP_IOFST, 0x1);
692 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_750M_SYS_CK,
693 				       CSR_2L_PXP_TXPLL_CHP_IBIAS, 0x2d);
694 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_TCL_VTP,
695 				       CSR_2L_PXP_TXPLL_SPARE_L, 0x1);
696 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_LPF_BWR,
697 				     CSR_2L_PXP_TXPLL_LPF_BWC);
698 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_POSTDIV,
699 				     CSR_2L_PXP_TXPLL_MMD_PREDIV_MODE);
700 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_REFIN_DIV,
701 				     CSR_2L_PXP_TXPLL_REFIN_DIV);
702 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_TCL_LPF_BW,
703 				   CSR_2L_PXP_TXPLL_VCO_HALFLSB_EN);
704 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_VCO_SCAPWR,
705 				       CSR_2L_PXP_TXPLL_VCO_SCAPWR, 0x7);
706 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_TCL_LPF_BW,
707 				       CSR_2L_PXP_TXPLL_VCO_CFIX, 0x3);
708 
709 	airoha_phy_pma0_set_bits(pcie_phy,
710 				 REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
711 				 PCIE_FORCE_SEL_DA_PXP_TXPLL_SDM_PCW);
712 	airoha_phy_pma1_set_bits(pcie_phy,
713 				 REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
714 				 PCIE_FORCE_SEL_DA_PXP_TXPLL_SDM_PCW);
715 
716 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SSC,
717 				     CSR_2L_PXP_TXPLL_SSC_PHASE_INI);
718 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_LPF_BWR,
719 				     CSR_2L_PXP_TXPLL_LPF_BWR);
720 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_PHY_CK2,
721 				   CSR_2L_PXP_TXPLL_REFIN_INTERNAL);
722 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_TCL_KBAND_VREF,
723 				     CSR_2L_PXP_TXPLL_VCO_KBAND_MEAS_EN);
724 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_VTP,
725 				     CSR_2L_PXP_TXPLL_VTP_EN);
726 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_POSTDIV,
727 				     CSR_2L_PXP_TXPLL_PHY_CK1_EN);
728 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_PHY_CK2,
729 				   CSR_2L_PXP_TXPLL_REFIN_INTERNAL);
730 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SSC,
731 				     CSR_2L_PXP_TXPLL_SSC_EN);
732 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_750M_SYS_CK,
733 				     CSR_2L_PXP_TXPLL_LPF_SHCK_EN);
734 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_POSTDIV,
735 				     CSR_2L_PXP_TXPLL_POSTDIV_EN);
736 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_KBAND_DIV,
737 				     CSR_2L_PXP_TXPLL_KBAND_KFC);
738 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_KBAND_DIV,
739 				       CSR_2L_PXP_TXPLL_KBAND_KF, 0x3);
740 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_KBAND_DIV,
741 				       CSR_2L_PXP_txpll_KBAND_KS, 0x1);
742 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_KBAND_DIV,
743 				       CSR_2L_PXP_TXPLL_KBAND_DIV, 0x4);
744 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_LPF_BWR,
745 				       CSR_2L_PXP_TXPLL_KBAND_CODE, 0xe4);
746 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_SDM_OUT,
747 				   CSR_2L_PXP_TXPLL_TCL_AMP_EN);
748 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_TCL_AMP_VREF,
749 				   CSR_2L_PXP_TXPLL_TCL_LPF_EN);
750 	airoha_phy_csr_2l_update_field(pcie_phy,
751 				       REG_CSR_2L_TXPLL_TCL_KBAND_VREF,
752 				       CSR_2L_PXP_TXPLL_TCL_KBAND_VREF, 0xf);
753 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_SDM_OUT,
754 				       CSR_2L_PXP_TXPLL_TCL_AMP_GAIN, 0x3);
755 	airoha_phy_csr_2l_update_field(pcie_phy,
756 				       REG_CSR_2L_TXPLL_TCL_AMP_VREF,
757 				       CSR_2L_PXP_TXPLL_TCL_AMP_VREF, 0xb);
758 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_TCL_LPF_BW,
759 				       CSR_2L_PXP_TXPLL_TCL_LPF_BW, 0x3);
760 
761 	airoha_phy_pma0_set_bits(pcie_phy,
762 				 REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
763 				 PCIE_FORCE_SEL_DA_PXP_TXPLL_CKOUT_EN);
764 	airoha_phy_pma0_set_bits(pcie_phy,
765 				 REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
766 				 PCIE_FORCE_DA_PXP_TXPLL_CKOUT_EN);
767 	airoha_phy_pma1_set_bits(pcie_phy,
768 				 REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
769 				 PCIE_FORCE_SEL_DA_PXP_TXPLL_CKOUT_EN);
770 	airoha_phy_pma1_set_bits(pcie_phy,
771 				 REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
772 				 PCIE_FORCE_DA_PXP_TXPLL_CKOUT_EN);
773 	airoha_phy_pma0_set_bits(pcie_phy,
774 				 REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
775 				 PCIE_FORCE_SEL_DA_PXP_TXPLL_EN);
776 	airoha_phy_pma0_set_bits(pcie_phy,
777 				 REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
778 				 PCIE_FORCE_DA_PXP_TXPLL_EN);
779 	airoha_phy_pma1_set_bits(pcie_phy,
780 				 REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
781 				 PCIE_FORCE_SEL_DA_PXP_TXPLL_EN);
782 	airoha_phy_pma1_set_bits(pcie_phy,
783 				 REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
784 				 PCIE_FORCE_DA_PXP_TXPLL_EN);
785 }
786 
787 static void airoha_pcie_phy_init_ssc_jcpll(struct airoha_pcie_phy *pcie_phy)
788 {
789 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_SSC_DELTA1,
790 				       CSR_2L_PXP_JCPLL_SSC_DELTA1, 0x106);
791 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_SSC_DELTA1,
792 				       CSR_2L_PXP_JCPLL_SSC_DELTA, 0x106);
793 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_SSC_PERIOD,
794 				       CSR_2L_PXP_JCPLL_SSC_PERIOD, 0x31b);
795 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC,
796 				   CSR_2L_PXP_JCPLL_SSC_PHASE_INI);
797 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC,
798 				   CSR_2L_PXP_JCPLL_SSC_EN);
799 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SDM_IFM,
800 				   CSR_2L_PXP_JCPLL_SDM_IFM);
801 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SDM_HREN,
802 				   REG_CSR_2L_JCPLL_SDM_HREN);
803 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_RST_DLY,
804 				     CSR_2L_PXP_JCPLL_SDM_DI_EN);
805 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC,
806 				   CSR_2L_PXP_JCPLL_SSC_TRI_EN);
807 }
808 
809 static void
810 airoha_pcie_phy_set_rxlan0_signal_detect(struct airoha_pcie_phy *pcie_phy)
811 {
812 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR0_PR_COR_HBW,
813 				   CSR_2L_PXP_CDR0_PR_LDO_FORCE_ON);
814 
815 	usleep_range(100, 200);
816 
817 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_19,
818 				     PCIE_PCP_RX_REV0_PCIE_GEN1, 0x18b0);
819 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_20,
820 				     PCIE_PCP_RX_REV0_PCIE_GEN2, 0x18b0);
821 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_20,
822 				     PCIE_PCP_RX_REV0_PCIE_GEN3, 0x1030);
823 
824 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_SIGDET_DCTEST,
825 				       CSR_2L_PXP_RX0_SIGDET_PEAK, 0x2);
826 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_SIGDET_VTH_SEL,
827 				       CSR_2L_PXP_RX0_SIGDET_VTH_SEL, 0x5);
828 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_REV0,
829 				       CSR_2L_PXP_VOS_PNINV, 0x2);
830 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_SIGDET_DCTEST,
831 				       CSR_2L_PXP_RX0_SIGDET_LPF_CTRL, 0x1);
832 
833 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_CAL2,
834 				     PCIE_CAL_OUT_OS, 0x0);
835 
836 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_PXP_RX0_FE_VB_EQ2,
837 				   CSR_2L_PXP_RX0_FE_VCM_GEN_PWDB);
838 
839 	airoha_phy_pma0_set_bits(pcie_phy,
840 				 REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_GAIN_CTRL,
841 				 PCIE_FORCE_SEL_DA_PXP_RX_FE_PWDB);
842 	airoha_phy_pma0_update_field(pcie_phy,
843 				     REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_GAIN_CTRL,
844 				     PCIE_FORCE_DA_PXP_RX_FE_GAIN_CTRL, 0x3);
845 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_RX_FORCE_MODE0,
846 				     PCIE_FORCE_DA_XPON_RX_FE_GAIN_CTRL, 0x1);
847 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_SIGDET0,
848 				     PCIE_SIGDET_WIN_NONVLD_TIMES, 0x3);
849 	airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_SEQUENCE_DISB_CTRL1,
850 				   PCIE_DISB_RX_SDCAL_EN);
851 
852 	airoha_phy_pma0_set_bits(pcie_phy,
853 				 REG_PCIE_PMA_CTRL_SEQUENCE_FORCE_CTRL1,
854 				 PCIE_FORCE_RX_SDCAL_EN);
855 	usleep_range(150, 200);
856 	airoha_phy_pma0_clear_bits(pcie_phy,
857 				   REG_PCIE_PMA_CTRL_SEQUENCE_FORCE_CTRL1,
858 				   PCIE_FORCE_RX_SDCAL_EN);
859 }
860 
861 static void
862 airoha_pcie_phy_set_rxlan1_signal_detect(struct airoha_pcie_phy *pcie_phy)
863 {
864 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR1_PR_COR_HBW,
865 				   CSR_2L_PXP_CDR1_PR_LDO_FORCE_ON);
866 
867 	usleep_range(100, 200);
868 
869 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_19,
870 				     PCIE_PCP_RX_REV0_PCIE_GEN1, 0x18b0);
871 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_20,
872 				     PCIE_PCP_RX_REV0_PCIE_GEN2, 0x18b0);
873 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_20,
874 				     PCIE_PCP_RX_REV0_PCIE_GEN3, 0x1030);
875 
876 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_SIGDET_NOVTH,
877 				       CSR_2L_PXP_RX1_SIGDET_PEAK, 0x2);
878 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_SIGDET_NOVTH,
879 				       CSR_2L_PXP_RX1_SIGDET_VTH_SEL, 0x5);
880 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_REV0,
881 				       CSR_2L_PXP_VOS_PNINV, 0x2);
882 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_DAC_RANGE_EYE,
883 				       CSR_2L_PXP_RX1_SIGDET_LPF_CTRL, 0x1);
884 
885 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_CAL2,
886 				     PCIE_CAL_OUT_OS, 0x0);
887 
888 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_RX1_FE_VB_EQ1,
889 				   CSR_2L_PXP_RX1_FE_VCM_GEN_PWDB);
890 
891 	airoha_phy_pma1_set_bits(pcie_phy,
892 				 REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_GAIN_CTRL,
893 				 PCIE_FORCE_SEL_DA_PXP_RX_FE_PWDB);
894 	airoha_phy_pma1_update_field(pcie_phy,
895 				     REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_GAIN_CTRL,
896 				     PCIE_FORCE_DA_PXP_RX_FE_GAIN_CTRL, 0x3);
897 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_RX_FORCE_MODE0,
898 				     PCIE_FORCE_DA_XPON_RX_FE_GAIN_CTRL, 0x1);
899 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_SIGDET0,
900 				     PCIE_SIGDET_WIN_NONVLD_TIMES, 0x3);
901 	airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_SEQUENCE_DISB_CTRL1,
902 				   PCIE_DISB_RX_SDCAL_EN);
903 
904 	airoha_phy_pma1_set_bits(pcie_phy,
905 				 REG_PCIE_PMA_CTRL_SEQUENCE_FORCE_CTRL1,
906 				 PCIE_FORCE_RX_SDCAL_EN);
907 	usleep_range(150, 200);
908 	airoha_phy_pma1_clear_bits(pcie_phy,
909 				   REG_PCIE_PMA_CTRL_SEQUENCE_FORCE_CTRL1,
910 				   PCIE_FORCE_RX_SDCAL_EN);
911 }
912 
913 static void airoha_pcie_phy_set_rxflow(struct airoha_pcie_phy *pcie_phy)
914 {
915 	airoha_phy_pma0_set_bits(pcie_phy,
916 				 REG_PCIE_PMA_FORCE_DA_PXP_RX_SCAN_RST,
917 				 PCIE_FORCE_DA_PXP_RX_SIGDET_PWDB |
918 				 PCIE_FORCE_SEL_DA_PXP_RX_SIGDET_PWDB);
919 	airoha_phy_pma1_set_bits(pcie_phy,
920 				 REG_PCIE_PMA_FORCE_DA_PXP_RX_SCAN_RST,
921 				 PCIE_FORCE_DA_PXP_RX_SIGDET_PWDB |
922 				 PCIE_FORCE_SEL_DA_PXP_RX_SIGDET_PWDB);
923 
924 	airoha_phy_pma0_set_bits(pcie_phy,
925 				 REG_PCIE_PMA_FORCE_DA_PXP_CDR_PD_PWDB,
926 				 PCIE_FORCE_DA_PXP_CDR_PD_PWDB |
927 				 PCIE_FORCE_SEL_DA_PXP_CDR_PD_PWDB);
928 	airoha_phy_pma0_set_bits(pcie_phy,
929 				 REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_PWDB,
930 				 PCIE_FORCE_DA_PXP_RX_FE_PWDB |
931 				 PCIE_FORCE_SEL_DA_PXP_RX_FE_PWDB);
932 	airoha_phy_pma1_set_bits(pcie_phy,
933 				 REG_PCIE_PMA_FORCE_DA_PXP_CDR_PD_PWDB,
934 				 PCIE_FORCE_DA_PXP_CDR_PD_PWDB |
935 				 PCIE_FORCE_SEL_DA_PXP_CDR_PD_PWDB);
936 	airoha_phy_pma1_set_bits(pcie_phy,
937 				 REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_PWDB,
938 				 PCIE_FORCE_DA_PXP_RX_FE_PWDB |
939 				 PCIE_FORCE_SEL_DA_PXP_RX_FE_PWDB);
940 
941 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_RX0_PHYCK_DIV,
942 				   CSR_2L_PXP_RX0_PHYCK_RSTB |
943 				   CSR_2L_PXP_RX0_TDC_CK_SEL);
944 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_RX1_PHYCK_DIV,
945 				   CSR_2L_PXP_RX1_PHYCK_RSTB |
946 				   CSR_2L_PXP_RX1_TDC_CK_SEL);
947 
948 	airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_SW_RESET,
949 				 PCIE_SW_RX_FIFO_RST | PCIE_SW_TX_RST |
950 				 PCIE_SW_PMA_RST | PCIE_SW_ALLPCS_RST |
951 				 PCIE_SW_TX_FIFO_RST);
952 	airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_SW_RESET,
953 				 PCIE_SW_RX_FIFO_RST | PCIE_SW_TX_RST |
954 				 PCIE_SW_PMA_RST | PCIE_SW_ALLPCS_RST |
955 				 PCIE_SW_TX_FIFO_RST);
956 
957 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_PXP_RX0_FE_VB_EQ2,
958 				   CSR_2L_PXP_RX0_FE_VB_EQ2_EN |
959 				   CSR_2L_PXP_RX0_FE_VB_EQ3_EN);
960 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_RX0_SIGDET_VTH_SEL,
961 				   CSR_2L_PXP_RX0_FE_VB_EQ1_EN);
962 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_RX1_FE_VB_EQ1,
963 				   CSR_2L_PXP_RX1_FE_VB_EQ1_EN |
964 				   CSR_2L_PXP_RX1_FE_VB_EQ2_EN |
965 				   CSR_2L_PXP_RX1_FE_VB_EQ3_EN);
966 
967 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_REV0,
968 				       CSR_2L_PXP_FE_GAIN_NORMAL_MODE, 0x4);
969 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_REV0,
970 				       CSR_2L_PXP_FE_GAIN_TRAIN_MODE, 0x4);
971 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_REV0,
972 				       CSR_2L_PXP_FE_GAIN_NORMAL_MODE, 0x4);
973 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_REV0,
974 				       CSR_2L_PXP_FE_GAIN_TRAIN_MODE, 0x4);
975 }
976 
977 static void airoha_pcie_phy_set_pr(struct airoha_pcie_phy *pcie_phy)
978 {
979 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_PR_VREG_IBAND,
980 				       CSR_2L_PXP_CDR0_PR_VREG_IBAND, 0x5);
981 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_PR_VREG_IBAND,
982 				       CSR_2L_PXP_CDR0_PR_VREG_CKBUF, 0x5);
983 
984 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR0_PR_CKREF_DIV,
985 				     CSR_2L_PXP_CDR0_PR_CKREF_DIV);
986 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR0_PR_COR_HBW,
987 				     CSR_2L_PXP_CDR0_PR_CKREF_DIV1);
988 
989 	airoha_phy_csr_2l_update_field(pcie_phy,
990 				       REG_CSR_2L_CDR1_PR_VREG_IBAND_VAL,
991 				       CSR_2L_PXP_CDR1_PR_VREG_IBAND, 0x5);
992 	airoha_phy_csr_2l_update_field(pcie_phy,
993 				       REG_CSR_2L_CDR1_PR_VREG_IBAND_VAL,
994 				       CSR_2L_PXP_CDR1_PR_VREG_CKBUF, 0x5);
995 
996 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR1_PR_CKREF_DIV,
997 				     CSR_2L_PXP_CDR1_PR_CKREF_DIV);
998 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR1_PR_COR_HBW,
999 				     CSR_2L_PXP_CDR1_PR_CKREF_DIV1);
1000 
1001 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_LPF_RATIO,
1002 				       CSR_2L_PXP_CDR0_LPF_TOP_LIM, 0x20000);
1003 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR1_LPF_RATIO,
1004 				       CSR_2L_PXP_CDR1_LPF_TOP_LIM, 0x20000);
1005 
1006 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_PR_BETA_DAC,
1007 				       CSR_2L_PXP_CDR0_PR_BETA_SEL, 0x2);
1008 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR1_PR_BETA_DAC,
1009 				       CSR_2L_PXP_CDR1_PR_BETA_SEL, 0x2);
1010 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_PR_BETA_DAC,
1011 				       CSR_2L_PXP_CDR0_PR_KBAND_DIV, 0x4);
1012 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR1_PR_BETA_DAC,
1013 				       CSR_2L_PXP_CDR1_PR_KBAND_DIV, 0x4);
1014 }
1015 
1016 static void airoha_pcie_phy_set_txflow(struct airoha_pcie_phy *pcie_phy)
1017 {
1018 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TX0_CKLDO,
1019 				   CSR_2L_PXP_TX0_CKLDO_EN);
1020 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TX1_CKLDO,
1021 				   CSR_2L_PXP_TX1_CKLDO_EN);
1022 
1023 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TX0_CKLDO,
1024 				   CSR_2L_PXP_TX0_DMEDGEGEN_EN);
1025 	airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TX1_CKLDO,
1026 				   CSR_2L_PXP_TX1_DMEDGEGEN_EN);
1027 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TX1_MULTLANE,
1028 				     CSR_2L_PXP_TX1_MULTLANE_EN);
1029 }
1030 
1031 static void airoha_pcie_phy_set_rx_mode(struct airoha_pcie_phy *pcie_phy)
1032 {
1033 	writel(0x804000, pcie_phy->pma0 + REG_PCIE_PMA_DIG_RESERVE_27);
1034 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18,
1035 				     PCIE_PXP_RX_VTH_SEL_PCIE_G1, 0x5);
1036 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18,
1037 				     PCIE_PXP_RX_VTH_SEL_PCIE_G2, 0x5);
1038 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18,
1039 				     PCIE_PXP_RX_VTH_SEL_PCIE_G3, 0x5);
1040 	airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_30,
1041 				 0x77700);
1042 
1043 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR0_PR_MONCK,
1044 				     CSR_2L_PXP_CDR0_PR_MONCK_ENABLE);
1045 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_PR_MONCK,
1046 				       CSR_2L_PXP_CDR0_PR_RESERVE0, 0x2);
1047 	airoha_phy_csr_2l_update_field(pcie_phy,
1048 				       REG_CSR_2L_PXP_RX0_OSCAL_CTLE1IOS,
1049 				       CSR_2L_PXP_RX0_PR_OSCAL_VGA1IOS, 0x19);
1050 	airoha_phy_csr_2l_update_field(pcie_phy,
1051 				       REG_CSR_2L_PXP_RX0_OSCA_VGA1VOS,
1052 				       CSR_2L_PXP_RX0_PR_OSCAL_VGA1VOS, 0x19);
1053 	airoha_phy_csr_2l_update_field(pcie_phy,
1054 				       REG_CSR_2L_PXP_RX0_OSCA_VGA1VOS,
1055 				       CSR_2L_PXP_RX0_PR_OSCAL_VGA2IOS, 0x14);
1056 
1057 	writel(0x804000, pcie_phy->pma1 + REG_PCIE_PMA_DIG_RESERVE_27);
1058 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18,
1059 				     PCIE_PXP_RX_VTH_SEL_PCIE_G1, 0x5);
1060 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18,
1061 				     PCIE_PXP_RX_VTH_SEL_PCIE_G2, 0x5);
1062 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18,
1063 				     PCIE_PXP_RX_VTH_SEL_PCIE_G3, 0x5);
1064 
1065 	airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_30,
1066 				 0x77700);
1067 
1068 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR1_PR_MONCK,
1069 				     CSR_2L_PXP_CDR1_PR_MONCK_ENABLE);
1070 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR1_PR_MONCK,
1071 				       CSR_2L_PXP_CDR1_PR_RESERVE0, 0x2);
1072 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_OSCAL_VGA1IOS,
1073 				       CSR_2L_PXP_RX1_PR_OSCAL_VGA1IOS, 0x19);
1074 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_OSCAL_VGA1IOS,
1075 				       CSR_2L_PXP_RX1_PR_OSCAL_VGA1VOS, 0x19);
1076 	airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_OSCAL_VGA1IOS,
1077 				       CSR_2L_PXP_RX1_PR_OSCAL_VGA2IOS, 0x14);
1078 }
1079 
1080 static void airoha_pcie_phy_load_kflow(struct airoha_pcie_phy *pcie_phy)
1081 {
1082 	airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_12,
1083 				     PCIE_FORCE_PMA_RX_SPEED, 0xa);
1084 	airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_12,
1085 				     PCIE_FORCE_PMA_RX_SPEED, 0xa);
1086 	airoha_phy_init_lane0_rx_fw_pre_calib(pcie_phy, PCIE_PORT_GEN3);
1087 	airoha_phy_init_lane1_rx_fw_pre_calib(pcie_phy, PCIE_PORT_GEN3);
1088 
1089 	airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_12,
1090 				   PCIE_FORCE_PMA_RX_SPEED);
1091 	airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_12,
1092 				   PCIE_FORCE_PMA_RX_SPEED);
1093 	usleep_range(100, 200);
1094 
1095 	airoha_phy_init_lane0_rx_fw_pre_calib(pcie_phy, PCIE_PORT_GEN2);
1096 	airoha_phy_init_lane1_rx_fw_pre_calib(pcie_phy, PCIE_PORT_GEN2);
1097 }
1098 
1099 /**
1100  * airoha_pcie_phy_init() - Initialize the phy
1101  * @phy: the phy to be initialized
1102  *
1103  * Initialize the phy registers.
1104  * The hardware settings will be reset during suspend, it should be
1105  * reinitialized when the consumer calls phy_init() again on resume.
1106  */
1107 static int airoha_pcie_phy_init(struct phy *phy)
1108 {
1109 	struct airoha_pcie_phy *pcie_phy = phy_get_drvdata(phy);
1110 	u32 val;
1111 
1112 	/* Setup Tx-Rx detection time */
1113 	val = FIELD_PREP(PCIE_XTP_RXDET_VCM_OFF_STB_T_SEL, 0x33) |
1114 	      FIELD_PREP(PCIE_XTP_RXDET_EN_STB_T_SEL, 0x1) |
1115 	      FIELD_PREP(PCIE_XTP_RXDET_FINISH_STB_T_SEL, 0x2) |
1116 	      FIELD_PREP(PCIE_XTP_TXPD_TX_DATA_EN_DLY, 0x3) |
1117 	      FIELD_PREP(PCIE_XTP_RXDET_LATCH_STB_T_SEL, 0x1);
1118 	writel(val, pcie_phy->p0_xr_dtime + REG_PCIE_PEXTP_DIG_GLB44);
1119 	writel(val, pcie_phy->p1_xr_dtime + REG_PCIE_PEXTP_DIG_GLB44);
1120 	/* Setup Rx AEQ training time */
1121 	val = FIELD_PREP(PCIE_XTP_LN_RX_PDOWN_L1P2_EXIT_WAIT, 0x32) |
1122 	      FIELD_PREP(PCIE_XTP_LN_RX_PDOWN_E0_AEQEN_WAIT, 0x5050);
1123 	writel(val, pcie_phy->rx_aeq + REG_PCIE_PEXTP_DIG_LN_RX30_P0);
1124 	writel(val, pcie_phy->rx_aeq + REG_PCIE_PEXTP_DIG_LN_RX30_P1);
1125 
1126 	/* enable load FLL-K flow */
1127 	airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_14,
1128 				 PCIE_FLL_LOAD_EN);
1129 	airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_14,
1130 				 PCIE_FLL_LOAD_EN);
1131 
1132 	airoha_pcie_phy_init_default(pcie_phy);
1133 	airoha_pcie_phy_init_clk_out(pcie_phy);
1134 	airoha_pcie_phy_init_csr_2l(pcie_phy);
1135 
1136 	usleep_range(100, 200);
1137 
1138 	airoha_pcie_phy_init_rx(pcie_phy);
1139 	/* phase 1, no ssc for K TXPLL */
1140 	airoha_pcie_phy_init_jcpll(pcie_phy);
1141 
1142 	usleep_range(500, 600);
1143 
1144 	/* TX PLL settings */
1145 	airoha_pcie_phy_txpll(pcie_phy);
1146 
1147 	usleep_range(200, 300);
1148 
1149 	/* SSC JCPLL setting */
1150 	airoha_pcie_phy_init_ssc_jcpll(pcie_phy);
1151 
1152 	usleep_range(100, 200);
1153 
1154 	/* Rx lan0 signal detect */
1155 	airoha_pcie_phy_set_rxlan0_signal_detect(pcie_phy);
1156 	/* Rx lan1 signal detect */
1157 	airoha_pcie_phy_set_rxlan1_signal_detect(pcie_phy);
1158 	/* RX FLOW */
1159 	airoha_pcie_phy_set_rxflow(pcie_phy);
1160 
1161 	usleep_range(100, 200);
1162 
1163 	airoha_pcie_phy_set_pr(pcie_phy);
1164 	/* TX FLOW */
1165 	airoha_pcie_phy_set_txflow(pcie_phy);
1166 
1167 	usleep_range(100, 200);
1168 	/* RX mode setting */
1169 	airoha_pcie_phy_set_rx_mode(pcie_phy);
1170 	/* Load K-Flow */
1171 	airoha_pcie_phy_load_kflow(pcie_phy);
1172 	airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_SS_DA_XPON_PWDB0,
1173 				   PCIE_DA_XPON_CDR_PR_PWDB);
1174 	airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_SS_DA_XPON_PWDB0,
1175 				   PCIE_DA_XPON_CDR_PR_PWDB);
1176 
1177 	usleep_range(100, 200);
1178 
1179 	airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_SS_DA_XPON_PWDB0,
1180 				 PCIE_DA_XPON_CDR_PR_PWDB);
1181 	airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_SS_DA_XPON_PWDB0,
1182 				 PCIE_DA_XPON_CDR_PR_PWDB);
1183 
1184 	usleep_range(100, 200);
1185 
1186 	return 0;
1187 }
1188 
1189 static int airoha_pcie_phy_exit(struct phy *phy)
1190 {
1191 	struct airoha_pcie_phy *pcie_phy = phy_get_drvdata(phy);
1192 
1193 	airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_SW_RESET,
1194 				   PCIE_PMA_SW_RST);
1195 	airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_SW_RESET,
1196 				   PCIE_PMA_SW_RST);
1197 	airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC,
1198 				     CSR_2L_PXP_JCPLL_SSC_PHASE_INI |
1199 				     CSR_2L_PXP_JCPLL_SSC_TRI_EN |
1200 				     CSR_2L_PXP_JCPLL_SSC_EN);
1201 
1202 	return 0;
1203 }
1204 
1205 static const struct phy_ops airoha_pcie_phy_ops = {
1206 	.init = airoha_pcie_phy_init,
1207 	.exit = airoha_pcie_phy_exit,
1208 	.owner = THIS_MODULE,
1209 };
1210 
1211 static int airoha_pcie_phy_probe(struct platform_device *pdev)
1212 {
1213 	struct airoha_pcie_phy *pcie_phy;
1214 	struct device *dev = &pdev->dev;
1215 	struct phy_provider *provider;
1216 
1217 	pcie_phy = devm_kzalloc(dev, sizeof(*pcie_phy), GFP_KERNEL);
1218 	if (!pcie_phy)
1219 		return -ENOMEM;
1220 
1221 	pcie_phy->csr_2l = devm_platform_ioremap_resource_byname(pdev, "csr-2l");
1222 	if (IS_ERR(pcie_phy->csr_2l))
1223 		return dev_err_probe(dev, PTR_ERR(pcie_phy->csr_2l),
1224 				     "Failed to map phy-csr-2l base\n");
1225 
1226 	pcie_phy->pma0 = devm_platform_ioremap_resource_byname(pdev, "pma0");
1227 	if (IS_ERR(pcie_phy->pma0))
1228 		return dev_err_probe(dev, PTR_ERR(pcie_phy->pma0),
1229 				     "Failed to map phy-pma0 base\n");
1230 
1231 	pcie_phy->pma1 = devm_platform_ioremap_resource_byname(pdev, "pma1");
1232 	if (IS_ERR(pcie_phy->pma1))
1233 		return dev_err_probe(dev, PTR_ERR(pcie_phy->pma1),
1234 				     "Failed to map phy-pma1 base\n");
1235 
1236 	pcie_phy->phy = devm_phy_create(dev, dev->of_node, &airoha_pcie_phy_ops);
1237 	if (IS_ERR(pcie_phy->phy))
1238 		return dev_err_probe(dev, PTR_ERR(pcie_phy->phy),
1239 				     "Failed to create PCIe phy\n");
1240 
1241 	pcie_phy->p0_xr_dtime =
1242 		devm_platform_ioremap_resource_byname(pdev, "p0-xr-dtime");
1243 	if (IS_ERR(pcie_phy->p0_xr_dtime))
1244 		return dev_err_probe(dev, PTR_ERR(pcie_phy->p0_xr_dtime),
1245 				     "Failed to map P0 Tx-Rx dtime base\n");
1246 
1247 	pcie_phy->p1_xr_dtime =
1248 		devm_platform_ioremap_resource_byname(pdev, "p1-xr-dtime");
1249 	if (IS_ERR(pcie_phy->p1_xr_dtime))
1250 		return dev_err_probe(dev, PTR_ERR(pcie_phy->p1_xr_dtime),
1251 				     "Failed to map P1 Tx-Rx dtime base\n");
1252 
1253 	pcie_phy->rx_aeq = devm_platform_ioremap_resource_byname(pdev, "rx-aeq");
1254 	if (IS_ERR(pcie_phy->rx_aeq))
1255 		return dev_err_probe(dev, PTR_ERR(pcie_phy->rx_aeq),
1256 				     "Failed to map Rx AEQ base\n");
1257 
1258 	pcie_phy->dev = dev;
1259 	phy_set_drvdata(pcie_phy->phy, pcie_phy);
1260 
1261 	provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
1262 	if (IS_ERR(provider))
1263 		return dev_err_probe(dev, PTR_ERR(provider),
1264 				     "PCIe phy probe failed\n");
1265 
1266 	return 0;
1267 }
1268 
1269 static const struct of_device_id airoha_pcie_phy_of_match[] = {
1270 	{ .compatible = "airoha,en7581-pcie-phy" },
1271 	{ /* sentinel */ }
1272 };
1273 MODULE_DEVICE_TABLE(of, airoha_pcie_phy_of_match);
1274 
1275 static struct platform_driver airoha_pcie_phy_driver = {
1276 	.probe	= airoha_pcie_phy_probe,
1277 	.driver	= {
1278 		.name = "airoha-pcie-phy",
1279 		.of_match_table = airoha_pcie_phy_of_match,
1280 	},
1281 };
1282 module_platform_driver(airoha_pcie_phy_driver);
1283 
1284 MODULE_DESCRIPTION("Airoha PCIe PHY driver");
1285 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
1286 MODULE_LICENSE("GPL");
1287