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