Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright (c) 2015 MediaTek Inc.
0004  * Author: Chunfeng Yun <chunfeng.yun@mediatek.com>
0005  *
0006  */
0007 
0008 #include <dt-bindings/phy/phy.h>
0009 #include <linux/clk.h>
0010 #include <linux/delay.h>
0011 #include <linux/iopoll.h>
0012 #include <linux/mfd/syscon.h>
0013 #include <linux/module.h>
0014 #include <linux/nvmem-consumer.h>
0015 #include <linux/of_address.h>
0016 #include <linux/of_device.h>
0017 #include <linux/phy/phy.h>
0018 #include <linux/platform_device.h>
0019 #include <linux/regmap.h>
0020 
0021 #include "phy-mtk-io.h"
0022 
0023 /* version V1 sub-banks offset base address */
0024 /* banks shared by multiple phys */
0025 #define SSUSB_SIFSLV_V1_SPLLC       0x000   /* shared by u3 phys */
0026 #define SSUSB_SIFSLV_V1_U2FREQ      0x100   /* shared by u2 phys */
0027 #define SSUSB_SIFSLV_V1_CHIP        0x300   /* shared by u3 phys */
0028 /* u2 phy bank */
0029 #define SSUSB_SIFSLV_V1_U2PHY_COM   0x000
0030 /* u3/pcie/sata phy banks */
0031 #define SSUSB_SIFSLV_V1_U3PHYD      0x000
0032 #define SSUSB_SIFSLV_V1_U3PHYA      0x200
0033 
0034 /* version V2/V3 sub-banks offset base address */
0035 /* V3: U2FREQ is not used anymore, but reserved */
0036 /* u2 phy banks */
0037 #define SSUSB_SIFSLV_V2_MISC        0x000
0038 #define SSUSB_SIFSLV_V2_U2FREQ      0x100
0039 #define SSUSB_SIFSLV_V2_U2PHY_COM   0x300
0040 /* u3/pcie/sata phy banks */
0041 #define SSUSB_SIFSLV_V2_SPLLC       0x000
0042 #define SSUSB_SIFSLV_V2_CHIP        0x100
0043 #define SSUSB_SIFSLV_V2_U3PHYD      0x200
0044 #define SSUSB_SIFSLV_V2_U3PHYA      0x400
0045 
0046 #define U3P_MISC_REG1       0x04
0047 #define MR1_EFUSE_AUTO_LOAD_DIS     BIT(6)
0048 
0049 #define U3P_USBPHYACR0      0x000
0050 #define PA0_RG_U2PLL_FORCE_ON       BIT(15)
0051 #define PA0_USB20_PLL_PREDIV        GENMASK(7, 6)
0052 #define PA0_USB20_PLL_PREDIV_VAL(x) ((0x3 & (x)) << 6)
0053 #define PA0_RG_USB20_INTR_EN        BIT(5)
0054 
0055 #define U3P_USBPHYACR1      0x004
0056 #define PA1_RG_INTR_CAL     GENMASK(23, 19)
0057 #define PA1_RG_INTR_CAL_VAL(x)  ((0x1f & (x)) << 19)
0058 #define PA1_RG_VRT_SEL          GENMASK(14, 12)
0059 #define PA1_RG_VRT_SEL_VAL(x)   ((0x7 & (x)) << 12)
0060 #define PA1_RG_TERM_SEL     GENMASK(10, 8)
0061 #define PA1_RG_TERM_SEL_VAL(x)  ((0x7 & (x)) << 8)
0062 
0063 #define U3P_USBPHYACR2      0x008
0064 #define PA2_RG_U2PLL_BW         GENMASK(21, 19)
0065 #define PA2_RG_U2PLL_BW_VAL(x)      ((0x7 & (x)) << 19)
0066 #define PA2_RG_SIF_U2PLL_FORCE_EN   BIT(18)
0067 
0068 #define U3P_USBPHYACR5      0x014
0069 #define PA5_RG_U2_HSTX_SRCAL_EN BIT(15)
0070 #define PA5_RG_U2_HSTX_SRCTRL       GENMASK(14, 12)
0071 #define PA5_RG_U2_HSTX_SRCTRL_VAL(x)    ((0x7 & (x)) << 12)
0072 #define PA5_RG_U2_HS_100U_U3_EN BIT(11)
0073 
0074 #define U3P_USBPHYACR6      0x018
0075 #define PA6_RG_U2_BC11_SW_EN        BIT(23)
0076 #define PA6_RG_U2_OTG_VBUSCMP_EN    BIT(20)
0077 #define PA6_RG_U2_DISCTH        GENMASK(7, 4)
0078 #define PA6_RG_U2_DISCTH_VAL(x) ((0xf & (x)) << 4)
0079 #define PA6_RG_U2_SQTH      GENMASK(3, 0)
0080 #define PA6_RG_U2_SQTH_VAL(x)   (0xf & (x))
0081 
0082 #define U3P_U2PHYACR4       0x020
0083 #define P2C_RG_USB20_GPIO_CTL       BIT(9)
0084 #define P2C_USB20_GPIO_MODE     BIT(8)
0085 #define P2C_U2_GPIO_CTR_MSK (P2C_RG_USB20_GPIO_CTL | P2C_USB20_GPIO_MODE)
0086 
0087 #define U3P_U2PHYA_RESV     0x030
0088 #define P2R_RG_U2PLL_FBDIV_26M      0x1bb13b
0089 #define P2R_RG_U2PLL_FBDIV_48M      0x3c0000
0090 
0091 #define U3P_U2PHYA_RESV1    0x044
0092 #define P2R_RG_U2PLL_REFCLK_SEL BIT(5)
0093 #define P2R_RG_U2PLL_FRA_EN     BIT(3)
0094 
0095 #define U3D_U2PHYDCR0       0x060
0096 #define P2C_RG_SIF_U2PLL_FORCE_ON   BIT(24)
0097 
0098 #define U3P_U2PHYDTM0       0x068
0099 #define P2C_FORCE_UART_EN       BIT(26)
0100 #define P2C_FORCE_DATAIN        BIT(23)
0101 #define P2C_FORCE_DM_PULLDOWN       BIT(21)
0102 #define P2C_FORCE_DP_PULLDOWN       BIT(20)
0103 #define P2C_FORCE_XCVRSEL       BIT(19)
0104 #define P2C_FORCE_SUSPENDM      BIT(18)
0105 #define P2C_FORCE_TERMSEL       BIT(17)
0106 #define P2C_RG_DATAIN           GENMASK(13, 10)
0107 #define P2C_RG_DATAIN_VAL(x)        ((0xf & (x)) << 10)
0108 #define P2C_RG_DMPULLDOWN       BIT(7)
0109 #define P2C_RG_DPPULLDOWN       BIT(6)
0110 #define P2C_RG_XCVRSEL          GENMASK(5, 4)
0111 #define P2C_RG_XCVRSEL_VAL(x)       ((0x3 & (x)) << 4)
0112 #define P2C_RG_SUSPENDM         BIT(3)
0113 #define P2C_RG_TERMSEL          BIT(2)
0114 #define P2C_DTM0_PART_MASK \
0115         (P2C_FORCE_DATAIN | P2C_FORCE_DM_PULLDOWN | \
0116         P2C_FORCE_DP_PULLDOWN | P2C_FORCE_XCVRSEL | \
0117         P2C_FORCE_TERMSEL | P2C_RG_DMPULLDOWN | \
0118         P2C_RG_DPPULLDOWN | P2C_RG_TERMSEL)
0119 
0120 #define U3P_U2PHYDTM1       0x06C
0121 #define P2C_RG_UART_EN          BIT(16)
0122 #define P2C_FORCE_IDDIG     BIT(9)
0123 #define P2C_RG_VBUSVALID        BIT(5)
0124 #define P2C_RG_SESSEND          BIT(4)
0125 #define P2C_RG_AVALID           BIT(2)
0126 #define P2C_RG_IDDIG            BIT(1)
0127 
0128 #define U3P_U2PHYBC12C      0x080
0129 #define P2C_RG_CHGDT_EN     BIT(0)
0130 
0131 #define U3P_U3_CHIP_GPIO_CTLD       0x0c
0132 #define P3C_REG_IP_SW_RST       BIT(31)
0133 #define P3C_MCU_BUS_CK_GATE_EN      BIT(30)
0134 #define P3C_FORCE_IP_SW_RST     BIT(29)
0135 
0136 #define U3P_U3_CHIP_GPIO_CTLE       0x10
0137 #define P3C_RG_SWRST_U3_PHYD        BIT(25)
0138 #define P3C_RG_SWRST_U3_PHYD_FORCE_EN   BIT(24)
0139 
0140 #define U3P_U3_PHYA_REG0    0x000
0141 #define P3A_RG_IEXT_INTR        GENMASK(15, 10)
0142 #define P3A_RG_IEXT_INTR_VAL(x)     ((0x3f & (x)) << 10)
0143 #define P3A_RG_CLKDRV_OFF       GENMASK(3, 2)
0144 #define P3A_RG_CLKDRV_OFF_VAL(x)    ((0x3 & (x)) << 2)
0145 
0146 #define U3P_U3_PHYA_REG1    0x004
0147 #define P3A_RG_CLKDRV_AMP       GENMASK(31, 29)
0148 #define P3A_RG_CLKDRV_AMP_VAL(x)    ((0x7 & (x)) << 29)
0149 
0150 #define U3P_U3_PHYA_REG6    0x018
0151 #define P3A_RG_TX_EIDLE_CM      GENMASK(31, 28)
0152 #define P3A_RG_TX_EIDLE_CM_VAL(x)   ((0xf & (x)) << 28)
0153 
0154 #define U3P_U3_PHYA_REG9    0x024
0155 #define P3A_RG_RX_DAC_MUX       GENMASK(5, 1)
0156 #define P3A_RG_RX_DAC_MUX_VAL(x)    ((0x1f & (x)) << 1)
0157 
0158 #define U3P_U3_PHYA_DA_REG0 0x100
0159 #define P3A_RG_XTAL_EXT_PE2H        GENMASK(17, 16)
0160 #define P3A_RG_XTAL_EXT_PE2H_VAL(x) ((0x3 & (x)) << 16)
0161 #define P3A_RG_XTAL_EXT_PE1H        GENMASK(13, 12)
0162 #define P3A_RG_XTAL_EXT_PE1H_VAL(x) ((0x3 & (x)) << 12)
0163 #define P3A_RG_XTAL_EXT_EN_U3       GENMASK(11, 10)
0164 #define P3A_RG_XTAL_EXT_EN_U3_VAL(x)    ((0x3 & (x)) << 10)
0165 
0166 #define U3P_U3_PHYA_DA_REG4 0x108
0167 #define P3A_RG_PLL_DIVEN_PE2H       GENMASK(21, 19)
0168 #define P3A_RG_PLL_BC_PE2H      GENMASK(7, 6)
0169 #define P3A_RG_PLL_BC_PE2H_VAL(x)   ((0x3 & (x)) << 6)
0170 
0171 #define U3P_U3_PHYA_DA_REG5 0x10c
0172 #define P3A_RG_PLL_BR_PE2H      GENMASK(29, 28)
0173 #define P3A_RG_PLL_BR_PE2H_VAL(x)   ((0x3 & (x)) << 28)
0174 #define P3A_RG_PLL_IC_PE2H      GENMASK(15, 12)
0175 #define P3A_RG_PLL_IC_PE2H_VAL(x)   ((0xf & (x)) << 12)
0176 
0177 #define U3P_U3_PHYA_DA_REG6 0x110
0178 #define P3A_RG_PLL_IR_PE2H      GENMASK(19, 16)
0179 #define P3A_RG_PLL_IR_PE2H_VAL(x)   ((0xf & (x)) << 16)
0180 
0181 #define U3P_U3_PHYA_DA_REG7 0x114
0182 #define P3A_RG_PLL_BP_PE2H      GENMASK(19, 16)
0183 #define P3A_RG_PLL_BP_PE2H_VAL(x)   ((0xf & (x)) << 16)
0184 
0185 #define U3P_U3_PHYA_DA_REG20    0x13c
0186 #define P3A_RG_PLL_DELTA1_PE2H      GENMASK(31, 16)
0187 #define P3A_RG_PLL_DELTA1_PE2H_VAL(x)   ((0xffff & (x)) << 16)
0188 
0189 #define U3P_U3_PHYA_DA_REG25    0x148
0190 #define P3A_RG_PLL_DELTA_PE2H       GENMASK(15, 0)
0191 #define P3A_RG_PLL_DELTA_PE2H_VAL(x)    (0xffff & (x))
0192 
0193 #define U3P_U3_PHYD_LFPS1       0x00c
0194 #define P3D_RG_FWAKE_TH     GENMASK(21, 16)
0195 #define P3D_RG_FWAKE_TH_VAL(x)  ((0x3f & (x)) << 16)
0196 
0197 #define U3P_U3_PHYD_IMPCAL0     0x010
0198 #define P3D_RG_FORCE_TX_IMPEL       BIT(31)
0199 #define P3D_RG_TX_IMPEL         GENMASK(28, 24)
0200 #define P3D_RG_TX_IMPEL_VAL(x)      ((0x1f & (x)) << 24)
0201 
0202 #define U3P_U3_PHYD_IMPCAL1     0x014
0203 #define P3D_RG_FORCE_RX_IMPEL       BIT(31)
0204 #define P3D_RG_RX_IMPEL         GENMASK(28, 24)
0205 #define P3D_RG_RX_IMPEL_VAL(x)      ((0x1f & (x)) << 24)
0206 
0207 #define U3P_U3_PHYD_RSV         0x054
0208 #define P3D_RG_EFUSE_AUTO_LOAD_DIS  BIT(12)
0209 
0210 #define U3P_U3_PHYD_CDR1        0x05c
0211 #define P3D_RG_CDR_BIR_LTD1     GENMASK(28, 24)
0212 #define P3D_RG_CDR_BIR_LTD1_VAL(x)  ((0x1f & (x)) << 24)
0213 #define P3D_RG_CDR_BIR_LTD0     GENMASK(12, 8)
0214 #define P3D_RG_CDR_BIR_LTD0_VAL(x)  ((0x1f & (x)) << 8)
0215 
0216 #define U3P_U3_PHYD_RXDET1      0x128
0217 #define P3D_RG_RXDET_STB2_SET       GENMASK(17, 9)
0218 #define P3D_RG_RXDET_STB2_SET_VAL(x)    ((0x1ff & (x)) << 9)
0219 
0220 #define U3P_U3_PHYD_RXDET2      0x12c
0221 #define P3D_RG_RXDET_STB2_SET_P3    GENMASK(8, 0)
0222 #define P3D_RG_RXDET_STB2_SET_P3_VAL(x) (0x1ff & (x))
0223 
0224 #define U3P_SPLLC_XTALCTL3      0x018
0225 #define XC3_RG_U3_XTAL_RX_PWD       BIT(9)
0226 #define XC3_RG_U3_FRC_XTAL_RX_PWD   BIT(8)
0227 
0228 #define U3P_U2FREQ_FMCR0    0x00
0229 #define P2F_RG_MONCLK_SEL   GENMASK(27, 26)
0230 #define P2F_RG_MONCLK_SEL_VAL(x)    ((0x3 & (x)) << 26)
0231 #define P2F_RG_FREQDET_EN   BIT(24)
0232 #define P2F_RG_CYCLECNT     GENMASK(23, 0)
0233 #define P2F_RG_CYCLECNT_VAL(x)  ((P2F_RG_CYCLECNT) & (x))
0234 
0235 #define U3P_U2FREQ_VALUE    0x0c
0236 
0237 #define U3P_U2FREQ_FMMONR1  0x10
0238 #define P2F_USB_FM_VALID    BIT(0)
0239 #define P2F_RG_FRCK_EN      BIT(8)
0240 
0241 #define U3P_REF_CLK     26  /* MHZ */
0242 #define U3P_SLEW_RATE_COEF  28
0243 #define U3P_SR_COEF_DIVISOR 1000
0244 #define U3P_FM_DET_CYCLE_CNT    1024
0245 
0246 /* SATA register setting */
0247 #define PHYD_CTRL_SIGNAL_MODE4      0x1c
0248 /* CDR Charge Pump P-path current adjustment */
0249 #define RG_CDR_BICLTD1_GEN1_MSK     GENMASK(23, 20)
0250 #define RG_CDR_BICLTD1_GEN1_VAL(x)  ((0xf & (x)) << 20)
0251 #define RG_CDR_BICLTD0_GEN1_MSK     GENMASK(11, 8)
0252 #define RG_CDR_BICLTD0_GEN1_VAL(x)  ((0xf & (x)) << 8)
0253 
0254 #define PHYD_DESIGN_OPTION2     0x24
0255 /* Symbol lock count selection */
0256 #define RG_LOCK_CNT_SEL_MSK     GENMASK(5, 4)
0257 #define RG_LOCK_CNT_SEL_VAL(x)      ((0x3 & (x)) << 4)
0258 
0259 #define PHYD_DESIGN_OPTION9 0x40
0260 /* COMWAK GAP width window */
0261 #define RG_TG_MAX_MSK       GENMASK(20, 16)
0262 #define RG_TG_MAX_VAL(x)    ((0x1f & (x)) << 16)
0263 /* COMINIT GAP width window */
0264 #define RG_T2_MAX_MSK       GENMASK(13, 8)
0265 #define RG_T2_MAX_VAL(x)    ((0x3f & (x)) << 8)
0266 /* COMWAK GAP width window */
0267 #define RG_TG_MIN_MSK       GENMASK(7, 5)
0268 #define RG_TG_MIN_VAL(x)    ((0x7 & (x)) << 5)
0269 /* COMINIT GAP width window */
0270 #define RG_T2_MIN_MSK       GENMASK(4, 0)
0271 #define RG_T2_MIN_VAL(x)    (0x1f & (x))
0272 
0273 #define ANA_RG_CTRL_SIGNAL1     0x4c
0274 /* TX driver tail current control for 0dB de-empahsis mdoe for Gen1 speed */
0275 #define RG_IDRV_0DB_GEN1_MSK        GENMASK(13, 8)
0276 #define RG_IDRV_0DB_GEN1_VAL(x)     ((0x3f & (x)) << 8)
0277 
0278 #define ANA_RG_CTRL_SIGNAL4     0x58
0279 #define RG_CDR_BICLTR_GEN1_MSK      GENMASK(23, 20)
0280 #define RG_CDR_BICLTR_GEN1_VAL(x)   ((0xf & (x)) << 20)
0281 /* Loop filter R1 resistance adjustment for Gen1 speed */
0282 #define RG_CDR_BR_GEN2_MSK      GENMASK(10, 8)
0283 #define RG_CDR_BR_GEN2_VAL(x)       ((0x7 & (x)) << 8)
0284 
0285 #define ANA_RG_CTRL_SIGNAL6     0x60
0286 /* I-path capacitance adjustment for Gen1 */
0287 #define RG_CDR_BC_GEN1_MSK      GENMASK(28, 24)
0288 #define RG_CDR_BC_GEN1_VAL(x)       ((0x1f & (x)) << 24)
0289 #define RG_CDR_BIRLTR_GEN1_MSK      GENMASK(4, 0)
0290 #define RG_CDR_BIRLTR_GEN1_VAL(x)   (0x1f & (x))
0291 
0292 #define ANA_EQ_EYE_CTRL_SIGNAL1     0x6c
0293 /* RX Gen1 LEQ tuning step */
0294 #define RG_EQ_DLEQ_LFI_GEN1_MSK     GENMASK(11, 8)
0295 #define RG_EQ_DLEQ_LFI_GEN1_VAL(x)  ((0xf & (x)) << 8)
0296 
0297 #define ANA_EQ_EYE_CTRL_SIGNAL4     0xd8
0298 #define RG_CDR_BIRLTD0_GEN1_MSK     GENMASK(20, 16)
0299 #define RG_CDR_BIRLTD0_GEN1_VAL(x)  ((0x1f & (x)) << 16)
0300 
0301 #define ANA_EQ_EYE_CTRL_SIGNAL5     0xdc
0302 #define RG_CDR_BIRLTD0_GEN3_MSK     GENMASK(4, 0)
0303 #define RG_CDR_BIRLTD0_GEN3_VAL(x)  (0x1f & (x))
0304 
0305 /* PHY switch between pcie/usb3/sgmii/sata */
0306 #define USB_PHY_SWITCH_CTRL 0x0
0307 #define RG_PHY_SW_TYPE      GENMASK(3, 0)
0308 #define RG_PHY_SW_PCIE      0x0
0309 #define RG_PHY_SW_USB3      0x1
0310 #define RG_PHY_SW_SGMII     0x2
0311 #define RG_PHY_SW_SATA      0x3
0312 
0313 #define TPHY_CLKS_CNT   2
0314 
0315 enum mtk_phy_version {
0316     MTK_PHY_V1 = 1,
0317     MTK_PHY_V2,
0318     MTK_PHY_V3,
0319 };
0320 
0321 struct mtk_phy_pdata {
0322     /* avoid RX sensitivity level degradation only for mt8173 */
0323     bool avoid_rx_sen_degradation;
0324     /*
0325      * workaround only for mt8195, HW fix it for others of V3,
0326      * u2phy should use integer mode instead of fractional mode of
0327      * 48M PLL, fix it by switching PLL to 26M from default 48M
0328      */
0329     bool sw_pll_48m_to_26m;
0330     /*
0331      * Some SoCs (e.g. mt8195) drop a bit when use auto load efuse,
0332      * support sw way, also support it for v2/v3 optionally.
0333      */
0334     bool sw_efuse_supported;
0335     enum mtk_phy_version version;
0336 };
0337 
0338 struct u2phy_banks {
0339     void __iomem *misc;
0340     void __iomem *fmreg;
0341     void __iomem *com;
0342 };
0343 
0344 struct u3phy_banks {
0345     void __iomem *spllc;
0346     void __iomem *chip;
0347     void __iomem *phyd; /* include u3phyd_bank2 */
0348     void __iomem *phya; /* include u3phya_da */
0349 };
0350 
0351 struct mtk_phy_instance {
0352     struct phy *phy;
0353     void __iomem *port_base;
0354     union {
0355         struct u2phy_banks u2_banks;
0356         struct u3phy_banks u3_banks;
0357     };
0358     struct clk_bulk_data clks[TPHY_CLKS_CNT];
0359     u32 index;
0360     u32 type;
0361     struct regmap *type_sw;
0362     u32 type_sw_reg;
0363     u32 type_sw_index;
0364     u32 efuse_sw_en;
0365     u32 efuse_intr;
0366     u32 efuse_tx_imp;
0367     u32 efuse_rx_imp;
0368     int eye_src;
0369     int eye_vrt;
0370     int eye_term;
0371     int intr;
0372     int discth;
0373     bool bc12_en;
0374 };
0375 
0376 struct mtk_tphy {
0377     struct device *dev;
0378     void __iomem *sif_base; /* only shared sif */
0379     const struct mtk_phy_pdata *pdata;
0380     struct mtk_phy_instance **phys;
0381     int nphys;
0382     int src_ref_clk; /* MHZ, reference clock for slew rate calibrate */
0383     int src_coef; /* coefficient for slew rate calibrate */
0384 };
0385 
0386 static void hs_slew_rate_calibrate(struct mtk_tphy *tphy,
0387     struct mtk_phy_instance *instance)
0388 {
0389     struct u2phy_banks *u2_banks = &instance->u2_banks;
0390     void __iomem *fmreg = u2_banks->fmreg;
0391     void __iomem *com = u2_banks->com;
0392     int calibration_val;
0393     int fm_out;
0394     u32 tmp;
0395 
0396     /* HW V3 doesn't support slew rate cal anymore */
0397     if (tphy->pdata->version == MTK_PHY_V3)
0398         return;
0399 
0400     /* use force value */
0401     if (instance->eye_src)
0402         return;
0403 
0404     /* enable USB ring oscillator */
0405     mtk_phy_set_bits(com + U3P_USBPHYACR5, PA5_RG_U2_HSTX_SRCAL_EN);
0406     udelay(1);
0407 
0408     /*enable free run clock */
0409     mtk_phy_set_bits(fmreg + U3P_U2FREQ_FMMONR1, P2F_RG_FRCK_EN);
0410 
0411     /* set cycle count as 1024, and select u2 channel */
0412     tmp = readl(fmreg + U3P_U2FREQ_FMCR0);
0413     tmp &= ~(P2F_RG_CYCLECNT | P2F_RG_MONCLK_SEL);
0414     tmp |= P2F_RG_CYCLECNT_VAL(U3P_FM_DET_CYCLE_CNT);
0415     if (tphy->pdata->version == MTK_PHY_V1)
0416         tmp |= P2F_RG_MONCLK_SEL_VAL(instance->index >> 1);
0417 
0418     writel(tmp, fmreg + U3P_U2FREQ_FMCR0);
0419 
0420     /* enable frequency meter */
0421     mtk_phy_set_bits(fmreg + U3P_U2FREQ_FMCR0, P2F_RG_FREQDET_EN);
0422 
0423     /* ignore return value */
0424     readl_poll_timeout(fmreg + U3P_U2FREQ_FMMONR1, tmp,
0425                (tmp & P2F_USB_FM_VALID), 10, 200);
0426 
0427     fm_out = readl(fmreg + U3P_U2FREQ_VALUE);
0428 
0429     /* disable frequency meter */
0430     mtk_phy_clear_bits(fmreg + U3P_U2FREQ_FMCR0, P2F_RG_FREQDET_EN);
0431 
0432     /*disable free run clock */
0433     mtk_phy_clear_bits(fmreg + U3P_U2FREQ_FMMONR1, P2F_RG_FRCK_EN);
0434 
0435     if (fm_out) {
0436         /* ( 1024 / FM_OUT ) x reference clock frequency x coef */
0437         tmp = tphy->src_ref_clk * tphy->src_coef;
0438         tmp = (tmp * U3P_FM_DET_CYCLE_CNT) / fm_out;
0439         calibration_val = DIV_ROUND_CLOSEST(tmp, U3P_SR_COEF_DIVISOR);
0440     } else {
0441         /* if FM detection fail, set default value */
0442         calibration_val = 4;
0443     }
0444     dev_dbg(tphy->dev, "phy:%d, fm_out:%d, calib:%d (clk:%d, coef:%d)\n",
0445         instance->index, fm_out, calibration_val,
0446         tphy->src_ref_clk, tphy->src_coef);
0447 
0448     /* set HS slew rate */
0449     mtk_phy_update_bits(com + U3P_USBPHYACR5, PA5_RG_U2_HSTX_SRCTRL,
0450                 PA5_RG_U2_HSTX_SRCTRL_VAL(calibration_val));
0451 
0452     /* disable USB ring oscillator */
0453     mtk_phy_clear_bits(com + U3P_USBPHYACR5, PA5_RG_U2_HSTX_SRCAL_EN);
0454 }
0455 
0456 static void u3_phy_instance_init(struct mtk_tphy *tphy,
0457     struct mtk_phy_instance *instance)
0458 {
0459     struct u3phy_banks *u3_banks = &instance->u3_banks;
0460 
0461     /* gating PCIe Analog XTAL clock */
0462     mtk_phy_set_bits(u3_banks->spllc + U3P_SPLLC_XTALCTL3,
0463              XC3_RG_U3_XTAL_RX_PWD | XC3_RG_U3_FRC_XTAL_RX_PWD);
0464 
0465     /* gating XSQ */
0466     mtk_phy_update_bits(u3_banks->phya + U3P_U3_PHYA_DA_REG0,
0467                 P3A_RG_XTAL_EXT_EN_U3, P3A_RG_XTAL_EXT_EN_U3_VAL(2));
0468 
0469     mtk_phy_update_bits(u3_banks->phya + U3P_U3_PHYA_REG9,
0470                 P3A_RG_RX_DAC_MUX, P3A_RG_RX_DAC_MUX_VAL(4));
0471 
0472     mtk_phy_update_bits(u3_banks->phya + U3P_U3_PHYA_REG6,
0473                 P3A_RG_TX_EIDLE_CM, P3A_RG_TX_EIDLE_CM_VAL(0xe));
0474 
0475     mtk_phy_update_bits(u3_banks->phyd + U3P_U3_PHYD_CDR1,
0476                 P3D_RG_CDR_BIR_LTD0 | P3D_RG_CDR_BIR_LTD1,
0477                 P3D_RG_CDR_BIR_LTD0_VAL(0xc) | P3D_RG_CDR_BIR_LTD1_VAL(0x3));
0478 
0479     mtk_phy_update_bits(u3_banks->phyd + U3P_U3_PHYD_LFPS1,
0480                 P3D_RG_FWAKE_TH, P3D_RG_FWAKE_TH_VAL(0x34));
0481 
0482     mtk_phy_update_bits(u3_banks->phyd + U3P_U3_PHYD_RXDET1,
0483                 P3D_RG_RXDET_STB2_SET, P3D_RG_RXDET_STB2_SET_VAL(0x10));
0484 
0485     mtk_phy_update_bits(u3_banks->phyd + U3P_U3_PHYD_RXDET2,
0486                 P3D_RG_RXDET_STB2_SET_P3, P3D_RG_RXDET_STB2_SET_P3_VAL(0x10));
0487 
0488     dev_dbg(tphy->dev, "%s(%d)\n", __func__, instance->index);
0489 }
0490 
0491 static void u2_phy_pll_26m_set(struct mtk_tphy *tphy,
0492     struct mtk_phy_instance *instance)
0493 {
0494     struct u2phy_banks *u2_banks = &instance->u2_banks;
0495     void __iomem *com = u2_banks->com;
0496 
0497     if (!tphy->pdata->sw_pll_48m_to_26m)
0498         return;
0499 
0500     mtk_phy_update_bits(com + U3P_USBPHYACR0, PA0_USB20_PLL_PREDIV,
0501                 PA0_USB20_PLL_PREDIV_VAL(0));
0502 
0503     mtk_phy_update_bits(com + U3P_USBPHYACR2, PA2_RG_U2PLL_BW,
0504                 PA2_RG_U2PLL_BW_VAL(3));
0505 
0506     writel(P2R_RG_U2PLL_FBDIV_26M, com + U3P_U2PHYA_RESV);
0507 
0508     mtk_phy_set_bits(com + U3P_U2PHYA_RESV1,
0509              P2R_RG_U2PLL_FRA_EN | P2R_RG_U2PLL_REFCLK_SEL);
0510 }
0511 
0512 static void u2_phy_instance_init(struct mtk_tphy *tphy,
0513     struct mtk_phy_instance *instance)
0514 {
0515     struct u2phy_banks *u2_banks = &instance->u2_banks;
0516     void __iomem *com = u2_banks->com;
0517     u32 index = instance->index;
0518 
0519     /* switch to USB function, and enable usb pll */
0520     mtk_phy_clear_bits(com + U3P_U2PHYDTM0, P2C_FORCE_UART_EN | P2C_FORCE_SUSPENDM);
0521 
0522     mtk_phy_update_bits(com + U3P_U2PHYDTM0, P2C_RG_XCVRSEL | P2C_RG_DATAIN,
0523                 P2C_RG_XCVRSEL_VAL(1) | P2C_RG_DATAIN_VAL(0));
0524 
0525     mtk_phy_clear_bits(com + U3P_U2PHYDTM1, P2C_RG_UART_EN);
0526 
0527     mtk_phy_set_bits(com + U3P_USBPHYACR0, PA0_RG_USB20_INTR_EN);
0528 
0529     /* disable switch 100uA current to SSUSB */
0530     mtk_phy_clear_bits(com + U3P_USBPHYACR5, PA5_RG_U2_HS_100U_U3_EN);
0531 
0532     if (!index)
0533         mtk_phy_clear_bits(com + U3P_U2PHYACR4, P2C_U2_GPIO_CTR_MSK);
0534 
0535     if (tphy->pdata->avoid_rx_sen_degradation) {
0536         if (!index) {
0537             mtk_phy_set_bits(com + U3P_USBPHYACR2, PA2_RG_SIF_U2PLL_FORCE_EN);
0538 
0539             mtk_phy_clear_bits(com + U3D_U2PHYDCR0, P2C_RG_SIF_U2PLL_FORCE_ON);
0540         } else {
0541             mtk_phy_set_bits(com + U3D_U2PHYDCR0, P2C_RG_SIF_U2PLL_FORCE_ON);
0542 
0543             mtk_phy_set_bits(com + U3P_U2PHYDTM0,
0544                      P2C_RG_SUSPENDM | P2C_FORCE_SUSPENDM);
0545         }
0546     }
0547 
0548     /* DP/DM BC1.1 path Disable */
0549     mtk_phy_clear_bits(com + U3P_USBPHYACR6, PA6_RG_U2_BC11_SW_EN);
0550 
0551     mtk_phy_update_bits(com + U3P_USBPHYACR6, PA6_RG_U2_SQTH, PA6_RG_U2_SQTH_VAL(2));
0552 
0553     /* Workaround only for mt8195, HW fix it for others (V3) */
0554     u2_phy_pll_26m_set(tphy, instance);
0555 
0556     dev_dbg(tphy->dev, "%s(%d)\n", __func__, index);
0557 }
0558 
0559 static void u2_phy_instance_power_on(struct mtk_tphy *tphy,
0560     struct mtk_phy_instance *instance)
0561 {
0562     struct u2phy_banks *u2_banks = &instance->u2_banks;
0563     void __iomem *com = u2_banks->com;
0564     u32 index = instance->index;
0565 
0566     mtk_phy_clear_bits(com + U3P_U2PHYDTM0,
0567                P2C_RG_XCVRSEL | P2C_RG_DATAIN | P2C_DTM0_PART_MASK);
0568 
0569     /* OTG Enable */
0570     mtk_phy_set_bits(com + U3P_USBPHYACR6, PA6_RG_U2_OTG_VBUSCMP_EN);
0571 
0572     mtk_phy_set_bits(com + U3P_U2PHYDTM1, P2C_RG_VBUSVALID | P2C_RG_AVALID);
0573 
0574     mtk_phy_clear_bits(com + U3P_U2PHYDTM1, P2C_RG_SESSEND);
0575 
0576     if (tphy->pdata->avoid_rx_sen_degradation && index) {
0577         mtk_phy_set_bits(com + U3D_U2PHYDCR0, P2C_RG_SIF_U2PLL_FORCE_ON);
0578 
0579         mtk_phy_set_bits(com + U3P_U2PHYDTM0, P2C_RG_SUSPENDM | P2C_FORCE_SUSPENDM);
0580     }
0581     dev_dbg(tphy->dev, "%s(%d)\n", __func__, index);
0582 }
0583 
0584 static void u2_phy_instance_power_off(struct mtk_tphy *tphy,
0585     struct mtk_phy_instance *instance)
0586 {
0587     struct u2phy_banks *u2_banks = &instance->u2_banks;
0588     void __iomem *com = u2_banks->com;
0589     u32 index = instance->index;
0590 
0591     mtk_phy_clear_bits(com + U3P_U2PHYDTM0, P2C_RG_XCVRSEL | P2C_RG_DATAIN);
0592 
0593     /* OTG Disable */
0594     mtk_phy_clear_bits(com + U3P_USBPHYACR6, PA6_RG_U2_OTG_VBUSCMP_EN);
0595 
0596     mtk_phy_clear_bits(com + U3P_U2PHYDTM1, P2C_RG_VBUSVALID | P2C_RG_AVALID);
0597 
0598     mtk_phy_set_bits(com + U3P_U2PHYDTM1, P2C_RG_SESSEND);
0599 
0600     if (tphy->pdata->avoid_rx_sen_degradation && index) {
0601         mtk_phy_clear_bits(com + U3P_U2PHYDTM0, P2C_RG_SUSPENDM | P2C_FORCE_SUSPENDM);
0602 
0603         mtk_phy_clear_bits(com + U3D_U2PHYDCR0, P2C_RG_SIF_U2PLL_FORCE_ON);
0604     }
0605 
0606     dev_dbg(tphy->dev, "%s(%d)\n", __func__, index);
0607 }
0608 
0609 static void u2_phy_instance_exit(struct mtk_tphy *tphy,
0610     struct mtk_phy_instance *instance)
0611 {
0612     struct u2phy_banks *u2_banks = &instance->u2_banks;
0613     void __iomem *com = u2_banks->com;
0614     u32 index = instance->index;
0615 
0616     if (tphy->pdata->avoid_rx_sen_degradation && index) {
0617         mtk_phy_clear_bits(com + U3D_U2PHYDCR0, P2C_RG_SIF_U2PLL_FORCE_ON);
0618 
0619         mtk_phy_clear_bits(com + U3P_U2PHYDTM0, P2C_FORCE_SUSPENDM);
0620     }
0621 }
0622 
0623 static void u2_phy_instance_set_mode(struct mtk_tphy *tphy,
0624                      struct mtk_phy_instance *instance,
0625                      enum phy_mode mode)
0626 {
0627     struct u2phy_banks *u2_banks = &instance->u2_banks;
0628     u32 tmp;
0629 
0630     tmp = readl(u2_banks->com + U3P_U2PHYDTM1);
0631     switch (mode) {
0632     case PHY_MODE_USB_DEVICE:
0633         tmp |= P2C_FORCE_IDDIG | P2C_RG_IDDIG;
0634         break;
0635     case PHY_MODE_USB_HOST:
0636         tmp |= P2C_FORCE_IDDIG;
0637         tmp &= ~P2C_RG_IDDIG;
0638         break;
0639     case PHY_MODE_USB_OTG:
0640         tmp &= ~(P2C_FORCE_IDDIG | P2C_RG_IDDIG);
0641         break;
0642     default:
0643         return;
0644     }
0645     writel(tmp, u2_banks->com + U3P_U2PHYDTM1);
0646 }
0647 
0648 static void pcie_phy_instance_init(struct mtk_tphy *tphy,
0649     struct mtk_phy_instance *instance)
0650 {
0651     struct u3phy_banks *u3_banks = &instance->u3_banks;
0652     void __iomem *phya = u3_banks->phya;
0653 
0654     if (tphy->pdata->version != MTK_PHY_V1)
0655         return;
0656 
0657     mtk_phy_update_bits(phya + U3P_U3_PHYA_DA_REG0,
0658                 P3A_RG_XTAL_EXT_PE1H | P3A_RG_XTAL_EXT_PE2H,
0659                 P3A_RG_XTAL_EXT_PE1H_VAL(0x2) | P3A_RG_XTAL_EXT_PE2H_VAL(0x2));
0660 
0661     /* ref clk drive */
0662     mtk_phy_update_bits(phya + U3P_U3_PHYA_REG1, P3A_RG_CLKDRV_AMP,
0663                 P3A_RG_CLKDRV_AMP_VAL(0x4));
0664 
0665     mtk_phy_update_bits(phya + U3P_U3_PHYA_REG0, P3A_RG_CLKDRV_OFF,
0666                 P3A_RG_CLKDRV_OFF_VAL(0x1));
0667 
0668     /* SSC delta -5000ppm */
0669     mtk_phy_update_bits(phya + U3P_U3_PHYA_DA_REG20, P3A_RG_PLL_DELTA1_PE2H,
0670                 P3A_RG_PLL_DELTA1_PE2H_VAL(0x3c));
0671 
0672     mtk_phy_update_bits(phya + U3P_U3_PHYA_DA_REG25, P3A_RG_PLL_DELTA_PE2H,
0673                 P3A_RG_PLL_DELTA_PE2H_VAL(0x36));
0674 
0675     /* change pll BW 0.6M */
0676     mtk_phy_update_bits(phya + U3P_U3_PHYA_DA_REG5,
0677                 P3A_RG_PLL_BR_PE2H | P3A_RG_PLL_IC_PE2H,
0678                 P3A_RG_PLL_BR_PE2H_VAL(0x1) | P3A_RG_PLL_IC_PE2H_VAL(0x1));
0679 
0680     mtk_phy_update_bits(phya + U3P_U3_PHYA_DA_REG4,
0681                 P3A_RG_PLL_DIVEN_PE2H | P3A_RG_PLL_BC_PE2H,
0682                 P3A_RG_PLL_BC_PE2H_VAL(0x3));
0683 
0684     mtk_phy_update_bits(phya + U3P_U3_PHYA_DA_REG6, P3A_RG_PLL_IR_PE2H,
0685                 P3A_RG_PLL_IR_PE2H_VAL(0x2));
0686 
0687     mtk_phy_update_bits(phya + U3P_U3_PHYA_DA_REG7, P3A_RG_PLL_BP_PE2H,
0688                 P3A_RG_PLL_BP_PE2H_VAL(0xa));
0689 
0690     /* Tx Detect Rx Timing: 10us -> 5us */
0691     mtk_phy_update_bits(u3_banks->phyd + U3P_U3_PHYD_RXDET1,
0692                 P3D_RG_RXDET_STB2_SET, P3D_RG_RXDET_STB2_SET_VAL(0x10));
0693 
0694     mtk_phy_update_bits(u3_banks->phyd + U3P_U3_PHYD_RXDET2,
0695                 P3D_RG_RXDET_STB2_SET_P3, P3D_RG_RXDET_STB2_SET_P3_VAL(0x10));
0696 
0697     /* wait for PCIe subsys register to active */
0698     usleep_range(2500, 3000);
0699     dev_dbg(tphy->dev, "%s(%d)\n", __func__, instance->index);
0700 }
0701 
0702 static void pcie_phy_instance_power_on(struct mtk_tphy *tphy,
0703     struct mtk_phy_instance *instance)
0704 {
0705     struct u3phy_banks *bank = &instance->u3_banks;
0706 
0707     mtk_phy_clear_bits(bank->chip + U3P_U3_CHIP_GPIO_CTLD,
0708                P3C_FORCE_IP_SW_RST | P3C_REG_IP_SW_RST);
0709 
0710     mtk_phy_clear_bits(bank->chip + U3P_U3_CHIP_GPIO_CTLE,
0711                P3C_RG_SWRST_U3_PHYD_FORCE_EN | P3C_RG_SWRST_U3_PHYD);
0712 }
0713 
0714 static void pcie_phy_instance_power_off(struct mtk_tphy *tphy,
0715     struct mtk_phy_instance *instance)
0716 
0717 {
0718     struct u3phy_banks *bank = &instance->u3_banks;
0719 
0720     mtk_phy_set_bits(bank->chip + U3P_U3_CHIP_GPIO_CTLD,
0721              P3C_FORCE_IP_SW_RST | P3C_REG_IP_SW_RST);
0722 
0723     mtk_phy_set_bits(bank->chip + U3P_U3_CHIP_GPIO_CTLE,
0724              P3C_RG_SWRST_U3_PHYD_FORCE_EN | P3C_RG_SWRST_U3_PHYD);
0725 }
0726 
0727 static void sata_phy_instance_init(struct mtk_tphy *tphy,
0728     struct mtk_phy_instance *instance)
0729 {
0730     struct u3phy_banks *u3_banks = &instance->u3_banks;
0731     void __iomem *phyd = u3_banks->phyd;
0732 
0733     /* charge current adjustment */
0734     mtk_phy_update_bits(phyd + ANA_RG_CTRL_SIGNAL6,
0735                 RG_CDR_BIRLTR_GEN1_MSK | RG_CDR_BC_GEN1_MSK,
0736                 RG_CDR_BIRLTR_GEN1_VAL(0x6) | RG_CDR_BC_GEN1_VAL(0x1a));
0737 
0738     mtk_phy_update_bits(phyd + ANA_EQ_EYE_CTRL_SIGNAL4, RG_CDR_BIRLTD0_GEN1_MSK,
0739                 RG_CDR_BIRLTD0_GEN1_VAL(0x18));
0740 
0741     mtk_phy_update_bits(phyd + ANA_EQ_EYE_CTRL_SIGNAL5, RG_CDR_BIRLTD0_GEN3_MSK,
0742                 RG_CDR_BIRLTD0_GEN3_VAL(0x06));
0743 
0744     mtk_phy_update_bits(phyd + ANA_RG_CTRL_SIGNAL4,
0745                 RG_CDR_BICLTR_GEN1_MSK | RG_CDR_BR_GEN2_MSK,
0746                 RG_CDR_BICLTR_GEN1_VAL(0x0c) | RG_CDR_BR_GEN2_VAL(0x07));
0747 
0748     mtk_phy_update_bits(phyd + PHYD_CTRL_SIGNAL_MODE4,
0749                 RG_CDR_BICLTD0_GEN1_MSK | RG_CDR_BICLTD1_GEN1_MSK,
0750                 RG_CDR_BICLTD0_GEN1_VAL(0x08) | RG_CDR_BICLTD1_GEN1_VAL(0x02));
0751 
0752     mtk_phy_update_bits(phyd + PHYD_DESIGN_OPTION2, RG_LOCK_CNT_SEL_MSK,
0753                 RG_LOCK_CNT_SEL_VAL(0x02));
0754 
0755     mtk_phy_update_bits(phyd + PHYD_DESIGN_OPTION9,
0756                 RG_T2_MIN_MSK | RG_TG_MIN_MSK,
0757                 RG_T2_MIN_VAL(0x12) | RG_TG_MIN_VAL(0x04));
0758 
0759     mtk_phy_update_bits(phyd + PHYD_DESIGN_OPTION9,
0760                 RG_T2_MAX_MSK | RG_TG_MAX_MSK,
0761                 RG_T2_MAX_VAL(0x31) | RG_TG_MAX_VAL(0x0e));
0762 
0763     mtk_phy_update_bits(phyd + ANA_RG_CTRL_SIGNAL1, RG_IDRV_0DB_GEN1_MSK,
0764                 RG_IDRV_0DB_GEN1_VAL(0x20));
0765 
0766     mtk_phy_update_bits(phyd + ANA_EQ_EYE_CTRL_SIGNAL1, RG_EQ_DLEQ_LFI_GEN1_MSK,
0767                 RG_EQ_DLEQ_LFI_GEN1_VAL(0x03));
0768 
0769     dev_dbg(tphy->dev, "%s(%d)\n", __func__, instance->index);
0770 }
0771 
0772 static void phy_v1_banks_init(struct mtk_tphy *tphy,
0773                   struct mtk_phy_instance *instance)
0774 {
0775     struct u2phy_banks *u2_banks = &instance->u2_banks;
0776     struct u3phy_banks *u3_banks = &instance->u3_banks;
0777 
0778     switch (instance->type) {
0779     case PHY_TYPE_USB2:
0780         u2_banks->misc = NULL;
0781         u2_banks->fmreg = tphy->sif_base + SSUSB_SIFSLV_V1_U2FREQ;
0782         u2_banks->com = instance->port_base + SSUSB_SIFSLV_V1_U2PHY_COM;
0783         break;
0784     case PHY_TYPE_USB3:
0785     case PHY_TYPE_PCIE:
0786         u3_banks->spllc = tphy->sif_base + SSUSB_SIFSLV_V1_SPLLC;
0787         u3_banks->chip = tphy->sif_base + SSUSB_SIFSLV_V1_CHIP;
0788         u3_banks->phyd = instance->port_base + SSUSB_SIFSLV_V1_U3PHYD;
0789         u3_banks->phya = instance->port_base + SSUSB_SIFSLV_V1_U3PHYA;
0790         break;
0791     case PHY_TYPE_SATA:
0792         u3_banks->phyd = instance->port_base + SSUSB_SIFSLV_V1_U3PHYD;
0793         break;
0794     default:
0795         dev_err(tphy->dev, "incompatible PHY type\n");
0796         return;
0797     }
0798 }
0799 
0800 static void phy_v2_banks_init(struct mtk_tphy *tphy,
0801                   struct mtk_phy_instance *instance)
0802 {
0803     struct u2phy_banks *u2_banks = &instance->u2_banks;
0804     struct u3phy_banks *u3_banks = &instance->u3_banks;
0805 
0806     switch (instance->type) {
0807     case PHY_TYPE_USB2:
0808         u2_banks->misc = instance->port_base + SSUSB_SIFSLV_V2_MISC;
0809         u2_banks->fmreg = instance->port_base + SSUSB_SIFSLV_V2_U2FREQ;
0810         u2_banks->com = instance->port_base + SSUSB_SIFSLV_V2_U2PHY_COM;
0811         break;
0812     case PHY_TYPE_USB3:
0813     case PHY_TYPE_PCIE:
0814         u3_banks->spllc = instance->port_base + SSUSB_SIFSLV_V2_SPLLC;
0815         u3_banks->chip = instance->port_base + SSUSB_SIFSLV_V2_CHIP;
0816         u3_banks->phyd = instance->port_base + SSUSB_SIFSLV_V2_U3PHYD;
0817         u3_banks->phya = instance->port_base + SSUSB_SIFSLV_V2_U3PHYA;
0818         break;
0819     default:
0820         dev_err(tphy->dev, "incompatible PHY type\n");
0821         return;
0822     }
0823 }
0824 
0825 static void phy_parse_property(struct mtk_tphy *tphy,
0826                 struct mtk_phy_instance *instance)
0827 {
0828     struct device *dev = &instance->phy->dev;
0829 
0830     if (instance->type != PHY_TYPE_USB2)
0831         return;
0832 
0833     instance->bc12_en = device_property_read_bool(dev, "mediatek,bc12");
0834     device_property_read_u32(dev, "mediatek,eye-src",
0835                  &instance->eye_src);
0836     device_property_read_u32(dev, "mediatek,eye-vrt",
0837                  &instance->eye_vrt);
0838     device_property_read_u32(dev, "mediatek,eye-term",
0839                  &instance->eye_term);
0840     device_property_read_u32(dev, "mediatek,intr",
0841                  &instance->intr);
0842     device_property_read_u32(dev, "mediatek,discth",
0843                  &instance->discth);
0844     dev_dbg(dev, "bc12:%d, src:%d, vrt:%d, term:%d, intr:%d, disc:%d\n",
0845         instance->bc12_en, instance->eye_src,
0846         instance->eye_vrt, instance->eye_term,
0847         instance->intr, instance->discth);
0848 }
0849 
0850 static void u2_phy_props_set(struct mtk_tphy *tphy,
0851                  struct mtk_phy_instance *instance)
0852 {
0853     struct u2phy_banks *u2_banks = &instance->u2_banks;
0854     void __iomem *com = u2_banks->com;
0855 
0856     if (instance->bc12_en) /* BC1.2 path Enable */
0857         mtk_phy_set_bits(com + U3P_U2PHYBC12C, P2C_RG_CHGDT_EN);
0858 
0859     if (tphy->pdata->version < MTK_PHY_V3 && instance->eye_src)
0860         mtk_phy_update_bits(com + U3P_USBPHYACR5, PA5_RG_U2_HSTX_SRCTRL,
0861                     PA5_RG_U2_HSTX_SRCTRL_VAL(instance->eye_src));
0862 
0863     if (instance->eye_vrt)
0864         mtk_phy_update_bits(com + U3P_USBPHYACR1, PA1_RG_VRT_SEL,
0865                     PA1_RG_VRT_SEL_VAL(instance->eye_vrt));
0866 
0867     if (instance->eye_term)
0868         mtk_phy_update_bits(com + U3P_USBPHYACR1, PA1_RG_TERM_SEL,
0869                     PA1_RG_TERM_SEL_VAL(instance->eye_term));
0870 
0871     if (instance->intr)
0872         mtk_phy_update_bits(com + U3P_USBPHYACR1, PA1_RG_INTR_CAL,
0873                     PA1_RG_INTR_CAL_VAL(instance->intr));
0874 
0875     if (instance->discth)
0876         mtk_phy_update_bits(com + U3P_USBPHYACR6, PA6_RG_U2_DISCTH,
0877                     PA6_RG_U2_DISCTH_VAL(instance->discth));
0878 }
0879 
0880 /* type switch for usb3/pcie/sgmii/sata */
0881 static int phy_type_syscon_get(struct mtk_phy_instance *instance,
0882                    struct device_node *dn)
0883 {
0884     struct of_phandle_args args;
0885     int ret;
0886 
0887     /* type switch function is optional */
0888     if (!of_property_read_bool(dn, "mediatek,syscon-type"))
0889         return 0;
0890 
0891     ret = of_parse_phandle_with_fixed_args(dn, "mediatek,syscon-type",
0892                            2, 0, &args);
0893     if (ret)
0894         return ret;
0895 
0896     instance->type_sw_reg = args.args[0];
0897     instance->type_sw_index = args.args[1] & 0x3; /* <=3 */
0898     instance->type_sw = syscon_node_to_regmap(args.np);
0899     of_node_put(args.np);
0900     dev_info(&instance->phy->dev, "type_sw - reg %#x, index %d\n",
0901          instance->type_sw_reg, instance->type_sw_index);
0902 
0903     return PTR_ERR_OR_ZERO(instance->type_sw);
0904 }
0905 
0906 static int phy_type_set(struct mtk_phy_instance *instance)
0907 {
0908     int type;
0909     u32 mask;
0910 
0911     if (!instance->type_sw)
0912         return 0;
0913 
0914     switch (instance->type) {
0915     case PHY_TYPE_USB3:
0916         type = RG_PHY_SW_USB3;
0917         break;
0918     case PHY_TYPE_PCIE:
0919         type = RG_PHY_SW_PCIE;
0920         break;
0921     case PHY_TYPE_SGMII:
0922         type = RG_PHY_SW_SGMII;
0923         break;
0924     case PHY_TYPE_SATA:
0925         type = RG_PHY_SW_SATA;
0926         break;
0927     case PHY_TYPE_USB2:
0928     default:
0929         return 0;
0930     }
0931 
0932     mask = RG_PHY_SW_TYPE << (instance->type_sw_index * BITS_PER_BYTE);
0933     regmap_update_bits(instance->type_sw, instance->type_sw_reg, mask, type);
0934 
0935     return 0;
0936 }
0937 
0938 static int phy_efuse_get(struct mtk_tphy *tphy, struct mtk_phy_instance *instance)
0939 {
0940     struct device *dev = &instance->phy->dev;
0941     int ret = 0;
0942 
0943     /* tphy v1 doesn't support sw efuse, skip it */
0944     if (!tphy->pdata->sw_efuse_supported) {
0945         instance->efuse_sw_en = 0;
0946         return 0;
0947     }
0948 
0949     /* software efuse is optional */
0950     instance->efuse_sw_en = device_property_read_bool(dev, "nvmem-cells");
0951     if (!instance->efuse_sw_en)
0952         return 0;
0953 
0954     switch (instance->type) {
0955     case PHY_TYPE_USB2:
0956         ret = nvmem_cell_read_variable_le_u32(dev, "intr", &instance->efuse_intr);
0957         if (ret) {
0958             dev_err(dev, "fail to get u2 intr efuse, %d\n", ret);
0959             break;
0960         }
0961 
0962         /* no efuse, ignore it */
0963         if (!instance->efuse_intr) {
0964             dev_warn(dev, "no u2 intr efuse, but dts enable it\n");
0965             instance->efuse_sw_en = 0;
0966             break;
0967         }
0968 
0969         dev_dbg(dev, "u2 efuse - intr %x\n", instance->efuse_intr);
0970         break;
0971 
0972     case PHY_TYPE_USB3:
0973     case PHY_TYPE_PCIE:
0974         ret = nvmem_cell_read_variable_le_u32(dev, "intr", &instance->efuse_intr);
0975         if (ret) {
0976             dev_err(dev, "fail to get u3 intr efuse, %d\n", ret);
0977             break;
0978         }
0979 
0980         ret = nvmem_cell_read_variable_le_u32(dev, "rx_imp", &instance->efuse_rx_imp);
0981         if (ret) {
0982             dev_err(dev, "fail to get u3 rx_imp efuse, %d\n", ret);
0983             break;
0984         }
0985 
0986         ret = nvmem_cell_read_variable_le_u32(dev, "tx_imp", &instance->efuse_tx_imp);
0987         if (ret) {
0988             dev_err(dev, "fail to get u3 tx_imp efuse, %d\n", ret);
0989             break;
0990         }
0991 
0992         /* no efuse, ignore it */
0993         if (!instance->efuse_intr &&
0994             !instance->efuse_rx_imp &&
0995             !instance->efuse_tx_imp) {
0996             dev_warn(dev, "no u3 intr efuse, but dts enable it\n");
0997             instance->efuse_sw_en = 0;
0998             break;
0999         }
1000 
1001         dev_dbg(dev, "u3 efuse - intr %x, rx_imp %x, tx_imp %x\n",
1002             instance->efuse_intr, instance->efuse_rx_imp,instance->efuse_tx_imp);
1003         break;
1004     default:
1005         dev_err(dev, "no sw efuse for type %d\n", instance->type);
1006         ret = -EINVAL;
1007     }
1008 
1009     return ret;
1010 }
1011 
1012 static void phy_efuse_set(struct mtk_phy_instance *instance)
1013 {
1014     struct device *dev = &instance->phy->dev;
1015     struct u2phy_banks *u2_banks = &instance->u2_banks;
1016     struct u3phy_banks *u3_banks = &instance->u3_banks;
1017 
1018     if (!instance->efuse_sw_en)
1019         return;
1020 
1021     switch (instance->type) {
1022     case PHY_TYPE_USB2:
1023         mtk_phy_set_bits(u2_banks->misc + U3P_MISC_REG1, MR1_EFUSE_AUTO_LOAD_DIS);
1024 
1025         mtk_phy_update_bits(u2_banks->com + U3P_USBPHYACR1, PA1_RG_INTR_CAL,
1026                     PA1_RG_INTR_CAL_VAL(instance->efuse_intr));
1027         break;
1028     case PHY_TYPE_USB3:
1029     case PHY_TYPE_PCIE:
1030         mtk_phy_set_bits(u3_banks->phyd + U3P_U3_PHYD_RSV, P3D_RG_EFUSE_AUTO_LOAD_DIS);
1031 
1032         mtk_phy_update_bits(u3_banks->phyd + U3P_U3_PHYD_IMPCAL0, P3D_RG_TX_IMPEL,
1033                     P3D_RG_TX_IMPEL_VAL(instance->efuse_tx_imp));
1034         mtk_phy_set_bits(u3_banks->phyd + U3P_U3_PHYD_IMPCAL0, P3D_RG_FORCE_TX_IMPEL);
1035 
1036         mtk_phy_update_bits(u3_banks->phyd + U3P_U3_PHYD_IMPCAL1, P3D_RG_RX_IMPEL,
1037                     P3D_RG_RX_IMPEL_VAL(instance->efuse_rx_imp));
1038         mtk_phy_set_bits(u3_banks->phyd + U3P_U3_PHYD_IMPCAL1, P3D_RG_FORCE_RX_IMPEL);
1039 
1040         mtk_phy_update_bits(u3_banks->phya + U3P_U3_PHYA_REG0, P3A_RG_IEXT_INTR,
1041                     P3A_RG_IEXT_INTR_VAL(instance->efuse_intr));
1042         break;
1043     default:
1044         dev_warn(dev, "no sw efuse for type %d\n", instance->type);
1045         break;
1046     }
1047 }
1048 
1049 static int mtk_phy_init(struct phy *phy)
1050 {
1051     struct mtk_phy_instance *instance = phy_get_drvdata(phy);
1052     struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent);
1053     int ret;
1054 
1055     ret = clk_bulk_prepare_enable(TPHY_CLKS_CNT, instance->clks);
1056     if (ret)
1057         return ret;
1058 
1059     phy_efuse_set(instance);
1060 
1061     switch (instance->type) {
1062     case PHY_TYPE_USB2:
1063         u2_phy_instance_init(tphy, instance);
1064         u2_phy_props_set(tphy, instance);
1065         break;
1066     case PHY_TYPE_USB3:
1067         u3_phy_instance_init(tphy, instance);
1068         break;
1069     case PHY_TYPE_PCIE:
1070         pcie_phy_instance_init(tphy, instance);
1071         break;
1072     case PHY_TYPE_SATA:
1073         sata_phy_instance_init(tphy, instance);
1074         break;
1075     case PHY_TYPE_SGMII:
1076         /* nothing to do, only used to set type */
1077         break;
1078     default:
1079         dev_err(tphy->dev, "incompatible PHY type\n");
1080         clk_bulk_disable_unprepare(TPHY_CLKS_CNT, instance->clks);
1081         return -EINVAL;
1082     }
1083 
1084     return 0;
1085 }
1086 
1087 static int mtk_phy_power_on(struct phy *phy)
1088 {
1089     struct mtk_phy_instance *instance = phy_get_drvdata(phy);
1090     struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent);
1091 
1092     if (instance->type == PHY_TYPE_USB2) {
1093         u2_phy_instance_power_on(tphy, instance);
1094         hs_slew_rate_calibrate(tphy, instance);
1095     } else if (instance->type == PHY_TYPE_PCIE) {
1096         pcie_phy_instance_power_on(tphy, instance);
1097     }
1098 
1099     return 0;
1100 }
1101 
1102 static int mtk_phy_power_off(struct phy *phy)
1103 {
1104     struct mtk_phy_instance *instance = phy_get_drvdata(phy);
1105     struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent);
1106 
1107     if (instance->type == PHY_TYPE_USB2)
1108         u2_phy_instance_power_off(tphy, instance);
1109     else if (instance->type == PHY_TYPE_PCIE)
1110         pcie_phy_instance_power_off(tphy, instance);
1111 
1112     return 0;
1113 }
1114 
1115 static int mtk_phy_exit(struct phy *phy)
1116 {
1117     struct mtk_phy_instance *instance = phy_get_drvdata(phy);
1118     struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent);
1119 
1120     if (instance->type == PHY_TYPE_USB2)
1121         u2_phy_instance_exit(tphy, instance);
1122 
1123     clk_bulk_disable_unprepare(TPHY_CLKS_CNT, instance->clks);
1124     return 0;
1125 }
1126 
1127 static int mtk_phy_set_mode(struct phy *phy, enum phy_mode mode, int submode)
1128 {
1129     struct mtk_phy_instance *instance = phy_get_drvdata(phy);
1130     struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent);
1131 
1132     if (instance->type == PHY_TYPE_USB2)
1133         u2_phy_instance_set_mode(tphy, instance, mode);
1134 
1135     return 0;
1136 }
1137 
1138 static struct phy *mtk_phy_xlate(struct device *dev,
1139                     struct of_phandle_args *args)
1140 {
1141     struct mtk_tphy *tphy = dev_get_drvdata(dev);
1142     struct mtk_phy_instance *instance = NULL;
1143     struct device_node *phy_np = args->np;
1144     int index;
1145     int ret;
1146 
1147     if (args->args_count != 1) {
1148         dev_err(dev, "invalid number of cells in 'phy' property\n");
1149         return ERR_PTR(-EINVAL);
1150     }
1151 
1152     for (index = 0; index < tphy->nphys; index++)
1153         if (phy_np == tphy->phys[index]->phy->dev.of_node) {
1154             instance = tphy->phys[index];
1155             break;
1156         }
1157 
1158     if (!instance) {
1159         dev_err(dev, "failed to find appropriate phy\n");
1160         return ERR_PTR(-EINVAL);
1161     }
1162 
1163     instance->type = args->args[0];
1164     if (!(instance->type == PHY_TYPE_USB2 ||
1165           instance->type == PHY_TYPE_USB3 ||
1166           instance->type == PHY_TYPE_PCIE ||
1167           instance->type == PHY_TYPE_SATA ||
1168           instance->type == PHY_TYPE_SGMII)) {
1169         dev_err(dev, "unsupported device type: %d\n", instance->type);
1170         return ERR_PTR(-EINVAL);
1171     }
1172 
1173     switch (tphy->pdata->version) {
1174     case MTK_PHY_V1:
1175         phy_v1_banks_init(tphy, instance);
1176         break;
1177     case MTK_PHY_V2:
1178     case MTK_PHY_V3:
1179         phy_v2_banks_init(tphy, instance);
1180         break;
1181     default:
1182         dev_err(dev, "phy version is not supported\n");
1183         return ERR_PTR(-EINVAL);
1184     }
1185 
1186     ret = phy_efuse_get(tphy, instance);
1187     if (ret)
1188         return ERR_PTR(ret);
1189 
1190     phy_parse_property(tphy, instance);
1191     phy_type_set(instance);
1192 
1193     return instance->phy;
1194 }
1195 
1196 static const struct phy_ops mtk_tphy_ops = {
1197     .init       = mtk_phy_init,
1198     .exit       = mtk_phy_exit,
1199     .power_on   = mtk_phy_power_on,
1200     .power_off  = mtk_phy_power_off,
1201     .set_mode   = mtk_phy_set_mode,
1202     .owner      = THIS_MODULE,
1203 };
1204 
1205 static const struct mtk_phy_pdata tphy_v1_pdata = {
1206     .avoid_rx_sen_degradation = false,
1207     .version = MTK_PHY_V1,
1208 };
1209 
1210 static const struct mtk_phy_pdata tphy_v2_pdata = {
1211     .avoid_rx_sen_degradation = false,
1212     .sw_efuse_supported = true,
1213     .version = MTK_PHY_V2,
1214 };
1215 
1216 static const struct mtk_phy_pdata tphy_v3_pdata = {
1217     .sw_efuse_supported = true,
1218     .version = MTK_PHY_V3,
1219 };
1220 
1221 static const struct mtk_phy_pdata mt8173_pdata = {
1222     .avoid_rx_sen_degradation = true,
1223     .version = MTK_PHY_V1,
1224 };
1225 
1226 static const struct mtk_phy_pdata mt8195_pdata = {
1227     .sw_pll_48m_to_26m = true,
1228     .sw_efuse_supported = true,
1229     .version = MTK_PHY_V3,
1230 };
1231 
1232 static const struct of_device_id mtk_tphy_id_table[] = {
1233     { .compatible = "mediatek,mt2701-u3phy", .data = &tphy_v1_pdata },
1234     { .compatible = "mediatek,mt2712-u3phy", .data = &tphy_v2_pdata },
1235     { .compatible = "mediatek,mt8173-u3phy", .data = &mt8173_pdata },
1236     { .compatible = "mediatek,mt8195-tphy", .data = &mt8195_pdata },
1237     { .compatible = "mediatek,generic-tphy-v1", .data = &tphy_v1_pdata },
1238     { .compatible = "mediatek,generic-tphy-v2", .data = &tphy_v2_pdata },
1239     { .compatible = "mediatek,generic-tphy-v3", .data = &tphy_v3_pdata },
1240     { },
1241 };
1242 MODULE_DEVICE_TABLE(of, mtk_tphy_id_table);
1243 
1244 static int mtk_tphy_probe(struct platform_device *pdev)
1245 {
1246     struct device *dev = &pdev->dev;
1247     struct device_node *np = dev->of_node;
1248     struct device_node *child_np;
1249     struct phy_provider *provider;
1250     struct resource *sif_res;
1251     struct mtk_tphy *tphy;
1252     struct resource res;
1253     int port, retval;
1254 
1255     tphy = devm_kzalloc(dev, sizeof(*tphy), GFP_KERNEL);
1256     if (!tphy)
1257         return -ENOMEM;
1258 
1259     tphy->pdata = of_device_get_match_data(dev);
1260     if (!tphy->pdata)
1261         return -EINVAL;
1262 
1263     tphy->nphys = of_get_child_count(np);
1264     tphy->phys = devm_kcalloc(dev, tphy->nphys,
1265                        sizeof(*tphy->phys), GFP_KERNEL);
1266     if (!tphy->phys)
1267         return -ENOMEM;
1268 
1269     tphy->dev = dev;
1270     platform_set_drvdata(pdev, tphy);
1271 
1272     sif_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1273     /* SATA phy of V1 needn't it if not shared with PCIe or USB */
1274     if (sif_res && tphy->pdata->version == MTK_PHY_V1) {
1275         /* get banks shared by multiple phys */
1276         tphy->sif_base = devm_ioremap_resource(dev, sif_res);
1277         if (IS_ERR(tphy->sif_base)) {
1278             dev_err(dev, "failed to remap sif regs\n");
1279             return PTR_ERR(tphy->sif_base);
1280         }
1281     }
1282 
1283     if (tphy->pdata->version < MTK_PHY_V3) {
1284         tphy->src_ref_clk = U3P_REF_CLK;
1285         tphy->src_coef = U3P_SLEW_RATE_COEF;
1286         /* update parameters of slew rate calibrate if exist */
1287         device_property_read_u32(dev, "mediatek,src-ref-clk-mhz",
1288                      &tphy->src_ref_clk);
1289         device_property_read_u32(dev, "mediatek,src-coef",
1290                      &tphy->src_coef);
1291     }
1292 
1293     port = 0;
1294     for_each_child_of_node(np, child_np) {
1295         struct mtk_phy_instance *instance;
1296         struct clk_bulk_data *clks;
1297         struct device *subdev;
1298         struct phy *phy;
1299 
1300         instance = devm_kzalloc(dev, sizeof(*instance), GFP_KERNEL);
1301         if (!instance) {
1302             retval = -ENOMEM;
1303             goto put_child;
1304         }
1305 
1306         tphy->phys[port] = instance;
1307 
1308         phy = devm_phy_create(dev, child_np, &mtk_tphy_ops);
1309         if (IS_ERR(phy)) {
1310             dev_err(dev, "failed to create phy\n");
1311             retval = PTR_ERR(phy);
1312             goto put_child;
1313         }
1314 
1315         subdev = &phy->dev;
1316         retval = of_address_to_resource(child_np, 0, &res);
1317         if (retval) {
1318             dev_err(subdev, "failed to get address resource(id-%d)\n",
1319                 port);
1320             goto put_child;
1321         }
1322 
1323         instance->port_base = devm_ioremap_resource(subdev, &res);
1324         if (IS_ERR(instance->port_base)) {
1325             retval = PTR_ERR(instance->port_base);
1326             goto put_child;
1327         }
1328 
1329         instance->phy = phy;
1330         instance->index = port;
1331         phy_set_drvdata(phy, instance);
1332         port++;
1333 
1334         clks = instance->clks;
1335         clks[0].id = "ref";     /* digital (& analog) clock */
1336         clks[1].id = "da_ref";  /* analog clock */
1337         retval = devm_clk_bulk_get_optional(subdev, TPHY_CLKS_CNT, clks);
1338         if (retval)
1339             goto put_child;
1340 
1341         retval = phy_type_syscon_get(instance, child_np);
1342         if (retval)
1343             goto put_child;
1344     }
1345 
1346     provider = devm_of_phy_provider_register(dev, mtk_phy_xlate);
1347 
1348     return PTR_ERR_OR_ZERO(provider);
1349 put_child:
1350     of_node_put(child_np);
1351     return retval;
1352 }
1353 
1354 static struct platform_driver mtk_tphy_driver = {
1355     .probe      = mtk_tphy_probe,
1356     .driver     = {
1357         .name   = "mtk-tphy",
1358         .of_match_table = mtk_tphy_id_table,
1359     },
1360 };
1361 
1362 module_platform_driver(mtk_tphy_driver);
1363 
1364 MODULE_AUTHOR("Chunfeng Yun <chunfeng.yun@mediatek.com>");
1365 MODULE_DESCRIPTION("MediaTek T-PHY driver");
1366 MODULE_LICENSE("GPL v2");