xref: /linux/drivers/net/phy/motorcomm.c (revision 87579b8cda9ec6ecba8327c59d8505d3b83fda98)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Motorcomm 8511/8521/8522/8531/8531S/8821 PHY driver.
4  *
5  * Author: Peter Geis <pgwipeout@gmail.com>
6  * Author: Frank <Frank.Sae@motor-comm.com>
7  */
8 
9 #include <linux/clk.h>
10 #include <linux/etherdevice.h>
11 #include <linux/kernel.h>
12 #include <linux/module.h>
13 #include <linux/phy.h>
14 #include <linux/property.h>
15 
16 #define PHY_ID_YT8511		0x0000010a
17 #define PHY_ID_YT8521		0x0000011a
18 #define PHY_ID_YT8522		0x4f51e928
19 #define PHY_ID_YT8531		0x4f51e91b
20 #define PHY_ID_YT8531S		0x4f51e91a
21 #define PHY_ID_YT8821		0x4f51ea19
22 /* YT8521/YT8531S/YT8821 Register Overview
23  *	UTP Register space	|	FIBER Register space
24  *  ------------------------------------------------------------
25  * |	UTP MII			|	FIBER MII		|
26  * |	UTP MMD			|				|
27  * |	UTP Extended		|	FIBER Extended		|
28  *  ------------------------------------------------------------
29  * |			Common Extended				|
30  *  ------------------------------------------------------------
31  */
32 
33 /* 0x10 ~ 0x15 , 0x1E and 0x1F are common MII registers of yt phy */
34 
35 /* Specific Function Control Register */
36 #define YTPHY_SPECIFIC_FUNCTION_CONTROL_REG	0x10
37 
38 /* 2b00 Manual MDI configuration
39  * 2b01 Manual MDIX configuration
40  * 2b10 Reserved
41  * 2b11 Enable automatic crossover for all modes  *default*
42  */
43 #define YTPHY_SFCR_MDI_CROSSOVER_MODE_MASK	(BIT(6) | BIT(5))
44 #define YTPHY_SFCR_CROSSOVER_EN			BIT(3)
45 #define YTPHY_SFCR_SQE_TEST_EN			BIT(2)
46 #define YTPHY_SFCR_POLARITY_REVERSAL_EN		BIT(1)
47 #define YTPHY_SFCR_JABBER_DIS			BIT(0)
48 
49 /* Specific Status Register */
50 #define YTPHY_SPECIFIC_STATUS_REG		0x11
51 #define YTPHY_SSR_SPEED_MASK			((0x3 << 14) | BIT(9))
52 #define YTPHY_SSR_SPEED_10M			((0x0 << 14))
53 #define YTPHY_SSR_SPEED_100M			((0x1 << 14))
54 #define YTPHY_SSR_SPEED_1000M			((0x2 << 14))
55 #define YTPHY_SSR_SPEED_10G			((0x3 << 14))
56 #define YTPHY_SSR_SPEED_2500M			((0x0 << 14) | BIT(9))
57 #define YTPHY_SSR_DUPLEX_OFFSET			13
58 #define YTPHY_SSR_DUPLEX			BIT(13)
59 #define YTPHY_SSR_PAGE_RECEIVED			BIT(12)
60 #define YTPHY_SSR_SPEED_DUPLEX_RESOLVED		BIT(11)
61 #define YTPHY_SSR_LINK				BIT(10)
62 #define YTPHY_SSR_MDIX_CROSSOVER		BIT(6)
63 #define YTPHY_SSR_DOWNGRADE			BIT(5)
64 #define YTPHY_SSR_TRANSMIT_PAUSE		BIT(3)
65 #define YTPHY_SSR_RECEIVE_PAUSE			BIT(2)
66 #define YTPHY_SSR_POLARITY			BIT(1)
67 #define YTPHY_SSR_JABBER			BIT(0)
68 
69 /* Interrupt enable Register */
70 #define YTPHY_INTERRUPT_ENABLE_REG		0x12
71 #define YTPHY_IER_WOL				BIT(6)
72 
73 /* Interrupt Status Register */
74 #define YTPHY_INTERRUPT_STATUS_REG		0x13
75 #define YTPHY_ISR_AUTONEG_ERR			BIT(15)
76 #define YTPHY_ISR_SPEED_CHANGED			BIT(14)
77 #define YTPHY_ISR_DUPLEX_CHANGED		BIT(13)
78 #define YTPHY_ISR_PAGE_RECEIVED			BIT(12)
79 #define YTPHY_ISR_LINK_FAILED			BIT(11)
80 #define YTPHY_ISR_LINK_SUCCESSED		BIT(10)
81 #define YTPHY_ISR_WOL				BIT(6)
82 #define YTPHY_ISR_WIRESPEED_DOWNGRADE		BIT(5)
83 #define YTPHY_ISR_SERDES_LINK_FAILED		BIT(3)
84 #define YTPHY_ISR_SERDES_LINK_SUCCESSED		BIT(2)
85 #define YTPHY_ISR_POLARITY_CHANGED		BIT(1)
86 #define YTPHY_ISR_JABBER_HAPPENED		BIT(0)
87 
88 /* Speed Auto Downgrade Control Register */
89 #define YTPHY_SPEED_AUTO_DOWNGRADE_CONTROL_REG	0x14
90 #define YTPHY_SADCR_SPEED_DOWNGRADE_EN		BIT(5)
91 
92 /* If these bits are set to 3, the PHY attempts five times ( 3(set value) +
93  * additional 2) before downgrading, default 0x3
94  */
95 #define YTPHY_SADCR_SPEED_RETRY_LIMIT		(0x3 << 2)
96 
97 /* Rx Error Counter Register */
98 #define YTPHY_RX_ERROR_COUNTER_REG		0x15
99 
100 /* Extended Register's Address Offset Register */
101 #define YTPHY_PAGE_SELECT			0x1E
102 
103 /* Extended Register's Data Register */
104 #define YTPHY_PAGE_DATA				0x1F
105 
106 /* FIBER Auto-Negotiation link partner ability */
107 #define YTPHY_FLPA_PAUSE			(0x3 << 7)
108 #define YTPHY_FLPA_ASYM_PAUSE			(0x2 << 7)
109 
110 #define YT8511_PAGE_SELECT	0x1e
111 #define YT8511_PAGE		0x1f
112 #define YT8511_EXT_CLK_GATE	0x0c
113 #define YT8511_EXT_DELAY_DRIVE	0x0d
114 #define YT8511_EXT_SLEEP_CTRL	0x27
115 
116 /* 2b00 25m from pll
117  * 2b01 25m from xtl *default*
118  * 2b10 62.m from pll
119  * 2b11 125m from pll
120  */
121 #define YT8511_CLK_125M		(BIT(2) | BIT(1))
122 #define YT8511_PLLON_SLP	BIT(14)
123 
124 /* RX Delay enabled = 1.8ns 1000T, 8ns 10/100T */
125 #define YT8511_DELAY_RX		BIT(0)
126 
127 /* TX Gig-E Delay is bits 7:4, default 0x5
128  * TX Fast-E Delay is bits 15:12, default 0xf
129  * Delay = 150ps * N - 250ps
130  * On = 2000ps, off = 50ps
131  */
132 #define YT8511_DELAY_GE_TX_EN	(0xf << 4)
133 #define YT8511_DELAY_GE_TX_DIS	(0x2 << 4)
134 #define YT8511_DELAY_FE_TX_EN	(0xf << 12)
135 #define YT8511_DELAY_FE_TX_DIS	(0x2 << 12)
136 
137 /* Extended register is different from MMD Register and MII Register.
138  * We can use ytphy_read_ext/ytphy_write_ext/ytphy_modify_ext function to
139  * operate extended register.
140  * Extended Register  start
141  */
142 
143 /* Phy gmii clock gating Register */
144 #define YT8521_CLOCK_GATING_REG			0xC
145 #define YT8521_CGR_RX_CLK_EN			BIT(12)
146 
147 #define YT8521_EXTREG_SLEEP_CONTROL1_REG	0x27
148 #define YT8521_ESC1R_SLEEP_SW			BIT(15)
149 #define YT8521_ESC1R_PLLON_SLP			BIT(14)
150 
151 /* Phy fiber Link timer cfg2 Register */
152 #define YT8521_LINK_TIMER_CFG2_REG		0xA5
153 #define YT8521_LTCR_EN_AUTOSEN			BIT(15)
154 
155 /* 0xA000, 0xA001, 0xA003, 0xA006 ~ 0xA00A and 0xA012 are common ext registers
156  * of yt8521 phy. There is no need to switch reg space when operating these
157  * registers.
158  */
159 
160 #define YT8521_REG_SPACE_SELECT_REG		0xA000
161 #define YT8521_RSSR_SPACE_MASK			BIT(1)
162 #define YT8521_RSSR_FIBER_SPACE			(0x1 << 1)
163 #define YT8521_RSSR_UTP_SPACE			(0x0 << 1)
164 #define YT8521_RSSR_TO_BE_ARBITRATED		(0xFF)
165 
166 #define YT8521_CHIP_CONFIG_REG			0xA001
167 #define YT8521_CCR_SW_RST			BIT(15)
168 #define YT8531_RGMII_LDO_VOL_MASK		GENMASK(5, 4)
169 #define YT8531_LDO_VOL_3V3			0x0
170 #define YT8531_LDO_VOL_1V8			0x2
171 
172 /* 1b0 disable 1.9ns rxc clock delay  *default*
173  * 1b1 enable 1.9ns rxc clock delay
174  */
175 #define YT8521_CCR_RXC_DLY_EN			BIT(8)
176 #define YT8521_CCR_RXC_DLY_1_900_NS		1900
177 
178 #define YT8521_CCR_MODE_SEL_MASK		(BIT(2) | BIT(1) | BIT(0))
179 #define YT8521_CCR_MODE_UTP_TO_RGMII		0
180 #define YT8521_CCR_MODE_FIBER_TO_RGMII		1
181 #define YT8521_CCR_MODE_UTP_FIBER_TO_RGMII	2
182 #define YT8521_CCR_MODE_UTP_TO_SGMII		3
183 #define YT8521_CCR_MODE_SGPHY_TO_RGMAC		4
184 #define YT8521_CCR_MODE_SGMAC_TO_RGPHY		5
185 #define YT8521_CCR_MODE_UTP_TO_FIBER_AUTO	6
186 #define YT8521_CCR_MODE_UTP_TO_FIBER_FORCE	7
187 
188 /* 3 phy polling modes,poll mode combines utp and fiber mode*/
189 #define YT8521_MODE_FIBER			0x1
190 #define YT8521_MODE_UTP				0x2
191 #define YT8521_MODE_POLL			0x3
192 
193 #define YT8521_RGMII_CONFIG1_REG		0xA003
194 /* 1b0 use original tx_clk_rgmii  *default*
195  * 1b1 use inverted tx_clk_rgmii.
196  */
197 #define YT8521_RC1R_TX_CLK_SEL_INVERTED		BIT(14)
198 #define YT8521_RC1R_RX_DELAY_MASK		GENMASK(13, 10)
199 #define YT8521_RC1R_FE_TX_DELAY_MASK		GENMASK(7, 4)
200 #define YT8521_RC1R_GE_TX_DELAY_MASK		GENMASK(3, 0)
201 #define YT8521_RC1R_RGMII_0_000_NS		0
202 #define YT8521_RC1R_RGMII_0_150_NS		1
203 #define YT8521_RC1R_RGMII_0_300_NS		2
204 #define YT8521_RC1R_RGMII_0_450_NS		3
205 #define YT8521_RC1R_RGMII_0_600_NS		4
206 #define YT8521_RC1R_RGMII_0_750_NS		5
207 #define YT8521_RC1R_RGMII_0_900_NS		6
208 #define YT8521_RC1R_RGMII_1_050_NS		7
209 #define YT8521_RC1R_RGMII_1_200_NS		8
210 #define YT8521_RC1R_RGMII_1_350_NS		9
211 #define YT8521_RC1R_RGMII_1_500_NS		10
212 #define YT8521_RC1R_RGMII_1_650_NS		11
213 #define YT8521_RC1R_RGMII_1_800_NS		12
214 #define YT8521_RC1R_RGMII_1_950_NS		13
215 #define YT8521_RC1R_RGMII_2_100_NS		14
216 #define YT8521_RC1R_RGMII_2_250_NS		15
217 
218 /* LED CONFIG */
219 #define YT8521_MAX_LEDS				3
220 #define YT8521_LED0_CFG_REG			0xA00C
221 #define YT8521_LED1_CFG_REG			0xA00D
222 #define YT8521_LED2_CFG_REG			0xA00E
223 #define YT8521_LED_ACT_BLK_IND			BIT(13)
224 #define YT8521_LED_FDX_ON_EN			BIT(12)
225 #define YT8521_LED_HDX_ON_EN			BIT(11)
226 #define YT8521_LED_TXACT_BLK_EN			BIT(10)
227 #define YT8521_LED_RXACT_BLK_EN			BIT(9)
228 #define YT8521_LED_1000_ON_EN			BIT(6)
229 #define YT8521_LED_100_ON_EN			BIT(5)
230 #define YT8521_LED_10_ON_EN			BIT(4)
231 
232 #define YT8522_EXTREG_SLEEP_CONTROL		0x2027
233 #define YT8522_EN_SLEEP_SW			BIT(15)
234 
235 #define YT8522_EXTENDED_COMBO_CTRL		0x4000
236 #define YT8522_RXDV_SEL				BIT(4)
237 #define YT8522_RMII_EN				BIT(1)
238 
239 #define YTPHY_MISC_CONFIG_REG			0xA006
240 #define YTPHY_MCR_FIBER_SPEED_MASK		BIT(0)
241 #define YTPHY_MCR_FIBER_1000BX			(0x1 << 0)
242 #define YTPHY_MCR_FIBER_100FX			(0x0 << 0)
243 
244 /* WOL MAC ADDR: MACADDR2(highest), MACADDR1(middle), MACADDR0(lowest) */
245 #define YTPHY_WOL_MACADDR2_REG			0xA007
246 #define YTPHY_WOL_MACADDR1_REG			0xA008
247 #define YTPHY_WOL_MACADDR0_REG			0xA009
248 
249 #define YTPHY_WOL_CONFIG_REG			0xA00A
250 #define YTPHY_WCR_INTR_SEL			BIT(6)
251 #define YTPHY_WCR_ENABLE			BIT(3)
252 
253 /* 2b00 84ms
254  * 2b01 168ms  *default*
255  * 2b10 336ms
256  * 2b11 672ms
257  */
258 #define YTPHY_WCR_PULSE_WIDTH_MASK		(BIT(2) | BIT(1))
259 #define YTPHY_WCR_PULSE_WIDTH_672MS		(BIT(2) | BIT(1))
260 
261 /* 1b0 Interrupt and WOL events is level triggered and active LOW  *default*
262  * 1b1 Interrupt and WOL events is pulse triggered and active LOW
263  */
264 #define YTPHY_WCR_TYPE_PULSE			BIT(0)
265 
266 #define YTPHY_PAD_DRIVE_STRENGTH_REG		0xA010
267 #define YT8531_RGMII_RXC_DS_MASK		GENMASK(15, 13)
268 #define YT8531_RGMII_RXD_DS_HI_MASK		BIT(12)		/* Bit 2 of rxd_ds */
269 #define YT8531_RGMII_RXD_DS_LOW_MASK		GENMASK(5, 4)	/* Bit 1/0 of rxd_ds */
270 #define YT8531_RGMII_RX_DS_DEFAULT		0x3
271 
272 #define YTPHY_SYNCE_CFG_REG			0xA012
273 #define YT8521_SCR_SYNCE_ENABLE			BIT(5)
274 /* 1b0 output 25m clock
275  * 1b1 output 125m clock  *default*
276  */
277 #define YT8521_SCR_CLK_FRE_SEL_125M		BIT(3)
278 #define YT8521_SCR_CLK_SRC_MASK			GENMASK(2, 1)
279 #define YT8521_SCR_CLK_SRC_PLL_125M		0
280 #define YT8521_SCR_CLK_SRC_UTP_RX		1
281 #define YT8521_SCR_CLK_SRC_SDS_RX		2
282 #define YT8521_SCR_CLK_SRC_REF_25M		3
283 #define YT8531_SCR_SYNCE_ENABLE			BIT(6)
284 /* 1b0 output 25m clock   *default*
285  * 1b1 output 125m clock
286  */
287 #define YT8531_SCR_CLK_FRE_SEL_125M		BIT(4)
288 #define YT8531_SCR_CLK_SRC_MASK			GENMASK(3, 1)
289 #define YT8531_SCR_CLK_SRC_PLL_125M		0
290 #define YT8531_SCR_CLK_SRC_UTP_RX		1
291 #define YT8531_SCR_CLK_SRC_SDS_RX		2
292 #define YT8531_SCR_CLK_SRC_CLOCK_FROM_DIGITAL	3
293 #define YT8531_SCR_CLK_SRC_REF_25M		4
294 #define YT8531_SCR_CLK_SRC_SSC_25M		5
295 
296 #define YT8821_SDS_EXT_CSR_CTRL_REG			0x23
297 #define YT8821_SDS_EXT_CSR_VCO_LDO_EN			BIT(15)
298 #define YT8821_SDS_EXT_CSR_VCO_BIAS_LPF_EN		BIT(8)
299 
300 #define YT8821_UTP_EXT_PI_CTRL_REG			0x56
301 #define YT8821_UTP_EXT_PI_RST_N_FIFO			BIT(5)
302 #define YT8821_UTP_EXT_PI_TX_CLK_SEL_AFE		BIT(4)
303 #define YT8821_UTP_EXT_PI_RX_CLK_3_SEL_AFE		BIT(3)
304 #define YT8821_UTP_EXT_PI_RX_CLK_2_SEL_AFE		BIT(2)
305 #define YT8821_UTP_EXT_PI_RX_CLK_1_SEL_AFE		BIT(1)
306 #define YT8821_UTP_EXT_PI_RX_CLK_0_SEL_AFE		BIT(0)
307 
308 #define YT8821_UTP_EXT_VCT_CFG6_CTRL_REG		0x97
309 #define YT8821_UTP_EXT_FECHO_AMP_TH_HUGE		GENMASK(15, 8)
310 
311 #define YT8821_UTP_EXT_ECHO_CTRL_REG			0x336
312 #define YT8821_UTP_EXT_TRACE_LNG_GAIN_THR_1000		GENMASK(14, 8)
313 
314 #define YT8821_UTP_EXT_GAIN_CTRL_REG			0x340
315 #define YT8821_UTP_EXT_TRACE_MED_GAIN_THR_1000		GENMASK(6, 0)
316 
317 #define YT8821_UTP_EXT_RPDN_CTRL_REG			0x34E
318 #define YT8821_UTP_EXT_RPDN_BP_FFE_LNG_2500		BIT(15)
319 #define YT8821_UTP_EXT_RPDN_BP_FFE_SHT_2500		BIT(7)
320 #define YT8821_UTP_EXT_RPDN_IPR_SHT_2500		GENMASK(6, 0)
321 
322 #define YT8821_UTP_EXT_TH_20DB_2500_CTRL_REG		0x36A
323 #define YT8821_UTP_EXT_TH_20DB_2500			GENMASK(15, 0)
324 
325 #define YT8821_UTP_EXT_TRACE_CTRL_REG			0x372
326 #define YT8821_UTP_EXT_TRACE_LNG_GAIN_THE_2500		GENMASK(14, 8)
327 #define YT8821_UTP_EXT_TRACE_MED_GAIN_THE_2500		GENMASK(6, 0)
328 
329 #define YT8821_UTP_EXT_ALPHA_IPR_CTRL_REG		0x374
330 #define YT8821_UTP_EXT_ALPHA_SHT_2500			GENMASK(14, 8)
331 #define YT8821_UTP_EXT_IPR_LNG_2500			GENMASK(6, 0)
332 
333 #define YT8821_UTP_EXT_PLL_CTRL_REG			0x450
334 #define YT8821_UTP_EXT_PLL_SPARE_CFG			GENMASK(7, 0)
335 
336 #define YT8821_UTP_EXT_DAC_IMID_CH_2_3_CTRL_REG		0x466
337 #define YT8821_UTP_EXT_DAC_IMID_CH_3_10_ORG		GENMASK(14, 8)
338 #define YT8821_UTP_EXT_DAC_IMID_CH_2_10_ORG		GENMASK(6, 0)
339 
340 #define YT8821_UTP_EXT_DAC_IMID_CH_0_1_CTRL_REG		0x467
341 #define YT8821_UTP_EXT_DAC_IMID_CH_1_10_ORG		GENMASK(14, 8)
342 #define YT8821_UTP_EXT_DAC_IMID_CH_0_10_ORG		GENMASK(6, 0)
343 
344 #define YT8821_UTP_EXT_DAC_IMSB_CH_2_3_CTRL_REG		0x468
345 #define YT8821_UTP_EXT_DAC_IMSB_CH_3_10_ORG		GENMASK(14, 8)
346 #define YT8821_UTP_EXT_DAC_IMSB_CH_2_10_ORG		GENMASK(6, 0)
347 
348 #define YT8821_UTP_EXT_DAC_IMSB_CH_0_1_CTRL_REG		0x469
349 #define YT8821_UTP_EXT_DAC_IMSB_CH_1_10_ORG		GENMASK(14, 8)
350 #define YT8821_UTP_EXT_DAC_IMSB_CH_0_10_ORG		GENMASK(6, 0)
351 
352 #define YT8821_UTP_EXT_MU_COARSE_FR_CTRL_REG		0x4B3
353 #define YT8821_UTP_EXT_MU_COARSE_FR_F_FFE		GENMASK(14, 12)
354 #define YT8821_UTP_EXT_MU_COARSE_FR_F_FBE		GENMASK(10, 8)
355 
356 #define YT8821_UTP_EXT_MU_FINE_FR_CTRL_REG		0x4B5
357 #define YT8821_UTP_EXT_MU_FINE_FR_F_FFE			GENMASK(14, 12)
358 #define YT8821_UTP_EXT_MU_FINE_FR_F_FBE			GENMASK(10, 8)
359 
360 #define YT8821_UTP_EXT_VGA_LPF1_CAP_CTRL_REG		0x4D2
361 #define YT8821_UTP_EXT_VGA_LPF1_CAP_OTHER		GENMASK(7, 4)
362 #define YT8821_UTP_EXT_VGA_LPF1_CAP_2500		GENMASK(3, 0)
363 
364 #define YT8821_UTP_EXT_VGA_LPF2_CAP_CTRL_REG		0x4D3
365 #define YT8821_UTP_EXT_VGA_LPF2_CAP_OTHER		GENMASK(7, 4)
366 #define YT8821_UTP_EXT_VGA_LPF2_CAP_2500		GENMASK(3, 0)
367 
368 #define YT8821_UTP_EXT_TXGE_NFR_FR_THP_CTRL_REG		0x660
369 #define YT8821_UTP_EXT_NFR_TX_ABILITY			BIT(3)
370 /* Extended Register  end */
371 
372 #define YTPHY_DTS_OUTPUT_CLK_DIS		0
373 #define YTPHY_DTS_OUTPUT_CLK_25M		25000000
374 #define YTPHY_DTS_OUTPUT_CLK_125M		125000000
375 
376 #define YT8821_CHIP_MODE_AUTO_BX2500_SGMII	0
377 #define YT8821_CHIP_MODE_FORCE_BX2500		1
378 
379 struct yt8521_priv {
380 	/* combo_advertising is used for case of YT8521 in combo mode,
381 	 * this means that yt8521 may work in utp or fiber mode which depends
382 	 * on which media is connected (YT8521_RSSR_TO_BE_ARBITRATED).
383 	 */
384 	__ETHTOOL_DECLARE_LINK_MODE_MASK(combo_advertising);
385 
386 	/* YT8521_MODE_FIBER / YT8521_MODE_UTP / YT8521_MODE_POLL*/
387 	u8 polling_mode;
388 	u8 strap_mode; /* 8 working modes  */
389 	/* current reg page of yt8521 phy:
390 	 * YT8521_RSSR_UTP_SPACE
391 	 * YT8521_RSSR_FIBER_SPACE
392 	 * YT8521_RSSR_TO_BE_ARBITRATED
393 	 */
394 	u8 reg_page;
395 };
396 
397 /**
398  * ytphy_read_ext() - read a PHY's extended register
399  * @phydev: a pointer to a &struct phy_device
400  * @regnum: register number to read
401  *
402  * NOTE:The caller must have taken the MDIO bus lock.
403  *
404  * returns the value of regnum reg or negative error code
405  */
406 static int ytphy_read_ext(struct phy_device *phydev, u16 regnum)
407 {
408 	int ret;
409 
410 	ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum);
411 	if (ret < 0)
412 		return ret;
413 
414 	return __phy_read(phydev, YTPHY_PAGE_DATA);
415 }
416 
417 /**
418  * ytphy_read_ext_with_lock() - read a PHY's extended register
419  * @phydev: a pointer to a &struct phy_device
420  * @regnum: register number to read
421  *
422  * returns the value of regnum reg or negative error code
423  */
424 static int ytphy_read_ext_with_lock(struct phy_device *phydev, u16 regnum)
425 {
426 	int ret;
427 
428 	phy_lock_mdio_bus(phydev);
429 	ret = ytphy_read_ext(phydev, regnum);
430 	phy_unlock_mdio_bus(phydev);
431 
432 	return ret;
433 }
434 
435 /**
436  * ytphy_write_ext() - write a PHY's extended register
437  * @phydev: a pointer to a &struct phy_device
438  * @regnum: register number to write
439  * @val: value to write to @regnum
440  *
441  * NOTE:The caller must have taken the MDIO bus lock.
442  *
443  * returns 0 or negative error code
444  */
445 static int ytphy_write_ext(struct phy_device *phydev, u16 regnum, u16 val)
446 {
447 	int ret;
448 
449 	ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum);
450 	if (ret < 0)
451 		return ret;
452 
453 	return __phy_write(phydev, YTPHY_PAGE_DATA, val);
454 }
455 
456 /**
457  * ytphy_write_ext_with_lock() - write a PHY's extended register
458  * @phydev: a pointer to a &struct phy_device
459  * @regnum: register number to write
460  * @val: value to write to @regnum
461  *
462  * returns 0 or negative error code
463  */
464 static int ytphy_write_ext_with_lock(struct phy_device *phydev, u16 regnum,
465 				     u16 val)
466 {
467 	int ret;
468 
469 	phy_lock_mdio_bus(phydev);
470 	ret = ytphy_write_ext(phydev, regnum, val);
471 	phy_unlock_mdio_bus(phydev);
472 
473 	return ret;
474 }
475 
476 /**
477  * ytphy_modify_ext() - bits modify a PHY's extended register
478  * @phydev: a pointer to a &struct phy_device
479  * @regnum: register number to write
480  * @mask: bit mask of bits to clear
481  * @set: bit mask of bits to set
482  *
483  * NOTE: Convenience function which allows a PHY's extended register to be
484  * modified as new register value = (old register value & ~mask) | set.
485  * The caller must have taken the MDIO bus lock.
486  *
487  * returns 0 or negative error code
488  */
489 static int ytphy_modify_ext(struct phy_device *phydev, u16 regnum, u16 mask,
490 			    u16 set)
491 {
492 	int ret;
493 
494 	ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum);
495 	if (ret < 0)
496 		return ret;
497 
498 	return __phy_modify(phydev, YTPHY_PAGE_DATA, mask, set);
499 }
500 
501 /**
502  * ytphy_modify_ext_with_lock() - bits modify a PHY's extended register
503  * @phydev: a pointer to a &struct phy_device
504  * @regnum: register number to write
505  * @mask: bit mask of bits to clear
506  * @set: bit mask of bits to set
507  *
508  * NOTE: Convenience function which allows a PHY's extended register to be
509  * modified as new register value = (old register value & ~mask) | set.
510  *
511  * returns 0 or negative error code
512  */
513 static int ytphy_modify_ext_with_lock(struct phy_device *phydev, u16 regnum,
514 				      u16 mask, u16 set)
515 {
516 	int ret;
517 
518 	phy_lock_mdio_bus(phydev);
519 	ret = ytphy_modify_ext(phydev, regnum, mask, set);
520 	phy_unlock_mdio_bus(phydev);
521 
522 	return ret;
523 }
524 
525 /**
526  * ytphy_get_wol() - report whether wake-on-lan is enabled
527  * @phydev: a pointer to a &struct phy_device
528  * @wol: a pointer to a &struct ethtool_wolinfo
529  *
530  * NOTE: YTPHY_WOL_CONFIG_REG is common ext reg.
531  */
532 static void ytphy_get_wol(struct phy_device *phydev,
533 			  struct ethtool_wolinfo *wol)
534 {
535 	int wol_config;
536 
537 	wol->supported = WAKE_MAGIC;
538 	wol->wolopts = 0;
539 
540 	wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG);
541 	if (wol_config < 0)
542 		return;
543 
544 	if (wol_config & YTPHY_WCR_ENABLE)
545 		wol->wolopts |= WAKE_MAGIC;
546 }
547 
548 /**
549  * ytphy_set_wol() - turn wake-on-lan on or off
550  * @phydev: a pointer to a &struct phy_device
551  * @wol: a pointer to a &struct ethtool_wolinfo
552  *
553  * NOTE: YTPHY_WOL_CONFIG_REG, YTPHY_WOL_MACADDR2_REG, YTPHY_WOL_MACADDR1_REG
554  * and YTPHY_WOL_MACADDR0_REG are common ext reg. The
555  * YTPHY_INTERRUPT_ENABLE_REG of UTP is special, fiber also use this register.
556  *
557  * returns 0 or negative errno code
558  */
559 static int ytphy_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol)
560 {
561 	struct net_device *p_attached_dev;
562 	const u16 mac_addr_reg[] = {
563 		YTPHY_WOL_MACADDR2_REG,
564 		YTPHY_WOL_MACADDR1_REG,
565 		YTPHY_WOL_MACADDR0_REG,
566 	};
567 	const u8 *mac_addr;
568 	int old_page;
569 	int ret = 0;
570 	u16 mask;
571 	u16 val;
572 	u8 i;
573 
574 	if (wol->wolopts & WAKE_MAGIC) {
575 		p_attached_dev = phydev->attached_dev;
576 		if (!p_attached_dev)
577 			return -ENODEV;
578 
579 		mac_addr = (const u8 *)p_attached_dev->dev_addr;
580 		if (!is_valid_ether_addr(mac_addr))
581 			return -EINVAL;
582 
583 		/* lock mdio bus then switch to utp reg space */
584 		old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
585 		if (old_page < 0)
586 			goto err_restore_page;
587 
588 		/* Store the device address for the magic packet */
589 		for (i = 0; i < 3; i++) {
590 			ret = ytphy_write_ext(phydev, mac_addr_reg[i],
591 					      ((mac_addr[i * 2] << 8)) |
592 						      (mac_addr[i * 2 + 1]));
593 			if (ret < 0)
594 				goto err_restore_page;
595 		}
596 
597 		/* Enable WOL feature */
598 		mask = YTPHY_WCR_PULSE_WIDTH_MASK | YTPHY_WCR_INTR_SEL;
599 		val = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL;
600 		val |= YTPHY_WCR_TYPE_PULSE | YTPHY_WCR_PULSE_WIDTH_672MS;
601 		ret = ytphy_modify_ext(phydev, YTPHY_WOL_CONFIG_REG, mask, val);
602 		if (ret < 0)
603 			goto err_restore_page;
604 
605 		/* Enable WOL interrupt */
606 		ret = __phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG, 0,
607 				   YTPHY_IER_WOL);
608 		if (ret < 0)
609 			goto err_restore_page;
610 
611 	} else {
612 		old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
613 		if (old_page < 0)
614 			goto err_restore_page;
615 
616 		/* Disable WOL feature */
617 		mask = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL;
618 		ret = ytphy_modify_ext(phydev, YTPHY_WOL_CONFIG_REG, mask, 0);
619 
620 		/* Disable WOL interrupt */
621 		ret = __phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG,
622 				   YTPHY_IER_WOL, 0);
623 		if (ret < 0)
624 			goto err_restore_page;
625 	}
626 
627 err_restore_page:
628 	return phy_restore_page(phydev, old_page, ret);
629 }
630 
631 static int yt8531_set_wol(struct phy_device *phydev,
632 			  struct ethtool_wolinfo *wol)
633 {
634 	const u16 mac_addr_reg[] = {
635 		YTPHY_WOL_MACADDR2_REG,
636 		YTPHY_WOL_MACADDR1_REG,
637 		YTPHY_WOL_MACADDR0_REG,
638 	};
639 	const u8 *mac_addr;
640 	u16 mask, val;
641 	int ret;
642 	u8 i;
643 
644 	if (wol->wolopts & WAKE_MAGIC) {
645 		mac_addr = phydev->attached_dev->dev_addr;
646 
647 		/* Store the device address for the magic packet */
648 		for (i = 0; i < 3; i++) {
649 			ret = ytphy_write_ext_with_lock(phydev, mac_addr_reg[i],
650 							((mac_addr[i * 2] << 8)) |
651 							(mac_addr[i * 2 + 1]));
652 			if (ret < 0)
653 				return ret;
654 		}
655 
656 		/* Enable WOL feature */
657 		mask = YTPHY_WCR_PULSE_WIDTH_MASK | YTPHY_WCR_INTR_SEL;
658 		val = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL;
659 		val |= YTPHY_WCR_TYPE_PULSE | YTPHY_WCR_PULSE_WIDTH_672MS;
660 		ret = ytphy_modify_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG,
661 						 mask, val);
662 		if (ret < 0)
663 			return ret;
664 
665 		/* Enable WOL interrupt */
666 		ret = phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG, 0,
667 				 YTPHY_IER_WOL);
668 		if (ret < 0)
669 			return ret;
670 	} else {
671 		/* Disable WOL feature */
672 		mask = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL;
673 		ret = ytphy_modify_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG,
674 						 mask, 0);
675 
676 		/* Disable WOL interrupt */
677 		ret = phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG,
678 				 YTPHY_IER_WOL, 0);
679 		if (ret < 0)
680 			return ret;
681 	}
682 
683 	return 0;
684 }
685 
686 static int yt8511_read_page(struct phy_device *phydev)
687 {
688 	return __phy_read(phydev, YT8511_PAGE_SELECT);
689 };
690 
691 static int yt8511_write_page(struct phy_device *phydev, int page)
692 {
693 	return __phy_write(phydev, YT8511_PAGE_SELECT, page);
694 };
695 
696 static int yt8511_config_init(struct phy_device *phydev)
697 {
698 	int oldpage, ret = 0;
699 	unsigned int ge, fe;
700 
701 	oldpage = phy_select_page(phydev, YT8511_EXT_CLK_GATE);
702 	if (oldpage < 0)
703 		goto err_restore_page;
704 
705 	/* set rgmii delay mode */
706 	switch (phydev->interface) {
707 	case PHY_INTERFACE_MODE_RGMII:
708 		ge = YT8511_DELAY_GE_TX_DIS;
709 		fe = YT8511_DELAY_FE_TX_DIS;
710 		break;
711 	case PHY_INTERFACE_MODE_RGMII_RXID:
712 		ge = YT8511_DELAY_RX | YT8511_DELAY_GE_TX_DIS;
713 		fe = YT8511_DELAY_FE_TX_DIS;
714 		break;
715 	case PHY_INTERFACE_MODE_RGMII_TXID:
716 		ge = YT8511_DELAY_GE_TX_EN;
717 		fe = YT8511_DELAY_FE_TX_EN;
718 		break;
719 	case PHY_INTERFACE_MODE_RGMII_ID:
720 		ge = YT8511_DELAY_RX | YT8511_DELAY_GE_TX_EN;
721 		fe = YT8511_DELAY_FE_TX_EN;
722 		break;
723 	default: /* do not support other modes */
724 		ret = -EOPNOTSUPP;
725 		goto err_restore_page;
726 	}
727 
728 	ret = __phy_modify(phydev, YT8511_PAGE, (YT8511_DELAY_RX | YT8511_DELAY_GE_TX_EN), ge);
729 	if (ret < 0)
730 		goto err_restore_page;
731 
732 	/* set clock mode to 125mhz */
733 	ret = __phy_modify(phydev, YT8511_PAGE, 0, YT8511_CLK_125M);
734 	if (ret < 0)
735 		goto err_restore_page;
736 
737 	/* fast ethernet delay is in a separate page */
738 	ret = __phy_write(phydev, YT8511_PAGE_SELECT, YT8511_EXT_DELAY_DRIVE);
739 	if (ret < 0)
740 		goto err_restore_page;
741 
742 	ret = __phy_modify(phydev, YT8511_PAGE, YT8511_DELAY_FE_TX_EN, fe);
743 	if (ret < 0)
744 		goto err_restore_page;
745 
746 	/* leave pll enabled in sleep */
747 	ret = __phy_write(phydev, YT8511_PAGE_SELECT, YT8511_EXT_SLEEP_CTRL);
748 	if (ret < 0)
749 		goto err_restore_page;
750 
751 	ret = __phy_modify(phydev, YT8511_PAGE, 0, YT8511_PLLON_SLP);
752 	if (ret < 0)
753 		goto err_restore_page;
754 
755 err_restore_page:
756 	return phy_restore_page(phydev, oldpage, ret);
757 }
758 
759 /**
760  * yt8521_read_page() - read reg page
761  * @phydev: a pointer to a &struct phy_device
762  *
763  * returns current reg space of yt8521 (YT8521_RSSR_FIBER_SPACE/
764  * YT8521_RSSR_UTP_SPACE) or negative errno code
765  */
766 static int yt8521_read_page(struct phy_device *phydev)
767 {
768 	int old_page;
769 
770 	old_page = ytphy_read_ext(phydev, YT8521_REG_SPACE_SELECT_REG);
771 	if (old_page < 0)
772 		return old_page;
773 
774 	if ((old_page & YT8521_RSSR_SPACE_MASK) == YT8521_RSSR_FIBER_SPACE)
775 		return YT8521_RSSR_FIBER_SPACE;
776 
777 	return YT8521_RSSR_UTP_SPACE;
778 };
779 
780 /**
781  * yt8521_write_page() - write reg page
782  * @phydev: a pointer to a &struct phy_device
783  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to write.
784  *
785  * returns 0 or negative errno code
786  */
787 static int yt8521_write_page(struct phy_device *phydev, int page)
788 {
789 	int mask = YT8521_RSSR_SPACE_MASK;
790 	int set;
791 
792 	if ((page & YT8521_RSSR_SPACE_MASK) == YT8521_RSSR_FIBER_SPACE)
793 		set = YT8521_RSSR_FIBER_SPACE;
794 	else
795 		set = YT8521_RSSR_UTP_SPACE;
796 
797 	return ytphy_modify_ext(phydev, YT8521_REG_SPACE_SELECT_REG, mask, set);
798 };
799 
800 /**
801  * struct ytphy_cfg_reg_map - map a config value to a register value
802  * @cfg: value in device configuration
803  * @reg: value in the register
804  */
805 struct ytphy_cfg_reg_map {
806 	u32 cfg;
807 	u32 reg;
808 };
809 
810 static const struct ytphy_cfg_reg_map ytphy_rgmii_delays[] = {
811 	/* for tx delay / rx delay with YT8521_CCR_RXC_DLY_EN is not set. */
812 	{ 0,	YT8521_RC1R_RGMII_0_000_NS },
813 	{ 150,	YT8521_RC1R_RGMII_0_150_NS },
814 	{ 300,	YT8521_RC1R_RGMII_0_300_NS },
815 	{ 450,	YT8521_RC1R_RGMII_0_450_NS },
816 	{ 600,	YT8521_RC1R_RGMII_0_600_NS },
817 	{ 750,	YT8521_RC1R_RGMII_0_750_NS },
818 	{ 900,	YT8521_RC1R_RGMII_0_900_NS },
819 	{ 1050,	YT8521_RC1R_RGMII_1_050_NS },
820 	{ 1200,	YT8521_RC1R_RGMII_1_200_NS },
821 	{ 1350,	YT8521_RC1R_RGMII_1_350_NS },
822 	{ 1500,	YT8521_RC1R_RGMII_1_500_NS },
823 	{ 1650,	YT8521_RC1R_RGMII_1_650_NS },
824 	{ 1800,	YT8521_RC1R_RGMII_1_800_NS },
825 	{ 1950,	YT8521_RC1R_RGMII_1_950_NS },	/* default tx/rx delay */
826 	{ 2100,	YT8521_RC1R_RGMII_2_100_NS },
827 	{ 2250,	YT8521_RC1R_RGMII_2_250_NS },
828 
829 	/* only for rx delay with YT8521_CCR_RXC_DLY_EN is set. */
830 	{ 0    + YT8521_CCR_RXC_DLY_1_900_NS,	YT8521_RC1R_RGMII_0_000_NS },
831 	{ 150  + YT8521_CCR_RXC_DLY_1_900_NS,	YT8521_RC1R_RGMII_0_150_NS },
832 	{ 300  + YT8521_CCR_RXC_DLY_1_900_NS,	YT8521_RC1R_RGMII_0_300_NS },
833 	{ 450  + YT8521_CCR_RXC_DLY_1_900_NS,	YT8521_RC1R_RGMII_0_450_NS },
834 	{ 600  + YT8521_CCR_RXC_DLY_1_900_NS,	YT8521_RC1R_RGMII_0_600_NS },
835 	{ 750  + YT8521_CCR_RXC_DLY_1_900_NS,	YT8521_RC1R_RGMII_0_750_NS },
836 	{ 900  + YT8521_CCR_RXC_DLY_1_900_NS,	YT8521_RC1R_RGMII_0_900_NS },
837 	{ 1050 + YT8521_CCR_RXC_DLY_1_900_NS,	YT8521_RC1R_RGMII_1_050_NS },
838 	{ 1200 + YT8521_CCR_RXC_DLY_1_900_NS,	YT8521_RC1R_RGMII_1_200_NS },
839 	{ 1350 + YT8521_CCR_RXC_DLY_1_900_NS,	YT8521_RC1R_RGMII_1_350_NS },
840 	{ 1500 + YT8521_CCR_RXC_DLY_1_900_NS,	YT8521_RC1R_RGMII_1_500_NS },
841 	{ 1650 + YT8521_CCR_RXC_DLY_1_900_NS,	YT8521_RC1R_RGMII_1_650_NS },
842 	{ 1800 + YT8521_CCR_RXC_DLY_1_900_NS,	YT8521_RC1R_RGMII_1_800_NS },
843 	{ 1950 + YT8521_CCR_RXC_DLY_1_900_NS,	YT8521_RC1R_RGMII_1_950_NS },
844 	{ 2100 + YT8521_CCR_RXC_DLY_1_900_NS,	YT8521_RC1R_RGMII_2_100_NS },
845 	{ 2250 + YT8521_CCR_RXC_DLY_1_900_NS,	YT8521_RC1R_RGMII_2_250_NS }
846 };
847 
848 static u32 ytphy_get_delay_reg_value(struct phy_device *phydev,
849 				     const char *prop_name,
850 				     const struct ytphy_cfg_reg_map *tbl,
851 				     int tb_size,
852 				     u16 *rxc_dly_en,
853 				     u32 dflt)
854 {
855 	struct device *dev = &phydev->mdio.dev;
856 	int tb_size_half = tb_size / 2;
857 	u32 val;
858 	int i;
859 
860 	if (device_property_read_u32(dev, prop_name, &val))
861 		goto err_dts_val;
862 
863 	/* when rxc_dly_en is NULL, it is get the delay for tx, only half of
864 	 * tb_size is valid.
865 	 */
866 	if (!rxc_dly_en)
867 		tb_size = tb_size_half;
868 
869 	for (i = 0; i < tb_size; i++) {
870 		if (tbl[i].cfg == val) {
871 			if (rxc_dly_en && i < tb_size_half)
872 				*rxc_dly_en = 0;
873 			return tbl[i].reg;
874 		}
875 	}
876 
877 	phydev_warn(phydev, "Unsupported value %d for %s using default (%u)\n",
878 		    val, prop_name, dflt);
879 
880 err_dts_val:
881 	/* when rxc_dly_en is not NULL, it is get the delay for rx.
882 	 * The rx default in dts and ytphy_rgmii_clk_delay_config is 1950 ps,
883 	 * so YT8521_CCR_RXC_DLY_EN should not be set.
884 	 */
885 	if (rxc_dly_en)
886 		*rxc_dly_en = 0;
887 
888 	return dflt;
889 }
890 
891 static int ytphy_rgmii_clk_delay_config(struct phy_device *phydev)
892 {
893 	int tb_size = ARRAY_SIZE(ytphy_rgmii_delays);
894 	u16 rxc_dly_en = YT8521_CCR_RXC_DLY_EN;
895 	u32 rx_reg, tx_reg;
896 	u16 mask, val = 0;
897 	int ret;
898 
899 	rx_reg = ytphy_get_delay_reg_value(phydev, "rx-internal-delay-ps",
900 					   ytphy_rgmii_delays, tb_size,
901 					   &rxc_dly_en,
902 					   YT8521_RC1R_RGMII_1_950_NS);
903 	tx_reg = ytphy_get_delay_reg_value(phydev, "tx-internal-delay-ps",
904 					   ytphy_rgmii_delays, tb_size, NULL,
905 					   YT8521_RC1R_RGMII_1_950_NS);
906 
907 	switch (phydev->interface) {
908 	case PHY_INTERFACE_MODE_RGMII:
909 		rxc_dly_en = 0;
910 		break;
911 	case PHY_INTERFACE_MODE_RGMII_RXID:
912 		val |= FIELD_PREP(YT8521_RC1R_RX_DELAY_MASK, rx_reg);
913 		break;
914 	case PHY_INTERFACE_MODE_RGMII_TXID:
915 		rxc_dly_en = 0;
916 		val |= FIELD_PREP(YT8521_RC1R_GE_TX_DELAY_MASK, tx_reg);
917 		break;
918 	case PHY_INTERFACE_MODE_RGMII_ID:
919 		val |= FIELD_PREP(YT8521_RC1R_RX_DELAY_MASK, rx_reg) |
920 		       FIELD_PREP(YT8521_RC1R_GE_TX_DELAY_MASK, tx_reg);
921 		break;
922 	case PHY_INTERFACE_MODE_GMII:
923 		if (phydev->drv->phy_id != PHY_ID_YT8531S)
924 			return -EOPNOTSUPP;
925 		return 0;
926 	default: /* do not support other modes */
927 		return -EOPNOTSUPP;
928 	}
929 
930 	ret = ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG,
931 			       YT8521_CCR_RXC_DLY_EN, rxc_dly_en);
932 	if (ret < 0)
933 		return ret;
934 
935 	/* Generally, it is not necessary to adjust YT8521_RC1R_FE_TX_DELAY */
936 	mask = YT8521_RC1R_RX_DELAY_MASK | YT8521_RC1R_GE_TX_DELAY_MASK;
937 	return ytphy_modify_ext(phydev, YT8521_RGMII_CONFIG1_REG, mask, val);
938 }
939 
940 static int ytphy_rgmii_clk_delay_config_with_lock(struct phy_device *phydev)
941 {
942 	int ret;
943 
944 	phy_lock_mdio_bus(phydev);
945 	ret = ytphy_rgmii_clk_delay_config(phydev);
946 	phy_unlock_mdio_bus(phydev);
947 
948 	return ret;
949 }
950 
951 /**
952  * struct ytphy_ldo_vol_map - map a current value to a register value
953  * @vol: ldo voltage
954  * @ds:  value in the register
955  * @cur: value in device configuration
956  */
957 struct ytphy_ldo_vol_map {
958 	u32 vol;
959 	u32 ds;
960 	u32 cur;
961 };
962 
963 static const struct ytphy_ldo_vol_map yt8531_ldo_vol[] = {
964 	{.vol = YT8531_LDO_VOL_1V8, .ds = 0, .cur = 1200},
965 	{.vol = YT8531_LDO_VOL_1V8, .ds = 1, .cur = 2100},
966 	{.vol = YT8531_LDO_VOL_1V8, .ds = 2, .cur = 2700},
967 	{.vol = YT8531_LDO_VOL_1V8, .ds = 3, .cur = 2910},
968 	{.vol = YT8531_LDO_VOL_1V8, .ds = 4, .cur = 3110},
969 	{.vol = YT8531_LDO_VOL_1V8, .ds = 5, .cur = 3600},
970 	{.vol = YT8531_LDO_VOL_1V8, .ds = 6, .cur = 3970},
971 	{.vol = YT8531_LDO_VOL_1V8, .ds = 7, .cur = 4350},
972 	{.vol = YT8531_LDO_VOL_3V3, .ds = 0, .cur = 3070},
973 	{.vol = YT8531_LDO_VOL_3V3, .ds = 1, .cur = 4080},
974 	{.vol = YT8531_LDO_VOL_3V3, .ds = 2, .cur = 4370},
975 	{.vol = YT8531_LDO_VOL_3V3, .ds = 3, .cur = 4680},
976 	{.vol = YT8531_LDO_VOL_3V3, .ds = 4, .cur = 5020},
977 	{.vol = YT8531_LDO_VOL_3V3, .ds = 5, .cur = 5450},
978 	{.vol = YT8531_LDO_VOL_3V3, .ds = 6, .cur = 5740},
979 	{.vol = YT8531_LDO_VOL_3V3, .ds = 7, .cur = 6140},
980 };
981 
982 static u32 yt8531_get_ldo_vol(struct phy_device *phydev)
983 {
984 	u32 val;
985 
986 	val = ytphy_read_ext(phydev, YT8521_CHIP_CONFIG_REG);
987 
988 	val = FIELD_GET(YT8531_RGMII_LDO_VOL_MASK, val);
989 
990 	return val <= YT8531_LDO_VOL_1V8 ? val : YT8531_LDO_VOL_1V8;
991 }
992 
993 static int yt8531_get_ds_map(struct phy_device *phydev, u32 cur)
994 {
995 	u32 vol;
996 	int i;
997 
998 	vol = yt8531_get_ldo_vol(phydev);
999 	for (i = 0; i < ARRAY_SIZE(yt8531_ldo_vol); i++) {
1000 		if (yt8531_ldo_vol[i].vol == vol && yt8531_ldo_vol[i].cur == cur)
1001 			return yt8531_ldo_vol[i].ds;
1002 	}
1003 
1004 	return -EINVAL;
1005 }
1006 
1007 static int yt8531_set_ds(struct phy_device *phydev)
1008 {
1009 	struct device *dev = &phydev->mdio.dev;
1010 	u32 ds_field_low, ds_field_hi, val;
1011 	int ret, ds;
1012 
1013 	/* set rgmii rx clk driver strength */
1014 	if (!device_property_read_u32(dev, "motorcomm,rx-clk-drv-microamp", &val)) {
1015 		ds = yt8531_get_ds_map(phydev, val);
1016 		if (ds < 0)
1017 			return dev_err_probe(&phydev->mdio.dev, ds,
1018 					     "No matching current value was found.\n");
1019 	} else {
1020 		ds = YT8531_RGMII_RX_DS_DEFAULT;
1021 	}
1022 
1023 	ret = ytphy_modify_ext(phydev,
1024 			       YTPHY_PAD_DRIVE_STRENGTH_REG,
1025 			       YT8531_RGMII_RXC_DS_MASK,
1026 			       FIELD_PREP(YT8531_RGMII_RXC_DS_MASK, ds));
1027 
1028 	if (ret < 0)
1029 		return ret;
1030 
1031 	/* set rgmii rx data driver strength */
1032 	if (!device_property_read_u32(dev, "motorcomm,rx-data-drv-microamp", &val)) {
1033 		ds = yt8531_get_ds_map(phydev, val);
1034 		if (ds < 0)
1035 			return dev_err_probe(&phydev->mdio.dev, ds,
1036 					     "No matching current value was found.\n");
1037 	} else {
1038 		ds = YT8531_RGMII_RX_DS_DEFAULT;
1039 	}
1040 
1041 	ds_field_hi = FIELD_GET(BIT(2), ds);
1042 	ds_field_hi = FIELD_PREP(YT8531_RGMII_RXD_DS_HI_MASK, ds_field_hi);
1043 
1044 	ds_field_low = FIELD_GET(GENMASK(1, 0), ds);
1045 	ds_field_low = FIELD_PREP(YT8531_RGMII_RXD_DS_LOW_MASK, ds_field_low);
1046 
1047 	ret = ytphy_modify_ext(phydev,
1048 			       YTPHY_PAD_DRIVE_STRENGTH_REG,
1049 			       YT8531_RGMII_RXD_DS_LOW_MASK | YT8531_RGMII_RXD_DS_HI_MASK,
1050 			       ds_field_low | ds_field_hi);
1051 
1052 	if (ret < 0)
1053 		return ret;
1054 
1055 	return 0;
1056 }
1057 
1058 /**
1059  * yt8521_probe() - read chip config then set suitable polling_mode
1060  * @phydev: a pointer to a &struct phy_device
1061  *
1062  * returns 0 or negative errno code
1063  */
1064 static int yt8521_probe(struct phy_device *phydev)
1065 {
1066 	struct device *dev = &phydev->mdio.dev;
1067 	struct yt8521_priv *priv;
1068 	int chip_config;
1069 	u16 mask, val;
1070 	u32 freq;
1071 	int ret;
1072 
1073 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
1074 	if (!priv)
1075 		return -ENOMEM;
1076 
1077 	phydev->priv = priv;
1078 
1079 	chip_config = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG);
1080 	if (chip_config < 0)
1081 		return chip_config;
1082 
1083 	priv->strap_mode = chip_config & YT8521_CCR_MODE_SEL_MASK;
1084 	switch (priv->strap_mode) {
1085 	case YT8521_CCR_MODE_FIBER_TO_RGMII:
1086 	case YT8521_CCR_MODE_SGPHY_TO_RGMAC:
1087 	case YT8521_CCR_MODE_SGMAC_TO_RGPHY:
1088 		priv->polling_mode = YT8521_MODE_FIBER;
1089 		priv->reg_page = YT8521_RSSR_FIBER_SPACE;
1090 		phydev->port = PORT_FIBRE;
1091 		break;
1092 	case YT8521_CCR_MODE_UTP_FIBER_TO_RGMII:
1093 	case YT8521_CCR_MODE_UTP_TO_FIBER_AUTO:
1094 	case YT8521_CCR_MODE_UTP_TO_FIBER_FORCE:
1095 		priv->polling_mode = YT8521_MODE_POLL;
1096 		priv->reg_page = YT8521_RSSR_TO_BE_ARBITRATED;
1097 		phydev->port = PORT_NONE;
1098 		break;
1099 	case YT8521_CCR_MODE_UTP_TO_SGMII:
1100 	case YT8521_CCR_MODE_UTP_TO_RGMII:
1101 		priv->polling_mode = YT8521_MODE_UTP;
1102 		priv->reg_page = YT8521_RSSR_UTP_SPACE;
1103 		phydev->port = PORT_TP;
1104 		break;
1105 	}
1106 	/* set default reg space */
1107 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
1108 		ret = ytphy_write_ext_with_lock(phydev,
1109 						YT8521_REG_SPACE_SELECT_REG,
1110 						priv->reg_page);
1111 		if (ret < 0)
1112 			return ret;
1113 	}
1114 
1115 	if (device_property_read_u32(dev, "motorcomm,clk-out-frequency-hz", &freq))
1116 		freq = YTPHY_DTS_OUTPUT_CLK_DIS;
1117 
1118 	if (phydev->drv->phy_id == PHY_ID_YT8521) {
1119 		switch (freq) {
1120 		case YTPHY_DTS_OUTPUT_CLK_DIS:
1121 			mask = YT8521_SCR_SYNCE_ENABLE;
1122 			val = 0;
1123 			break;
1124 		case YTPHY_DTS_OUTPUT_CLK_25M:
1125 			mask = YT8521_SCR_SYNCE_ENABLE |
1126 			       YT8521_SCR_CLK_SRC_MASK |
1127 			       YT8521_SCR_CLK_FRE_SEL_125M;
1128 			val = YT8521_SCR_SYNCE_ENABLE |
1129 			      FIELD_PREP(YT8521_SCR_CLK_SRC_MASK,
1130 					 YT8521_SCR_CLK_SRC_REF_25M);
1131 			break;
1132 		case YTPHY_DTS_OUTPUT_CLK_125M:
1133 			mask = YT8521_SCR_SYNCE_ENABLE |
1134 			       YT8521_SCR_CLK_SRC_MASK |
1135 			       YT8521_SCR_CLK_FRE_SEL_125M;
1136 			val = YT8521_SCR_SYNCE_ENABLE |
1137 			      YT8521_SCR_CLK_FRE_SEL_125M |
1138 			      FIELD_PREP(YT8521_SCR_CLK_SRC_MASK,
1139 					 YT8521_SCR_CLK_SRC_PLL_125M);
1140 			break;
1141 		default:
1142 			phydev_warn(phydev, "Freq err:%u\n", freq);
1143 			return -EINVAL;
1144 		}
1145 	} else if (phydev->drv->phy_id == PHY_ID_YT8531S) {
1146 		switch (freq) {
1147 		case YTPHY_DTS_OUTPUT_CLK_DIS:
1148 			mask = YT8531_SCR_SYNCE_ENABLE;
1149 			val = 0;
1150 			break;
1151 		case YTPHY_DTS_OUTPUT_CLK_25M:
1152 			mask = YT8531_SCR_SYNCE_ENABLE |
1153 			       YT8531_SCR_CLK_SRC_MASK |
1154 			       YT8531_SCR_CLK_FRE_SEL_125M;
1155 			val = YT8531_SCR_SYNCE_ENABLE |
1156 			      FIELD_PREP(YT8531_SCR_CLK_SRC_MASK,
1157 					 YT8531_SCR_CLK_SRC_REF_25M);
1158 			break;
1159 		case YTPHY_DTS_OUTPUT_CLK_125M:
1160 			mask = YT8531_SCR_SYNCE_ENABLE |
1161 			       YT8531_SCR_CLK_SRC_MASK |
1162 			       YT8531_SCR_CLK_FRE_SEL_125M;
1163 			val = YT8531_SCR_SYNCE_ENABLE |
1164 			      YT8531_SCR_CLK_FRE_SEL_125M |
1165 			      FIELD_PREP(YT8531_SCR_CLK_SRC_MASK,
1166 					 YT8531_SCR_CLK_SRC_PLL_125M);
1167 			break;
1168 		default:
1169 			phydev_warn(phydev, "Freq err:%u\n", freq);
1170 			return -EINVAL;
1171 		}
1172 	} else {
1173 		phydev_warn(phydev, "PHY id err\n");
1174 		return -EINVAL;
1175 	}
1176 
1177 	return ytphy_modify_ext_with_lock(phydev, YTPHY_SYNCE_CFG_REG, mask,
1178 					  val);
1179 }
1180 
1181 static int yt8531_probe(struct phy_device *phydev)
1182 {
1183 	struct device *dev = &phydev->mdio.dev;
1184 	struct clk *clk;
1185 	u16 mask, val;
1186 	u32 freq;
1187 
1188 	clk = devm_clk_get_optional_enabled(dev, NULL);
1189 	if (IS_ERR(clk))
1190 		return dev_err_probe(dev, PTR_ERR(clk),
1191 				     "failed to get and enable PHY clock\n");
1192 
1193 	if (device_property_read_u32(dev, "motorcomm,clk-out-frequency-hz", &freq))
1194 		freq = YTPHY_DTS_OUTPUT_CLK_DIS;
1195 
1196 	switch (freq) {
1197 	case YTPHY_DTS_OUTPUT_CLK_DIS:
1198 		mask = YT8531_SCR_SYNCE_ENABLE;
1199 		val = 0;
1200 		break;
1201 	case YTPHY_DTS_OUTPUT_CLK_25M:
1202 		mask = YT8531_SCR_SYNCE_ENABLE | YT8531_SCR_CLK_SRC_MASK |
1203 		       YT8531_SCR_CLK_FRE_SEL_125M;
1204 		val = YT8531_SCR_SYNCE_ENABLE |
1205 		      FIELD_PREP(YT8531_SCR_CLK_SRC_MASK,
1206 				 YT8531_SCR_CLK_SRC_REF_25M);
1207 		break;
1208 	case YTPHY_DTS_OUTPUT_CLK_125M:
1209 		mask = YT8531_SCR_SYNCE_ENABLE | YT8531_SCR_CLK_SRC_MASK |
1210 		       YT8531_SCR_CLK_FRE_SEL_125M;
1211 		val = YT8531_SCR_SYNCE_ENABLE | YT8531_SCR_CLK_FRE_SEL_125M |
1212 		      FIELD_PREP(YT8531_SCR_CLK_SRC_MASK,
1213 				 YT8531_SCR_CLK_SRC_PLL_125M);
1214 		break;
1215 	default:
1216 		phydev_warn(phydev, "Freq err:%u\n", freq);
1217 		return -EINVAL;
1218 	}
1219 
1220 	return ytphy_modify_ext_with_lock(phydev, YTPHY_SYNCE_CFG_REG, mask,
1221 					  val);
1222 }
1223 
1224 /**
1225  * ytphy_utp_read_lpa() - read LPA then setup lp_advertising for utp
1226  * @phydev: a pointer to a &struct phy_device
1227  *
1228  * NOTE:The caller must have taken the MDIO bus lock.
1229  *
1230  * returns 0 or negative errno code
1231  */
1232 static int ytphy_utp_read_lpa(struct phy_device *phydev)
1233 {
1234 	int lpa, lpagb;
1235 
1236 	if (phydev->autoneg == AUTONEG_ENABLE) {
1237 		if (!phydev->autoneg_complete) {
1238 			mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising,
1239 							0);
1240 			mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, 0);
1241 			return 0;
1242 		}
1243 
1244 		if (phydev->is_gigabit_capable) {
1245 			lpagb = __phy_read(phydev, MII_STAT1000);
1246 			if (lpagb < 0)
1247 				return lpagb;
1248 
1249 			if (lpagb & LPA_1000MSFAIL) {
1250 				int adv = __phy_read(phydev, MII_CTRL1000);
1251 
1252 				if (adv < 0)
1253 					return adv;
1254 
1255 				if (adv & CTL1000_ENABLE_MASTER)
1256 					phydev_err(phydev, "Master/Slave resolution failed, maybe conflicting manual settings?\n");
1257 				else
1258 					phydev_err(phydev, "Master/Slave resolution failed\n");
1259 				return -ENOLINK;
1260 			}
1261 
1262 			mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising,
1263 							lpagb);
1264 		}
1265 
1266 		lpa = __phy_read(phydev, MII_LPA);
1267 		if (lpa < 0)
1268 			return lpa;
1269 
1270 		mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa);
1271 	} else {
1272 		linkmode_zero(phydev->lp_advertising);
1273 	}
1274 
1275 	return 0;
1276 }
1277 
1278 /**
1279  * yt8521_adjust_status() - update speed and duplex to phydev. when in fiber
1280  * mode, adjust speed and duplex.
1281  * @phydev: a pointer to a &struct phy_device
1282  * @status: yt8521 status read from YTPHY_SPECIFIC_STATUS_REG
1283  * @is_utp: false(yt8521 work in fiber mode) or true(yt8521 work in utp mode)
1284  *
1285  * NOTE:The caller must have taken the MDIO bus lock.
1286  *
1287  * returns 0
1288  */
1289 static int yt8521_adjust_status(struct phy_device *phydev, int status,
1290 				bool is_utp)
1291 {
1292 	int speed_mode, duplex;
1293 	int speed;
1294 	int err;
1295 	int lpa;
1296 
1297 	if (is_utp)
1298 		duplex = (status & YTPHY_SSR_DUPLEX) >> YTPHY_SSR_DUPLEX_OFFSET;
1299 	else
1300 		duplex = DUPLEX_FULL;	/* for fiber, it always DUPLEX_FULL */
1301 
1302 	speed_mode = status & YTPHY_SSR_SPEED_MASK;
1303 
1304 	switch (speed_mode) {
1305 	case YTPHY_SSR_SPEED_10M:
1306 		if (is_utp)
1307 			speed = SPEED_10;
1308 		else
1309 			/* for fiber, it will never run here, default to
1310 			 * SPEED_UNKNOWN
1311 			 */
1312 			speed = SPEED_UNKNOWN;
1313 		break;
1314 	case YTPHY_SSR_SPEED_100M:
1315 		speed = SPEED_100;
1316 		break;
1317 	case YTPHY_SSR_SPEED_1000M:
1318 		speed = SPEED_1000;
1319 		break;
1320 	default:
1321 		speed = SPEED_UNKNOWN;
1322 		break;
1323 	}
1324 
1325 	phydev->speed = speed;
1326 	phydev->duplex = duplex;
1327 
1328 	if (is_utp) {
1329 		err = ytphy_utp_read_lpa(phydev);
1330 		if (err < 0)
1331 			return err;
1332 
1333 		phy_resolve_aneg_pause(phydev);
1334 	} else {
1335 		lpa = __phy_read(phydev, MII_LPA);
1336 		if (lpa < 0)
1337 			return lpa;
1338 
1339 		/* only support 1000baseX Full */
1340 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
1341 				 phydev->lp_advertising, lpa & LPA_1000XFULL);
1342 
1343 		if (!(lpa & YTPHY_FLPA_PAUSE)) {
1344 			phydev->pause = 0;
1345 			phydev->asym_pause = 0;
1346 		} else if ((lpa & YTPHY_FLPA_ASYM_PAUSE)) {
1347 			phydev->pause = 1;
1348 			phydev->asym_pause = 1;
1349 		} else {
1350 			phydev->pause = 1;
1351 			phydev->asym_pause = 0;
1352 		}
1353 	}
1354 
1355 	return 0;
1356 }
1357 
1358 /**
1359  * yt8521_read_status_paged() -  determines the speed and duplex of one page
1360  * @phydev: a pointer to a &struct phy_device
1361  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to
1362  * operate.
1363  *
1364  * returns 1 (utp or fiber link),0 (no link) or negative errno code
1365  */
1366 static int yt8521_read_status_paged(struct phy_device *phydev, int page)
1367 {
1368 	int fiber_latch_val;
1369 	int fiber_curr_val;
1370 	int old_page;
1371 	int ret = 0;
1372 	int status;
1373 	int link;
1374 
1375 	linkmode_zero(phydev->lp_advertising);
1376 	phydev->duplex = DUPLEX_UNKNOWN;
1377 	phydev->speed = SPEED_UNKNOWN;
1378 	phydev->asym_pause = 0;
1379 	phydev->pause = 0;
1380 
1381 	/* YT8521 has two reg space (utp/fiber) for linkup with utp/fiber
1382 	 * respectively. but for utp/fiber combo mode, reg space should be
1383 	 * arbitrated based on media priority. by default, utp takes
1384 	 * priority. reg space should be properly set before read
1385 	 * YTPHY_SPECIFIC_STATUS_REG.
1386 	 */
1387 
1388 	page &= YT8521_RSSR_SPACE_MASK;
1389 	old_page = phy_select_page(phydev, page);
1390 	if (old_page < 0)
1391 		goto err_restore_page;
1392 
1393 	/* Read YTPHY_SPECIFIC_STATUS_REG, which indicates the speed and duplex
1394 	 * of the PHY is actually using.
1395 	 */
1396 	ret = __phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG);
1397 	if (ret < 0)
1398 		goto err_restore_page;
1399 
1400 	status = ret;
1401 	link = !!(status & YTPHY_SSR_LINK);
1402 
1403 	/* When PHY is in fiber mode, speed transferred from 1000Mbps to
1404 	 * 100Mbps,there is not link down from YTPHY_SPECIFIC_STATUS_REG, so
1405 	 * we need check MII_BMSR to identify such case.
1406 	 */
1407 	if (page == YT8521_RSSR_FIBER_SPACE) {
1408 		ret = __phy_read(phydev, MII_BMSR);
1409 		if (ret < 0)
1410 			goto err_restore_page;
1411 
1412 		fiber_latch_val = ret;
1413 		ret = __phy_read(phydev, MII_BMSR);
1414 		if (ret < 0)
1415 			goto err_restore_page;
1416 
1417 		fiber_curr_val = ret;
1418 		if (link && fiber_latch_val != fiber_curr_val) {
1419 			link = 0;
1420 			phydev_info(phydev,
1421 				    "%s, fiber link down detect, latch = %04x, curr = %04x\n",
1422 				    __func__, fiber_latch_val, fiber_curr_val);
1423 		}
1424 	} else {
1425 		/* Read autonegotiation status */
1426 		ret = __phy_read(phydev, MII_BMSR);
1427 		if (ret < 0)
1428 			goto err_restore_page;
1429 
1430 		phydev->autoneg_complete = ret & BMSR_ANEGCOMPLETE ? 1 : 0;
1431 	}
1432 
1433 	if (link) {
1434 		if (page == YT8521_RSSR_UTP_SPACE)
1435 			yt8521_adjust_status(phydev, status, true);
1436 		else
1437 			yt8521_adjust_status(phydev, status, false);
1438 	}
1439 	return phy_restore_page(phydev, old_page, link);
1440 
1441 err_restore_page:
1442 	return phy_restore_page(phydev, old_page, ret);
1443 }
1444 
1445 /**
1446  * yt8521_read_status() -  determines the negotiated speed and duplex
1447  * @phydev: a pointer to a &struct phy_device
1448  *
1449  * returns 0 or negative errno code
1450  */
1451 static int yt8521_read_status(struct phy_device *phydev)
1452 {
1453 	struct yt8521_priv *priv = phydev->priv;
1454 	int link_fiber = 0;
1455 	int link_utp;
1456 	int link;
1457 	int ret;
1458 
1459 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
1460 		link = yt8521_read_status_paged(phydev, priv->reg_page);
1461 		if (link < 0)
1462 			return link;
1463 	} else {
1464 		/* when page is YT8521_RSSR_TO_BE_ARBITRATED, arbitration is
1465 		 * needed. by default, utp is higher priority.
1466 		 */
1467 
1468 		link_utp = yt8521_read_status_paged(phydev,
1469 						    YT8521_RSSR_UTP_SPACE);
1470 		if (link_utp < 0)
1471 			return link_utp;
1472 
1473 		if (!link_utp) {
1474 			link_fiber = yt8521_read_status_paged(phydev,
1475 							      YT8521_RSSR_FIBER_SPACE);
1476 			if (link_fiber < 0)
1477 				return link_fiber;
1478 		}
1479 
1480 		link = link_utp || link_fiber;
1481 	}
1482 
1483 	if (link) {
1484 		if (phydev->link == 0) {
1485 			/* arbitrate reg space based on linkup media type. */
1486 			if (priv->polling_mode == YT8521_MODE_POLL &&
1487 			    priv->reg_page == YT8521_RSSR_TO_BE_ARBITRATED) {
1488 				if (link_fiber)
1489 					priv->reg_page =
1490 						YT8521_RSSR_FIBER_SPACE;
1491 				else
1492 					priv->reg_page = YT8521_RSSR_UTP_SPACE;
1493 
1494 				ret = ytphy_write_ext_with_lock(phydev,
1495 								YT8521_REG_SPACE_SELECT_REG,
1496 								priv->reg_page);
1497 				if (ret < 0)
1498 					return ret;
1499 
1500 				phydev->port = link_fiber ? PORT_FIBRE : PORT_TP;
1501 
1502 				phydev_info(phydev, "%s, link up, media: %s\n",
1503 					    __func__,
1504 					    (phydev->port == PORT_TP) ?
1505 					    "UTP" : "Fiber");
1506 			}
1507 		}
1508 		phydev->link = 1;
1509 	} else {
1510 		if (phydev->link == 1) {
1511 			phydev_info(phydev, "%s, link down, media: %s\n",
1512 				    __func__, (phydev->port == PORT_TP) ?
1513 				    "UTP" : "Fiber");
1514 
1515 			/* When in YT8521_MODE_POLL mode, need prepare for next
1516 			 * arbitration.
1517 			 */
1518 			if (priv->polling_mode == YT8521_MODE_POLL) {
1519 				priv->reg_page = YT8521_RSSR_TO_BE_ARBITRATED;
1520 				phydev->port = PORT_NONE;
1521 			}
1522 		}
1523 
1524 		phydev->link = 0;
1525 	}
1526 
1527 	return 0;
1528 }
1529 
1530 /**
1531  * yt8521_modify_bmcr_paged - bits modify a PHY's BMCR register of one page
1532  * @phydev: the phy_device struct
1533  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to operate
1534  * @mask: bit mask of bits to clear
1535  * @set: bit mask of bits to set
1536  *
1537  * NOTE: Convenience function which allows a PHY's BMCR register to be
1538  * modified as new register value = (old register value & ~mask) | set.
1539  * YT8521 has two space (utp/fiber) and three mode (utp/fiber/poll), each space
1540  * has MII_BMCR. poll mode combines utp and faber,so need do both.
1541  * If it is reset, it will wait for completion.
1542  *
1543  * returns 0 or negative errno code
1544  */
1545 static int yt8521_modify_bmcr_paged(struct phy_device *phydev, int page,
1546 				    u16 mask, u16 set)
1547 {
1548 	int max_cnt = 500; /* the max wait time of reset ~ 500 ms */
1549 	int old_page;
1550 	int ret = 0;
1551 
1552 	old_page = phy_select_page(phydev, page & YT8521_RSSR_SPACE_MASK);
1553 	if (old_page < 0)
1554 		goto err_restore_page;
1555 
1556 	ret = __phy_modify(phydev, MII_BMCR, mask, set);
1557 	if (ret < 0)
1558 		goto err_restore_page;
1559 
1560 	/* If it is reset, need to wait for the reset to complete */
1561 	if (set == BMCR_RESET) {
1562 		while (max_cnt--) {
1563 			usleep_range(1000, 1100);
1564 			ret = __phy_read(phydev, MII_BMCR);
1565 			if (ret < 0)
1566 				goto err_restore_page;
1567 
1568 			if (!(ret & BMCR_RESET))
1569 				return phy_restore_page(phydev, old_page, 0);
1570 		}
1571 	}
1572 
1573 err_restore_page:
1574 	return phy_restore_page(phydev, old_page, ret);
1575 }
1576 
1577 /**
1578  * yt8521_modify_utp_fiber_bmcr - bits modify a PHY's BMCR register
1579  * @phydev: the phy_device struct
1580  * @mask: bit mask of bits to clear
1581  * @set: bit mask of bits to set
1582  *
1583  * NOTE: Convenience function which allows a PHY's BMCR register to be
1584  * modified as new register value = (old register value & ~mask) | set.
1585  * YT8521 has two space (utp/fiber) and three mode (utp/fiber/poll), each space
1586  * has MII_BMCR. poll mode combines utp and faber,so need do both.
1587  *
1588  * returns 0 or negative errno code
1589  */
1590 static int yt8521_modify_utp_fiber_bmcr(struct phy_device *phydev, u16 mask,
1591 					u16 set)
1592 {
1593 	struct yt8521_priv *priv = phydev->priv;
1594 	int ret;
1595 
1596 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
1597 		ret = yt8521_modify_bmcr_paged(phydev, priv->reg_page, mask,
1598 					       set);
1599 		if (ret < 0)
1600 			return ret;
1601 	} else {
1602 		ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_UTP_SPACE,
1603 					       mask, set);
1604 		if (ret < 0)
1605 			return ret;
1606 
1607 		ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_FIBER_SPACE,
1608 					       mask, set);
1609 		if (ret < 0)
1610 			return ret;
1611 	}
1612 	return 0;
1613 }
1614 
1615 /**
1616  * yt8521_soft_reset() - called to issue a PHY software reset
1617  * @phydev: a pointer to a &struct phy_device
1618  *
1619  * returns 0 or negative errno code
1620  */
1621 static int yt8521_soft_reset(struct phy_device *phydev)
1622 {
1623 	return yt8521_modify_utp_fiber_bmcr(phydev, 0, BMCR_RESET);
1624 }
1625 
1626 /**
1627  * yt8521_suspend() - suspend the hardware
1628  * @phydev: a pointer to a &struct phy_device
1629  *
1630  * returns 0 or negative errno code
1631  */
1632 static int yt8521_suspend(struct phy_device *phydev)
1633 {
1634 	int wol_config;
1635 
1636 	/* YTPHY_WOL_CONFIG_REG is common ext reg */
1637 	wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG);
1638 	if (wol_config < 0)
1639 		return wol_config;
1640 
1641 	/* if wol enable, do nothing */
1642 	if (wol_config & YTPHY_WCR_ENABLE)
1643 		return 0;
1644 
1645 	return yt8521_modify_utp_fiber_bmcr(phydev, 0, BMCR_PDOWN);
1646 }
1647 
1648 /**
1649  * yt8521_resume() - resume the hardware
1650  * @phydev: a pointer to a &struct phy_device
1651  *
1652  * returns 0 or negative errno code
1653  */
1654 static int yt8521_resume(struct phy_device *phydev)
1655 {
1656 	int ret;
1657 	int wol_config;
1658 
1659 	/* disable auto sleep */
1660 	ret = ytphy_modify_ext_with_lock(phydev,
1661 					 YT8521_EXTREG_SLEEP_CONTROL1_REG,
1662 					 YT8521_ESC1R_SLEEP_SW, 0);
1663 	if (ret < 0)
1664 		return ret;
1665 
1666 	wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG);
1667 	if (wol_config < 0)
1668 		return wol_config;
1669 
1670 	/* if wol enable, do nothing */
1671 	if (wol_config & YTPHY_WCR_ENABLE)
1672 		return 0;
1673 
1674 	return yt8521_modify_utp_fiber_bmcr(phydev, BMCR_PDOWN, 0);
1675 }
1676 
1677 /**
1678  * yt8521_config_init() - called to initialize the PHY
1679  * @phydev: a pointer to a &struct phy_device
1680  *
1681  * returns 0 or negative errno code
1682  */
1683 static int yt8521_config_init(struct phy_device *phydev)
1684 {
1685 	struct device *dev = &phydev->mdio.dev;
1686 	int old_page;
1687 	int ret = 0;
1688 
1689 	old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
1690 	if (old_page < 0)
1691 		goto err_restore_page;
1692 
1693 	/* set rgmii delay mode */
1694 	if (phydev->interface != PHY_INTERFACE_MODE_SGMII) {
1695 		ret = ytphy_rgmii_clk_delay_config(phydev);
1696 		if (ret < 0)
1697 			goto err_restore_page;
1698 	}
1699 
1700 	if (device_property_read_bool(dev, "motorcomm,auto-sleep-disabled")) {
1701 		/* disable auto sleep */
1702 		ret = ytphy_modify_ext(phydev, YT8521_EXTREG_SLEEP_CONTROL1_REG,
1703 				       YT8521_ESC1R_SLEEP_SW, 0);
1704 		if (ret < 0)
1705 			goto err_restore_page;
1706 	}
1707 
1708 	if (device_property_read_bool(dev, "motorcomm,keep-pll-enabled")) {
1709 		/* enable RXC clock when no wire plug */
1710 		ret = ytphy_modify_ext(phydev, YT8521_CLOCK_GATING_REG,
1711 				       YT8521_CGR_RX_CLK_EN, 0);
1712 		if (ret < 0)
1713 			goto err_restore_page;
1714 	}
1715 
1716 	if (phy_interface_is_rgmii(phydev) &&
1717 	    phydev_id_compare(phydev, PHY_ID_YT8531S))
1718 		ret = yt8531_set_ds(phydev);
1719 
1720 err_restore_page:
1721 	return phy_restore_page(phydev, old_page, ret);
1722 }
1723 
1724 static const unsigned long supported_trgs = (BIT(TRIGGER_NETDEV_FULL_DUPLEX) |
1725 					     BIT(TRIGGER_NETDEV_HALF_DUPLEX) |
1726 					     BIT(TRIGGER_NETDEV_LINK)        |
1727 					     BIT(TRIGGER_NETDEV_LINK_10)     |
1728 					     BIT(TRIGGER_NETDEV_LINK_100)    |
1729 					     BIT(TRIGGER_NETDEV_LINK_1000)   |
1730 					     BIT(TRIGGER_NETDEV_RX)          |
1731 					     BIT(TRIGGER_NETDEV_TX));
1732 
1733 static int yt8521_led_hw_is_supported(struct phy_device *phydev, u8 index,
1734 				      unsigned long rules)
1735 {
1736 	if (index >= YT8521_MAX_LEDS)
1737 		return -EINVAL;
1738 
1739 	/* All combinations of the supported triggers are allowed */
1740 	if (rules & ~supported_trgs)
1741 		return -EOPNOTSUPP;
1742 
1743 	return 0;
1744 }
1745 
1746 static int yt8521_led_hw_control_set(struct phy_device *phydev, u8 index,
1747 				     unsigned long rules)
1748 {
1749 	u16 val = 0;
1750 
1751 	if (index >= YT8521_MAX_LEDS)
1752 		return -EINVAL;
1753 
1754 	if (test_bit(TRIGGER_NETDEV_LINK, &rules)) {
1755 		val |= YT8521_LED_10_ON_EN;
1756 		val |= YT8521_LED_100_ON_EN;
1757 		val |= YT8521_LED_1000_ON_EN;
1758 	}
1759 
1760 	if (test_bit(TRIGGER_NETDEV_LINK_10, &rules))
1761 		val |= YT8521_LED_10_ON_EN;
1762 
1763 	if (test_bit(TRIGGER_NETDEV_LINK_100, &rules))
1764 		val |= YT8521_LED_100_ON_EN;
1765 
1766 	if (test_bit(TRIGGER_NETDEV_LINK_1000, &rules))
1767 		val |= YT8521_LED_1000_ON_EN;
1768 
1769 	if (test_bit(TRIGGER_NETDEV_FULL_DUPLEX, &rules))
1770 		val |= YT8521_LED_FDX_ON_EN;
1771 
1772 	if (test_bit(TRIGGER_NETDEV_HALF_DUPLEX, &rules))
1773 		val |= YT8521_LED_HDX_ON_EN;
1774 
1775 	if (test_bit(TRIGGER_NETDEV_TX, &rules) ||
1776 	    test_bit(TRIGGER_NETDEV_RX, &rules))
1777 		val |= YT8521_LED_ACT_BLK_IND;
1778 
1779 	if (test_bit(TRIGGER_NETDEV_TX, &rules))
1780 		val |= YT8521_LED_TXACT_BLK_EN;
1781 
1782 	if (test_bit(TRIGGER_NETDEV_RX, &rules))
1783 		val |= YT8521_LED_RXACT_BLK_EN;
1784 
1785 	return ytphy_write_ext(phydev, YT8521_LED0_CFG_REG + index, val);
1786 }
1787 
1788 static int yt8521_led_hw_control_get(struct phy_device *phydev, u8 index,
1789 				     unsigned long *rules)
1790 {
1791 	int val;
1792 
1793 	if (index >= YT8521_MAX_LEDS)
1794 		return -EINVAL;
1795 
1796 	val = ytphy_read_ext(phydev, YT8521_LED0_CFG_REG + index);
1797 	if (val < 0)
1798 		return val;
1799 
1800 	if (val & YT8521_LED_TXACT_BLK_EN || val & YT8521_LED_ACT_BLK_IND)
1801 		__set_bit(TRIGGER_NETDEV_TX, rules);
1802 
1803 	if (val & YT8521_LED_RXACT_BLK_EN || val & YT8521_LED_ACT_BLK_IND)
1804 		__set_bit(TRIGGER_NETDEV_RX, rules);
1805 
1806 	if (val & YT8521_LED_FDX_ON_EN)
1807 		__set_bit(TRIGGER_NETDEV_FULL_DUPLEX, rules);
1808 
1809 	if (val & YT8521_LED_HDX_ON_EN)
1810 		__set_bit(TRIGGER_NETDEV_HALF_DUPLEX, rules);
1811 
1812 	if (val & YT8521_LED_1000_ON_EN)
1813 		__set_bit(TRIGGER_NETDEV_LINK_1000, rules);
1814 
1815 	if (val & YT8521_LED_100_ON_EN)
1816 		__set_bit(TRIGGER_NETDEV_LINK_100, rules);
1817 
1818 	if (val & YT8521_LED_10_ON_EN)
1819 		__set_bit(TRIGGER_NETDEV_LINK_10, rules);
1820 
1821 	return 0;
1822 }
1823 
1824 static int yt8531_config_init(struct phy_device *phydev)
1825 {
1826 	struct device *dev = &phydev->mdio.dev;
1827 	int ret;
1828 
1829 	ret = ytphy_rgmii_clk_delay_config_with_lock(phydev);
1830 	if (ret < 0)
1831 		return ret;
1832 
1833 	if (device_property_read_bool(dev, "motorcomm,auto-sleep-disabled")) {
1834 		/* disable auto sleep */
1835 		ret = ytphy_modify_ext_with_lock(phydev,
1836 						 YT8521_EXTREG_SLEEP_CONTROL1_REG,
1837 						 YT8521_ESC1R_SLEEP_SW, 0);
1838 		if (ret < 0)
1839 			return ret;
1840 	}
1841 
1842 	if (device_property_read_bool(dev, "motorcomm,keep-pll-enabled")) {
1843 		/* enable RXC clock when no wire plug */
1844 		ret = ytphy_modify_ext_with_lock(phydev,
1845 						 YT8521_CLOCK_GATING_REG,
1846 						 YT8521_CGR_RX_CLK_EN, 0);
1847 		if (ret < 0)
1848 			return ret;
1849 	}
1850 
1851 	phy_lock_mdio_bus(phydev);
1852 	ret = yt8531_set_ds(phydev);
1853 	phy_unlock_mdio_bus(phydev);
1854 	if (ret < 0)
1855 		return ret;
1856 
1857 	return 0;
1858 }
1859 
1860 static int yt8522_config_init(struct phy_device *phydev)
1861 {
1862 	struct device *dev = &phydev->mdio.dev;
1863 	int ret, val;
1864 
1865 	val = ytphy_read_ext_with_lock(phydev, YT8522_EXTENDED_COMBO_CTRL);
1866 	if (val < 0)
1867 		return val;
1868 
1869 	if (val & YT8522_RMII_EN) {
1870 		val |= YT8522_RXDV_SEL;
1871 		ret = ytphy_write_ext_with_lock(phydev,
1872 						YT8522_EXTENDED_COMBO_CTRL,
1873 						val);
1874 		if (ret < 0)
1875 			return ret;
1876 	}
1877 
1878 	if (device_property_read_bool(dev, "motorcomm,auto-sleep-disabled")) {
1879 		/* disable auto sleep */
1880 		ret = ytphy_modify_ext_with_lock(phydev,
1881 						 YT8522_EXTREG_SLEEP_CONTROL,
1882 						 YT8522_EN_SLEEP_SW, 0);
1883 		if (ret < 0)
1884 			return ret;
1885 	}
1886 
1887 	return 0;
1888 }
1889 
1890 /**
1891  * yt8531_link_change_notify() - Adjust the tx clock direction according to
1892  * the current speed and dts config.
1893  * @phydev: a pointer to a &struct phy_device
1894  *
1895  * NOTE: This function is only used to adapt to VF2 with JH7110 SoC. Please
1896  * keep "motorcomm,tx-clk-adj-enabled" not exist in dts when the soc is not
1897  * JH7110.
1898  */
1899 static void yt8531_link_change_notify(struct phy_device *phydev)
1900 {
1901 	struct device *dev = &phydev->mdio.dev;
1902 	bool tx_clk_1000_inverted = false;
1903 	bool tx_clk_100_inverted = false;
1904 	bool tx_clk_10_inverted = false;
1905 	bool tx_clk_adj_enabled = false;
1906 	u16 val = 0;
1907 	int ret;
1908 
1909 	if (device_property_read_bool(dev, "motorcomm,tx-clk-adj-enabled"))
1910 		tx_clk_adj_enabled = true;
1911 
1912 	if (!tx_clk_adj_enabled)
1913 		return;
1914 
1915 	if (device_property_read_bool(dev, "motorcomm,tx-clk-10-inverted"))
1916 		tx_clk_10_inverted = true;
1917 	if (device_property_read_bool(dev, "motorcomm,tx-clk-100-inverted"))
1918 		tx_clk_100_inverted = true;
1919 	if (device_property_read_bool(dev, "motorcomm,tx-clk-1000-inverted"))
1920 		tx_clk_1000_inverted = true;
1921 
1922 	if (phydev->speed < 0)
1923 		return;
1924 
1925 	switch (phydev->speed) {
1926 	case SPEED_1000:
1927 		if (tx_clk_1000_inverted)
1928 			val = YT8521_RC1R_TX_CLK_SEL_INVERTED;
1929 		break;
1930 	case SPEED_100:
1931 		if (tx_clk_100_inverted)
1932 			val = YT8521_RC1R_TX_CLK_SEL_INVERTED;
1933 		break;
1934 	case SPEED_10:
1935 		if (tx_clk_10_inverted)
1936 			val = YT8521_RC1R_TX_CLK_SEL_INVERTED;
1937 		break;
1938 	default:
1939 		return;
1940 	}
1941 
1942 	ret = ytphy_modify_ext_with_lock(phydev, YT8521_RGMII_CONFIG1_REG,
1943 					 YT8521_RC1R_TX_CLK_SEL_INVERTED, val);
1944 	if (ret < 0)
1945 		phydev_warn(phydev, "Modify TX_CLK_SEL err:%d\n", ret);
1946 }
1947 
1948 /**
1949  * yt8521_prepare_fiber_features() -  A small helper function that setup
1950  * fiber's features.
1951  * @phydev: a pointer to a &struct phy_device
1952  * @dst: a pointer to store fiber's features
1953  */
1954 static void yt8521_prepare_fiber_features(struct phy_device *phydev,
1955 					  unsigned long *dst)
1956 {
1957 	linkmode_set_bit(ETHTOOL_LINK_MODE_100baseFX_Full_BIT, dst);
1958 	linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, dst);
1959 	linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, dst);
1960 	linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, dst);
1961 }
1962 
1963 /**
1964  * yt8521_fiber_setup_forced - configures/forces speed from @phydev
1965  * @phydev: target phy_device struct
1966  *
1967  * NOTE:The caller must have taken the MDIO bus lock.
1968  *
1969  * returns 0 or negative errno code
1970  */
1971 static int yt8521_fiber_setup_forced(struct phy_device *phydev)
1972 {
1973 	u16 val;
1974 	int ret;
1975 
1976 	if (phydev->speed == SPEED_1000)
1977 		val = YTPHY_MCR_FIBER_1000BX;
1978 	else if (phydev->speed == SPEED_100)
1979 		val = YTPHY_MCR_FIBER_100FX;
1980 	else
1981 		return -EINVAL;
1982 
1983 	ret =  __phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0);
1984 	if (ret < 0)
1985 		return ret;
1986 
1987 	/* disable Fiber auto sensing */
1988 	ret =  ytphy_modify_ext(phydev, YT8521_LINK_TIMER_CFG2_REG,
1989 				YT8521_LTCR_EN_AUTOSEN, 0);
1990 	if (ret < 0)
1991 		return ret;
1992 
1993 	ret =  ytphy_modify_ext(phydev, YTPHY_MISC_CONFIG_REG,
1994 				YTPHY_MCR_FIBER_SPEED_MASK, val);
1995 	if (ret < 0)
1996 		return ret;
1997 
1998 	return ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG,
1999 				YT8521_CCR_SW_RST, 0);
2000 }
2001 
2002 /**
2003  * ytphy_check_and_restart_aneg - Enable and restart auto-negotiation
2004  * @phydev: target phy_device struct
2005  * @restart: whether aneg restart is requested
2006  *
2007  * NOTE:The caller must have taken the MDIO bus lock.
2008  *
2009  * returns 0 or negative errno code
2010  */
2011 static int ytphy_check_and_restart_aneg(struct phy_device *phydev, bool restart)
2012 {
2013 	int ret;
2014 
2015 	if (!restart) {
2016 		/* Advertisement hasn't changed, but maybe aneg was never on to
2017 		 * begin with?  Or maybe phy was isolated?
2018 		 */
2019 		ret = __phy_read(phydev, MII_BMCR);
2020 		if (ret < 0)
2021 			return ret;
2022 
2023 		if (!(ret & BMCR_ANENABLE) || (ret & BMCR_ISOLATE))
2024 			restart = true;
2025 	}
2026 	/* Enable and Restart Autonegotiation
2027 	 * Don't isolate the PHY if we're negotiating
2028 	 */
2029 	if (restart)
2030 		return __phy_modify(phydev, MII_BMCR, BMCR_ISOLATE,
2031 				    BMCR_ANENABLE | BMCR_ANRESTART);
2032 
2033 	return 0;
2034 }
2035 
2036 /**
2037  * yt8521_fiber_config_aneg - restart auto-negotiation or write
2038  * YTPHY_MISC_CONFIG_REG.
2039  * @phydev: target phy_device struct
2040  *
2041  * NOTE:The caller must have taken the MDIO bus lock.
2042  *
2043  * returns 0 or negative errno code
2044  */
2045 static int yt8521_fiber_config_aneg(struct phy_device *phydev)
2046 {
2047 	int err, changed = 0;
2048 	int bmcr;
2049 	u16 adv;
2050 
2051 	if (phydev->autoneg != AUTONEG_ENABLE)
2052 		return yt8521_fiber_setup_forced(phydev);
2053 
2054 	/* enable Fiber auto sensing */
2055 	err =  ytphy_modify_ext(phydev, YT8521_LINK_TIMER_CFG2_REG,
2056 				0, YT8521_LTCR_EN_AUTOSEN);
2057 	if (err < 0)
2058 		return err;
2059 
2060 	err =  ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG,
2061 				YT8521_CCR_SW_RST, 0);
2062 	if (err < 0)
2063 		return err;
2064 
2065 	bmcr = __phy_read(phydev, MII_BMCR);
2066 	if (bmcr < 0)
2067 		return bmcr;
2068 
2069 	/* When it is coming from fiber forced mode, add bmcr power down
2070 	 * and power up to let aneg work fine.
2071 	 */
2072 	if (!(bmcr & BMCR_ANENABLE)) {
2073 		__phy_modify(phydev, MII_BMCR, 0, BMCR_PDOWN);
2074 		usleep_range(1000, 1100);
2075 		__phy_modify(phydev, MII_BMCR, BMCR_PDOWN, 0);
2076 	}
2077 
2078 	adv = linkmode_adv_to_mii_adv_x(phydev->advertising,
2079 					ETHTOOL_LINK_MODE_1000baseX_Full_BIT);
2080 
2081 	/* Setup fiber advertisement */
2082 	err = __phy_modify_changed(phydev, MII_ADVERTISE,
2083 				   ADVERTISE_1000XHALF | ADVERTISE_1000XFULL |
2084 				   ADVERTISE_1000XPAUSE |
2085 				   ADVERTISE_1000XPSE_ASYM,
2086 				   adv);
2087 	if (err < 0)
2088 		return err;
2089 
2090 	if (err > 0)
2091 		changed = 1;
2092 
2093 	return ytphy_check_and_restart_aneg(phydev, changed);
2094 }
2095 
2096 /**
2097  * ytphy_setup_master_slave
2098  * @phydev: target phy_device struct
2099  *
2100  * NOTE: The caller must have taken the MDIO bus lock.
2101  *
2102  * returns 0 or negative errno code
2103  */
2104 static int ytphy_setup_master_slave(struct phy_device *phydev)
2105 {
2106 	u16 ctl = 0;
2107 
2108 	if (!phydev->is_gigabit_capable)
2109 		return 0;
2110 
2111 	switch (phydev->master_slave_set) {
2112 	case MASTER_SLAVE_CFG_MASTER_PREFERRED:
2113 		ctl |= CTL1000_PREFER_MASTER;
2114 		break;
2115 	case MASTER_SLAVE_CFG_SLAVE_PREFERRED:
2116 		break;
2117 	case MASTER_SLAVE_CFG_MASTER_FORCE:
2118 		ctl |= CTL1000_AS_MASTER;
2119 		fallthrough;
2120 	case MASTER_SLAVE_CFG_SLAVE_FORCE:
2121 		ctl |= CTL1000_ENABLE_MASTER;
2122 		break;
2123 	case MASTER_SLAVE_CFG_UNKNOWN:
2124 	case MASTER_SLAVE_CFG_UNSUPPORTED:
2125 		return 0;
2126 	default:
2127 		phydev_warn(phydev, "Unsupported Master/Slave mode\n");
2128 		return -EOPNOTSUPP;
2129 	}
2130 
2131 	return __phy_modify_changed(phydev, MII_CTRL1000,
2132 				    (CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER |
2133 				    CTL1000_PREFER_MASTER), ctl);
2134 }
2135 
2136 /**
2137  * ytphy_utp_config_advert - sanitize and advertise auto-negotiation parameters
2138  * @phydev: target phy_device struct
2139  *
2140  * NOTE: Writes MII_ADVERTISE with the appropriate values,
2141  * after sanitizing the values to make sure we only advertise
2142  * what is supported.  Returns < 0 on error, 0 if the PHY's advertisement
2143  * hasn't changed, and > 0 if it has changed.
2144  * The caller must have taken the MDIO bus lock.
2145  *
2146  * returns 0 or negative errno code
2147  */
2148 static int ytphy_utp_config_advert(struct phy_device *phydev)
2149 {
2150 	int err, bmsr, changed = 0;
2151 	u32 adv;
2152 
2153 	/* Only allow advertising what this PHY supports */
2154 	linkmode_and(phydev->advertising, phydev->advertising,
2155 		     phydev->supported);
2156 
2157 	adv = linkmode_adv_to_mii_adv_t(phydev->advertising);
2158 
2159 	/* Setup standard advertisement */
2160 	err = __phy_modify_changed(phydev, MII_ADVERTISE,
2161 				   ADVERTISE_ALL | ADVERTISE_100BASE4 |
2162 				   ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM,
2163 				   adv);
2164 	if (err < 0)
2165 		return err;
2166 	if (err > 0)
2167 		changed = 1;
2168 
2169 	bmsr = __phy_read(phydev, MII_BMSR);
2170 	if (bmsr < 0)
2171 		return bmsr;
2172 
2173 	/* Per 802.3-2008, Section 22.2.4.2.16 Extended status all
2174 	 * 1000Mbits/sec capable PHYs shall have the BMSR_ESTATEN bit set to a
2175 	 * logical 1.
2176 	 */
2177 	if (!(bmsr & BMSR_ESTATEN))
2178 		return changed;
2179 
2180 	adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising);
2181 
2182 	err = __phy_modify_changed(phydev, MII_CTRL1000,
2183 				   ADVERTISE_1000FULL | ADVERTISE_1000HALF,
2184 				   adv);
2185 	if (err < 0)
2186 		return err;
2187 	if (err > 0)
2188 		changed = 1;
2189 
2190 	return changed;
2191 }
2192 
2193 /**
2194  * ytphy_utp_config_aneg - restart auto-negotiation or write BMCR
2195  * @phydev: target phy_device struct
2196  * @changed: whether autoneg is requested
2197  *
2198  * NOTE: If auto-negotiation is enabled, we configure the
2199  * advertising, and then restart auto-negotiation.  If it is not
2200  * enabled, then we write the BMCR.
2201  * The caller must have taken the MDIO bus lock.
2202  *
2203  * returns 0 or negative errno code
2204  */
2205 static int ytphy_utp_config_aneg(struct phy_device *phydev, bool changed)
2206 {
2207 	int err;
2208 	u16 ctl;
2209 
2210 	err = ytphy_setup_master_slave(phydev);
2211 	if (err < 0)
2212 		return err;
2213 	else if (err)
2214 		changed = true;
2215 
2216 	if (phydev->autoneg != AUTONEG_ENABLE) {
2217 		/* configures/forces speed/duplex from @phydev */
2218 
2219 		ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex);
2220 
2221 		return __phy_modify(phydev, MII_BMCR, ~(BMCR_LOOPBACK |
2222 				    BMCR_ISOLATE | BMCR_PDOWN), ctl);
2223 	}
2224 
2225 	err = ytphy_utp_config_advert(phydev);
2226 	if (err < 0) /* error */
2227 		return err;
2228 	else if (err)
2229 		changed = true;
2230 
2231 	return ytphy_check_and_restart_aneg(phydev, changed);
2232 }
2233 
2234 /**
2235  * yt8521_config_aneg_paged() - switch reg space then call genphy_config_aneg
2236  * of one page
2237  * @phydev: a pointer to a &struct phy_device
2238  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to
2239  * operate.
2240  *
2241  * returns 0 or negative errno code
2242  */
2243 static int yt8521_config_aneg_paged(struct phy_device *phydev, int page)
2244 {
2245 	__ETHTOOL_DECLARE_LINK_MODE_MASK(fiber_supported);
2246 	struct yt8521_priv *priv = phydev->priv;
2247 	int old_page;
2248 	int ret = 0;
2249 
2250 	page &= YT8521_RSSR_SPACE_MASK;
2251 
2252 	old_page = phy_select_page(phydev, page);
2253 	if (old_page < 0)
2254 		goto err_restore_page;
2255 
2256 	/* If reg_page is YT8521_RSSR_TO_BE_ARBITRATED,
2257 	 * phydev->advertising should be updated.
2258 	 */
2259 	if (priv->reg_page == YT8521_RSSR_TO_BE_ARBITRATED) {
2260 		linkmode_zero(fiber_supported);
2261 		yt8521_prepare_fiber_features(phydev, fiber_supported);
2262 
2263 		/* prepare fiber_supported, then setup advertising. */
2264 		if (page == YT8521_RSSR_FIBER_SPACE) {
2265 			linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT,
2266 					 fiber_supported);
2267 			linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
2268 					 fiber_supported);
2269 			linkmode_and(phydev->advertising,
2270 				     priv->combo_advertising, fiber_supported);
2271 		} else {
2272 			/* ETHTOOL_LINK_MODE_Autoneg_BIT is also used in utp */
2273 			linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
2274 					   fiber_supported);
2275 			linkmode_andnot(phydev->advertising,
2276 					priv->combo_advertising,
2277 					fiber_supported);
2278 		}
2279 	}
2280 
2281 	if (page == YT8521_RSSR_FIBER_SPACE)
2282 		ret = yt8521_fiber_config_aneg(phydev);
2283 	else
2284 		ret = ytphy_utp_config_aneg(phydev, false);
2285 
2286 err_restore_page:
2287 	return phy_restore_page(phydev, old_page, ret);
2288 }
2289 
2290 /**
2291  * yt8521_config_aneg() - change reg space then call yt8521_config_aneg_paged
2292  * @phydev: a pointer to a &struct phy_device
2293  *
2294  * returns 0 or negative errno code
2295  */
2296 static int yt8521_config_aneg(struct phy_device *phydev)
2297 {
2298 	struct yt8521_priv *priv = phydev->priv;
2299 	int ret;
2300 
2301 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
2302 		ret = yt8521_config_aneg_paged(phydev, priv->reg_page);
2303 		if (ret < 0)
2304 			return ret;
2305 	} else {
2306 		/* If reg_page is YT8521_RSSR_TO_BE_ARBITRATED,
2307 		 * phydev->advertising need to be saved at first run.
2308 		 * Because it contains the advertising which supported by both
2309 		 * mac and yt8521(utp and fiber).
2310 		 */
2311 		if (linkmode_empty(priv->combo_advertising)) {
2312 			linkmode_copy(priv->combo_advertising,
2313 				      phydev->advertising);
2314 		}
2315 
2316 		ret = yt8521_config_aneg_paged(phydev, YT8521_RSSR_UTP_SPACE);
2317 		if (ret < 0)
2318 			return ret;
2319 
2320 		ret = yt8521_config_aneg_paged(phydev, YT8521_RSSR_FIBER_SPACE);
2321 		if (ret < 0)
2322 			return ret;
2323 
2324 		/* we don't known which will be link, so restore
2325 		 * phydev->advertising as default value.
2326 		 */
2327 		linkmode_copy(phydev->advertising, priv->combo_advertising);
2328 	}
2329 	return 0;
2330 }
2331 
2332 /**
2333  * yt8521_aneg_done_paged() - determines the auto negotiation result of one
2334  * page.
2335  * @phydev: a pointer to a &struct phy_device
2336  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to
2337  * operate.
2338  *
2339  * returns 0(no link)or 1(fiber or utp link) or negative errno code
2340  */
2341 static int yt8521_aneg_done_paged(struct phy_device *phydev, int page)
2342 {
2343 	int old_page;
2344 	int ret = 0;
2345 	int link;
2346 
2347 	old_page = phy_select_page(phydev, page & YT8521_RSSR_SPACE_MASK);
2348 	if (old_page < 0)
2349 		goto err_restore_page;
2350 
2351 	ret = __phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG);
2352 	if (ret < 0)
2353 		goto err_restore_page;
2354 
2355 	link = !!(ret & YTPHY_SSR_LINK);
2356 	ret = link;
2357 
2358 err_restore_page:
2359 	return phy_restore_page(phydev, old_page, ret);
2360 }
2361 
2362 /**
2363  * yt8521_aneg_done() - determines the auto negotiation result
2364  * @phydev: a pointer to a &struct phy_device
2365  *
2366  * returns 0(no link)or 1(fiber or utp link) or negative errno code
2367  */
2368 static int yt8521_aneg_done(struct phy_device *phydev)
2369 {
2370 	struct yt8521_priv *priv = phydev->priv;
2371 	int link_fiber = 0;
2372 	int link_utp;
2373 	int link;
2374 
2375 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
2376 		link = yt8521_aneg_done_paged(phydev, priv->reg_page);
2377 	} else {
2378 		link_utp = yt8521_aneg_done_paged(phydev,
2379 						  YT8521_RSSR_UTP_SPACE);
2380 		if (link_utp < 0)
2381 			return link_utp;
2382 
2383 		if (!link_utp) {
2384 			link_fiber = yt8521_aneg_done_paged(phydev,
2385 							    YT8521_RSSR_FIBER_SPACE);
2386 			if (link_fiber < 0)
2387 				return link_fiber;
2388 		}
2389 		link = link_fiber || link_utp;
2390 		phydev_info(phydev, "%s, link_fiber: %d, link_utp: %d\n",
2391 			    __func__, link_fiber, link_utp);
2392 	}
2393 
2394 	return link;
2395 }
2396 
2397 /**
2398  * ytphy_utp_read_abilities - read PHY abilities from Clause 22 registers
2399  * @phydev: target phy_device struct
2400  *
2401  * NOTE: Reads the PHY's abilities and populates
2402  * phydev->supported accordingly.
2403  * The caller must have taken the MDIO bus lock.
2404  *
2405  * returns 0 or negative errno code
2406  */
2407 static int ytphy_utp_read_abilities(struct phy_device *phydev)
2408 {
2409 	int val;
2410 
2411 	linkmode_set_bit_array(phy_basic_ports_array,
2412 			       ARRAY_SIZE(phy_basic_ports_array),
2413 			       phydev->supported);
2414 
2415 	val = __phy_read(phydev, MII_BMSR);
2416 	if (val < 0)
2417 		return val;
2418 
2419 	linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported,
2420 			 val & BMSR_ANEGCAPABLE);
2421 
2422 	linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, phydev->supported,
2423 			 val & BMSR_100FULL);
2424 	linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, phydev->supported,
2425 			 val & BMSR_100HALF);
2426 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, phydev->supported,
2427 			 val & BMSR_10FULL);
2428 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, phydev->supported,
2429 			 val & BMSR_10HALF);
2430 
2431 	if (val & BMSR_ESTATEN) {
2432 		val = __phy_read(phydev, MII_ESTATUS);
2433 		if (val < 0)
2434 			return val;
2435 
2436 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
2437 				 phydev->supported, val & ESTATUS_1000_TFULL);
2438 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
2439 				 phydev->supported, val & ESTATUS_1000_THALF);
2440 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
2441 				 phydev->supported, val & ESTATUS_1000_XFULL);
2442 	}
2443 
2444 	return 0;
2445 }
2446 
2447 /**
2448  * yt8521_get_features_paged() -  read supported link modes for one page
2449  * @phydev: a pointer to a &struct phy_device
2450  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to
2451  * operate.
2452  *
2453  * returns 0 or negative errno code
2454  */
2455 static int yt8521_get_features_paged(struct phy_device *phydev, int page)
2456 {
2457 	int old_page;
2458 	int ret = 0;
2459 
2460 	page &= YT8521_RSSR_SPACE_MASK;
2461 	old_page = phy_select_page(phydev, page);
2462 	if (old_page < 0)
2463 		goto err_restore_page;
2464 
2465 	if (page == YT8521_RSSR_FIBER_SPACE) {
2466 		linkmode_zero(phydev->supported);
2467 		yt8521_prepare_fiber_features(phydev, phydev->supported);
2468 	} else {
2469 		ret = ytphy_utp_read_abilities(phydev);
2470 		if (ret < 0)
2471 			goto err_restore_page;
2472 	}
2473 
2474 err_restore_page:
2475 	return phy_restore_page(phydev, old_page, ret);
2476 }
2477 
2478 /**
2479  * yt8521_get_features - switch reg space then call yt8521_get_features_paged
2480  * @phydev: target phy_device struct
2481  *
2482  * returns 0 or negative errno code
2483  */
2484 static int yt8521_get_features(struct phy_device *phydev)
2485 {
2486 	struct yt8521_priv *priv = phydev->priv;
2487 	int ret;
2488 
2489 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
2490 		ret = yt8521_get_features_paged(phydev, priv->reg_page);
2491 	} else {
2492 		ret = yt8521_get_features_paged(phydev,
2493 						YT8521_RSSR_UTP_SPACE);
2494 		if (ret < 0)
2495 			return ret;
2496 
2497 		/* add fiber's features to phydev->supported */
2498 		yt8521_prepare_fiber_features(phydev, phydev->supported);
2499 	}
2500 	return ret;
2501 }
2502 
2503 /**
2504  * yt8821_get_features - read mmd register to get 2.5G capability
2505  * @phydev: target phy_device struct
2506  *
2507  * Returns: 0 or negative errno code
2508  */
2509 static int yt8821_get_features(struct phy_device *phydev)
2510 {
2511 	int ret;
2512 
2513 	ret = genphy_c45_pma_read_ext_abilities(phydev);
2514 	if (ret < 0)
2515 		return ret;
2516 
2517 	return genphy_read_abilities(phydev);
2518 }
2519 
2520 /**
2521  * yt8821_get_rate_matching - read register to get phy chip mode
2522  * @phydev: target phy_device struct
2523  * @iface: PHY data interface type
2524  *
2525  * Returns: rate matching type or negative errno code
2526  */
2527 static int yt8821_get_rate_matching(struct phy_device *phydev,
2528 				    phy_interface_t iface)
2529 {
2530 	int val;
2531 
2532 	val = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG);
2533 	if (val < 0)
2534 		return val;
2535 
2536 	if (FIELD_GET(YT8521_CCR_MODE_SEL_MASK, val) ==
2537 	    YT8821_CHIP_MODE_FORCE_BX2500)
2538 		return RATE_MATCH_PAUSE;
2539 
2540 	return RATE_MATCH_NONE;
2541 }
2542 
2543 /**
2544  * yt8821_aneg_done() - determines the auto negotiation result
2545  * @phydev: a pointer to a &struct phy_device
2546  *
2547  * Returns: 0(no link)or 1(utp link) or negative errno code
2548  */
2549 static int yt8821_aneg_done(struct phy_device *phydev)
2550 {
2551 	return yt8521_aneg_done_paged(phydev, YT8521_RSSR_UTP_SPACE);
2552 }
2553 
2554 /**
2555  * yt8821_serdes_init() - serdes init
2556  * @phydev: a pointer to a &struct phy_device
2557  *
2558  * Returns: 0 or negative errno code
2559  */
2560 static int yt8821_serdes_init(struct phy_device *phydev)
2561 {
2562 	int old_page;
2563 	int ret = 0;
2564 	u16 mask;
2565 	u16 set;
2566 
2567 	old_page = phy_select_page(phydev, YT8521_RSSR_FIBER_SPACE);
2568 	if (old_page < 0) {
2569 		phydev_err(phydev, "Failed to select page: %d\n",
2570 			   old_page);
2571 		goto err_restore_page;
2572 	}
2573 
2574 	ret = __phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0);
2575 	if (ret < 0)
2576 		goto err_restore_page;
2577 
2578 	mask = YT8821_SDS_EXT_CSR_VCO_LDO_EN |
2579 		YT8821_SDS_EXT_CSR_VCO_BIAS_LPF_EN;
2580 	set = YT8821_SDS_EXT_CSR_VCO_LDO_EN;
2581 	ret = ytphy_modify_ext(phydev, YT8821_SDS_EXT_CSR_CTRL_REG, mask,
2582 			       set);
2583 
2584 err_restore_page:
2585 	return phy_restore_page(phydev, old_page, ret);
2586 }
2587 
2588 /**
2589  * yt8821_utp_init() - utp init
2590  * @phydev: a pointer to a &struct phy_device
2591  *
2592  * Returns: 0 or negative errno code
2593  */
2594 static int yt8821_utp_init(struct phy_device *phydev)
2595 {
2596 	int old_page;
2597 	int ret = 0;
2598 	u16 mask;
2599 	u16 save;
2600 	u16 set;
2601 
2602 	old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
2603 	if (old_page < 0) {
2604 		phydev_err(phydev, "Failed to select page: %d\n",
2605 			   old_page);
2606 		goto err_restore_page;
2607 	}
2608 
2609 	mask = YT8821_UTP_EXT_RPDN_BP_FFE_LNG_2500 |
2610 		YT8821_UTP_EXT_RPDN_BP_FFE_SHT_2500 |
2611 		YT8821_UTP_EXT_RPDN_IPR_SHT_2500;
2612 	set = YT8821_UTP_EXT_RPDN_BP_FFE_LNG_2500 |
2613 		YT8821_UTP_EXT_RPDN_BP_FFE_SHT_2500;
2614 	ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_RPDN_CTRL_REG,
2615 			       mask, set);
2616 	if (ret < 0)
2617 		goto err_restore_page;
2618 
2619 	mask = YT8821_UTP_EXT_VGA_LPF1_CAP_OTHER |
2620 		YT8821_UTP_EXT_VGA_LPF1_CAP_2500;
2621 	ret = ytphy_modify_ext(phydev,
2622 			       YT8821_UTP_EXT_VGA_LPF1_CAP_CTRL_REG,
2623 			       mask, 0);
2624 	if (ret < 0)
2625 		goto err_restore_page;
2626 
2627 	mask = YT8821_UTP_EXT_VGA_LPF2_CAP_OTHER |
2628 		YT8821_UTP_EXT_VGA_LPF2_CAP_2500;
2629 	ret = ytphy_modify_ext(phydev,
2630 			       YT8821_UTP_EXT_VGA_LPF2_CAP_CTRL_REG,
2631 			       mask, 0);
2632 	if (ret < 0)
2633 		goto err_restore_page;
2634 
2635 	mask = YT8821_UTP_EXT_TRACE_LNG_GAIN_THE_2500 |
2636 		YT8821_UTP_EXT_TRACE_MED_GAIN_THE_2500;
2637 	set = FIELD_PREP(YT8821_UTP_EXT_TRACE_LNG_GAIN_THE_2500, 0x5a) |
2638 		FIELD_PREP(YT8821_UTP_EXT_TRACE_MED_GAIN_THE_2500, 0x3c);
2639 	ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_TRACE_CTRL_REG,
2640 			       mask, set);
2641 	if (ret < 0)
2642 		goto err_restore_page;
2643 
2644 	mask = YT8821_UTP_EXT_IPR_LNG_2500;
2645 	set = FIELD_PREP(YT8821_UTP_EXT_IPR_LNG_2500, 0x6c);
2646 	ret = ytphy_modify_ext(phydev,
2647 			       YT8821_UTP_EXT_ALPHA_IPR_CTRL_REG,
2648 			       mask, set);
2649 	if (ret < 0)
2650 		goto err_restore_page;
2651 
2652 	mask = YT8821_UTP_EXT_TRACE_LNG_GAIN_THR_1000;
2653 	set = FIELD_PREP(YT8821_UTP_EXT_TRACE_LNG_GAIN_THR_1000, 0x2a);
2654 	ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_ECHO_CTRL_REG,
2655 			       mask, set);
2656 	if (ret < 0)
2657 		goto err_restore_page;
2658 
2659 	mask = YT8821_UTP_EXT_TRACE_MED_GAIN_THR_1000;
2660 	set = FIELD_PREP(YT8821_UTP_EXT_TRACE_MED_GAIN_THR_1000, 0x22);
2661 	ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_GAIN_CTRL_REG,
2662 			       mask, set);
2663 	if (ret < 0)
2664 		goto err_restore_page;
2665 
2666 	mask = YT8821_UTP_EXT_TH_20DB_2500;
2667 	set = FIELD_PREP(YT8821_UTP_EXT_TH_20DB_2500, 0x8000);
2668 	ret = ytphy_modify_ext(phydev,
2669 			       YT8821_UTP_EXT_TH_20DB_2500_CTRL_REG,
2670 			       mask, set);
2671 	if (ret < 0)
2672 		goto err_restore_page;
2673 
2674 	mask = YT8821_UTP_EXT_MU_COARSE_FR_F_FFE |
2675 		YT8821_UTP_EXT_MU_COARSE_FR_F_FBE;
2676 	set = FIELD_PREP(YT8821_UTP_EXT_MU_COARSE_FR_F_FFE, 0x7) |
2677 		FIELD_PREP(YT8821_UTP_EXT_MU_COARSE_FR_F_FBE, 0x7);
2678 	ret = ytphy_modify_ext(phydev,
2679 			       YT8821_UTP_EXT_MU_COARSE_FR_CTRL_REG,
2680 			       mask, set);
2681 	if (ret < 0)
2682 		goto err_restore_page;
2683 
2684 	mask = YT8821_UTP_EXT_MU_FINE_FR_F_FFE |
2685 		YT8821_UTP_EXT_MU_FINE_FR_F_FBE;
2686 	set = FIELD_PREP(YT8821_UTP_EXT_MU_FINE_FR_F_FFE, 0x2) |
2687 		FIELD_PREP(YT8821_UTP_EXT_MU_FINE_FR_F_FBE, 0x2);
2688 	ret = ytphy_modify_ext(phydev,
2689 			       YT8821_UTP_EXT_MU_FINE_FR_CTRL_REG,
2690 			       mask, set);
2691 	if (ret < 0)
2692 		goto err_restore_page;
2693 
2694 	/* save YT8821_UTP_EXT_PI_CTRL_REG's val for use later */
2695 	ret = ytphy_read_ext(phydev, YT8821_UTP_EXT_PI_CTRL_REG);
2696 	if (ret < 0)
2697 		goto err_restore_page;
2698 
2699 	save = ret;
2700 
2701 	mask = YT8821_UTP_EXT_PI_TX_CLK_SEL_AFE |
2702 		YT8821_UTP_EXT_PI_RX_CLK_3_SEL_AFE |
2703 		YT8821_UTP_EXT_PI_RX_CLK_2_SEL_AFE |
2704 		YT8821_UTP_EXT_PI_RX_CLK_1_SEL_AFE |
2705 		YT8821_UTP_EXT_PI_RX_CLK_0_SEL_AFE;
2706 	ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_PI_CTRL_REG,
2707 			       mask, 0);
2708 	if (ret < 0)
2709 		goto err_restore_page;
2710 
2711 	/* restore YT8821_UTP_EXT_PI_CTRL_REG's val */
2712 	ret = ytphy_write_ext(phydev, YT8821_UTP_EXT_PI_CTRL_REG, save);
2713 	if (ret < 0)
2714 		goto err_restore_page;
2715 
2716 	mask = YT8821_UTP_EXT_FECHO_AMP_TH_HUGE;
2717 	set = FIELD_PREP(YT8821_UTP_EXT_FECHO_AMP_TH_HUGE, 0x38);
2718 	ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_VCT_CFG6_CTRL_REG,
2719 			       mask, set);
2720 	if (ret < 0)
2721 		goto err_restore_page;
2722 
2723 	mask = YT8821_UTP_EXT_NFR_TX_ABILITY;
2724 	set = YT8821_UTP_EXT_NFR_TX_ABILITY;
2725 	ret = ytphy_modify_ext(phydev,
2726 			       YT8821_UTP_EXT_TXGE_NFR_FR_THP_CTRL_REG,
2727 			       mask, set);
2728 	if (ret < 0)
2729 		goto err_restore_page;
2730 
2731 	mask = YT8821_UTP_EXT_PLL_SPARE_CFG;
2732 	set = FIELD_PREP(YT8821_UTP_EXT_PLL_SPARE_CFG, 0xe9);
2733 	ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_PLL_CTRL_REG,
2734 			       mask, set);
2735 	if (ret < 0)
2736 		goto err_restore_page;
2737 
2738 	mask = YT8821_UTP_EXT_DAC_IMID_CH_3_10_ORG |
2739 		YT8821_UTP_EXT_DAC_IMID_CH_2_10_ORG;
2740 	set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_3_10_ORG, 0x64) |
2741 		FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_2_10_ORG, 0x64);
2742 	ret = ytphy_modify_ext(phydev,
2743 			       YT8821_UTP_EXT_DAC_IMID_CH_2_3_CTRL_REG,
2744 			       mask, set);
2745 	if (ret < 0)
2746 		goto err_restore_page;
2747 
2748 	mask = YT8821_UTP_EXT_DAC_IMID_CH_1_10_ORG |
2749 		YT8821_UTP_EXT_DAC_IMID_CH_0_10_ORG;
2750 	set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_1_10_ORG, 0x64) |
2751 		FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_0_10_ORG, 0x64);
2752 	ret = ytphy_modify_ext(phydev,
2753 			       YT8821_UTP_EXT_DAC_IMID_CH_0_1_CTRL_REG,
2754 			       mask, set);
2755 	if (ret < 0)
2756 		goto err_restore_page;
2757 
2758 	mask = YT8821_UTP_EXT_DAC_IMSB_CH_3_10_ORG |
2759 		YT8821_UTP_EXT_DAC_IMSB_CH_2_10_ORG;
2760 	set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_3_10_ORG, 0x64) |
2761 		FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_2_10_ORG, 0x64);
2762 	ret = ytphy_modify_ext(phydev,
2763 			       YT8821_UTP_EXT_DAC_IMSB_CH_2_3_CTRL_REG,
2764 			       mask, set);
2765 	if (ret < 0)
2766 		goto err_restore_page;
2767 
2768 	mask = YT8821_UTP_EXT_DAC_IMSB_CH_1_10_ORG |
2769 		YT8821_UTP_EXT_DAC_IMSB_CH_0_10_ORG;
2770 	set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_1_10_ORG, 0x64) |
2771 		FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_0_10_ORG, 0x64);
2772 	ret = ytphy_modify_ext(phydev,
2773 			       YT8821_UTP_EXT_DAC_IMSB_CH_0_1_CTRL_REG,
2774 			       mask, set);
2775 
2776 err_restore_page:
2777 	return phy_restore_page(phydev, old_page, ret);
2778 }
2779 
2780 /**
2781  * yt8821_auto_sleep_config() - phy auto sleep config
2782  * @phydev: a pointer to a &struct phy_device
2783  * @enable: true enable auto sleep, false disable auto sleep
2784  *
2785  * Returns: 0 or negative errno code
2786  */
2787 static int yt8821_auto_sleep_config(struct phy_device *phydev,
2788 				    bool enable)
2789 {
2790 	int old_page;
2791 	int ret = 0;
2792 
2793 	old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
2794 	if (old_page < 0) {
2795 		phydev_err(phydev, "Failed to select page: %d\n",
2796 			   old_page);
2797 		goto err_restore_page;
2798 	}
2799 
2800 	ret = ytphy_modify_ext(phydev,
2801 			       YT8521_EXTREG_SLEEP_CONTROL1_REG,
2802 			       YT8521_ESC1R_SLEEP_SW,
2803 			       enable ? 1 : 0);
2804 
2805 err_restore_page:
2806 	return phy_restore_page(phydev, old_page, ret);
2807 }
2808 
2809 /**
2810  * yt8821_soft_reset() - soft reset utp and serdes
2811  * @phydev: a pointer to a &struct phy_device
2812  *
2813  * Returns: 0 or negative errno code
2814  */
2815 static int yt8821_soft_reset(struct phy_device *phydev)
2816 {
2817 	return ytphy_modify_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG,
2818 					  YT8521_CCR_SW_RST, 0);
2819 }
2820 
2821 /**
2822  * yt8821_config_init() - phy initializatioin
2823  * @phydev: a pointer to a &struct phy_device
2824  *
2825  * Returns: 0 or negative errno code
2826  */
2827 static int yt8821_config_init(struct phy_device *phydev)
2828 {
2829 	u8 mode = YT8821_CHIP_MODE_AUTO_BX2500_SGMII;
2830 	int ret;
2831 	u16 set;
2832 
2833 	if (phydev->interface == PHY_INTERFACE_MODE_2500BASEX)
2834 		mode = YT8821_CHIP_MODE_FORCE_BX2500;
2835 
2836 	set = FIELD_PREP(YT8521_CCR_MODE_SEL_MASK, mode);
2837 	ret = ytphy_modify_ext_with_lock(phydev,
2838 					 YT8521_CHIP_CONFIG_REG,
2839 					 YT8521_CCR_MODE_SEL_MASK,
2840 					 set);
2841 	if (ret < 0)
2842 		return ret;
2843 
2844 	__set_bit(PHY_INTERFACE_MODE_2500BASEX,
2845 		  phydev->possible_interfaces);
2846 
2847 	if (mode == YT8821_CHIP_MODE_AUTO_BX2500_SGMII) {
2848 		__set_bit(PHY_INTERFACE_MODE_SGMII,
2849 			  phydev->possible_interfaces);
2850 
2851 		phydev->rate_matching = RATE_MATCH_NONE;
2852 	} else if (mode == YT8821_CHIP_MODE_FORCE_BX2500) {
2853 		phydev->rate_matching = RATE_MATCH_PAUSE;
2854 	}
2855 
2856 	ret = yt8821_serdes_init(phydev);
2857 	if (ret < 0)
2858 		return ret;
2859 
2860 	ret = yt8821_utp_init(phydev);
2861 	if (ret < 0)
2862 		return ret;
2863 
2864 	/* disable auto sleep */
2865 	ret = yt8821_auto_sleep_config(phydev, false);
2866 	if (ret < 0)
2867 		return ret;
2868 
2869 	/* soft reset */
2870 	return yt8821_soft_reset(phydev);
2871 }
2872 
2873 /**
2874  * yt8821_adjust_status() - update speed and duplex to phydev
2875  * @phydev: a pointer to a &struct phy_device
2876  * @val: read from YTPHY_SPECIFIC_STATUS_REG
2877  */
2878 static void yt8821_adjust_status(struct phy_device *phydev, int val)
2879 {
2880 	int speed, duplex;
2881 	int speed_mode;
2882 
2883 	duplex = FIELD_GET(YTPHY_SSR_DUPLEX, val);
2884 	speed_mode = val & YTPHY_SSR_SPEED_MASK;
2885 	switch (speed_mode) {
2886 	case YTPHY_SSR_SPEED_10M:
2887 		speed = SPEED_10;
2888 		break;
2889 	case YTPHY_SSR_SPEED_100M:
2890 		speed = SPEED_100;
2891 		break;
2892 	case YTPHY_SSR_SPEED_1000M:
2893 		speed = SPEED_1000;
2894 		break;
2895 	case YTPHY_SSR_SPEED_2500M:
2896 		speed = SPEED_2500;
2897 		break;
2898 	default:
2899 		speed = SPEED_UNKNOWN;
2900 		break;
2901 	}
2902 
2903 	phydev->speed = speed;
2904 	phydev->duplex = duplex;
2905 }
2906 
2907 /**
2908  * yt8821_update_interface() - update interface per current speed
2909  * @phydev: a pointer to a &struct phy_device
2910  */
2911 static void yt8821_update_interface(struct phy_device *phydev)
2912 {
2913 	if (!phydev->link)
2914 		return;
2915 
2916 	switch (phydev->speed) {
2917 	case SPEED_2500:
2918 		phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
2919 		break;
2920 	case SPEED_1000:
2921 	case SPEED_100:
2922 	case SPEED_10:
2923 		phydev->interface = PHY_INTERFACE_MODE_SGMII;
2924 		break;
2925 	default:
2926 		phydev_warn(phydev, "phy speed err :%d\n", phydev->speed);
2927 		break;
2928 	}
2929 }
2930 
2931 /**
2932  * yt8821_read_status() -  determines the negotiated speed and duplex
2933  * @phydev: a pointer to a &struct phy_device
2934  *
2935  * Returns: 0 or negative errno code
2936  */
2937 static int yt8821_read_status(struct phy_device *phydev)
2938 {
2939 	int link;
2940 	int ret;
2941 	int val;
2942 
2943 	ret = ytphy_write_ext_with_lock(phydev,
2944 					YT8521_REG_SPACE_SELECT_REG,
2945 					YT8521_RSSR_UTP_SPACE);
2946 	if (ret < 0)
2947 		return ret;
2948 
2949 	ret = genphy_read_status(phydev);
2950 	if (ret < 0)
2951 		return ret;
2952 
2953 	if (phydev->autoneg_complete) {
2954 		ret = genphy_c45_read_lpa(phydev);
2955 		if (ret < 0)
2956 			return ret;
2957 	}
2958 
2959 	ret = phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG);
2960 	if (ret < 0)
2961 		return ret;
2962 
2963 	val = ret;
2964 
2965 	link = val & YTPHY_SSR_LINK;
2966 	if (link)
2967 		yt8821_adjust_status(phydev, val);
2968 
2969 	if (link) {
2970 		if (phydev->link == 0)
2971 			phydev_dbg(phydev,
2972 				   "%s, phy addr: %d, link up\n",
2973 				   __func__, phydev->mdio.addr);
2974 		phydev->link = 1;
2975 	} else {
2976 		if (phydev->link == 1)
2977 			phydev_dbg(phydev,
2978 				   "%s, phy addr: %d, link down\n",
2979 				   __func__, phydev->mdio.addr);
2980 		phydev->link = 0;
2981 	}
2982 
2983 	val = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG);
2984 	if (val < 0)
2985 		return val;
2986 
2987 	if (FIELD_GET(YT8521_CCR_MODE_SEL_MASK, val) ==
2988 	    YT8821_CHIP_MODE_AUTO_BX2500_SGMII)
2989 		yt8821_update_interface(phydev);
2990 
2991 	return 0;
2992 }
2993 
2994 /**
2995  * yt8821_modify_utp_fiber_bmcr - bits modify a PHY's BMCR register
2996  * @phydev: the phy_device struct
2997  * @mask: bit mask of bits to clear
2998  * @set: bit mask of bits to set
2999  *
3000  * NOTE: Convenience function which allows a PHY's BMCR register to be
3001  * modified as new register value = (old register value & ~mask) | set.
3002  *
3003  * Returns: 0 or negative errno code
3004  */
3005 static int yt8821_modify_utp_fiber_bmcr(struct phy_device *phydev,
3006 					u16 mask, u16 set)
3007 {
3008 	int ret;
3009 
3010 	ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_UTP_SPACE,
3011 				       mask, set);
3012 	if (ret < 0)
3013 		return ret;
3014 
3015 	return yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_FIBER_SPACE,
3016 					mask, set);
3017 }
3018 
3019 /**
3020  * yt8821_suspend() - suspend the hardware
3021  * @phydev: a pointer to a &struct phy_device
3022  *
3023  * Returns: 0 or negative errno code
3024  */
3025 static int yt8821_suspend(struct phy_device *phydev)
3026 {
3027 	int wol_config;
3028 
3029 	wol_config = ytphy_read_ext_with_lock(phydev,
3030 					      YTPHY_WOL_CONFIG_REG);
3031 	if (wol_config < 0)
3032 		return wol_config;
3033 
3034 	/* if wol enable, do nothing */
3035 	if (wol_config & YTPHY_WCR_ENABLE)
3036 		return 0;
3037 
3038 	return yt8821_modify_utp_fiber_bmcr(phydev, 0, BMCR_PDOWN);
3039 }
3040 
3041 /**
3042  * yt8821_resume() - resume the hardware
3043  * @phydev: a pointer to a &struct phy_device
3044  *
3045  * Returns: 0 or negative errno code
3046  */
3047 static int yt8821_resume(struct phy_device *phydev)
3048 {
3049 	int wol_config;
3050 	int ret;
3051 
3052 	/* disable auto sleep */
3053 	ret = yt8821_auto_sleep_config(phydev, false);
3054 	if (ret < 0)
3055 		return ret;
3056 
3057 	wol_config = ytphy_read_ext_with_lock(phydev,
3058 					      YTPHY_WOL_CONFIG_REG);
3059 	if (wol_config < 0)
3060 		return wol_config;
3061 
3062 	/* if wol enable, do nothing */
3063 	if (wol_config & YTPHY_WCR_ENABLE)
3064 		return 0;
3065 
3066 	return yt8821_modify_utp_fiber_bmcr(phydev, BMCR_PDOWN, 0);
3067 }
3068 
3069 static struct phy_driver motorcomm_phy_drvs[] = {
3070 	{
3071 		PHY_ID_MATCH_EXACT(PHY_ID_YT8511),
3072 		.name		= "YT8511 Gigabit Ethernet",
3073 		.config_init	= yt8511_config_init,
3074 		.suspend	= genphy_suspend,
3075 		.resume		= genphy_resume,
3076 		.read_page	= yt8511_read_page,
3077 		.write_page	= yt8511_write_page,
3078 	},
3079 	{
3080 		PHY_ID_MATCH_EXACT(PHY_ID_YT8521),
3081 		.name		= "YT8521 Gigabit Ethernet",
3082 		.get_features	= yt8521_get_features,
3083 		.probe		= yt8521_probe,
3084 		.read_page	= yt8521_read_page,
3085 		.write_page	= yt8521_write_page,
3086 		.get_wol	= ytphy_get_wol,
3087 		.set_wol	= ytphy_set_wol,
3088 		.config_aneg	= yt8521_config_aneg,
3089 		.aneg_done	= yt8521_aneg_done,
3090 		.config_init	= yt8521_config_init,
3091 		.read_status	= yt8521_read_status,
3092 		.soft_reset	= yt8521_soft_reset,
3093 		.suspend	= yt8521_suspend,
3094 		.resume		= yt8521_resume,
3095 		.led_hw_is_supported = yt8521_led_hw_is_supported,
3096 		.led_hw_control_set = yt8521_led_hw_control_set,
3097 		.led_hw_control_get = yt8521_led_hw_control_get,
3098 	},
3099 	{
3100 		PHY_ID_MATCH_EXACT(PHY_ID_YT8522),
3101 		.name		= "YT8522 100 Megabit Ethernet",
3102 		.config_aneg	= genphy_config_aneg,
3103 		.config_init	= yt8522_config_init,
3104 		.suspend	= genphy_suspend,
3105 		.resume		= genphy_resume,
3106 	},
3107 	{
3108 		PHY_ID_MATCH_EXACT(PHY_ID_YT8531),
3109 		.name		= "YT8531 Gigabit Ethernet",
3110 		.probe		= yt8531_probe,
3111 		.config_init	= yt8531_config_init,
3112 		.suspend	= genphy_suspend,
3113 		.resume		= genphy_resume,
3114 		.get_wol	= ytphy_get_wol,
3115 		.set_wol	= yt8531_set_wol,
3116 		.link_change_notify = yt8531_link_change_notify,
3117 		.led_hw_is_supported = yt8521_led_hw_is_supported,
3118 		.led_hw_control_set = yt8521_led_hw_control_set,
3119 		.led_hw_control_get = yt8521_led_hw_control_get,
3120 	},
3121 	{
3122 		PHY_ID_MATCH_EXACT(PHY_ID_YT8531S),
3123 		.name		= "YT8531S Gigabit Ethernet",
3124 		.get_features	= yt8521_get_features,
3125 		.probe		= yt8521_probe,
3126 		.read_page	= yt8521_read_page,
3127 		.write_page	= yt8521_write_page,
3128 		.get_wol	= ytphy_get_wol,
3129 		.set_wol	= ytphy_set_wol,
3130 		.config_aneg	= yt8521_config_aneg,
3131 		.aneg_done	= yt8521_aneg_done,
3132 		.config_init	= yt8521_config_init,
3133 		.read_status	= yt8521_read_status,
3134 		.soft_reset	= yt8521_soft_reset,
3135 		.suspend	= yt8521_suspend,
3136 		.resume		= yt8521_resume,
3137 	},
3138 	{
3139 		PHY_ID_MATCH_EXACT(PHY_ID_YT8821),
3140 		.name			= "YT8821 2.5Gbps PHY",
3141 		.get_features		= yt8821_get_features,
3142 		.read_page		= yt8521_read_page,
3143 		.write_page		= yt8521_write_page,
3144 		.get_wol		= ytphy_get_wol,
3145 		.set_wol		= ytphy_set_wol,
3146 		.config_aneg		= genphy_config_aneg,
3147 		.aneg_done		= yt8821_aneg_done,
3148 		.config_init		= yt8821_config_init,
3149 		.get_rate_matching	= yt8821_get_rate_matching,
3150 		.read_status		= yt8821_read_status,
3151 		.soft_reset		= yt8821_soft_reset,
3152 		.suspend		= yt8821_suspend,
3153 		.resume			= yt8821_resume,
3154 	},
3155 };
3156 
3157 module_phy_driver(motorcomm_phy_drvs);
3158 
3159 MODULE_DESCRIPTION("Motorcomm 8511/8521/8531/8531S/8821 PHY driver");
3160 MODULE_AUTHOR("Peter Geis");
3161 MODULE_AUTHOR("Frank");
3162 MODULE_LICENSE("GPL");
3163 
3164 static const struct mdio_device_id __maybe_unused motorcomm_tbl[] = {
3165 	{ PHY_ID_MATCH_EXACT(PHY_ID_YT8511) },
3166 	{ PHY_ID_MATCH_EXACT(PHY_ID_YT8521) },
3167 	{ PHY_ID_MATCH_EXACT(PHY_ID_YT8522) },
3168 	{ PHY_ID_MATCH_EXACT(PHY_ID_YT8531) },
3169 	{ PHY_ID_MATCH_EXACT(PHY_ID_YT8531S) },
3170 	{ PHY_ID_MATCH_EXACT(PHY_ID_YT8821) },
3171 	{ /* sentinel */ }
3172 };
3173 
3174 MODULE_DEVICE_TABLE(mdio, motorcomm_tbl);
3175