xref: /linux/drivers/net/phy/motorcomm.c (revision cf85f810f911234a06a4ef2439e8694b93b717fc)
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 	struct clk *clk;
1069 	int chip_config;
1070 	u16 mask, val;
1071 	u32 freq;
1072 	int ret;
1073 
1074 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
1075 	if (!priv)
1076 		return -ENOMEM;
1077 
1078 	phydev->priv = priv;
1079 
1080 	clk = devm_clk_get_optional_enabled(dev, NULL);
1081 	if (IS_ERR(clk))
1082 		return dev_err_probe(dev, PTR_ERR(clk),
1083 				     "failed to get and enable PHY clock\n");
1084 
1085 	chip_config = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG);
1086 	if (chip_config < 0)
1087 		return chip_config;
1088 
1089 	priv->strap_mode = chip_config & YT8521_CCR_MODE_SEL_MASK;
1090 	switch (priv->strap_mode) {
1091 	case YT8521_CCR_MODE_FIBER_TO_RGMII:
1092 	case YT8521_CCR_MODE_SGPHY_TO_RGMAC:
1093 	case YT8521_CCR_MODE_SGMAC_TO_RGPHY:
1094 		priv->polling_mode = YT8521_MODE_FIBER;
1095 		priv->reg_page = YT8521_RSSR_FIBER_SPACE;
1096 		phydev->port = PORT_FIBRE;
1097 		break;
1098 	case YT8521_CCR_MODE_UTP_FIBER_TO_RGMII:
1099 	case YT8521_CCR_MODE_UTP_TO_FIBER_AUTO:
1100 	case YT8521_CCR_MODE_UTP_TO_FIBER_FORCE:
1101 		priv->polling_mode = YT8521_MODE_POLL;
1102 		priv->reg_page = YT8521_RSSR_TO_BE_ARBITRATED;
1103 		phydev->port = PORT_NONE;
1104 		break;
1105 	case YT8521_CCR_MODE_UTP_TO_SGMII:
1106 	case YT8521_CCR_MODE_UTP_TO_RGMII:
1107 		priv->polling_mode = YT8521_MODE_UTP;
1108 		priv->reg_page = YT8521_RSSR_UTP_SPACE;
1109 		phydev->port = PORT_TP;
1110 		break;
1111 	}
1112 	/* set default reg space */
1113 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
1114 		ret = ytphy_write_ext_with_lock(phydev,
1115 						YT8521_REG_SPACE_SELECT_REG,
1116 						priv->reg_page);
1117 		if (ret < 0)
1118 			return ret;
1119 	}
1120 
1121 	if (device_property_read_u32(dev, "motorcomm,clk-out-frequency-hz", &freq))
1122 		freq = YTPHY_DTS_OUTPUT_CLK_DIS;
1123 
1124 	if (phydev->drv->phy_id == PHY_ID_YT8521) {
1125 		switch (freq) {
1126 		case YTPHY_DTS_OUTPUT_CLK_DIS:
1127 			mask = YT8521_SCR_SYNCE_ENABLE;
1128 			val = 0;
1129 			break;
1130 		case YTPHY_DTS_OUTPUT_CLK_25M:
1131 			mask = YT8521_SCR_SYNCE_ENABLE |
1132 			       YT8521_SCR_CLK_SRC_MASK |
1133 			       YT8521_SCR_CLK_FRE_SEL_125M;
1134 			val = YT8521_SCR_SYNCE_ENABLE |
1135 			      FIELD_PREP(YT8521_SCR_CLK_SRC_MASK,
1136 					 YT8521_SCR_CLK_SRC_REF_25M);
1137 			break;
1138 		case YTPHY_DTS_OUTPUT_CLK_125M:
1139 			mask = YT8521_SCR_SYNCE_ENABLE |
1140 			       YT8521_SCR_CLK_SRC_MASK |
1141 			       YT8521_SCR_CLK_FRE_SEL_125M;
1142 			val = YT8521_SCR_SYNCE_ENABLE |
1143 			      YT8521_SCR_CLK_FRE_SEL_125M |
1144 			      FIELD_PREP(YT8521_SCR_CLK_SRC_MASK,
1145 					 YT8521_SCR_CLK_SRC_PLL_125M);
1146 			break;
1147 		default:
1148 			phydev_warn(phydev, "Freq err:%u\n", freq);
1149 			return -EINVAL;
1150 		}
1151 	} else if (phydev->drv->phy_id == PHY_ID_YT8531S) {
1152 		switch (freq) {
1153 		case YTPHY_DTS_OUTPUT_CLK_DIS:
1154 			mask = YT8531_SCR_SYNCE_ENABLE;
1155 			val = 0;
1156 			break;
1157 		case YTPHY_DTS_OUTPUT_CLK_25M:
1158 			mask = YT8531_SCR_SYNCE_ENABLE |
1159 			       YT8531_SCR_CLK_SRC_MASK |
1160 			       YT8531_SCR_CLK_FRE_SEL_125M;
1161 			val = YT8531_SCR_SYNCE_ENABLE |
1162 			      FIELD_PREP(YT8531_SCR_CLK_SRC_MASK,
1163 					 YT8531_SCR_CLK_SRC_REF_25M);
1164 			break;
1165 		case YTPHY_DTS_OUTPUT_CLK_125M:
1166 			mask = YT8531_SCR_SYNCE_ENABLE |
1167 			       YT8531_SCR_CLK_SRC_MASK |
1168 			       YT8531_SCR_CLK_FRE_SEL_125M;
1169 			val = YT8531_SCR_SYNCE_ENABLE |
1170 			      YT8531_SCR_CLK_FRE_SEL_125M |
1171 			      FIELD_PREP(YT8531_SCR_CLK_SRC_MASK,
1172 					 YT8531_SCR_CLK_SRC_PLL_125M);
1173 			break;
1174 		default:
1175 			phydev_warn(phydev, "Freq err:%u\n", freq);
1176 			return -EINVAL;
1177 		}
1178 	} else {
1179 		phydev_warn(phydev, "PHY id err\n");
1180 		return -EINVAL;
1181 	}
1182 
1183 	return ytphy_modify_ext_with_lock(phydev, YTPHY_SYNCE_CFG_REG, mask,
1184 					  val);
1185 }
1186 
1187 static int yt8531_probe(struct phy_device *phydev)
1188 {
1189 	struct device *dev = &phydev->mdio.dev;
1190 	struct clk *clk;
1191 	u16 mask, val;
1192 	u32 freq;
1193 
1194 	clk = devm_clk_get_optional_enabled(dev, NULL);
1195 	if (IS_ERR(clk))
1196 		return dev_err_probe(dev, PTR_ERR(clk),
1197 				     "failed to get and enable PHY clock\n");
1198 
1199 	if (device_property_read_u32(dev, "motorcomm,clk-out-frequency-hz", &freq))
1200 		freq = YTPHY_DTS_OUTPUT_CLK_DIS;
1201 
1202 	switch (freq) {
1203 	case YTPHY_DTS_OUTPUT_CLK_DIS:
1204 		mask = YT8531_SCR_SYNCE_ENABLE;
1205 		val = 0;
1206 		break;
1207 	case YTPHY_DTS_OUTPUT_CLK_25M:
1208 		mask = YT8531_SCR_SYNCE_ENABLE | YT8531_SCR_CLK_SRC_MASK |
1209 		       YT8531_SCR_CLK_FRE_SEL_125M;
1210 		val = YT8531_SCR_SYNCE_ENABLE |
1211 		      FIELD_PREP(YT8531_SCR_CLK_SRC_MASK,
1212 				 YT8531_SCR_CLK_SRC_REF_25M);
1213 		break;
1214 	case YTPHY_DTS_OUTPUT_CLK_125M:
1215 		mask = YT8531_SCR_SYNCE_ENABLE | YT8531_SCR_CLK_SRC_MASK |
1216 		       YT8531_SCR_CLK_FRE_SEL_125M;
1217 		val = YT8531_SCR_SYNCE_ENABLE | YT8531_SCR_CLK_FRE_SEL_125M |
1218 		      FIELD_PREP(YT8531_SCR_CLK_SRC_MASK,
1219 				 YT8531_SCR_CLK_SRC_PLL_125M);
1220 		break;
1221 	default:
1222 		phydev_warn(phydev, "Freq err:%u\n", freq);
1223 		return -EINVAL;
1224 	}
1225 
1226 	return ytphy_modify_ext_with_lock(phydev, YTPHY_SYNCE_CFG_REG, mask,
1227 					  val);
1228 }
1229 
1230 /**
1231  * ytphy_utp_read_lpa() - read LPA then setup lp_advertising for utp
1232  * @phydev: a pointer to a &struct phy_device
1233  *
1234  * NOTE:The caller must have taken the MDIO bus lock.
1235  *
1236  * returns 0 or negative errno code
1237  */
1238 static int ytphy_utp_read_lpa(struct phy_device *phydev)
1239 {
1240 	int lpa, lpagb;
1241 
1242 	if (phydev->autoneg == AUTONEG_ENABLE) {
1243 		if (!phydev->autoneg_complete) {
1244 			mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising,
1245 							0);
1246 			mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, 0);
1247 			return 0;
1248 		}
1249 
1250 		if (phydev->is_gigabit_capable) {
1251 			lpagb = __phy_read(phydev, MII_STAT1000);
1252 			if (lpagb < 0)
1253 				return lpagb;
1254 
1255 			if (lpagb & LPA_1000MSFAIL) {
1256 				int adv = __phy_read(phydev, MII_CTRL1000);
1257 
1258 				if (adv < 0)
1259 					return adv;
1260 
1261 				if (adv & CTL1000_ENABLE_MASTER)
1262 					phydev_err(phydev, "Master/Slave resolution failed, maybe conflicting manual settings?\n");
1263 				else
1264 					phydev_err(phydev, "Master/Slave resolution failed\n");
1265 				return -ENOLINK;
1266 			}
1267 
1268 			mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising,
1269 							lpagb);
1270 		}
1271 
1272 		lpa = __phy_read(phydev, MII_LPA);
1273 		if (lpa < 0)
1274 			return lpa;
1275 
1276 		mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa);
1277 	} else {
1278 		linkmode_zero(phydev->lp_advertising);
1279 	}
1280 
1281 	return 0;
1282 }
1283 
1284 /**
1285  * yt8521_adjust_status() - update speed and duplex to phydev. when in fiber
1286  * mode, adjust speed and duplex.
1287  * @phydev: a pointer to a &struct phy_device
1288  * @status: yt8521 status read from YTPHY_SPECIFIC_STATUS_REG
1289  * @is_utp: false(yt8521 work in fiber mode) or true(yt8521 work in utp mode)
1290  *
1291  * NOTE:The caller must have taken the MDIO bus lock.
1292  *
1293  * returns 0
1294  */
1295 static int yt8521_adjust_status(struct phy_device *phydev, int status,
1296 				bool is_utp)
1297 {
1298 	int speed_mode, duplex;
1299 	int speed;
1300 	int err;
1301 	int lpa;
1302 
1303 	if (is_utp)
1304 		duplex = (status & YTPHY_SSR_DUPLEX) >> YTPHY_SSR_DUPLEX_OFFSET;
1305 	else
1306 		duplex = DUPLEX_FULL;	/* for fiber, it always DUPLEX_FULL */
1307 
1308 	speed_mode = status & YTPHY_SSR_SPEED_MASK;
1309 
1310 	switch (speed_mode) {
1311 	case YTPHY_SSR_SPEED_10M:
1312 		if (is_utp)
1313 			speed = SPEED_10;
1314 		else
1315 			/* for fiber, it will never run here, default to
1316 			 * SPEED_UNKNOWN
1317 			 */
1318 			speed = SPEED_UNKNOWN;
1319 		break;
1320 	case YTPHY_SSR_SPEED_100M:
1321 		speed = SPEED_100;
1322 		break;
1323 	case YTPHY_SSR_SPEED_1000M:
1324 		speed = SPEED_1000;
1325 		break;
1326 	default:
1327 		speed = SPEED_UNKNOWN;
1328 		break;
1329 	}
1330 
1331 	phydev->speed = speed;
1332 	phydev->duplex = duplex;
1333 
1334 	if (is_utp) {
1335 		err = ytphy_utp_read_lpa(phydev);
1336 		if (err < 0)
1337 			return err;
1338 
1339 		phy_resolve_aneg_pause(phydev);
1340 	} else {
1341 		lpa = __phy_read(phydev, MII_LPA);
1342 		if (lpa < 0)
1343 			return lpa;
1344 
1345 		/* only support 1000baseX Full */
1346 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
1347 				 phydev->lp_advertising, lpa & LPA_1000XFULL);
1348 
1349 		if (!(lpa & YTPHY_FLPA_PAUSE)) {
1350 			phydev->pause = 0;
1351 			phydev->asym_pause = 0;
1352 		} else if ((lpa & YTPHY_FLPA_ASYM_PAUSE)) {
1353 			phydev->pause = 1;
1354 			phydev->asym_pause = 1;
1355 		} else {
1356 			phydev->pause = 1;
1357 			phydev->asym_pause = 0;
1358 		}
1359 	}
1360 
1361 	return 0;
1362 }
1363 
1364 /**
1365  * yt8521_read_status_paged() -  determines the speed and duplex of one page
1366  * @phydev: a pointer to a &struct phy_device
1367  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to
1368  * operate.
1369  *
1370  * returns 1 (utp or fiber link),0 (no link) or negative errno code
1371  */
1372 static int yt8521_read_status_paged(struct phy_device *phydev, int page)
1373 {
1374 	int fiber_latch_val;
1375 	int fiber_curr_val;
1376 	int old_page;
1377 	int ret = 0;
1378 	int status;
1379 	int link;
1380 
1381 	linkmode_zero(phydev->lp_advertising);
1382 	phydev->duplex = DUPLEX_UNKNOWN;
1383 	phydev->speed = SPEED_UNKNOWN;
1384 	phydev->asym_pause = 0;
1385 	phydev->pause = 0;
1386 
1387 	/* YT8521 has two reg space (utp/fiber) for linkup with utp/fiber
1388 	 * respectively. but for utp/fiber combo mode, reg space should be
1389 	 * arbitrated based on media priority. by default, utp takes
1390 	 * priority. reg space should be properly set before read
1391 	 * YTPHY_SPECIFIC_STATUS_REG.
1392 	 */
1393 
1394 	page &= YT8521_RSSR_SPACE_MASK;
1395 	old_page = phy_select_page(phydev, page);
1396 	if (old_page < 0)
1397 		goto err_restore_page;
1398 
1399 	/* Read YTPHY_SPECIFIC_STATUS_REG, which indicates the speed and duplex
1400 	 * of the PHY is actually using.
1401 	 */
1402 	ret = __phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG);
1403 	if (ret < 0)
1404 		goto err_restore_page;
1405 
1406 	status = ret;
1407 	link = !!(status & YTPHY_SSR_LINK);
1408 
1409 	/* When PHY is in fiber mode, speed transferred from 1000Mbps to
1410 	 * 100Mbps,there is not link down from YTPHY_SPECIFIC_STATUS_REG, so
1411 	 * we need check MII_BMSR to identify such case.
1412 	 */
1413 	if (page == YT8521_RSSR_FIBER_SPACE) {
1414 		ret = __phy_read(phydev, MII_BMSR);
1415 		if (ret < 0)
1416 			goto err_restore_page;
1417 
1418 		fiber_latch_val = ret;
1419 		ret = __phy_read(phydev, MII_BMSR);
1420 		if (ret < 0)
1421 			goto err_restore_page;
1422 
1423 		fiber_curr_val = ret;
1424 		if (link && fiber_latch_val != fiber_curr_val) {
1425 			link = 0;
1426 			phydev_info(phydev,
1427 				    "%s, fiber link down detect, latch = %04x, curr = %04x\n",
1428 				    __func__, fiber_latch_val, fiber_curr_val);
1429 		}
1430 	} else {
1431 		/* Read autonegotiation status */
1432 		ret = __phy_read(phydev, MII_BMSR);
1433 		if (ret < 0)
1434 			goto err_restore_page;
1435 
1436 		phydev->autoneg_complete = ret & BMSR_ANEGCOMPLETE ? 1 : 0;
1437 	}
1438 
1439 	if (link) {
1440 		if (page == YT8521_RSSR_UTP_SPACE)
1441 			yt8521_adjust_status(phydev, status, true);
1442 		else
1443 			yt8521_adjust_status(phydev, status, false);
1444 	}
1445 	return phy_restore_page(phydev, old_page, link);
1446 
1447 err_restore_page:
1448 	return phy_restore_page(phydev, old_page, ret);
1449 }
1450 
1451 /**
1452  * yt8521_read_status() -  determines the negotiated speed and duplex
1453  * @phydev: a pointer to a &struct phy_device
1454  *
1455  * returns 0 or negative errno code
1456  */
1457 static int yt8521_read_status(struct phy_device *phydev)
1458 {
1459 	struct yt8521_priv *priv = phydev->priv;
1460 	int link_fiber = 0;
1461 	int link_utp;
1462 	int link;
1463 	int ret;
1464 
1465 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
1466 		link = yt8521_read_status_paged(phydev, priv->reg_page);
1467 		if (link < 0)
1468 			return link;
1469 	} else {
1470 		/* when page is YT8521_RSSR_TO_BE_ARBITRATED, arbitration is
1471 		 * needed. by default, utp is higher priority.
1472 		 */
1473 
1474 		link_utp = yt8521_read_status_paged(phydev,
1475 						    YT8521_RSSR_UTP_SPACE);
1476 		if (link_utp < 0)
1477 			return link_utp;
1478 
1479 		if (!link_utp) {
1480 			link_fiber = yt8521_read_status_paged(phydev,
1481 							      YT8521_RSSR_FIBER_SPACE);
1482 			if (link_fiber < 0)
1483 				return link_fiber;
1484 		}
1485 
1486 		link = link_utp || link_fiber;
1487 	}
1488 
1489 	if (link) {
1490 		if (phydev->link == 0) {
1491 			/* arbitrate reg space based on linkup media type. */
1492 			if (priv->polling_mode == YT8521_MODE_POLL &&
1493 			    priv->reg_page == YT8521_RSSR_TO_BE_ARBITRATED) {
1494 				if (link_fiber)
1495 					priv->reg_page =
1496 						YT8521_RSSR_FIBER_SPACE;
1497 				else
1498 					priv->reg_page = YT8521_RSSR_UTP_SPACE;
1499 
1500 				ret = ytphy_write_ext_with_lock(phydev,
1501 								YT8521_REG_SPACE_SELECT_REG,
1502 								priv->reg_page);
1503 				if (ret < 0)
1504 					return ret;
1505 
1506 				phydev->port = link_fiber ? PORT_FIBRE : PORT_TP;
1507 
1508 				phydev_info(phydev, "%s, link up, media: %s\n",
1509 					    __func__,
1510 					    (phydev->port == PORT_TP) ?
1511 					    "UTP" : "Fiber");
1512 			}
1513 		}
1514 		phydev->link = 1;
1515 	} else {
1516 		if (phydev->link == 1) {
1517 			phydev_info(phydev, "%s, link down, media: %s\n",
1518 				    __func__, (phydev->port == PORT_TP) ?
1519 				    "UTP" : "Fiber");
1520 
1521 			/* When in YT8521_MODE_POLL mode, need prepare for next
1522 			 * arbitration.
1523 			 */
1524 			if (priv->polling_mode == YT8521_MODE_POLL) {
1525 				priv->reg_page = YT8521_RSSR_TO_BE_ARBITRATED;
1526 				phydev->port = PORT_NONE;
1527 			}
1528 		}
1529 
1530 		phydev->link = 0;
1531 	}
1532 
1533 	return 0;
1534 }
1535 
1536 /**
1537  * yt8521_modify_bmcr_paged - bits modify a PHY's BMCR register of one page
1538  * @phydev: the phy_device struct
1539  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to operate
1540  * @mask: bit mask of bits to clear
1541  * @set: bit mask of bits to set
1542  *
1543  * NOTE: Convenience function which allows a PHY's BMCR register to be
1544  * modified as new register value = (old register value & ~mask) | set.
1545  * YT8521 has two space (utp/fiber) and three mode (utp/fiber/poll), each space
1546  * has MII_BMCR. poll mode combines utp and faber,so need do both.
1547  * If it is reset, it will wait for completion.
1548  *
1549  * returns 0 or negative errno code
1550  */
1551 static int yt8521_modify_bmcr_paged(struct phy_device *phydev, int page,
1552 				    u16 mask, u16 set)
1553 {
1554 	int max_cnt = 500; /* the max wait time of reset ~ 500 ms */
1555 	int old_page;
1556 	int ret = 0;
1557 
1558 	old_page = phy_select_page(phydev, page & YT8521_RSSR_SPACE_MASK);
1559 	if (old_page < 0)
1560 		goto err_restore_page;
1561 
1562 	ret = __phy_modify(phydev, MII_BMCR, mask, set);
1563 	if (ret < 0)
1564 		goto err_restore_page;
1565 
1566 	/* If it is reset, need to wait for the reset to complete */
1567 	if (set == BMCR_RESET) {
1568 		while (max_cnt--) {
1569 			usleep_range(1000, 1100);
1570 			ret = __phy_read(phydev, MII_BMCR);
1571 			if (ret < 0)
1572 				goto err_restore_page;
1573 
1574 			if (!(ret & BMCR_RESET))
1575 				return phy_restore_page(phydev, old_page, 0);
1576 		}
1577 	}
1578 
1579 err_restore_page:
1580 	return phy_restore_page(phydev, old_page, ret);
1581 }
1582 
1583 /**
1584  * yt8521_modify_utp_fiber_bmcr - bits modify a PHY's BMCR register
1585  * @phydev: the phy_device struct
1586  * @mask: bit mask of bits to clear
1587  * @set: bit mask of bits to set
1588  *
1589  * NOTE: Convenience function which allows a PHY's BMCR register to be
1590  * modified as new register value = (old register value & ~mask) | set.
1591  * YT8521 has two space (utp/fiber) and three mode (utp/fiber/poll), each space
1592  * has MII_BMCR. poll mode combines utp and faber,so need do both.
1593  *
1594  * returns 0 or negative errno code
1595  */
1596 static int yt8521_modify_utp_fiber_bmcr(struct phy_device *phydev, u16 mask,
1597 					u16 set)
1598 {
1599 	struct yt8521_priv *priv = phydev->priv;
1600 	int ret;
1601 
1602 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
1603 		ret = yt8521_modify_bmcr_paged(phydev, priv->reg_page, mask,
1604 					       set);
1605 		if (ret < 0)
1606 			return ret;
1607 	} else {
1608 		ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_UTP_SPACE,
1609 					       mask, set);
1610 		if (ret < 0)
1611 			return ret;
1612 
1613 		ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_FIBER_SPACE,
1614 					       mask, set);
1615 		if (ret < 0)
1616 			return ret;
1617 	}
1618 	return 0;
1619 }
1620 
1621 /**
1622  * yt8521_soft_reset() - called to issue a PHY software reset
1623  * @phydev: a pointer to a &struct phy_device
1624  *
1625  * returns 0 or negative errno code
1626  */
1627 static int yt8521_soft_reset(struct phy_device *phydev)
1628 {
1629 	return yt8521_modify_utp_fiber_bmcr(phydev, 0, BMCR_RESET);
1630 }
1631 
1632 /**
1633  * yt8521_suspend() - suspend the hardware
1634  * @phydev: a pointer to a &struct phy_device
1635  *
1636  * returns 0 or negative errno code
1637  */
1638 static int yt8521_suspend(struct phy_device *phydev)
1639 {
1640 	int wol_config;
1641 
1642 	/* YTPHY_WOL_CONFIG_REG is common ext reg */
1643 	wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG);
1644 	if (wol_config < 0)
1645 		return wol_config;
1646 
1647 	/* if wol enable, do nothing */
1648 	if (wol_config & YTPHY_WCR_ENABLE)
1649 		return 0;
1650 
1651 	return yt8521_modify_utp_fiber_bmcr(phydev, 0, BMCR_PDOWN);
1652 }
1653 
1654 /**
1655  * yt8521_resume() - resume the hardware
1656  * @phydev: a pointer to a &struct phy_device
1657  *
1658  * returns 0 or negative errno code
1659  */
1660 static int yt8521_resume(struct phy_device *phydev)
1661 {
1662 	int ret;
1663 	int wol_config;
1664 
1665 	/* disable auto sleep */
1666 	ret = ytphy_modify_ext_with_lock(phydev,
1667 					 YT8521_EXTREG_SLEEP_CONTROL1_REG,
1668 					 YT8521_ESC1R_SLEEP_SW, 0);
1669 	if (ret < 0)
1670 		return ret;
1671 
1672 	wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG);
1673 	if (wol_config < 0)
1674 		return wol_config;
1675 
1676 	/* if wol enable, do nothing */
1677 	if (wol_config & YTPHY_WCR_ENABLE)
1678 		return 0;
1679 
1680 	return yt8521_modify_utp_fiber_bmcr(phydev, BMCR_PDOWN, 0);
1681 }
1682 
1683 /**
1684  * yt8521_config_init() - called to initialize the PHY
1685  * @phydev: a pointer to a &struct phy_device
1686  *
1687  * returns 0 or negative errno code
1688  */
1689 static int yt8521_config_init(struct phy_device *phydev)
1690 {
1691 	struct device *dev = &phydev->mdio.dev;
1692 	int old_page;
1693 	int ret = 0;
1694 
1695 	old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
1696 	if (old_page < 0)
1697 		goto err_restore_page;
1698 
1699 	/* set rgmii delay mode */
1700 	if (phydev->interface != PHY_INTERFACE_MODE_SGMII) {
1701 		ret = ytphy_rgmii_clk_delay_config(phydev);
1702 		if (ret < 0)
1703 			goto err_restore_page;
1704 	}
1705 
1706 	if (device_property_read_bool(dev, "motorcomm,auto-sleep-disabled")) {
1707 		/* disable auto sleep */
1708 		ret = ytphy_modify_ext(phydev, YT8521_EXTREG_SLEEP_CONTROL1_REG,
1709 				       YT8521_ESC1R_SLEEP_SW, 0);
1710 		if (ret < 0)
1711 			goto err_restore_page;
1712 	}
1713 
1714 	if (device_property_read_bool(dev, "motorcomm,keep-pll-enabled")) {
1715 		/* enable RXC clock when no wire plug */
1716 		ret = ytphy_modify_ext(phydev, YT8521_CLOCK_GATING_REG,
1717 				       YT8521_CGR_RX_CLK_EN, 0);
1718 		if (ret < 0)
1719 			goto err_restore_page;
1720 	}
1721 
1722 	if (phy_interface_is_rgmii(phydev) &&
1723 	    phydev_id_compare(phydev, PHY_ID_YT8531S))
1724 		ret = yt8531_set_ds(phydev);
1725 
1726 err_restore_page:
1727 	return phy_restore_page(phydev, old_page, ret);
1728 }
1729 
1730 static const unsigned long supported_trgs = (BIT(TRIGGER_NETDEV_FULL_DUPLEX) |
1731 					     BIT(TRIGGER_NETDEV_HALF_DUPLEX) |
1732 					     BIT(TRIGGER_NETDEV_LINK)        |
1733 					     BIT(TRIGGER_NETDEV_LINK_10)     |
1734 					     BIT(TRIGGER_NETDEV_LINK_100)    |
1735 					     BIT(TRIGGER_NETDEV_LINK_1000)   |
1736 					     BIT(TRIGGER_NETDEV_RX)          |
1737 					     BIT(TRIGGER_NETDEV_TX));
1738 
1739 static int yt8521_led_hw_is_supported(struct phy_device *phydev, u8 index,
1740 				      unsigned long rules)
1741 {
1742 	if (index >= YT8521_MAX_LEDS)
1743 		return -EINVAL;
1744 
1745 	/* All combinations of the supported triggers are allowed */
1746 	if (rules & ~supported_trgs)
1747 		return -EOPNOTSUPP;
1748 
1749 	return 0;
1750 }
1751 
1752 static int yt8521_led_hw_control_set(struct phy_device *phydev, u8 index,
1753 				     unsigned long rules)
1754 {
1755 	u16 val = 0;
1756 
1757 	if (index >= YT8521_MAX_LEDS)
1758 		return -EINVAL;
1759 
1760 	if (test_bit(TRIGGER_NETDEV_LINK, &rules)) {
1761 		val |= YT8521_LED_10_ON_EN;
1762 		val |= YT8521_LED_100_ON_EN;
1763 		val |= YT8521_LED_1000_ON_EN;
1764 	}
1765 
1766 	if (test_bit(TRIGGER_NETDEV_LINK_10, &rules))
1767 		val |= YT8521_LED_10_ON_EN;
1768 
1769 	if (test_bit(TRIGGER_NETDEV_LINK_100, &rules))
1770 		val |= YT8521_LED_100_ON_EN;
1771 
1772 	if (test_bit(TRIGGER_NETDEV_LINK_1000, &rules))
1773 		val |= YT8521_LED_1000_ON_EN;
1774 
1775 	if (test_bit(TRIGGER_NETDEV_FULL_DUPLEX, &rules))
1776 		val |= YT8521_LED_FDX_ON_EN;
1777 
1778 	if (test_bit(TRIGGER_NETDEV_HALF_DUPLEX, &rules))
1779 		val |= YT8521_LED_HDX_ON_EN;
1780 
1781 	if (test_bit(TRIGGER_NETDEV_TX, &rules) ||
1782 	    test_bit(TRIGGER_NETDEV_RX, &rules))
1783 		val |= YT8521_LED_ACT_BLK_IND;
1784 
1785 	if (test_bit(TRIGGER_NETDEV_TX, &rules))
1786 		val |= YT8521_LED_TXACT_BLK_EN;
1787 
1788 	if (test_bit(TRIGGER_NETDEV_RX, &rules))
1789 		val |= YT8521_LED_RXACT_BLK_EN;
1790 
1791 	return ytphy_write_ext(phydev, YT8521_LED0_CFG_REG + index, val);
1792 }
1793 
1794 static int yt8521_led_hw_control_get(struct phy_device *phydev, u8 index,
1795 				     unsigned long *rules)
1796 {
1797 	int val;
1798 
1799 	if (index >= YT8521_MAX_LEDS)
1800 		return -EINVAL;
1801 
1802 	val = ytphy_read_ext(phydev, YT8521_LED0_CFG_REG + index);
1803 	if (val < 0)
1804 		return val;
1805 
1806 	if (val & YT8521_LED_TXACT_BLK_EN || val & YT8521_LED_ACT_BLK_IND)
1807 		__set_bit(TRIGGER_NETDEV_TX, rules);
1808 
1809 	if (val & YT8521_LED_RXACT_BLK_EN || val & YT8521_LED_ACT_BLK_IND)
1810 		__set_bit(TRIGGER_NETDEV_RX, rules);
1811 
1812 	if (val & YT8521_LED_FDX_ON_EN)
1813 		__set_bit(TRIGGER_NETDEV_FULL_DUPLEX, rules);
1814 
1815 	if (val & YT8521_LED_HDX_ON_EN)
1816 		__set_bit(TRIGGER_NETDEV_HALF_DUPLEX, rules);
1817 
1818 	if (val & YT8521_LED_1000_ON_EN)
1819 		__set_bit(TRIGGER_NETDEV_LINK_1000, rules);
1820 
1821 	if (val & YT8521_LED_100_ON_EN)
1822 		__set_bit(TRIGGER_NETDEV_LINK_100, rules);
1823 
1824 	if (val & YT8521_LED_10_ON_EN)
1825 		__set_bit(TRIGGER_NETDEV_LINK_10, rules);
1826 
1827 	return 0;
1828 }
1829 
1830 static int yt8531_config_init(struct phy_device *phydev)
1831 {
1832 	struct device *dev = &phydev->mdio.dev;
1833 	int ret;
1834 
1835 	ret = ytphy_rgmii_clk_delay_config_with_lock(phydev);
1836 	if (ret < 0)
1837 		return ret;
1838 
1839 	if (device_property_read_bool(dev, "motorcomm,auto-sleep-disabled")) {
1840 		/* disable auto sleep */
1841 		ret = ytphy_modify_ext_with_lock(phydev,
1842 						 YT8521_EXTREG_SLEEP_CONTROL1_REG,
1843 						 YT8521_ESC1R_SLEEP_SW, 0);
1844 		if (ret < 0)
1845 			return ret;
1846 	}
1847 
1848 	if (device_property_read_bool(dev, "motorcomm,keep-pll-enabled")) {
1849 		/* enable RXC clock when no wire plug */
1850 		ret = ytphy_modify_ext_with_lock(phydev,
1851 						 YT8521_CLOCK_GATING_REG,
1852 						 YT8521_CGR_RX_CLK_EN, 0);
1853 		if (ret < 0)
1854 			return ret;
1855 	}
1856 
1857 	phy_lock_mdio_bus(phydev);
1858 	ret = yt8531_set_ds(phydev);
1859 	phy_unlock_mdio_bus(phydev);
1860 	if (ret < 0)
1861 		return ret;
1862 
1863 	return 0;
1864 }
1865 
1866 static int yt8522_config_init(struct phy_device *phydev)
1867 {
1868 	struct device *dev = &phydev->mdio.dev;
1869 	int ret, val;
1870 
1871 	val = ytphy_read_ext_with_lock(phydev, YT8522_EXTENDED_COMBO_CTRL);
1872 	if (val < 0)
1873 		return val;
1874 
1875 	if (val & YT8522_RMII_EN) {
1876 		val |= YT8522_RXDV_SEL;
1877 		ret = ytphy_write_ext_with_lock(phydev,
1878 						YT8522_EXTENDED_COMBO_CTRL,
1879 						val);
1880 		if (ret < 0)
1881 			return ret;
1882 	}
1883 
1884 	if (device_property_read_bool(dev, "motorcomm,auto-sleep-disabled")) {
1885 		/* disable auto sleep */
1886 		ret = ytphy_modify_ext_with_lock(phydev,
1887 						 YT8522_EXTREG_SLEEP_CONTROL,
1888 						 YT8522_EN_SLEEP_SW, 0);
1889 		if (ret < 0)
1890 			return ret;
1891 	}
1892 
1893 	return 0;
1894 }
1895 
1896 /**
1897  * yt8531_link_change_notify() - Adjust the tx clock direction according to
1898  * the current speed and dts config.
1899  * @phydev: a pointer to a &struct phy_device
1900  *
1901  * NOTE: This function is only used to adapt to VF2 with JH7110 SoC. Please
1902  * keep "motorcomm,tx-clk-adj-enabled" not exist in dts when the soc is not
1903  * JH7110.
1904  */
1905 static void yt8531_link_change_notify(struct phy_device *phydev)
1906 {
1907 	struct device *dev = &phydev->mdio.dev;
1908 	bool tx_clk_1000_inverted = false;
1909 	bool tx_clk_100_inverted = false;
1910 	bool tx_clk_10_inverted = false;
1911 	bool tx_clk_adj_enabled = false;
1912 	u16 val = 0;
1913 	int ret;
1914 
1915 	if (device_property_read_bool(dev, "motorcomm,tx-clk-adj-enabled"))
1916 		tx_clk_adj_enabled = true;
1917 
1918 	if (!tx_clk_adj_enabled)
1919 		return;
1920 
1921 	if (device_property_read_bool(dev, "motorcomm,tx-clk-10-inverted"))
1922 		tx_clk_10_inverted = true;
1923 	if (device_property_read_bool(dev, "motorcomm,tx-clk-100-inverted"))
1924 		tx_clk_100_inverted = true;
1925 	if (device_property_read_bool(dev, "motorcomm,tx-clk-1000-inverted"))
1926 		tx_clk_1000_inverted = true;
1927 
1928 	if (phydev->speed < 0)
1929 		return;
1930 
1931 	switch (phydev->speed) {
1932 	case SPEED_1000:
1933 		if (tx_clk_1000_inverted)
1934 			val = YT8521_RC1R_TX_CLK_SEL_INVERTED;
1935 		break;
1936 	case SPEED_100:
1937 		if (tx_clk_100_inverted)
1938 			val = YT8521_RC1R_TX_CLK_SEL_INVERTED;
1939 		break;
1940 	case SPEED_10:
1941 		if (tx_clk_10_inverted)
1942 			val = YT8521_RC1R_TX_CLK_SEL_INVERTED;
1943 		break;
1944 	default:
1945 		return;
1946 	}
1947 
1948 	ret = ytphy_modify_ext_with_lock(phydev, YT8521_RGMII_CONFIG1_REG,
1949 					 YT8521_RC1R_TX_CLK_SEL_INVERTED, val);
1950 	if (ret < 0)
1951 		phydev_warn(phydev, "Modify TX_CLK_SEL err:%d\n", ret);
1952 }
1953 
1954 /**
1955  * yt8521_prepare_fiber_features() -  A small helper function that setup
1956  * fiber's features.
1957  * @phydev: a pointer to a &struct phy_device
1958  * @dst: a pointer to store fiber's features
1959  */
1960 static void yt8521_prepare_fiber_features(struct phy_device *phydev,
1961 					  unsigned long *dst)
1962 {
1963 	linkmode_set_bit(ETHTOOL_LINK_MODE_100baseFX_Full_BIT, dst);
1964 	linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, dst);
1965 	linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, dst);
1966 	linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, dst);
1967 }
1968 
1969 /**
1970  * yt8521_fiber_setup_forced - configures/forces speed from @phydev
1971  * @phydev: target phy_device struct
1972  *
1973  * NOTE:The caller must have taken the MDIO bus lock.
1974  *
1975  * returns 0 or negative errno code
1976  */
1977 static int yt8521_fiber_setup_forced(struct phy_device *phydev)
1978 {
1979 	u16 val;
1980 	int ret;
1981 
1982 	if (phydev->speed == SPEED_1000)
1983 		val = YTPHY_MCR_FIBER_1000BX;
1984 	else if (phydev->speed == SPEED_100)
1985 		val = YTPHY_MCR_FIBER_100FX;
1986 	else
1987 		return -EINVAL;
1988 
1989 	ret =  __phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0);
1990 	if (ret < 0)
1991 		return ret;
1992 
1993 	/* disable Fiber auto sensing */
1994 	ret =  ytphy_modify_ext(phydev, YT8521_LINK_TIMER_CFG2_REG,
1995 				YT8521_LTCR_EN_AUTOSEN, 0);
1996 	if (ret < 0)
1997 		return ret;
1998 
1999 	ret =  ytphy_modify_ext(phydev, YTPHY_MISC_CONFIG_REG,
2000 				YTPHY_MCR_FIBER_SPEED_MASK, val);
2001 	if (ret < 0)
2002 		return ret;
2003 
2004 	return ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG,
2005 				YT8521_CCR_SW_RST, 0);
2006 }
2007 
2008 /**
2009  * ytphy_check_and_restart_aneg - Enable and restart auto-negotiation
2010  * @phydev: target phy_device struct
2011  * @restart: whether aneg restart is requested
2012  *
2013  * NOTE:The caller must have taken the MDIO bus lock.
2014  *
2015  * returns 0 or negative errno code
2016  */
2017 static int ytphy_check_and_restart_aneg(struct phy_device *phydev, bool restart)
2018 {
2019 	int ret;
2020 
2021 	if (!restart) {
2022 		/* Advertisement hasn't changed, but maybe aneg was never on to
2023 		 * begin with?  Or maybe phy was isolated?
2024 		 */
2025 		ret = __phy_read(phydev, MII_BMCR);
2026 		if (ret < 0)
2027 			return ret;
2028 
2029 		if (!(ret & BMCR_ANENABLE) || (ret & BMCR_ISOLATE))
2030 			restart = true;
2031 	}
2032 	/* Enable and Restart Autonegotiation
2033 	 * Don't isolate the PHY if we're negotiating
2034 	 */
2035 	if (restart)
2036 		return __phy_modify(phydev, MII_BMCR, BMCR_ISOLATE,
2037 				    BMCR_ANENABLE | BMCR_ANRESTART);
2038 
2039 	return 0;
2040 }
2041 
2042 /**
2043  * yt8521_fiber_config_aneg - restart auto-negotiation or write
2044  * YTPHY_MISC_CONFIG_REG.
2045  * @phydev: target phy_device struct
2046  *
2047  * NOTE:The caller must have taken the MDIO bus lock.
2048  *
2049  * returns 0 or negative errno code
2050  */
2051 static int yt8521_fiber_config_aneg(struct phy_device *phydev)
2052 {
2053 	int err, changed = 0;
2054 	int bmcr;
2055 	u16 adv;
2056 
2057 	if (phydev->autoneg != AUTONEG_ENABLE)
2058 		return yt8521_fiber_setup_forced(phydev);
2059 
2060 	/* enable Fiber auto sensing */
2061 	err =  ytphy_modify_ext(phydev, YT8521_LINK_TIMER_CFG2_REG,
2062 				0, YT8521_LTCR_EN_AUTOSEN);
2063 	if (err < 0)
2064 		return err;
2065 
2066 	err =  ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG,
2067 				YT8521_CCR_SW_RST, 0);
2068 	if (err < 0)
2069 		return err;
2070 
2071 	bmcr = __phy_read(phydev, MII_BMCR);
2072 	if (bmcr < 0)
2073 		return bmcr;
2074 
2075 	/* When it is coming from fiber forced mode, add bmcr power down
2076 	 * and power up to let aneg work fine.
2077 	 */
2078 	if (!(bmcr & BMCR_ANENABLE)) {
2079 		__phy_modify(phydev, MII_BMCR, 0, BMCR_PDOWN);
2080 		usleep_range(1000, 1100);
2081 		__phy_modify(phydev, MII_BMCR, BMCR_PDOWN, 0);
2082 	}
2083 
2084 	adv = linkmode_adv_to_mii_adv_x(phydev->advertising,
2085 					ETHTOOL_LINK_MODE_1000baseX_Full_BIT);
2086 
2087 	/* Setup fiber advertisement */
2088 	err = __phy_modify_changed(phydev, MII_ADVERTISE,
2089 				   ADVERTISE_1000XHALF | ADVERTISE_1000XFULL |
2090 				   ADVERTISE_1000XPAUSE |
2091 				   ADVERTISE_1000XPSE_ASYM,
2092 				   adv);
2093 	if (err < 0)
2094 		return err;
2095 
2096 	if (err > 0)
2097 		changed = 1;
2098 
2099 	return ytphy_check_and_restart_aneg(phydev, changed);
2100 }
2101 
2102 /**
2103  * ytphy_setup_master_slave
2104  * @phydev: target phy_device struct
2105  *
2106  * NOTE: The caller must have taken the MDIO bus lock.
2107  *
2108  * returns 0 or negative errno code
2109  */
2110 static int ytphy_setup_master_slave(struct phy_device *phydev)
2111 {
2112 	u16 ctl = 0;
2113 
2114 	if (!phydev->is_gigabit_capable)
2115 		return 0;
2116 
2117 	switch (phydev->master_slave_set) {
2118 	case MASTER_SLAVE_CFG_MASTER_PREFERRED:
2119 		ctl |= CTL1000_PREFER_MASTER;
2120 		break;
2121 	case MASTER_SLAVE_CFG_SLAVE_PREFERRED:
2122 		break;
2123 	case MASTER_SLAVE_CFG_MASTER_FORCE:
2124 		ctl |= CTL1000_AS_MASTER;
2125 		fallthrough;
2126 	case MASTER_SLAVE_CFG_SLAVE_FORCE:
2127 		ctl |= CTL1000_ENABLE_MASTER;
2128 		break;
2129 	case MASTER_SLAVE_CFG_UNKNOWN:
2130 	case MASTER_SLAVE_CFG_UNSUPPORTED:
2131 		return 0;
2132 	default:
2133 		phydev_warn(phydev, "Unsupported Master/Slave mode\n");
2134 		return -EOPNOTSUPP;
2135 	}
2136 
2137 	return __phy_modify_changed(phydev, MII_CTRL1000,
2138 				    (CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER |
2139 				    CTL1000_PREFER_MASTER), ctl);
2140 }
2141 
2142 /**
2143  * ytphy_utp_config_advert - sanitize and advertise auto-negotiation parameters
2144  * @phydev: target phy_device struct
2145  *
2146  * NOTE: Writes MII_ADVERTISE with the appropriate values,
2147  * after sanitizing the values to make sure we only advertise
2148  * what is supported.  Returns < 0 on error, 0 if the PHY's advertisement
2149  * hasn't changed, and > 0 if it has changed.
2150  * The caller must have taken the MDIO bus lock.
2151  *
2152  * returns 0 or negative errno code
2153  */
2154 static int ytphy_utp_config_advert(struct phy_device *phydev)
2155 {
2156 	int err, bmsr, changed = 0;
2157 	u32 adv;
2158 
2159 	/* Only allow advertising what this PHY supports */
2160 	linkmode_and(phydev->advertising, phydev->advertising,
2161 		     phydev->supported);
2162 
2163 	adv = linkmode_adv_to_mii_adv_t(phydev->advertising);
2164 
2165 	/* Setup standard advertisement */
2166 	err = __phy_modify_changed(phydev, MII_ADVERTISE,
2167 				   ADVERTISE_ALL | ADVERTISE_100BASE4 |
2168 				   ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM,
2169 				   adv);
2170 	if (err < 0)
2171 		return err;
2172 	if (err > 0)
2173 		changed = 1;
2174 
2175 	bmsr = __phy_read(phydev, MII_BMSR);
2176 	if (bmsr < 0)
2177 		return bmsr;
2178 
2179 	/* Per 802.3-2008, Section 22.2.4.2.16 Extended status all
2180 	 * 1000Mbits/sec capable PHYs shall have the BMSR_ESTATEN bit set to a
2181 	 * logical 1.
2182 	 */
2183 	if (!(bmsr & BMSR_ESTATEN))
2184 		return changed;
2185 
2186 	adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising);
2187 
2188 	err = __phy_modify_changed(phydev, MII_CTRL1000,
2189 				   ADVERTISE_1000FULL | ADVERTISE_1000HALF,
2190 				   adv);
2191 	if (err < 0)
2192 		return err;
2193 	if (err > 0)
2194 		changed = 1;
2195 
2196 	return changed;
2197 }
2198 
2199 /**
2200  * ytphy_utp_config_aneg - restart auto-negotiation or write BMCR
2201  * @phydev: target phy_device struct
2202  * @changed: whether autoneg is requested
2203  *
2204  * NOTE: If auto-negotiation is enabled, we configure the
2205  * advertising, and then restart auto-negotiation.  If it is not
2206  * enabled, then we write the BMCR.
2207  * The caller must have taken the MDIO bus lock.
2208  *
2209  * returns 0 or negative errno code
2210  */
2211 static int ytphy_utp_config_aneg(struct phy_device *phydev, bool changed)
2212 {
2213 	int err;
2214 	u16 ctl;
2215 
2216 	err = ytphy_setup_master_slave(phydev);
2217 	if (err < 0)
2218 		return err;
2219 	else if (err)
2220 		changed = true;
2221 
2222 	if (phydev->autoneg != AUTONEG_ENABLE) {
2223 		/* configures/forces speed/duplex from @phydev */
2224 
2225 		ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex);
2226 
2227 		return __phy_modify(phydev, MII_BMCR, ~(BMCR_LOOPBACK |
2228 				    BMCR_ISOLATE | BMCR_PDOWN), ctl);
2229 	}
2230 
2231 	err = ytphy_utp_config_advert(phydev);
2232 	if (err < 0) /* error */
2233 		return err;
2234 	else if (err)
2235 		changed = true;
2236 
2237 	return ytphy_check_and_restart_aneg(phydev, changed);
2238 }
2239 
2240 /**
2241  * yt8521_config_aneg_paged() - switch reg space then call genphy_config_aneg
2242  * of one page
2243  * @phydev: a pointer to a &struct phy_device
2244  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to
2245  * operate.
2246  *
2247  * returns 0 or negative errno code
2248  */
2249 static int yt8521_config_aneg_paged(struct phy_device *phydev, int page)
2250 {
2251 	__ETHTOOL_DECLARE_LINK_MODE_MASK(fiber_supported);
2252 	struct yt8521_priv *priv = phydev->priv;
2253 	int old_page;
2254 	int ret = 0;
2255 
2256 	page &= YT8521_RSSR_SPACE_MASK;
2257 
2258 	old_page = phy_select_page(phydev, page);
2259 	if (old_page < 0)
2260 		goto err_restore_page;
2261 
2262 	/* If reg_page is YT8521_RSSR_TO_BE_ARBITRATED,
2263 	 * phydev->advertising should be updated.
2264 	 */
2265 	if (priv->reg_page == YT8521_RSSR_TO_BE_ARBITRATED) {
2266 		linkmode_zero(fiber_supported);
2267 		yt8521_prepare_fiber_features(phydev, fiber_supported);
2268 
2269 		/* prepare fiber_supported, then setup advertising. */
2270 		if (page == YT8521_RSSR_FIBER_SPACE) {
2271 			linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT,
2272 					 fiber_supported);
2273 			linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
2274 					 fiber_supported);
2275 			linkmode_and(phydev->advertising,
2276 				     priv->combo_advertising, fiber_supported);
2277 		} else {
2278 			/* ETHTOOL_LINK_MODE_Autoneg_BIT is also used in utp */
2279 			linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
2280 					   fiber_supported);
2281 			linkmode_andnot(phydev->advertising,
2282 					priv->combo_advertising,
2283 					fiber_supported);
2284 		}
2285 	}
2286 
2287 	if (page == YT8521_RSSR_FIBER_SPACE)
2288 		ret = yt8521_fiber_config_aneg(phydev);
2289 	else
2290 		ret = ytphy_utp_config_aneg(phydev, false);
2291 
2292 err_restore_page:
2293 	return phy_restore_page(phydev, old_page, ret);
2294 }
2295 
2296 /**
2297  * yt8521_config_aneg() - change reg space then call yt8521_config_aneg_paged
2298  * @phydev: a pointer to a &struct phy_device
2299  *
2300  * returns 0 or negative errno code
2301  */
2302 static int yt8521_config_aneg(struct phy_device *phydev)
2303 {
2304 	struct yt8521_priv *priv = phydev->priv;
2305 	int ret;
2306 
2307 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
2308 		ret = yt8521_config_aneg_paged(phydev, priv->reg_page);
2309 		if (ret < 0)
2310 			return ret;
2311 	} else {
2312 		/* If reg_page is YT8521_RSSR_TO_BE_ARBITRATED,
2313 		 * phydev->advertising need to be saved at first run.
2314 		 * Because it contains the advertising which supported by both
2315 		 * mac and yt8521(utp and fiber).
2316 		 */
2317 		if (linkmode_empty(priv->combo_advertising)) {
2318 			linkmode_copy(priv->combo_advertising,
2319 				      phydev->advertising);
2320 		}
2321 
2322 		ret = yt8521_config_aneg_paged(phydev, YT8521_RSSR_UTP_SPACE);
2323 		if (ret < 0)
2324 			return ret;
2325 
2326 		ret = yt8521_config_aneg_paged(phydev, YT8521_RSSR_FIBER_SPACE);
2327 		if (ret < 0)
2328 			return ret;
2329 
2330 		/* we don't known which will be link, so restore
2331 		 * phydev->advertising as default value.
2332 		 */
2333 		linkmode_copy(phydev->advertising, priv->combo_advertising);
2334 	}
2335 	return 0;
2336 }
2337 
2338 /**
2339  * yt8521_aneg_done_paged() - determines the auto negotiation result of one
2340  * page.
2341  * @phydev: a pointer to a &struct phy_device
2342  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to
2343  * operate.
2344  *
2345  * returns 0(no link)or 1(fiber or utp link) or negative errno code
2346  */
2347 static int yt8521_aneg_done_paged(struct phy_device *phydev, int page)
2348 {
2349 	int old_page;
2350 	int ret = 0;
2351 	int link;
2352 
2353 	old_page = phy_select_page(phydev, page & YT8521_RSSR_SPACE_MASK);
2354 	if (old_page < 0)
2355 		goto err_restore_page;
2356 
2357 	ret = __phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG);
2358 	if (ret < 0)
2359 		goto err_restore_page;
2360 
2361 	link = !!(ret & YTPHY_SSR_LINK);
2362 	ret = link;
2363 
2364 err_restore_page:
2365 	return phy_restore_page(phydev, old_page, ret);
2366 }
2367 
2368 /**
2369  * yt8521_aneg_done() - determines the auto negotiation result
2370  * @phydev: a pointer to a &struct phy_device
2371  *
2372  * returns 0(no link)or 1(fiber or utp link) or negative errno code
2373  */
2374 static int yt8521_aneg_done(struct phy_device *phydev)
2375 {
2376 	struct yt8521_priv *priv = phydev->priv;
2377 	int link_fiber = 0;
2378 	int link_utp;
2379 	int link;
2380 
2381 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
2382 		link = yt8521_aneg_done_paged(phydev, priv->reg_page);
2383 	} else {
2384 		link_utp = yt8521_aneg_done_paged(phydev,
2385 						  YT8521_RSSR_UTP_SPACE);
2386 		if (link_utp < 0)
2387 			return link_utp;
2388 
2389 		if (!link_utp) {
2390 			link_fiber = yt8521_aneg_done_paged(phydev,
2391 							    YT8521_RSSR_FIBER_SPACE);
2392 			if (link_fiber < 0)
2393 				return link_fiber;
2394 		}
2395 		link = link_fiber || link_utp;
2396 		phydev_info(phydev, "%s, link_fiber: %d, link_utp: %d\n",
2397 			    __func__, link_fiber, link_utp);
2398 	}
2399 
2400 	return link;
2401 }
2402 
2403 /**
2404  * ytphy_utp_read_abilities - read PHY abilities from Clause 22 registers
2405  * @phydev: target phy_device struct
2406  *
2407  * NOTE: Reads the PHY's abilities and populates
2408  * phydev->supported accordingly.
2409  * The caller must have taken the MDIO bus lock.
2410  *
2411  * returns 0 or negative errno code
2412  */
2413 static int ytphy_utp_read_abilities(struct phy_device *phydev)
2414 {
2415 	int val;
2416 
2417 	linkmode_set_bit_array(phy_basic_ports_array,
2418 			       ARRAY_SIZE(phy_basic_ports_array),
2419 			       phydev->supported);
2420 
2421 	val = __phy_read(phydev, MII_BMSR);
2422 	if (val < 0)
2423 		return val;
2424 
2425 	linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported,
2426 			 val & BMSR_ANEGCAPABLE);
2427 
2428 	linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, phydev->supported,
2429 			 val & BMSR_100FULL);
2430 	linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, phydev->supported,
2431 			 val & BMSR_100HALF);
2432 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, phydev->supported,
2433 			 val & BMSR_10FULL);
2434 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, phydev->supported,
2435 			 val & BMSR_10HALF);
2436 
2437 	if (val & BMSR_ESTATEN) {
2438 		val = __phy_read(phydev, MII_ESTATUS);
2439 		if (val < 0)
2440 			return val;
2441 
2442 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
2443 				 phydev->supported, val & ESTATUS_1000_TFULL);
2444 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
2445 				 phydev->supported, val & ESTATUS_1000_THALF);
2446 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
2447 				 phydev->supported, val & ESTATUS_1000_XFULL);
2448 	}
2449 
2450 	return 0;
2451 }
2452 
2453 /**
2454  * yt8521_get_features_paged() -  read supported link modes for one page
2455  * @phydev: a pointer to a &struct phy_device
2456  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to
2457  * operate.
2458  *
2459  * returns 0 or negative errno code
2460  */
2461 static int yt8521_get_features_paged(struct phy_device *phydev, int page)
2462 {
2463 	int old_page;
2464 	int ret = 0;
2465 
2466 	page &= YT8521_RSSR_SPACE_MASK;
2467 	old_page = phy_select_page(phydev, page);
2468 	if (old_page < 0)
2469 		goto err_restore_page;
2470 
2471 	if (page == YT8521_RSSR_FIBER_SPACE) {
2472 		linkmode_zero(phydev->supported);
2473 		yt8521_prepare_fiber_features(phydev, phydev->supported);
2474 	} else {
2475 		ret = ytphy_utp_read_abilities(phydev);
2476 		if (ret < 0)
2477 			goto err_restore_page;
2478 	}
2479 
2480 err_restore_page:
2481 	return phy_restore_page(phydev, old_page, ret);
2482 }
2483 
2484 /**
2485  * yt8521_get_features - switch reg space then call yt8521_get_features_paged
2486  * @phydev: target phy_device struct
2487  *
2488  * returns 0 or negative errno code
2489  */
2490 static int yt8521_get_features(struct phy_device *phydev)
2491 {
2492 	struct yt8521_priv *priv = phydev->priv;
2493 	int ret;
2494 
2495 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
2496 		ret = yt8521_get_features_paged(phydev, priv->reg_page);
2497 	} else {
2498 		ret = yt8521_get_features_paged(phydev,
2499 						YT8521_RSSR_UTP_SPACE);
2500 		if (ret < 0)
2501 			return ret;
2502 
2503 		/* add fiber's features to phydev->supported */
2504 		yt8521_prepare_fiber_features(phydev, phydev->supported);
2505 	}
2506 	return ret;
2507 }
2508 
2509 /**
2510  * yt8821_get_features - read mmd register to get 2.5G capability
2511  * @phydev: target phy_device struct
2512  *
2513  * Returns: 0 or negative errno code
2514  */
2515 static int yt8821_get_features(struct phy_device *phydev)
2516 {
2517 	int ret;
2518 
2519 	ret = genphy_c45_pma_read_ext_abilities(phydev);
2520 	if (ret < 0)
2521 		return ret;
2522 
2523 	return genphy_read_abilities(phydev);
2524 }
2525 
2526 /**
2527  * yt8821_get_rate_matching - read register to get phy chip mode
2528  * @phydev: target phy_device struct
2529  * @iface: PHY data interface type
2530  *
2531  * Returns: rate matching type or negative errno code
2532  */
2533 static int yt8821_get_rate_matching(struct phy_device *phydev,
2534 				    phy_interface_t iface)
2535 {
2536 	int val;
2537 
2538 	val = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG);
2539 	if (val < 0)
2540 		return val;
2541 
2542 	if (FIELD_GET(YT8521_CCR_MODE_SEL_MASK, val) ==
2543 	    YT8821_CHIP_MODE_FORCE_BX2500)
2544 		return RATE_MATCH_PAUSE;
2545 
2546 	return RATE_MATCH_NONE;
2547 }
2548 
2549 /**
2550  * yt8821_aneg_done() - determines the auto negotiation result
2551  * @phydev: a pointer to a &struct phy_device
2552  *
2553  * Returns: 0(no link)or 1(utp link) or negative errno code
2554  */
2555 static int yt8821_aneg_done(struct phy_device *phydev)
2556 {
2557 	return yt8521_aneg_done_paged(phydev, YT8521_RSSR_UTP_SPACE);
2558 }
2559 
2560 /**
2561  * yt8821_serdes_init() - serdes init
2562  * @phydev: a pointer to a &struct phy_device
2563  *
2564  * Returns: 0 or negative errno code
2565  */
2566 static int yt8821_serdes_init(struct phy_device *phydev)
2567 {
2568 	int old_page;
2569 	int ret = 0;
2570 	u16 mask;
2571 	u16 set;
2572 
2573 	old_page = phy_select_page(phydev, YT8521_RSSR_FIBER_SPACE);
2574 	if (old_page < 0) {
2575 		phydev_err(phydev, "Failed to select page: %d\n",
2576 			   old_page);
2577 		goto err_restore_page;
2578 	}
2579 
2580 	ret = __phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0);
2581 	if (ret < 0)
2582 		goto err_restore_page;
2583 
2584 	mask = YT8821_SDS_EXT_CSR_VCO_LDO_EN |
2585 		YT8821_SDS_EXT_CSR_VCO_BIAS_LPF_EN;
2586 	set = YT8821_SDS_EXT_CSR_VCO_LDO_EN;
2587 	ret = ytphy_modify_ext(phydev, YT8821_SDS_EXT_CSR_CTRL_REG, mask,
2588 			       set);
2589 
2590 err_restore_page:
2591 	return phy_restore_page(phydev, old_page, ret);
2592 }
2593 
2594 /**
2595  * yt8821_utp_init() - utp init
2596  * @phydev: a pointer to a &struct phy_device
2597  *
2598  * Returns: 0 or negative errno code
2599  */
2600 static int yt8821_utp_init(struct phy_device *phydev)
2601 {
2602 	int old_page;
2603 	int ret = 0;
2604 	u16 mask;
2605 	u16 save;
2606 	u16 set;
2607 
2608 	old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
2609 	if (old_page < 0) {
2610 		phydev_err(phydev, "Failed to select page: %d\n",
2611 			   old_page);
2612 		goto err_restore_page;
2613 	}
2614 
2615 	mask = YT8821_UTP_EXT_RPDN_BP_FFE_LNG_2500 |
2616 		YT8821_UTP_EXT_RPDN_BP_FFE_SHT_2500 |
2617 		YT8821_UTP_EXT_RPDN_IPR_SHT_2500;
2618 	set = YT8821_UTP_EXT_RPDN_BP_FFE_LNG_2500 |
2619 		YT8821_UTP_EXT_RPDN_BP_FFE_SHT_2500;
2620 	ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_RPDN_CTRL_REG,
2621 			       mask, set);
2622 	if (ret < 0)
2623 		goto err_restore_page;
2624 
2625 	mask = YT8821_UTP_EXT_VGA_LPF1_CAP_OTHER |
2626 		YT8821_UTP_EXT_VGA_LPF1_CAP_2500;
2627 	ret = ytphy_modify_ext(phydev,
2628 			       YT8821_UTP_EXT_VGA_LPF1_CAP_CTRL_REG,
2629 			       mask, 0);
2630 	if (ret < 0)
2631 		goto err_restore_page;
2632 
2633 	mask = YT8821_UTP_EXT_VGA_LPF2_CAP_OTHER |
2634 		YT8821_UTP_EXT_VGA_LPF2_CAP_2500;
2635 	ret = ytphy_modify_ext(phydev,
2636 			       YT8821_UTP_EXT_VGA_LPF2_CAP_CTRL_REG,
2637 			       mask, 0);
2638 	if (ret < 0)
2639 		goto err_restore_page;
2640 
2641 	mask = YT8821_UTP_EXT_TRACE_LNG_GAIN_THE_2500 |
2642 		YT8821_UTP_EXT_TRACE_MED_GAIN_THE_2500;
2643 	set = FIELD_PREP(YT8821_UTP_EXT_TRACE_LNG_GAIN_THE_2500, 0x5a) |
2644 		FIELD_PREP(YT8821_UTP_EXT_TRACE_MED_GAIN_THE_2500, 0x3c);
2645 	ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_TRACE_CTRL_REG,
2646 			       mask, set);
2647 	if (ret < 0)
2648 		goto err_restore_page;
2649 
2650 	mask = YT8821_UTP_EXT_IPR_LNG_2500;
2651 	set = FIELD_PREP(YT8821_UTP_EXT_IPR_LNG_2500, 0x6c);
2652 	ret = ytphy_modify_ext(phydev,
2653 			       YT8821_UTP_EXT_ALPHA_IPR_CTRL_REG,
2654 			       mask, set);
2655 	if (ret < 0)
2656 		goto err_restore_page;
2657 
2658 	mask = YT8821_UTP_EXT_TRACE_LNG_GAIN_THR_1000;
2659 	set = FIELD_PREP(YT8821_UTP_EXT_TRACE_LNG_GAIN_THR_1000, 0x2a);
2660 	ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_ECHO_CTRL_REG,
2661 			       mask, set);
2662 	if (ret < 0)
2663 		goto err_restore_page;
2664 
2665 	mask = YT8821_UTP_EXT_TRACE_MED_GAIN_THR_1000;
2666 	set = FIELD_PREP(YT8821_UTP_EXT_TRACE_MED_GAIN_THR_1000, 0x22);
2667 	ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_GAIN_CTRL_REG,
2668 			       mask, set);
2669 	if (ret < 0)
2670 		goto err_restore_page;
2671 
2672 	mask = YT8821_UTP_EXT_TH_20DB_2500;
2673 	set = FIELD_PREP(YT8821_UTP_EXT_TH_20DB_2500, 0x8000);
2674 	ret = ytphy_modify_ext(phydev,
2675 			       YT8821_UTP_EXT_TH_20DB_2500_CTRL_REG,
2676 			       mask, set);
2677 	if (ret < 0)
2678 		goto err_restore_page;
2679 
2680 	mask = YT8821_UTP_EXT_MU_COARSE_FR_F_FFE |
2681 		YT8821_UTP_EXT_MU_COARSE_FR_F_FBE;
2682 	set = FIELD_PREP(YT8821_UTP_EXT_MU_COARSE_FR_F_FFE, 0x7) |
2683 		FIELD_PREP(YT8821_UTP_EXT_MU_COARSE_FR_F_FBE, 0x7);
2684 	ret = ytphy_modify_ext(phydev,
2685 			       YT8821_UTP_EXT_MU_COARSE_FR_CTRL_REG,
2686 			       mask, set);
2687 	if (ret < 0)
2688 		goto err_restore_page;
2689 
2690 	mask = YT8821_UTP_EXT_MU_FINE_FR_F_FFE |
2691 		YT8821_UTP_EXT_MU_FINE_FR_F_FBE;
2692 	set = FIELD_PREP(YT8821_UTP_EXT_MU_FINE_FR_F_FFE, 0x2) |
2693 		FIELD_PREP(YT8821_UTP_EXT_MU_FINE_FR_F_FBE, 0x2);
2694 	ret = ytphy_modify_ext(phydev,
2695 			       YT8821_UTP_EXT_MU_FINE_FR_CTRL_REG,
2696 			       mask, set);
2697 	if (ret < 0)
2698 		goto err_restore_page;
2699 
2700 	/* save YT8821_UTP_EXT_PI_CTRL_REG's val for use later */
2701 	ret = ytphy_read_ext(phydev, YT8821_UTP_EXT_PI_CTRL_REG);
2702 	if (ret < 0)
2703 		goto err_restore_page;
2704 
2705 	save = ret;
2706 
2707 	mask = YT8821_UTP_EXT_PI_TX_CLK_SEL_AFE |
2708 		YT8821_UTP_EXT_PI_RX_CLK_3_SEL_AFE |
2709 		YT8821_UTP_EXT_PI_RX_CLK_2_SEL_AFE |
2710 		YT8821_UTP_EXT_PI_RX_CLK_1_SEL_AFE |
2711 		YT8821_UTP_EXT_PI_RX_CLK_0_SEL_AFE;
2712 	ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_PI_CTRL_REG,
2713 			       mask, 0);
2714 	if (ret < 0)
2715 		goto err_restore_page;
2716 
2717 	/* restore YT8821_UTP_EXT_PI_CTRL_REG's val */
2718 	ret = ytphy_write_ext(phydev, YT8821_UTP_EXT_PI_CTRL_REG, save);
2719 	if (ret < 0)
2720 		goto err_restore_page;
2721 
2722 	mask = YT8821_UTP_EXT_FECHO_AMP_TH_HUGE;
2723 	set = FIELD_PREP(YT8821_UTP_EXT_FECHO_AMP_TH_HUGE, 0x38);
2724 	ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_VCT_CFG6_CTRL_REG,
2725 			       mask, set);
2726 	if (ret < 0)
2727 		goto err_restore_page;
2728 
2729 	mask = YT8821_UTP_EXT_NFR_TX_ABILITY;
2730 	set = YT8821_UTP_EXT_NFR_TX_ABILITY;
2731 	ret = ytphy_modify_ext(phydev,
2732 			       YT8821_UTP_EXT_TXGE_NFR_FR_THP_CTRL_REG,
2733 			       mask, set);
2734 	if (ret < 0)
2735 		goto err_restore_page;
2736 
2737 	mask = YT8821_UTP_EXT_PLL_SPARE_CFG;
2738 	set = FIELD_PREP(YT8821_UTP_EXT_PLL_SPARE_CFG, 0xe9);
2739 	ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_PLL_CTRL_REG,
2740 			       mask, set);
2741 	if (ret < 0)
2742 		goto err_restore_page;
2743 
2744 	mask = YT8821_UTP_EXT_DAC_IMID_CH_3_10_ORG |
2745 		YT8821_UTP_EXT_DAC_IMID_CH_2_10_ORG;
2746 	set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_3_10_ORG, 0x64) |
2747 		FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_2_10_ORG, 0x64);
2748 	ret = ytphy_modify_ext(phydev,
2749 			       YT8821_UTP_EXT_DAC_IMID_CH_2_3_CTRL_REG,
2750 			       mask, set);
2751 	if (ret < 0)
2752 		goto err_restore_page;
2753 
2754 	mask = YT8821_UTP_EXT_DAC_IMID_CH_1_10_ORG |
2755 		YT8821_UTP_EXT_DAC_IMID_CH_0_10_ORG;
2756 	set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_1_10_ORG, 0x64) |
2757 		FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_0_10_ORG, 0x64);
2758 	ret = ytphy_modify_ext(phydev,
2759 			       YT8821_UTP_EXT_DAC_IMID_CH_0_1_CTRL_REG,
2760 			       mask, set);
2761 	if (ret < 0)
2762 		goto err_restore_page;
2763 
2764 	mask = YT8821_UTP_EXT_DAC_IMSB_CH_3_10_ORG |
2765 		YT8821_UTP_EXT_DAC_IMSB_CH_2_10_ORG;
2766 	set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_3_10_ORG, 0x64) |
2767 		FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_2_10_ORG, 0x64);
2768 	ret = ytphy_modify_ext(phydev,
2769 			       YT8821_UTP_EXT_DAC_IMSB_CH_2_3_CTRL_REG,
2770 			       mask, set);
2771 	if (ret < 0)
2772 		goto err_restore_page;
2773 
2774 	mask = YT8821_UTP_EXT_DAC_IMSB_CH_1_10_ORG |
2775 		YT8821_UTP_EXT_DAC_IMSB_CH_0_10_ORG;
2776 	set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_1_10_ORG, 0x64) |
2777 		FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_0_10_ORG, 0x64);
2778 	ret = ytphy_modify_ext(phydev,
2779 			       YT8821_UTP_EXT_DAC_IMSB_CH_0_1_CTRL_REG,
2780 			       mask, set);
2781 
2782 err_restore_page:
2783 	return phy_restore_page(phydev, old_page, ret);
2784 }
2785 
2786 /**
2787  * yt8821_auto_sleep_config() - phy auto sleep config
2788  * @phydev: a pointer to a &struct phy_device
2789  * @enable: true enable auto sleep, false disable auto sleep
2790  *
2791  * Returns: 0 or negative errno code
2792  */
2793 static int yt8821_auto_sleep_config(struct phy_device *phydev,
2794 				    bool enable)
2795 {
2796 	int old_page;
2797 	int ret = 0;
2798 
2799 	old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
2800 	if (old_page < 0) {
2801 		phydev_err(phydev, "Failed to select page: %d\n",
2802 			   old_page);
2803 		goto err_restore_page;
2804 	}
2805 
2806 	ret = ytphy_modify_ext(phydev,
2807 			       YT8521_EXTREG_SLEEP_CONTROL1_REG,
2808 			       YT8521_ESC1R_SLEEP_SW,
2809 			       enable ? 1 : 0);
2810 
2811 err_restore_page:
2812 	return phy_restore_page(phydev, old_page, ret);
2813 }
2814 
2815 /**
2816  * yt8821_soft_reset() - soft reset utp and serdes
2817  * @phydev: a pointer to a &struct phy_device
2818  *
2819  * Returns: 0 or negative errno code
2820  */
2821 static int yt8821_soft_reset(struct phy_device *phydev)
2822 {
2823 	return ytphy_modify_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG,
2824 					  YT8521_CCR_SW_RST, 0);
2825 }
2826 
2827 /**
2828  * yt8821_config_init() - phy initializatioin
2829  * @phydev: a pointer to a &struct phy_device
2830  *
2831  * Returns: 0 or negative errno code
2832  */
2833 static int yt8821_config_init(struct phy_device *phydev)
2834 {
2835 	u8 mode = YT8821_CHIP_MODE_AUTO_BX2500_SGMII;
2836 	int ret;
2837 	u16 set;
2838 
2839 	if (phydev->interface == PHY_INTERFACE_MODE_2500BASEX)
2840 		mode = YT8821_CHIP_MODE_FORCE_BX2500;
2841 
2842 	set = FIELD_PREP(YT8521_CCR_MODE_SEL_MASK, mode);
2843 	ret = ytphy_modify_ext_with_lock(phydev,
2844 					 YT8521_CHIP_CONFIG_REG,
2845 					 YT8521_CCR_MODE_SEL_MASK,
2846 					 set);
2847 	if (ret < 0)
2848 		return ret;
2849 
2850 	__set_bit(PHY_INTERFACE_MODE_2500BASEX,
2851 		  phydev->possible_interfaces);
2852 
2853 	if (mode == YT8821_CHIP_MODE_AUTO_BX2500_SGMII) {
2854 		__set_bit(PHY_INTERFACE_MODE_SGMII,
2855 			  phydev->possible_interfaces);
2856 
2857 		phydev->rate_matching = RATE_MATCH_NONE;
2858 	} else if (mode == YT8821_CHIP_MODE_FORCE_BX2500) {
2859 		phydev->rate_matching = RATE_MATCH_PAUSE;
2860 	}
2861 
2862 	ret = yt8821_serdes_init(phydev);
2863 	if (ret < 0)
2864 		return ret;
2865 
2866 	ret = yt8821_utp_init(phydev);
2867 	if (ret < 0)
2868 		return ret;
2869 
2870 	/* disable auto sleep */
2871 	ret = yt8821_auto_sleep_config(phydev, false);
2872 	if (ret < 0)
2873 		return ret;
2874 
2875 	/* soft reset */
2876 	return yt8821_soft_reset(phydev);
2877 }
2878 
2879 /**
2880  * yt8821_adjust_status() - update speed and duplex to phydev
2881  * @phydev: a pointer to a &struct phy_device
2882  * @val: read from YTPHY_SPECIFIC_STATUS_REG
2883  */
2884 static void yt8821_adjust_status(struct phy_device *phydev, int val)
2885 {
2886 	int speed, duplex;
2887 	int speed_mode;
2888 
2889 	duplex = FIELD_GET(YTPHY_SSR_DUPLEX, val);
2890 	speed_mode = val & YTPHY_SSR_SPEED_MASK;
2891 	switch (speed_mode) {
2892 	case YTPHY_SSR_SPEED_10M:
2893 		speed = SPEED_10;
2894 		break;
2895 	case YTPHY_SSR_SPEED_100M:
2896 		speed = SPEED_100;
2897 		break;
2898 	case YTPHY_SSR_SPEED_1000M:
2899 		speed = SPEED_1000;
2900 		break;
2901 	case YTPHY_SSR_SPEED_2500M:
2902 		speed = SPEED_2500;
2903 		break;
2904 	default:
2905 		speed = SPEED_UNKNOWN;
2906 		break;
2907 	}
2908 
2909 	phydev->speed = speed;
2910 	phydev->duplex = duplex;
2911 }
2912 
2913 /**
2914  * yt8821_update_interface() - update interface per current speed
2915  * @phydev: a pointer to a &struct phy_device
2916  */
2917 static void yt8821_update_interface(struct phy_device *phydev)
2918 {
2919 	if (!phydev->link)
2920 		return;
2921 
2922 	switch (phydev->speed) {
2923 	case SPEED_2500:
2924 		phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
2925 		break;
2926 	case SPEED_1000:
2927 	case SPEED_100:
2928 	case SPEED_10:
2929 		phydev->interface = PHY_INTERFACE_MODE_SGMII;
2930 		break;
2931 	default:
2932 		phydev_warn(phydev, "phy speed err :%d\n", phydev->speed);
2933 		break;
2934 	}
2935 }
2936 
2937 /**
2938  * yt8821_read_status() -  determines the negotiated speed and duplex
2939  * @phydev: a pointer to a &struct phy_device
2940  *
2941  * Returns: 0 or negative errno code
2942  */
2943 static int yt8821_read_status(struct phy_device *phydev)
2944 {
2945 	int link;
2946 	int ret;
2947 	int val;
2948 
2949 	ret = ytphy_write_ext_with_lock(phydev,
2950 					YT8521_REG_SPACE_SELECT_REG,
2951 					YT8521_RSSR_UTP_SPACE);
2952 	if (ret < 0)
2953 		return ret;
2954 
2955 	ret = genphy_read_status(phydev);
2956 	if (ret < 0)
2957 		return ret;
2958 
2959 	if (phydev->autoneg_complete) {
2960 		ret = genphy_c45_read_lpa(phydev);
2961 		if (ret < 0)
2962 			return ret;
2963 	}
2964 
2965 	ret = phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG);
2966 	if (ret < 0)
2967 		return ret;
2968 
2969 	val = ret;
2970 
2971 	link = val & YTPHY_SSR_LINK;
2972 	if (link)
2973 		yt8821_adjust_status(phydev, val);
2974 
2975 	if (link) {
2976 		if (phydev->link == 0)
2977 			phydev_dbg(phydev,
2978 				   "%s, phy addr: %d, link up\n",
2979 				   __func__, phydev->mdio.addr);
2980 		phydev->link = 1;
2981 	} else {
2982 		if (phydev->link == 1)
2983 			phydev_dbg(phydev,
2984 				   "%s, phy addr: %d, link down\n",
2985 				   __func__, phydev->mdio.addr);
2986 		phydev->link = 0;
2987 	}
2988 
2989 	val = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG);
2990 	if (val < 0)
2991 		return val;
2992 
2993 	if (FIELD_GET(YT8521_CCR_MODE_SEL_MASK, val) ==
2994 	    YT8821_CHIP_MODE_AUTO_BX2500_SGMII)
2995 		yt8821_update_interface(phydev);
2996 
2997 	return 0;
2998 }
2999 
3000 /**
3001  * yt8821_modify_utp_fiber_bmcr - bits modify a PHY's BMCR register
3002  * @phydev: the phy_device struct
3003  * @mask: bit mask of bits to clear
3004  * @set: bit mask of bits to set
3005  *
3006  * NOTE: Convenience function which allows a PHY's BMCR register to be
3007  * modified as new register value = (old register value & ~mask) | set.
3008  *
3009  * Returns: 0 or negative errno code
3010  */
3011 static int yt8821_modify_utp_fiber_bmcr(struct phy_device *phydev,
3012 					u16 mask, u16 set)
3013 {
3014 	int ret;
3015 
3016 	ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_UTP_SPACE,
3017 				       mask, set);
3018 	if (ret < 0)
3019 		return ret;
3020 
3021 	return yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_FIBER_SPACE,
3022 					mask, set);
3023 }
3024 
3025 /**
3026  * yt8821_suspend() - suspend the hardware
3027  * @phydev: a pointer to a &struct phy_device
3028  *
3029  * Returns: 0 or negative errno code
3030  */
3031 static int yt8821_suspend(struct phy_device *phydev)
3032 {
3033 	int wol_config;
3034 
3035 	wol_config = ytphy_read_ext_with_lock(phydev,
3036 					      YTPHY_WOL_CONFIG_REG);
3037 	if (wol_config < 0)
3038 		return wol_config;
3039 
3040 	/* if wol enable, do nothing */
3041 	if (wol_config & YTPHY_WCR_ENABLE)
3042 		return 0;
3043 
3044 	return yt8821_modify_utp_fiber_bmcr(phydev, 0, BMCR_PDOWN);
3045 }
3046 
3047 /**
3048  * yt8821_resume() - resume the hardware
3049  * @phydev: a pointer to a &struct phy_device
3050  *
3051  * Returns: 0 or negative errno code
3052  */
3053 static int yt8821_resume(struct phy_device *phydev)
3054 {
3055 	int wol_config;
3056 	int ret;
3057 
3058 	/* disable auto sleep */
3059 	ret = yt8821_auto_sleep_config(phydev, false);
3060 	if (ret < 0)
3061 		return ret;
3062 
3063 	wol_config = ytphy_read_ext_with_lock(phydev,
3064 					      YTPHY_WOL_CONFIG_REG);
3065 	if (wol_config < 0)
3066 		return wol_config;
3067 
3068 	/* if wol enable, do nothing */
3069 	if (wol_config & YTPHY_WCR_ENABLE)
3070 		return 0;
3071 
3072 	return yt8821_modify_utp_fiber_bmcr(phydev, BMCR_PDOWN, 0);
3073 }
3074 
3075 static struct phy_driver motorcomm_phy_drvs[] = {
3076 	{
3077 		PHY_ID_MATCH_EXACT(PHY_ID_YT8511),
3078 		.name		= "YT8511 Gigabit Ethernet",
3079 		.config_init	= yt8511_config_init,
3080 		.suspend	= genphy_suspend,
3081 		.resume		= genphy_resume,
3082 		.read_page	= yt8511_read_page,
3083 		.write_page	= yt8511_write_page,
3084 	},
3085 	{
3086 		PHY_ID_MATCH_EXACT(PHY_ID_YT8521),
3087 		.name		= "YT8521 Gigabit Ethernet",
3088 		.get_features	= yt8521_get_features,
3089 		.probe		= yt8521_probe,
3090 		.read_page	= yt8521_read_page,
3091 		.write_page	= yt8521_write_page,
3092 		.get_wol	= ytphy_get_wol,
3093 		.set_wol	= ytphy_set_wol,
3094 		.config_aneg	= yt8521_config_aneg,
3095 		.aneg_done	= yt8521_aneg_done,
3096 		.config_init	= yt8521_config_init,
3097 		.read_status	= yt8521_read_status,
3098 		.soft_reset	= yt8521_soft_reset,
3099 		.suspend	= yt8521_suspend,
3100 		.resume		= yt8521_resume,
3101 		.led_hw_is_supported = yt8521_led_hw_is_supported,
3102 		.led_hw_control_set = yt8521_led_hw_control_set,
3103 		.led_hw_control_get = yt8521_led_hw_control_get,
3104 	},
3105 	{
3106 		PHY_ID_MATCH_EXACT(PHY_ID_YT8522),
3107 		.name		= "YT8522 100 Megabit Ethernet",
3108 		.config_aneg	= genphy_config_aneg,
3109 		.config_init	= yt8522_config_init,
3110 		.suspend	= genphy_suspend,
3111 		.resume		= genphy_resume,
3112 	},
3113 	{
3114 		PHY_ID_MATCH_EXACT(PHY_ID_YT8531),
3115 		.name		= "YT8531 Gigabit Ethernet",
3116 		.probe		= yt8531_probe,
3117 		.config_init	= yt8531_config_init,
3118 		.suspend	= genphy_suspend,
3119 		.resume		= genphy_resume,
3120 		.get_wol	= ytphy_get_wol,
3121 		.set_wol	= yt8531_set_wol,
3122 		.link_change_notify = yt8531_link_change_notify,
3123 		.led_hw_is_supported = yt8521_led_hw_is_supported,
3124 		.led_hw_control_set = yt8521_led_hw_control_set,
3125 		.led_hw_control_get = yt8521_led_hw_control_get,
3126 	},
3127 	{
3128 		PHY_ID_MATCH_EXACT(PHY_ID_YT8531S),
3129 		.name		= "YT8531S Gigabit Ethernet",
3130 		.get_features	= yt8521_get_features,
3131 		.probe		= yt8521_probe,
3132 		.read_page	= yt8521_read_page,
3133 		.write_page	= yt8521_write_page,
3134 		.get_wol	= ytphy_get_wol,
3135 		.set_wol	= ytphy_set_wol,
3136 		.config_aneg	= yt8521_config_aneg,
3137 		.aneg_done	= yt8521_aneg_done,
3138 		.config_init	= yt8521_config_init,
3139 		.read_status	= yt8521_read_status,
3140 		.soft_reset	= yt8521_soft_reset,
3141 		.suspend	= yt8521_suspend,
3142 		.resume		= yt8521_resume,
3143 	},
3144 	{
3145 		PHY_ID_MATCH_EXACT(PHY_ID_YT8821),
3146 		.name			= "YT8821 2.5Gbps PHY",
3147 		.get_features		= yt8821_get_features,
3148 		.read_page		= yt8521_read_page,
3149 		.write_page		= yt8521_write_page,
3150 		.get_wol		= ytphy_get_wol,
3151 		.set_wol		= ytphy_set_wol,
3152 		.config_aneg		= genphy_config_aneg,
3153 		.aneg_done		= yt8821_aneg_done,
3154 		.config_init		= yt8821_config_init,
3155 		.get_rate_matching	= yt8821_get_rate_matching,
3156 		.read_status		= yt8821_read_status,
3157 		.soft_reset		= yt8821_soft_reset,
3158 		.suspend		= yt8821_suspend,
3159 		.resume			= yt8821_resume,
3160 	},
3161 };
3162 
3163 module_phy_driver(motorcomm_phy_drvs);
3164 
3165 MODULE_DESCRIPTION("Motorcomm 8511/8521/8531/8531S/8821 PHY driver");
3166 MODULE_AUTHOR("Peter Geis");
3167 MODULE_AUTHOR("Frank");
3168 MODULE_LICENSE("GPL");
3169 
3170 static const struct mdio_device_id __maybe_unused motorcomm_tbl[] = {
3171 	{ PHY_ID_MATCH_EXACT(PHY_ID_YT8511) },
3172 	{ PHY_ID_MATCH_EXACT(PHY_ID_YT8521) },
3173 	{ PHY_ID_MATCH_EXACT(PHY_ID_YT8522) },
3174 	{ PHY_ID_MATCH_EXACT(PHY_ID_YT8531) },
3175 	{ PHY_ID_MATCH_EXACT(PHY_ID_YT8531S) },
3176 	{ PHY_ID_MATCH_EXACT(PHY_ID_YT8821) },
3177 	{ /* sentinel */ }
3178 };
3179 
3180 MODULE_DEVICE_TABLE(mdio, motorcomm_tbl);
3181