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