1 /* 2 * Copyright (c) 2015 MediaTek Inc. 3 * Author: Chunfeng Yun <chunfeng.yun@mediatek.com> 4 * 5 * This software is licensed under the terms of the GNU General Public 6 * License version 2, as published by the Free Software Foundation, and 7 * may be copied, distributed, and modified under those terms. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 */ 15 16 #include <dt-bindings/phy/phy.h> 17 #include <linux/clk.h> 18 #include <linux/delay.h> 19 #include <linux/io.h> 20 #include <linux/iopoll.h> 21 #include <linux/module.h> 22 #include <linux/of_address.h> 23 #include <linux/phy/phy.h> 24 #include <linux/platform_device.h> 25 26 /* version V1 sub-banks offset base address */ 27 /* banks shared by multiple phys */ 28 #define SSUSB_SIFSLV_V1_SPLLC 0x000 /* shared by u3 phys */ 29 #define SSUSB_SIFSLV_V1_U2FREQ 0x100 /* shared by u2 phys */ 30 /* u2 phy bank */ 31 #define SSUSB_SIFSLV_V1_U2PHY_COM 0x000 32 /* u3/pcie/sata phy banks */ 33 #define SSUSB_SIFSLV_V1_U3PHYD 0x000 34 #define SSUSB_SIFSLV_V1_U3PHYA 0x200 35 36 /* version V2 sub-banks offset base address */ 37 /* u2 phy banks */ 38 #define SSUSB_SIFSLV_V2_MISC 0x000 39 #define SSUSB_SIFSLV_V2_U2FREQ 0x100 40 #define SSUSB_SIFSLV_V2_U2PHY_COM 0x300 41 /* u3/pcie/sata phy banks */ 42 #define SSUSB_SIFSLV_V2_SPLLC 0x000 43 #define SSUSB_SIFSLV_V2_CHIP 0x100 44 #define SSUSB_SIFSLV_V2_U3PHYD 0x200 45 #define SSUSB_SIFSLV_V2_U3PHYA 0x400 46 47 #define U3P_USBPHYACR0 0x000 48 #define PA0_RG_U2PLL_FORCE_ON BIT(15) 49 #define PA0_RG_USB20_INTR_EN BIT(5) 50 51 #define U3P_USBPHYACR2 0x008 52 #define PA2_RG_SIF_U2PLL_FORCE_EN BIT(18) 53 54 #define U3P_USBPHYACR5 0x014 55 #define PA5_RG_U2_HSTX_SRCAL_EN BIT(15) 56 #define PA5_RG_U2_HSTX_SRCTRL GENMASK(14, 12) 57 #define PA5_RG_U2_HSTX_SRCTRL_VAL(x) ((0x7 & (x)) << 12) 58 #define PA5_RG_U2_HS_100U_U3_EN BIT(11) 59 60 #define U3P_USBPHYACR6 0x018 61 #define PA6_RG_U2_BC11_SW_EN BIT(23) 62 #define PA6_RG_U2_OTG_VBUSCMP_EN BIT(20) 63 #define PA6_RG_U2_SQTH GENMASK(3, 0) 64 #define PA6_RG_U2_SQTH_VAL(x) (0xf & (x)) 65 66 #define U3P_U2PHYACR4 0x020 67 #define P2C_RG_USB20_GPIO_CTL BIT(9) 68 #define P2C_USB20_GPIO_MODE BIT(8) 69 #define P2C_U2_GPIO_CTR_MSK (P2C_RG_USB20_GPIO_CTL | P2C_USB20_GPIO_MODE) 70 71 #define U3D_U2PHYDCR0 0x060 72 #define P2C_RG_SIF_U2PLL_FORCE_ON BIT(24) 73 74 #define U3P_U2PHYDTM0 0x068 75 #define P2C_FORCE_UART_EN BIT(26) 76 #define P2C_FORCE_DATAIN BIT(23) 77 #define P2C_FORCE_DM_PULLDOWN BIT(21) 78 #define P2C_FORCE_DP_PULLDOWN BIT(20) 79 #define P2C_FORCE_XCVRSEL BIT(19) 80 #define P2C_FORCE_SUSPENDM BIT(18) 81 #define P2C_FORCE_TERMSEL BIT(17) 82 #define P2C_RG_DATAIN GENMASK(13, 10) 83 #define P2C_RG_DATAIN_VAL(x) ((0xf & (x)) << 10) 84 #define P2C_RG_DMPULLDOWN BIT(7) 85 #define P2C_RG_DPPULLDOWN BIT(6) 86 #define P2C_RG_XCVRSEL GENMASK(5, 4) 87 #define P2C_RG_XCVRSEL_VAL(x) ((0x3 & (x)) << 4) 88 #define P2C_RG_SUSPENDM BIT(3) 89 #define P2C_RG_TERMSEL BIT(2) 90 #define P2C_DTM0_PART_MASK \ 91 (P2C_FORCE_DATAIN | P2C_FORCE_DM_PULLDOWN | \ 92 P2C_FORCE_DP_PULLDOWN | P2C_FORCE_XCVRSEL | \ 93 P2C_FORCE_TERMSEL | P2C_RG_DMPULLDOWN | \ 94 P2C_RG_DPPULLDOWN | P2C_RG_TERMSEL) 95 96 #define U3P_U2PHYDTM1 0x06C 97 #define P2C_RG_UART_EN BIT(16) 98 #define P2C_RG_VBUSVALID BIT(5) 99 #define P2C_RG_SESSEND BIT(4) 100 #define P2C_RG_AVALID BIT(2) 101 102 #define U3P_U3_CHIP_GPIO_CTLD 0x0c 103 #define P3C_REG_IP_SW_RST BIT(31) 104 #define P3C_MCU_BUS_CK_GATE_EN BIT(30) 105 #define P3C_FORCE_IP_SW_RST BIT(29) 106 107 #define U3P_U3_CHIP_GPIO_CTLE 0x10 108 #define P3C_RG_SWRST_U3_PHYD BIT(25) 109 #define P3C_RG_SWRST_U3_PHYD_FORCE_EN BIT(24) 110 111 #define U3P_U3_PHYA_REG0 0x000 112 #define P3A_RG_CLKDRV_OFF GENMASK(3, 2) 113 #define P3A_RG_CLKDRV_OFF_VAL(x) ((0x3 & (x)) << 2) 114 115 #define U3P_U3_PHYA_REG1 0x004 116 #define P3A_RG_CLKDRV_AMP GENMASK(31, 29) 117 #define P3A_RG_CLKDRV_AMP_VAL(x) ((0x7 & (x)) << 29) 118 119 #define U3P_U3_PHYA_REG6 0x018 120 #define P3A_RG_TX_EIDLE_CM GENMASK(31, 28) 121 #define P3A_RG_TX_EIDLE_CM_VAL(x) ((0xf & (x)) << 28) 122 123 #define U3P_U3_PHYA_REG9 0x024 124 #define P3A_RG_RX_DAC_MUX GENMASK(5, 1) 125 #define P3A_RG_RX_DAC_MUX_VAL(x) ((0x1f & (x)) << 1) 126 127 #define U3P_U3_PHYA_DA_REG0 0x100 128 #define P3A_RG_XTAL_EXT_PE2H GENMASK(17, 16) 129 #define P3A_RG_XTAL_EXT_PE2H_VAL(x) ((0x3 & (x)) << 16) 130 #define P3A_RG_XTAL_EXT_PE1H GENMASK(13, 12) 131 #define P3A_RG_XTAL_EXT_PE1H_VAL(x) ((0x3 & (x)) << 12) 132 #define P3A_RG_XTAL_EXT_EN_U3 GENMASK(11, 10) 133 #define P3A_RG_XTAL_EXT_EN_U3_VAL(x) ((0x3 & (x)) << 10) 134 135 #define U3P_U3_PHYA_DA_REG4 0x108 136 #define P3A_RG_PLL_DIVEN_PE2H GENMASK(21, 19) 137 #define P3A_RG_PLL_BC_PE2H GENMASK(7, 6) 138 #define P3A_RG_PLL_BC_PE2H_VAL(x) ((0x3 & (x)) << 6) 139 140 #define U3P_U3_PHYA_DA_REG5 0x10c 141 #define P3A_RG_PLL_BR_PE2H GENMASK(29, 28) 142 #define P3A_RG_PLL_BR_PE2H_VAL(x) ((0x3 & (x)) << 28) 143 #define P3A_RG_PLL_IC_PE2H GENMASK(15, 12) 144 #define P3A_RG_PLL_IC_PE2H_VAL(x) ((0xf & (x)) << 12) 145 146 #define U3P_U3_PHYA_DA_REG6 0x110 147 #define P3A_RG_PLL_IR_PE2H GENMASK(19, 16) 148 #define P3A_RG_PLL_IR_PE2H_VAL(x) ((0xf & (x)) << 16) 149 150 #define U3P_U3_PHYA_DA_REG7 0x114 151 #define P3A_RG_PLL_BP_PE2H GENMASK(19, 16) 152 #define P3A_RG_PLL_BP_PE2H_VAL(x) ((0xf & (x)) << 16) 153 154 #define U3P_U3_PHYA_DA_REG20 0x13c 155 #define P3A_RG_PLL_DELTA1_PE2H GENMASK(31, 16) 156 #define P3A_RG_PLL_DELTA1_PE2H_VAL(x) ((0xffff & (x)) << 16) 157 158 #define U3P_U3_PHYA_DA_REG25 0x148 159 #define P3A_RG_PLL_DELTA_PE2H GENMASK(15, 0) 160 #define P3A_RG_PLL_DELTA_PE2H_VAL(x) (0xffff & (x)) 161 162 #define U3P_U3_PHYD_LFPS1 0x00c 163 #define P3D_RG_FWAKE_TH GENMASK(21, 16) 164 #define P3D_RG_FWAKE_TH_VAL(x) ((0x3f & (x)) << 16) 165 166 #define U3P_U3_PHYD_CDR1 0x05c 167 #define P3D_RG_CDR_BIR_LTD1 GENMASK(28, 24) 168 #define P3D_RG_CDR_BIR_LTD1_VAL(x) ((0x1f & (x)) << 24) 169 #define P3D_RG_CDR_BIR_LTD0 GENMASK(12, 8) 170 #define P3D_RG_CDR_BIR_LTD0_VAL(x) ((0x1f & (x)) << 8) 171 172 #define U3P_U3_PHYD_RXDET1 0x128 173 #define P3D_RG_RXDET_STB2_SET GENMASK(17, 9) 174 #define P3D_RG_RXDET_STB2_SET_VAL(x) ((0x1ff & (x)) << 9) 175 176 #define U3P_U3_PHYD_RXDET2 0x12c 177 #define P3D_RG_RXDET_STB2_SET_P3 GENMASK(8, 0) 178 #define P3D_RG_RXDET_STB2_SET_P3_VAL(x) (0x1ff & (x)) 179 180 #define U3P_SPLLC_XTALCTL3 0x018 181 #define XC3_RG_U3_XTAL_RX_PWD BIT(9) 182 #define XC3_RG_U3_FRC_XTAL_RX_PWD BIT(8) 183 184 #define U3P_U2FREQ_FMCR0 0x00 185 #define P2F_RG_MONCLK_SEL GENMASK(27, 26) 186 #define P2F_RG_MONCLK_SEL_VAL(x) ((0x3 & (x)) << 26) 187 #define P2F_RG_FREQDET_EN BIT(24) 188 #define P2F_RG_CYCLECNT GENMASK(23, 0) 189 #define P2F_RG_CYCLECNT_VAL(x) ((P2F_RG_CYCLECNT) & (x)) 190 191 #define U3P_U2FREQ_VALUE 0x0c 192 193 #define U3P_U2FREQ_FMMONR1 0x10 194 #define P2F_USB_FM_VALID BIT(0) 195 #define P2F_RG_FRCK_EN BIT(8) 196 197 #define U3P_REF_CLK 26 /* MHZ */ 198 #define U3P_SLEW_RATE_COEF 28 199 #define U3P_SR_COEF_DIVISOR 1000 200 #define U3P_FM_DET_CYCLE_CNT 1024 201 202 /* SATA register setting */ 203 #define PHYD_CTRL_SIGNAL_MODE4 0x1c 204 /* CDR Charge Pump P-path current adjustment */ 205 #define RG_CDR_BICLTD1_GEN1_MSK GENMASK(23, 20) 206 #define RG_CDR_BICLTD1_GEN1_VAL(x) ((0xf & (x)) << 20) 207 #define RG_CDR_BICLTD0_GEN1_MSK GENMASK(11, 8) 208 #define RG_CDR_BICLTD0_GEN1_VAL(x) ((0xf & (x)) << 8) 209 210 #define PHYD_DESIGN_OPTION2 0x24 211 /* Symbol lock count selection */ 212 #define RG_LOCK_CNT_SEL_MSK GENMASK(5, 4) 213 #define RG_LOCK_CNT_SEL_VAL(x) ((0x3 & (x)) << 4) 214 215 #define PHYD_DESIGN_OPTION9 0x40 216 /* COMWAK GAP width window */ 217 #define RG_TG_MAX_MSK GENMASK(20, 16) 218 #define RG_TG_MAX_VAL(x) ((0x1f & (x)) << 16) 219 /* COMINIT GAP width window */ 220 #define RG_T2_MAX_MSK GENMASK(13, 8) 221 #define RG_T2_MAX_VAL(x) ((0x3f & (x)) << 8) 222 /* COMWAK GAP width window */ 223 #define RG_TG_MIN_MSK GENMASK(7, 5) 224 #define RG_TG_MIN_VAL(x) ((0x7 & (x)) << 5) 225 /* COMINIT GAP width window */ 226 #define RG_T2_MIN_MSK GENMASK(4, 0) 227 #define RG_T2_MIN_VAL(x) (0x1f & (x)) 228 229 #define ANA_RG_CTRL_SIGNAL1 0x4c 230 /* TX driver tail current control for 0dB de-empahsis mdoe for Gen1 speed */ 231 #define RG_IDRV_0DB_GEN1_MSK GENMASK(13, 8) 232 #define RG_IDRV_0DB_GEN1_VAL(x) ((0x3f & (x)) << 8) 233 234 #define ANA_RG_CTRL_SIGNAL4 0x58 235 #define RG_CDR_BICLTR_GEN1_MSK GENMASK(23, 20) 236 #define RG_CDR_BICLTR_GEN1_VAL(x) ((0xf & (x)) << 20) 237 /* Loop filter R1 resistance adjustment for Gen1 speed */ 238 #define RG_CDR_BR_GEN2_MSK GENMASK(10, 8) 239 #define RG_CDR_BR_GEN2_VAL(x) ((0x7 & (x)) << 8) 240 241 #define ANA_RG_CTRL_SIGNAL6 0x60 242 /* I-path capacitance adjustment for Gen1 */ 243 #define RG_CDR_BC_GEN1_MSK GENMASK(28, 24) 244 #define RG_CDR_BC_GEN1_VAL(x) ((0x1f & (x)) << 24) 245 #define RG_CDR_BIRLTR_GEN1_MSK GENMASK(4, 0) 246 #define RG_CDR_BIRLTR_GEN1_VAL(x) (0x1f & (x)) 247 248 #define ANA_EQ_EYE_CTRL_SIGNAL1 0x6c 249 /* RX Gen1 LEQ tuning step */ 250 #define RG_EQ_DLEQ_LFI_GEN1_MSK GENMASK(11, 8) 251 #define RG_EQ_DLEQ_LFI_GEN1_VAL(x) ((0xf & (x)) << 8) 252 253 #define ANA_EQ_EYE_CTRL_SIGNAL4 0xd8 254 #define RG_CDR_BIRLTD0_GEN1_MSK GENMASK(20, 16) 255 #define RG_CDR_BIRLTD0_GEN1_VAL(x) ((0x1f & (x)) << 16) 256 257 #define ANA_EQ_EYE_CTRL_SIGNAL5 0xdc 258 #define RG_CDR_BIRLTD0_GEN3_MSK GENMASK(4, 0) 259 #define RG_CDR_BIRLTD0_GEN3_VAL(x) (0x1f & (x)) 260 261 enum mtk_phy_version { 262 MTK_PHY_V1 = 1, 263 MTK_PHY_V2, 264 }; 265 266 struct mtk_phy_pdata { 267 /* avoid RX sensitivity level degradation only for mt8173 */ 268 bool avoid_rx_sen_degradation; 269 enum mtk_phy_version version; 270 }; 271 272 struct u2phy_banks { 273 void __iomem *misc; 274 void __iomem *fmreg; 275 void __iomem *com; 276 }; 277 278 struct u3phy_banks { 279 void __iomem *spllc; 280 void __iomem *chip; 281 void __iomem *phyd; /* include u3phyd_bank2 */ 282 void __iomem *phya; /* include u3phya_da */ 283 }; 284 285 struct mtk_phy_instance { 286 struct phy *phy; 287 void __iomem *port_base; 288 union { 289 struct u2phy_banks u2_banks; 290 struct u3phy_banks u3_banks; 291 }; 292 struct clk *ref_clk; /* reference clock of anolog phy */ 293 u32 index; 294 u8 type; 295 }; 296 297 struct mtk_tphy { 298 struct device *dev; 299 void __iomem *sif_base; /* only shared sif */ 300 /* deprecated, use @ref_clk instead in phy instance */ 301 struct clk *u3phya_ref; /* reference clock of usb3 anolog phy */ 302 const struct mtk_phy_pdata *pdata; 303 struct mtk_phy_instance **phys; 304 int nphys; 305 }; 306 307 static void hs_slew_rate_calibrate(struct mtk_tphy *tphy, 308 struct mtk_phy_instance *instance) 309 { 310 struct u2phy_banks *u2_banks = &instance->u2_banks; 311 void __iomem *fmreg = u2_banks->fmreg; 312 void __iomem *com = u2_banks->com; 313 int calibration_val; 314 int fm_out; 315 u32 tmp; 316 317 /* enable USB ring oscillator */ 318 tmp = readl(com + U3P_USBPHYACR5); 319 tmp |= PA5_RG_U2_HSTX_SRCAL_EN; 320 writel(tmp, com + U3P_USBPHYACR5); 321 udelay(1); 322 323 /*enable free run clock */ 324 tmp = readl(fmreg + U3P_U2FREQ_FMMONR1); 325 tmp |= P2F_RG_FRCK_EN; 326 writel(tmp, fmreg + U3P_U2FREQ_FMMONR1); 327 328 /* set cycle count as 1024, and select u2 channel */ 329 tmp = readl(fmreg + U3P_U2FREQ_FMCR0); 330 tmp &= ~(P2F_RG_CYCLECNT | P2F_RG_MONCLK_SEL); 331 tmp |= P2F_RG_CYCLECNT_VAL(U3P_FM_DET_CYCLE_CNT); 332 if (tphy->pdata->version == MTK_PHY_V1) 333 tmp |= P2F_RG_MONCLK_SEL_VAL(instance->index >> 1); 334 335 writel(tmp, fmreg + U3P_U2FREQ_FMCR0); 336 337 /* enable frequency meter */ 338 tmp = readl(fmreg + U3P_U2FREQ_FMCR0); 339 tmp |= P2F_RG_FREQDET_EN; 340 writel(tmp, fmreg + U3P_U2FREQ_FMCR0); 341 342 /* ignore return value */ 343 readl_poll_timeout(fmreg + U3P_U2FREQ_FMMONR1, tmp, 344 (tmp & P2F_USB_FM_VALID), 10, 200); 345 346 fm_out = readl(fmreg + U3P_U2FREQ_VALUE); 347 348 /* disable frequency meter */ 349 tmp = readl(fmreg + U3P_U2FREQ_FMCR0); 350 tmp &= ~P2F_RG_FREQDET_EN; 351 writel(tmp, fmreg + U3P_U2FREQ_FMCR0); 352 353 /*disable free run clock */ 354 tmp = readl(fmreg + U3P_U2FREQ_FMMONR1); 355 tmp &= ~P2F_RG_FRCK_EN; 356 writel(tmp, fmreg + U3P_U2FREQ_FMMONR1); 357 358 if (fm_out) { 359 /* ( 1024 / FM_OUT ) x reference clock frequency x 0.028 */ 360 tmp = U3P_FM_DET_CYCLE_CNT * U3P_REF_CLK * U3P_SLEW_RATE_COEF; 361 tmp /= fm_out; 362 calibration_val = DIV_ROUND_CLOSEST(tmp, U3P_SR_COEF_DIVISOR); 363 } else { 364 /* if FM detection fail, set default value */ 365 calibration_val = 4; 366 } 367 dev_dbg(tphy->dev, "phy:%d, fm_out:%d, calib:%d\n", 368 instance->index, fm_out, calibration_val); 369 370 /* set HS slew rate */ 371 tmp = readl(com + U3P_USBPHYACR5); 372 tmp &= ~PA5_RG_U2_HSTX_SRCTRL; 373 tmp |= PA5_RG_U2_HSTX_SRCTRL_VAL(calibration_val); 374 writel(tmp, com + U3P_USBPHYACR5); 375 376 /* disable USB ring oscillator */ 377 tmp = readl(com + U3P_USBPHYACR5); 378 tmp &= ~PA5_RG_U2_HSTX_SRCAL_EN; 379 writel(tmp, com + U3P_USBPHYACR5); 380 } 381 382 static void u3_phy_instance_init(struct mtk_tphy *tphy, 383 struct mtk_phy_instance *instance) 384 { 385 struct u3phy_banks *u3_banks = &instance->u3_banks; 386 u32 tmp; 387 388 /* gating PCIe Analog XTAL clock */ 389 tmp = readl(u3_banks->spllc + U3P_SPLLC_XTALCTL3); 390 tmp |= XC3_RG_U3_XTAL_RX_PWD | XC3_RG_U3_FRC_XTAL_RX_PWD; 391 writel(tmp, u3_banks->spllc + U3P_SPLLC_XTALCTL3); 392 393 /* gating XSQ */ 394 tmp = readl(u3_banks->phya + U3P_U3_PHYA_DA_REG0); 395 tmp &= ~P3A_RG_XTAL_EXT_EN_U3; 396 tmp |= P3A_RG_XTAL_EXT_EN_U3_VAL(2); 397 writel(tmp, u3_banks->phya + U3P_U3_PHYA_DA_REG0); 398 399 tmp = readl(u3_banks->phya + U3P_U3_PHYA_REG9); 400 tmp &= ~P3A_RG_RX_DAC_MUX; 401 tmp |= P3A_RG_RX_DAC_MUX_VAL(4); 402 writel(tmp, u3_banks->phya + U3P_U3_PHYA_REG9); 403 404 tmp = readl(u3_banks->phya + U3P_U3_PHYA_REG6); 405 tmp &= ~P3A_RG_TX_EIDLE_CM; 406 tmp |= P3A_RG_TX_EIDLE_CM_VAL(0xe); 407 writel(tmp, u3_banks->phya + U3P_U3_PHYA_REG6); 408 409 tmp = readl(u3_banks->phyd + U3P_U3_PHYD_CDR1); 410 tmp &= ~(P3D_RG_CDR_BIR_LTD0 | P3D_RG_CDR_BIR_LTD1); 411 tmp |= P3D_RG_CDR_BIR_LTD0_VAL(0xc) | P3D_RG_CDR_BIR_LTD1_VAL(0x3); 412 writel(tmp, u3_banks->phyd + U3P_U3_PHYD_CDR1); 413 414 tmp = readl(u3_banks->phyd + U3P_U3_PHYD_LFPS1); 415 tmp &= ~P3D_RG_FWAKE_TH; 416 tmp |= P3D_RG_FWAKE_TH_VAL(0x34); 417 writel(tmp, u3_banks->phyd + U3P_U3_PHYD_LFPS1); 418 419 tmp = readl(u3_banks->phyd + U3P_U3_PHYD_RXDET1); 420 tmp &= ~P3D_RG_RXDET_STB2_SET; 421 tmp |= P3D_RG_RXDET_STB2_SET_VAL(0x10); 422 writel(tmp, u3_banks->phyd + U3P_U3_PHYD_RXDET1); 423 424 tmp = readl(u3_banks->phyd + U3P_U3_PHYD_RXDET2); 425 tmp &= ~P3D_RG_RXDET_STB2_SET_P3; 426 tmp |= P3D_RG_RXDET_STB2_SET_P3_VAL(0x10); 427 writel(tmp, u3_banks->phyd + U3P_U3_PHYD_RXDET2); 428 429 dev_dbg(tphy->dev, "%s(%d)\n", __func__, instance->index); 430 } 431 432 static void u2_phy_instance_init(struct mtk_tphy *tphy, 433 struct mtk_phy_instance *instance) 434 { 435 struct u2phy_banks *u2_banks = &instance->u2_banks; 436 void __iomem *com = u2_banks->com; 437 u32 index = instance->index; 438 u32 tmp; 439 440 /* switch to USB function. (system register, force ip into usb mode) */ 441 tmp = readl(com + U3P_U2PHYDTM0); 442 tmp &= ~P2C_FORCE_UART_EN; 443 tmp |= P2C_RG_XCVRSEL_VAL(1) | P2C_RG_DATAIN_VAL(0); 444 writel(tmp, com + U3P_U2PHYDTM0); 445 446 tmp = readl(com + U3P_U2PHYDTM1); 447 tmp &= ~P2C_RG_UART_EN; 448 writel(tmp, com + U3P_U2PHYDTM1); 449 450 tmp = readl(com + U3P_USBPHYACR0); 451 tmp |= PA0_RG_USB20_INTR_EN; 452 writel(tmp, com + U3P_USBPHYACR0); 453 454 /* disable switch 100uA current to SSUSB */ 455 tmp = readl(com + U3P_USBPHYACR5); 456 tmp &= ~PA5_RG_U2_HS_100U_U3_EN; 457 writel(tmp, com + U3P_USBPHYACR5); 458 459 if (!index) { 460 tmp = readl(com + U3P_U2PHYACR4); 461 tmp &= ~P2C_U2_GPIO_CTR_MSK; 462 writel(tmp, com + U3P_U2PHYACR4); 463 } 464 465 if (tphy->pdata->avoid_rx_sen_degradation) { 466 if (!index) { 467 tmp = readl(com + U3P_USBPHYACR2); 468 tmp |= PA2_RG_SIF_U2PLL_FORCE_EN; 469 writel(tmp, com + U3P_USBPHYACR2); 470 471 tmp = readl(com + U3D_U2PHYDCR0); 472 tmp &= ~P2C_RG_SIF_U2PLL_FORCE_ON; 473 writel(tmp, com + U3D_U2PHYDCR0); 474 } else { 475 tmp = readl(com + U3D_U2PHYDCR0); 476 tmp |= P2C_RG_SIF_U2PLL_FORCE_ON; 477 writel(tmp, com + U3D_U2PHYDCR0); 478 479 tmp = readl(com + U3P_U2PHYDTM0); 480 tmp |= P2C_RG_SUSPENDM | P2C_FORCE_SUSPENDM; 481 writel(tmp, com + U3P_U2PHYDTM0); 482 } 483 } 484 485 tmp = readl(com + U3P_USBPHYACR6); 486 tmp &= ~PA6_RG_U2_BC11_SW_EN; /* DP/DM BC1.1 path Disable */ 487 tmp &= ~PA6_RG_U2_SQTH; 488 tmp |= PA6_RG_U2_SQTH_VAL(2); 489 writel(tmp, com + U3P_USBPHYACR6); 490 491 dev_dbg(tphy->dev, "%s(%d)\n", __func__, index); 492 } 493 494 static void u2_phy_instance_power_on(struct mtk_tphy *tphy, 495 struct mtk_phy_instance *instance) 496 { 497 struct u2phy_banks *u2_banks = &instance->u2_banks; 498 void __iomem *com = u2_banks->com; 499 u32 index = instance->index; 500 u32 tmp; 501 502 /* (force_suspendm=0) (let suspendm=1, enable usb 480MHz pll) */ 503 tmp = readl(com + U3P_U2PHYDTM0); 504 tmp &= ~(P2C_FORCE_SUSPENDM | P2C_RG_XCVRSEL); 505 tmp &= ~(P2C_RG_DATAIN | P2C_DTM0_PART_MASK); 506 writel(tmp, com + U3P_U2PHYDTM0); 507 508 /* OTG Enable */ 509 tmp = readl(com + U3P_USBPHYACR6); 510 tmp |= PA6_RG_U2_OTG_VBUSCMP_EN; 511 writel(tmp, com + U3P_USBPHYACR6); 512 513 tmp = readl(com + U3P_U2PHYDTM1); 514 tmp |= P2C_RG_VBUSVALID | P2C_RG_AVALID; 515 tmp &= ~P2C_RG_SESSEND; 516 writel(tmp, com + U3P_U2PHYDTM1); 517 518 if (tphy->pdata->avoid_rx_sen_degradation && index) { 519 tmp = readl(com + U3D_U2PHYDCR0); 520 tmp |= P2C_RG_SIF_U2PLL_FORCE_ON; 521 writel(tmp, com + U3D_U2PHYDCR0); 522 523 tmp = readl(com + U3P_U2PHYDTM0); 524 tmp |= P2C_RG_SUSPENDM | P2C_FORCE_SUSPENDM; 525 writel(tmp, com + U3P_U2PHYDTM0); 526 } 527 dev_dbg(tphy->dev, "%s(%d)\n", __func__, index); 528 } 529 530 static void u2_phy_instance_power_off(struct mtk_tphy *tphy, 531 struct mtk_phy_instance *instance) 532 { 533 struct u2phy_banks *u2_banks = &instance->u2_banks; 534 void __iomem *com = u2_banks->com; 535 u32 index = instance->index; 536 u32 tmp; 537 538 tmp = readl(com + U3P_U2PHYDTM0); 539 tmp &= ~(P2C_RG_XCVRSEL | P2C_RG_DATAIN); 540 tmp |= P2C_FORCE_SUSPENDM; 541 writel(tmp, com + U3P_U2PHYDTM0); 542 543 /* OTG Disable */ 544 tmp = readl(com + U3P_USBPHYACR6); 545 tmp &= ~PA6_RG_U2_OTG_VBUSCMP_EN; 546 writel(tmp, com + U3P_USBPHYACR6); 547 548 /* let suspendm=0, set utmi into analog power down */ 549 tmp = readl(com + U3P_U2PHYDTM0); 550 tmp &= ~P2C_RG_SUSPENDM; 551 writel(tmp, com + U3P_U2PHYDTM0); 552 udelay(1); 553 554 tmp = readl(com + U3P_U2PHYDTM1); 555 tmp &= ~(P2C_RG_VBUSVALID | P2C_RG_AVALID); 556 tmp |= P2C_RG_SESSEND; 557 writel(tmp, com + U3P_U2PHYDTM1); 558 559 if (tphy->pdata->avoid_rx_sen_degradation && index) { 560 tmp = readl(com + U3D_U2PHYDCR0); 561 tmp &= ~P2C_RG_SIF_U2PLL_FORCE_ON; 562 writel(tmp, com + U3D_U2PHYDCR0); 563 } 564 565 dev_dbg(tphy->dev, "%s(%d)\n", __func__, index); 566 } 567 568 static void u2_phy_instance_exit(struct mtk_tphy *tphy, 569 struct mtk_phy_instance *instance) 570 { 571 struct u2phy_banks *u2_banks = &instance->u2_banks; 572 void __iomem *com = u2_banks->com; 573 u32 index = instance->index; 574 u32 tmp; 575 576 if (tphy->pdata->avoid_rx_sen_degradation && index) { 577 tmp = readl(com + U3D_U2PHYDCR0); 578 tmp &= ~P2C_RG_SIF_U2PLL_FORCE_ON; 579 writel(tmp, com + U3D_U2PHYDCR0); 580 581 tmp = readl(com + U3P_U2PHYDTM0); 582 tmp &= ~P2C_FORCE_SUSPENDM; 583 writel(tmp, com + U3P_U2PHYDTM0); 584 } 585 } 586 587 static void pcie_phy_instance_init(struct mtk_tphy *tphy, 588 struct mtk_phy_instance *instance) 589 { 590 struct u3phy_banks *u3_banks = &instance->u3_banks; 591 u32 tmp; 592 593 if (tphy->pdata->version != MTK_PHY_V1) 594 return; 595 596 tmp = readl(u3_banks->phya + U3P_U3_PHYA_DA_REG0); 597 tmp &= ~(P3A_RG_XTAL_EXT_PE1H | P3A_RG_XTAL_EXT_PE2H); 598 tmp |= P3A_RG_XTAL_EXT_PE1H_VAL(0x2) | P3A_RG_XTAL_EXT_PE2H_VAL(0x2); 599 writel(tmp, u3_banks->phya + U3P_U3_PHYA_DA_REG0); 600 601 /* ref clk drive */ 602 tmp = readl(u3_banks->phya + U3P_U3_PHYA_REG1); 603 tmp &= ~P3A_RG_CLKDRV_AMP; 604 tmp |= P3A_RG_CLKDRV_AMP_VAL(0x4); 605 writel(tmp, u3_banks->phya + U3P_U3_PHYA_REG1); 606 607 tmp = readl(u3_banks->phya + U3P_U3_PHYA_REG0); 608 tmp &= ~P3A_RG_CLKDRV_OFF; 609 tmp |= P3A_RG_CLKDRV_OFF_VAL(0x1); 610 writel(tmp, u3_banks->phya + U3P_U3_PHYA_REG0); 611 612 /* SSC delta -5000ppm */ 613 tmp = readl(u3_banks->phya + U3P_U3_PHYA_DA_REG20); 614 tmp &= ~P3A_RG_PLL_DELTA1_PE2H; 615 tmp |= P3A_RG_PLL_DELTA1_PE2H_VAL(0x3c); 616 writel(tmp, u3_banks->phya + U3P_U3_PHYA_DA_REG20); 617 618 tmp = readl(u3_banks->phya + U3P_U3_PHYA_DA_REG25); 619 tmp &= ~P3A_RG_PLL_DELTA_PE2H; 620 tmp |= P3A_RG_PLL_DELTA_PE2H_VAL(0x36); 621 writel(tmp, u3_banks->phya + U3P_U3_PHYA_DA_REG25); 622 623 /* change pll BW 0.6M */ 624 tmp = readl(u3_banks->phya + U3P_U3_PHYA_DA_REG5); 625 tmp &= ~(P3A_RG_PLL_BR_PE2H | P3A_RG_PLL_IC_PE2H); 626 tmp |= P3A_RG_PLL_BR_PE2H_VAL(0x1) | P3A_RG_PLL_IC_PE2H_VAL(0x1); 627 writel(tmp, u3_banks->phya + U3P_U3_PHYA_DA_REG5); 628 629 tmp = readl(u3_banks->phya + U3P_U3_PHYA_DA_REG4); 630 tmp &= ~(P3A_RG_PLL_DIVEN_PE2H | P3A_RG_PLL_BC_PE2H); 631 tmp |= P3A_RG_PLL_BC_PE2H_VAL(0x3); 632 writel(tmp, u3_banks->phya + U3P_U3_PHYA_DA_REG4); 633 634 tmp = readl(u3_banks->phya + U3P_U3_PHYA_DA_REG6); 635 tmp &= ~P3A_RG_PLL_IR_PE2H; 636 tmp |= P3A_RG_PLL_IR_PE2H_VAL(0x2); 637 writel(tmp, u3_banks->phya + U3P_U3_PHYA_DA_REG6); 638 639 tmp = readl(u3_banks->phya + U3P_U3_PHYA_DA_REG7); 640 tmp &= ~P3A_RG_PLL_BP_PE2H; 641 tmp |= P3A_RG_PLL_BP_PE2H_VAL(0xa); 642 writel(tmp, u3_banks->phya + U3P_U3_PHYA_DA_REG7); 643 644 /* Tx Detect Rx Timing: 10us -> 5us */ 645 tmp = readl(u3_banks->phyd + U3P_U3_PHYD_RXDET1); 646 tmp &= ~P3D_RG_RXDET_STB2_SET; 647 tmp |= P3D_RG_RXDET_STB2_SET_VAL(0x10); 648 writel(tmp, u3_banks->phyd + U3P_U3_PHYD_RXDET1); 649 650 tmp = readl(u3_banks->phyd + U3P_U3_PHYD_RXDET2); 651 tmp &= ~P3D_RG_RXDET_STB2_SET_P3; 652 tmp |= P3D_RG_RXDET_STB2_SET_P3_VAL(0x10); 653 writel(tmp, u3_banks->phyd + U3P_U3_PHYD_RXDET2); 654 655 /* wait for PCIe subsys register to active */ 656 usleep_range(2500, 3000); 657 dev_dbg(tphy->dev, "%s(%d)\n", __func__, instance->index); 658 } 659 660 static void pcie_phy_instance_power_on(struct mtk_tphy *tphy, 661 struct mtk_phy_instance *instance) 662 { 663 struct u3phy_banks *bank = &instance->u3_banks; 664 u32 tmp; 665 666 tmp = readl(bank->chip + U3P_U3_CHIP_GPIO_CTLD); 667 tmp &= ~(P3C_FORCE_IP_SW_RST | P3C_MCU_BUS_CK_GATE_EN | 668 P3C_REG_IP_SW_RST); 669 writel(tmp, bank->chip + U3P_U3_CHIP_GPIO_CTLD); 670 671 tmp = readl(bank->chip + U3P_U3_CHIP_GPIO_CTLE); 672 tmp &= ~(P3C_RG_SWRST_U3_PHYD_FORCE_EN | P3C_RG_SWRST_U3_PHYD); 673 writel(tmp, bank->chip + U3P_U3_CHIP_GPIO_CTLE); 674 } 675 676 static void pcie_phy_instance_power_off(struct mtk_tphy *tphy, 677 struct mtk_phy_instance *instance) 678 679 { 680 struct u3phy_banks *bank = &instance->u3_banks; 681 u32 tmp; 682 683 tmp = readl(bank->chip + U3P_U3_CHIP_GPIO_CTLD); 684 tmp |= P3C_FORCE_IP_SW_RST | P3C_REG_IP_SW_RST; 685 writel(tmp, bank->chip + U3P_U3_CHIP_GPIO_CTLD); 686 687 tmp = readl(bank->chip + U3P_U3_CHIP_GPIO_CTLE); 688 tmp |= P3C_RG_SWRST_U3_PHYD_FORCE_EN | P3C_RG_SWRST_U3_PHYD; 689 writel(tmp, bank->chip + U3P_U3_CHIP_GPIO_CTLE); 690 } 691 692 static void sata_phy_instance_init(struct mtk_tphy *tphy, 693 struct mtk_phy_instance *instance) 694 { 695 struct u3phy_banks *u3_banks = &instance->u3_banks; 696 void __iomem *phyd = u3_banks->phyd; 697 u32 tmp; 698 699 /* charge current adjustment */ 700 tmp = readl(phyd + ANA_RG_CTRL_SIGNAL6); 701 tmp &= ~(RG_CDR_BIRLTR_GEN1_MSK | RG_CDR_BC_GEN1_MSK); 702 tmp |= RG_CDR_BIRLTR_GEN1_VAL(0x6) | RG_CDR_BC_GEN1_VAL(0x1a); 703 writel(tmp, phyd + ANA_RG_CTRL_SIGNAL6); 704 705 tmp = readl(phyd + ANA_EQ_EYE_CTRL_SIGNAL4); 706 tmp &= ~RG_CDR_BIRLTD0_GEN1_MSK; 707 tmp |= RG_CDR_BIRLTD0_GEN1_VAL(0x18); 708 writel(tmp, phyd + ANA_EQ_EYE_CTRL_SIGNAL4); 709 710 tmp = readl(phyd + ANA_EQ_EYE_CTRL_SIGNAL5); 711 tmp &= ~RG_CDR_BIRLTD0_GEN3_MSK; 712 tmp |= RG_CDR_BIRLTD0_GEN3_VAL(0x06); 713 writel(tmp, phyd + ANA_EQ_EYE_CTRL_SIGNAL5); 714 715 tmp = readl(phyd + ANA_RG_CTRL_SIGNAL4); 716 tmp &= ~(RG_CDR_BICLTR_GEN1_MSK | RG_CDR_BR_GEN2_MSK); 717 tmp |= RG_CDR_BICLTR_GEN1_VAL(0x0c) | RG_CDR_BR_GEN2_VAL(0x07); 718 writel(tmp, phyd + ANA_RG_CTRL_SIGNAL4); 719 720 tmp = readl(phyd + PHYD_CTRL_SIGNAL_MODE4); 721 tmp &= ~(RG_CDR_BICLTD0_GEN1_MSK | RG_CDR_BICLTD1_GEN1_MSK); 722 tmp |= RG_CDR_BICLTD0_GEN1_VAL(0x08) | RG_CDR_BICLTD1_GEN1_VAL(0x02); 723 writel(tmp, phyd + PHYD_CTRL_SIGNAL_MODE4); 724 725 tmp = readl(phyd + PHYD_DESIGN_OPTION2); 726 tmp &= ~RG_LOCK_CNT_SEL_MSK; 727 tmp |= RG_LOCK_CNT_SEL_VAL(0x02); 728 writel(tmp, phyd + PHYD_DESIGN_OPTION2); 729 730 tmp = readl(phyd + PHYD_DESIGN_OPTION9); 731 tmp &= ~(RG_T2_MIN_MSK | RG_TG_MIN_MSK | 732 RG_T2_MAX_MSK | RG_TG_MAX_MSK); 733 tmp |= RG_T2_MIN_VAL(0x12) | RG_TG_MIN_VAL(0x04) | 734 RG_T2_MAX_VAL(0x31) | RG_TG_MAX_VAL(0x0e); 735 writel(tmp, phyd + PHYD_DESIGN_OPTION9); 736 737 tmp = readl(phyd + ANA_RG_CTRL_SIGNAL1); 738 tmp &= ~RG_IDRV_0DB_GEN1_MSK; 739 tmp |= RG_IDRV_0DB_GEN1_VAL(0x20); 740 writel(tmp, phyd + ANA_RG_CTRL_SIGNAL1); 741 742 tmp = readl(phyd + ANA_EQ_EYE_CTRL_SIGNAL1); 743 tmp &= ~RG_EQ_DLEQ_LFI_GEN1_MSK; 744 tmp |= RG_EQ_DLEQ_LFI_GEN1_VAL(0x03); 745 writel(tmp, phyd + ANA_EQ_EYE_CTRL_SIGNAL1); 746 747 dev_dbg(tphy->dev, "%s(%d)\n", __func__, instance->index); 748 } 749 750 static void phy_v1_banks_init(struct mtk_tphy *tphy, 751 struct mtk_phy_instance *instance) 752 { 753 struct u2phy_banks *u2_banks = &instance->u2_banks; 754 struct u3phy_banks *u3_banks = &instance->u3_banks; 755 756 switch (instance->type) { 757 case PHY_TYPE_USB2: 758 u2_banks->misc = NULL; 759 u2_banks->fmreg = tphy->sif_base + SSUSB_SIFSLV_V1_U2FREQ; 760 u2_banks->com = instance->port_base + SSUSB_SIFSLV_V1_U2PHY_COM; 761 break; 762 case PHY_TYPE_USB3: 763 case PHY_TYPE_PCIE: 764 u3_banks->spllc = tphy->sif_base + SSUSB_SIFSLV_V1_SPLLC; 765 u3_banks->chip = NULL; 766 u3_banks->phyd = instance->port_base + SSUSB_SIFSLV_V1_U3PHYD; 767 u3_banks->phya = instance->port_base + SSUSB_SIFSLV_V1_U3PHYA; 768 break; 769 case PHY_TYPE_SATA: 770 u3_banks->phyd = instance->port_base + SSUSB_SIFSLV_V1_U3PHYD; 771 break; 772 default: 773 dev_err(tphy->dev, "incompatible PHY type\n"); 774 return; 775 } 776 } 777 778 static void phy_v2_banks_init(struct mtk_tphy *tphy, 779 struct mtk_phy_instance *instance) 780 { 781 struct u2phy_banks *u2_banks = &instance->u2_banks; 782 struct u3phy_banks *u3_banks = &instance->u3_banks; 783 784 switch (instance->type) { 785 case PHY_TYPE_USB2: 786 u2_banks->misc = instance->port_base + SSUSB_SIFSLV_V2_MISC; 787 u2_banks->fmreg = instance->port_base + SSUSB_SIFSLV_V2_U2FREQ; 788 u2_banks->com = instance->port_base + SSUSB_SIFSLV_V2_U2PHY_COM; 789 break; 790 case PHY_TYPE_USB3: 791 case PHY_TYPE_PCIE: 792 u3_banks->spllc = instance->port_base + SSUSB_SIFSLV_V2_SPLLC; 793 u3_banks->chip = instance->port_base + SSUSB_SIFSLV_V2_CHIP; 794 u3_banks->phyd = instance->port_base + SSUSB_SIFSLV_V2_U3PHYD; 795 u3_banks->phya = instance->port_base + SSUSB_SIFSLV_V2_U3PHYA; 796 break; 797 default: 798 dev_err(tphy->dev, "incompatible PHY type\n"); 799 return; 800 } 801 } 802 803 static int mtk_phy_init(struct phy *phy) 804 { 805 struct mtk_phy_instance *instance = phy_get_drvdata(phy); 806 struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent); 807 int ret; 808 809 ret = clk_prepare_enable(tphy->u3phya_ref); 810 if (ret) { 811 dev_err(tphy->dev, "failed to enable u3phya_ref\n"); 812 return ret; 813 } 814 815 ret = clk_prepare_enable(instance->ref_clk); 816 if (ret) { 817 dev_err(tphy->dev, "failed to enable ref_clk\n"); 818 return ret; 819 } 820 821 switch (instance->type) { 822 case PHY_TYPE_USB2: 823 u2_phy_instance_init(tphy, instance); 824 break; 825 case PHY_TYPE_USB3: 826 u3_phy_instance_init(tphy, instance); 827 break; 828 case PHY_TYPE_PCIE: 829 pcie_phy_instance_init(tphy, instance); 830 break; 831 case PHY_TYPE_SATA: 832 sata_phy_instance_init(tphy, instance); 833 break; 834 default: 835 dev_err(tphy->dev, "incompatible PHY type\n"); 836 return -EINVAL; 837 } 838 839 return 0; 840 } 841 842 static int mtk_phy_power_on(struct phy *phy) 843 { 844 struct mtk_phy_instance *instance = phy_get_drvdata(phy); 845 struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent); 846 847 if (instance->type == PHY_TYPE_USB2) { 848 u2_phy_instance_power_on(tphy, instance); 849 hs_slew_rate_calibrate(tphy, instance); 850 } else if (instance->type == PHY_TYPE_PCIE) { 851 pcie_phy_instance_power_on(tphy, instance); 852 } 853 854 return 0; 855 } 856 857 static int mtk_phy_power_off(struct phy *phy) 858 { 859 struct mtk_phy_instance *instance = phy_get_drvdata(phy); 860 struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent); 861 862 if (instance->type == PHY_TYPE_USB2) 863 u2_phy_instance_power_off(tphy, instance); 864 else if (instance->type == PHY_TYPE_PCIE) 865 pcie_phy_instance_power_off(tphy, instance); 866 867 return 0; 868 } 869 870 static int mtk_phy_exit(struct phy *phy) 871 { 872 struct mtk_phy_instance *instance = phy_get_drvdata(phy); 873 struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent); 874 875 if (instance->type == PHY_TYPE_USB2) 876 u2_phy_instance_exit(tphy, instance); 877 878 clk_disable_unprepare(instance->ref_clk); 879 clk_disable_unprepare(tphy->u3phya_ref); 880 return 0; 881 } 882 883 static struct phy *mtk_phy_xlate(struct device *dev, 884 struct of_phandle_args *args) 885 { 886 struct mtk_tphy *tphy = dev_get_drvdata(dev); 887 struct mtk_phy_instance *instance = NULL; 888 struct device_node *phy_np = args->np; 889 int index; 890 891 if (args->args_count != 1) { 892 dev_err(dev, "invalid number of cells in 'phy' property\n"); 893 return ERR_PTR(-EINVAL); 894 } 895 896 for (index = 0; index < tphy->nphys; index++) 897 if (phy_np == tphy->phys[index]->phy->dev.of_node) { 898 instance = tphy->phys[index]; 899 break; 900 } 901 902 if (!instance) { 903 dev_err(dev, "failed to find appropriate phy\n"); 904 return ERR_PTR(-EINVAL); 905 } 906 907 instance->type = args->args[0]; 908 if (!(instance->type == PHY_TYPE_USB2 || 909 instance->type == PHY_TYPE_USB3 || 910 instance->type == PHY_TYPE_PCIE || 911 instance->type == PHY_TYPE_SATA)) { 912 dev_err(dev, "unsupported device type: %d\n", instance->type); 913 return ERR_PTR(-EINVAL); 914 } 915 916 if (tphy->pdata->version == MTK_PHY_V1) { 917 phy_v1_banks_init(tphy, instance); 918 } else if (tphy->pdata->version == MTK_PHY_V2) { 919 phy_v2_banks_init(tphy, instance); 920 } else { 921 dev_err(dev, "phy version is not supported\n"); 922 return ERR_PTR(-EINVAL); 923 } 924 925 return instance->phy; 926 } 927 928 static const struct phy_ops mtk_tphy_ops = { 929 .init = mtk_phy_init, 930 .exit = mtk_phy_exit, 931 .power_on = mtk_phy_power_on, 932 .power_off = mtk_phy_power_off, 933 .owner = THIS_MODULE, 934 }; 935 936 static const struct mtk_phy_pdata tphy_v1_pdata = { 937 .avoid_rx_sen_degradation = false, 938 .version = MTK_PHY_V1, 939 }; 940 941 static const struct mtk_phy_pdata tphy_v2_pdata = { 942 .avoid_rx_sen_degradation = false, 943 .version = MTK_PHY_V2, 944 }; 945 946 static const struct mtk_phy_pdata mt8173_pdata = { 947 .avoid_rx_sen_degradation = true, 948 .version = MTK_PHY_V1, 949 }; 950 951 static const struct of_device_id mtk_tphy_id_table[] = { 952 { .compatible = "mediatek,mt2701-u3phy", .data = &tphy_v1_pdata }, 953 { .compatible = "mediatek,mt2712-u3phy", .data = &tphy_v2_pdata }, 954 { .compatible = "mediatek,mt8173-u3phy", .data = &mt8173_pdata }, 955 { .compatible = "mediatek,generic-tphy-v1", .data = &tphy_v1_pdata }, 956 { .compatible = "mediatek,generic-tphy-v2", .data = &tphy_v2_pdata }, 957 { }, 958 }; 959 MODULE_DEVICE_TABLE(of, mtk_tphy_id_table); 960 961 static int mtk_tphy_probe(struct platform_device *pdev) 962 { 963 const struct of_device_id *match; 964 struct device *dev = &pdev->dev; 965 struct device_node *np = dev->of_node; 966 struct device_node *child_np; 967 struct phy_provider *provider; 968 struct resource *sif_res; 969 struct mtk_tphy *tphy; 970 struct resource res; 971 int port, retval; 972 973 match = of_match_node(mtk_tphy_id_table, pdev->dev.of_node); 974 if (!match) 975 return -EINVAL; 976 977 tphy = devm_kzalloc(dev, sizeof(*tphy), GFP_KERNEL); 978 if (!tphy) 979 return -ENOMEM; 980 981 tphy->pdata = match->data; 982 tphy->nphys = of_get_child_count(np); 983 tphy->phys = devm_kcalloc(dev, tphy->nphys, 984 sizeof(*tphy->phys), GFP_KERNEL); 985 if (!tphy->phys) 986 return -ENOMEM; 987 988 tphy->dev = dev; 989 platform_set_drvdata(pdev, tphy); 990 991 if (tphy->pdata->version == MTK_PHY_V1) { 992 /* get banks shared by multiple phys */ 993 sif_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 994 tphy->sif_base = devm_ioremap_resource(dev, sif_res); 995 if (IS_ERR(tphy->sif_base)) { 996 dev_err(dev, "failed to remap sif regs\n"); 997 return PTR_ERR(tphy->sif_base); 998 } 999 } 1000 1001 /* it's deprecated, make it optional for backward compatibility */ 1002 tphy->u3phya_ref = devm_clk_get(dev, "u3phya_ref"); 1003 if (IS_ERR(tphy->u3phya_ref)) { 1004 if (PTR_ERR(tphy->u3phya_ref) == -EPROBE_DEFER) 1005 return -EPROBE_DEFER; 1006 1007 tphy->u3phya_ref = NULL; 1008 } 1009 1010 port = 0; 1011 for_each_child_of_node(np, child_np) { 1012 struct mtk_phy_instance *instance; 1013 struct phy *phy; 1014 1015 instance = devm_kzalloc(dev, sizeof(*instance), GFP_KERNEL); 1016 if (!instance) { 1017 retval = -ENOMEM; 1018 goto put_child; 1019 } 1020 1021 tphy->phys[port] = instance; 1022 1023 phy = devm_phy_create(dev, child_np, &mtk_tphy_ops); 1024 if (IS_ERR(phy)) { 1025 dev_err(dev, "failed to create phy\n"); 1026 retval = PTR_ERR(phy); 1027 goto put_child; 1028 } 1029 1030 retval = of_address_to_resource(child_np, 0, &res); 1031 if (retval) { 1032 dev_err(dev, "failed to get address resource(id-%d)\n", 1033 port); 1034 goto put_child; 1035 } 1036 1037 instance->port_base = devm_ioremap_resource(&phy->dev, &res); 1038 if (IS_ERR(instance->port_base)) { 1039 dev_err(dev, "failed to remap phy regs\n"); 1040 retval = PTR_ERR(instance->port_base); 1041 goto put_child; 1042 } 1043 1044 instance->phy = phy; 1045 instance->index = port; 1046 phy_set_drvdata(phy, instance); 1047 port++; 1048 1049 /* if deprecated clock is provided, ignore instance's one */ 1050 if (tphy->u3phya_ref) 1051 continue; 1052 1053 instance->ref_clk = devm_clk_get(&phy->dev, "ref"); 1054 if (IS_ERR(instance->ref_clk)) { 1055 dev_err(dev, "failed to get ref_clk(id-%d)\n", port); 1056 retval = PTR_ERR(instance->ref_clk); 1057 goto put_child; 1058 } 1059 } 1060 1061 provider = devm_of_phy_provider_register(dev, mtk_phy_xlate); 1062 1063 return PTR_ERR_OR_ZERO(provider); 1064 put_child: 1065 of_node_put(child_np); 1066 return retval; 1067 } 1068 1069 static struct platform_driver mtk_tphy_driver = { 1070 .probe = mtk_tphy_probe, 1071 .driver = { 1072 .name = "mtk-tphy", 1073 .of_match_table = mtk_tphy_id_table, 1074 }, 1075 }; 1076 1077 module_platform_driver(mtk_tphy_driver); 1078 1079 MODULE_AUTHOR("Chunfeng Yun <chunfeng.yun@mediatek.com>"); 1080 MODULE_DESCRIPTION("MediaTek T-PHY driver"); 1081 MODULE_LICENSE("GPL v2"); 1082