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