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