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