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