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