xref: /linux/drivers/phy/samsung/phy-exynos5-usbdrd.c (revision 2c142b63c8ee982cdfdba49a616027c266294838)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Samsung Exynos5 SoC series USB DRD PHY driver
4  *
5  * Phy provider for USB 3.0 DRD controller on Exynos5 SoC series
6  *
7  * Copyright (C) 2014 Samsung Electronics Co., Ltd.
8  * Author: Vivek Gautam <gautam.vivek@samsung.com>
9  */
10 
11 #include <linux/bitfield.h>
12 #include <linux/clk.h>
13 #include <linux/delay.h>
14 #include <linux/io.h>
15 #include <linux/kernel.h>
16 #include <linux/module.h>
17 #include <linux/of.h>
18 #include <linux/iopoll.h>
19 #include <linux/phy/phy.h>
20 #include <linux/platform_device.h>
21 #include <linux/mutex.h>
22 #include <linux/mfd/syscon.h>
23 #include <linux/regmap.h>
24 #include <linux/regulator/consumer.h>
25 #include <linux/soc/samsung/exynos-regs-pmu.h>
26 #include <linux/usb/typec.h>
27 #include <linux/usb/typec_mux.h>
28 
29 /* Exynos USB PHY registers */
30 #define EXYNOS5_FSEL_9MHZ6		0x0
31 #define EXYNOS5_FSEL_10MHZ		0x1
32 #define EXYNOS5_FSEL_12MHZ		0x2
33 #define EXYNOS5_FSEL_19MHZ2		0x3
34 #define EXYNOS5_FSEL_20MHZ		0x4
35 #define EXYNOS5_FSEL_24MHZ		0x5
36 #define EXYNOS5_FSEL_26MHZ		0x6
37 #define EXYNOS5_FSEL_50MHZ		0x7
38 
39 /* USB 3.2 DRD 4nm PHY link controller registers */
40 #define EXYNOS2200_DRD_CLKRST			0x0c
41 #define EXYNOS2200_CLKRST_LINK_PCLK_SEL		BIT(1)
42 
43 #define EXYNOS2200_DRD_UTMI			0x10
44 
45 /* ExynosAutov920 bits */
46 #define UTMICTL_FORCE_UTMI_SUSPEND		BIT(13)
47 #define UTMICTL_FORCE_UTMI_SLEEP		BIT(12)
48 #define UTMICTL_FORCE_DPPULLDOWN		BIT(9)
49 #define UTMICTL_FORCE_DMPULLDOWN		BIT(8)
50 
51 #define EXYNOS2200_UTMI_FORCE_VBUSVALID		BIT(1)
52 #define EXYNOS2200_UTMI_FORCE_BVALID		BIT(0)
53 
54 #define EXYNOS2200_DRD_HSP_MISC			0x114
55 #define HSP_MISC_SET_REQ_IN2			BIT(4)
56 #define HSP_MISC_RES_TUNE			GENMASK(1, 0)
57 #define RES_TUNE_PHY1_PHY2			0x1
58 #define RES_TUNE_PHY1				0x2
59 #define RES_TUNE_PHY2				0x3
60 
61 /* Exynos5: USB 3.0 DRD PHY registers */
62 #define EXYNOS5_DRD_LINKSYSTEM			0x04
63 #define LINKSYSTEM_XHCI_VERSION_CONTROL		BIT(27)
64 #define LINKSYSTEM_FORCE_VBUSVALID		BIT(8)
65 #define LINKSYSTEM_FORCE_BVALID			BIT(7)
66 #define LINKSYSTEM_FLADJ			GENMASK(6, 1)
67 
68 #define EXYNOS5_DRD_PHYUTMI			0x08
69 #define PHYUTMI_UTMI_SUSPEND_COM_N		BIT(12)
70 #define PHYUTMI_UTMI_L1_SUSPEND_COM_N		BIT(11)
71 #define PHYUTMI_VBUSVLDEXTSEL			BIT(10)
72 #define PHYUTMI_VBUSVLDEXT			BIT(9)
73 #define PHYUTMI_TXBITSTUFFENH			BIT(8)
74 #define PHYUTMI_TXBITSTUFFEN			BIT(7)
75 #define PHYUTMI_OTGDISABLE			BIT(6)
76 #define PHYUTMI_IDPULLUP			BIT(5)
77 #define PHYUTMI_DRVVBUS				BIT(4)
78 #define PHYUTMI_DPPULLDOWN			BIT(3)
79 #define PHYUTMI_DMPULLDOWN			BIT(2)
80 #define PHYUTMI_FORCESUSPEND			BIT(1)
81 #define PHYUTMI_FORCESLEEP			BIT(0)
82 
83 #define EXYNOS5_DRD_PHYPIPE			0x0c
84 
85 #define EXYNOS5_DRD_PHYCLKRST			0x10
86 #define PHYCLKRST_EN_UTMISUSPEND		BIT(31)
87 #define PHYCLKRST_SSC_REFCLKSEL			GENMASK(30, 23)
88 #define PHYCLKRST_SSC_RANGE			GENMASK(22, 21)
89 #define PHYCLKRST_SSC_EN			BIT(20)
90 #define PHYCLKRST_REF_SSP_EN			BIT(19)
91 #define PHYCLKRST_REF_CLKDIV2			BIT(18)
92 #define PHYCLKRST_MPLL_MULTIPLIER		GENMASK(17, 11)
93 #define PHYCLKRST_MPLL_MULTIPLIER_100MHZ_REF	0x19
94 #define PHYCLKRST_MPLL_MULTIPLIER_50M_REF	0x32
95 #define PHYCLKRST_MPLL_MULTIPLIER_24MHZ_REF	0x68
96 #define PHYCLKRST_MPLL_MULTIPLIER_20MHZ_REF	0x7d
97 #define PHYCLKRST_MPLL_MULTIPLIER_19200KHZ_REF	0x02
98 #define PHYCLKRST_FSEL_PIPE			GENMASK(10, 8)
99 #define PHYCLKRST_FSEL_UTMI			GENMASK(7, 5)
100 #define PHYCLKRST_FSEL_PAD_100MHZ		0x27
101 #define PHYCLKRST_FSEL_PAD_24MHZ		0x2a
102 #define PHYCLKRST_FSEL_PAD_20MHZ		0x31
103 #define PHYCLKRST_FSEL_PAD_19_2MHZ		0x38
104 #define PHYCLKRST_RETENABLEN			BIT(4)
105 #define PHYCLKRST_REFCLKSEL			GENMASK(3, 2)
106 #define PHYCLKRST_REFCLKSEL_PAD_REFCLK		0x2
107 #define PHYCLKRST_REFCLKSEL_EXT_REFCLK		0x3
108 #define PHYCLKRST_PORTRESET			BIT(1)
109 #define PHYCLKRST_COMMONONN			BIT(0)
110 
111 #define EXYNOS5_DRD_PHYREG0			0x14
112 #define PHYREG0_SSC_REF_CLK_SEL			BIT(21)
113 #define PHYREG0_SSC_RANGE			BIT(20)
114 #define PHYREG0_CR_WRITE			BIT(19)
115 #define PHYREG0_CR_READ				BIT(18)
116 #define PHYREG0_CR_DATA_IN			GENMASK(17, 2)
117 #define PHYREG0_CR_CAP_DATA			BIT(1)
118 #define PHYREG0_CR_CAP_ADDR			BIT(0)
119 
120 #define EXYNOS5_DRD_PHYREG1			0x18
121 #define PHYREG0_CR_DATA_OUT			GENMASK(16, 1)
122 #define PHYREG1_CR_ACK				BIT(0)
123 
124 #define EXYNOS5_DRD_PHYPARAM0			0x1c
125 #define PHYPARAM0_REF_USE_PAD			BIT(31)
126 #define PHYPARAM0_REF_LOSLEVEL			GENMASK(30, 26)
127 #define PHYPARAM0_REF_LOSLEVEL_VAL		0x9
128 #define PHYPARAM0_TXVREFTUNE			GENMASK(25, 22)
129 #define PHYPARAM0_TXRISETUNE			GENMASK(21, 20)
130 #define PHYPARAM0_TXRESTUNE			GENMASK(19, 18)
131 #define PHYPARAM0_TXPREEMPPULSETUNE		BIT(17)
132 #define PHYPARAM0_TXPREEMPAMPTUNE		GENMASK(16, 15)
133 #define PHYPARAM0_TXHSXVTUNE			GENMASK(14, 13)
134 #define PHYPARAM0_TXFSLSTUNE			GENMASK(12, 9)
135 #define PHYPARAM0_SQRXTUNE			GENMASK(8, 6)
136 #define PHYPARAM0_OTGTUNE			GENMASK(5, 3)
137 #define PHYPARAM0_COMPDISTUNE			GENMASK(2, 0)
138 
139 #define EXYNOS5_DRD_PHYPARAM1			0x20
140 #define PHYPARAM1_PCS_TXDEEMPH			GENMASK(4, 0)
141 #define PHYPARAM1_PCS_TXDEEMPH_VAL		0x1c
142 
143 #define EXYNOS5_DRD_PHYTERM			0x24
144 
145 #define EXYNOS5_DRD_PHYTEST			0x28
146 #define PHYTEST_POWERDOWN_SSP			BIT(3)
147 #define PHYTEST_POWERDOWN_HSP			BIT(2)
148 
149 #define EXYNOS5_DRD_PHYADP			0x2c
150 
151 #define EXYNOS5_DRD_PHYUTMICLKSEL		0x30
152 #define PHYUTMICLKSEL_UTMI_CLKSEL		BIT(2)
153 
154 #define EXYNOS5_DRD_PHYRESUME			0x34
155 
156 #define EXYNOS5_DRD_LINKPORT			0x44
157 #define LINKPORT_HOST_U3_PORT_DISABLE		BIT(8)
158 #define LINKPORT_HOST_U2_PORT_DISABLE		BIT(7)
159 #define LINKPORT_HOST_PORT_OVCR_U3		BIT(5)
160 #define LINKPORT_HOST_PORT_OVCR_U2		BIT(4)
161 #define LINKPORT_HOST_PORT_OVCR_U3_SEL		BIT(3)
162 #define LINKPORT_HOST_PORT_OVCR_U2_SEL		BIT(2)
163 
164 /* USB 3.0 DRD PHY SS Function Control Reg; accessed by CR_PORT */
165 #define EXYNOS5_DRD_PHYSS_LOSLEVEL_OVRD_IN		(0x15)
166 #define LOSLEVEL_OVRD_IN_LOS_BIAS_5420			(0x5 << 13)
167 #define LOSLEVEL_OVRD_IN_LOS_BIAS_DEFAULT		(0x0 << 13)
168 #define LOSLEVEL_OVRD_IN_EN				(0x1 << 10)
169 #define LOSLEVEL_OVRD_IN_LOS_LEVEL_DEFAULT		(0x9 << 0)
170 
171 #define EXYNOS5_DRD_PHYSS_TX_VBOOSTLEVEL_OVRD_IN	(0x12)
172 #define TX_VBOOSTLEVEL_OVRD_IN_VBOOST_5420		(0x5 << 13)
173 #define TX_VBOOSTLEVEL_OVRD_IN_VBOOST_DEFAULT		(0x4 << 13)
174 
175 #define EXYNOS5_DRD_PHYSS_LANE0_TX_DEBUG		(0x1010)
176 #define LANE0_TX_DEBUG_RXDET_MEAS_TIME_19M2_20M		(0x4 << 4)
177 #define LANE0_TX_DEBUG_RXDET_MEAS_TIME_24M		(0x8 << 4)
178 #define LANE0_TX_DEBUG_RXDET_MEAS_TIME_25M_26M		(0x8 << 4)
179 #define LANE0_TX_DEBUG_RXDET_MEAS_TIME_48M_50M_52M	(0x20 << 4)
180 #define LANE0_TX_DEBUG_RXDET_MEAS_TIME_62M5		(0x20 << 4)
181 #define LANE0_TX_DEBUG_RXDET_MEAS_TIME_96M_100M		(0x40 << 4)
182 
183 /* Exynos7870: USB DRD PHY registers */
184 #define EXYNOS7870_DRD_PHYPCSVAL		0x3C
185 #define PHYPCSVAL_PCS_RX_LOS_MASK		GENMASK(9, 0)
186 
187 #define EXYNOS7870_DRD_PHYPARAM2		0x50
188 #define PHYPARAM2_TX_VBOOST_LVL		        GENMASK(6, 4)
189 #define PHYPARAM2_LOS_BIAS			GENMASK(2, 0)
190 
191 #define EXYNOS7870_DRD_HSPHYCTRL		0x54
192 #define HSPHYCTRL_PHYSWRSTALL			BIT(31)
193 #define HSPHYCTRL_SIDDQ				BIT(6)
194 #define HSPHYCTRL_PHYSWRST			BIT(0)
195 
196 #define EXYNOS7870_DRD_HSPHYPLLTUNE		0x70
197 #define HSPHYPLLTUNE_PLL_B_TUNE			BIT(6)
198 #define HSPHYPLLTUNE_PLL_I_TUNE			GENMASK(5, 4)
199 #define HSPHYPLLTUNE_PLL_P_TUNE			GENMASK(3, 0)
200 
201 /* Exynos850: USB DRD PHY registers */
202 #define EXYNOS850_DRD_LINKCTRL			0x04
203 #define LINKCTRL_FORCE_RXELECIDLE		BIT(18)
204 #define LINKCTRL_FORCE_PHYSTATUS		BIT(17)
205 #define LINKCTRL_FORCE_PIPE_EN			BIT(16)
206 #define LINKCTRL_FORCE_QACT			BIT(8)
207 #define LINKCTRL_BUS_FILTER_BYPASS		GENMASK(7, 4)
208 
209 #define EXYNOS850_DRD_LINKPORT			0x08
210 #define LINKPORT_HOST_NUM_U3			GENMASK(19, 16)
211 #define LINKPORT_HOST_NUM_U2			GENMASK(15, 12)
212 
213 #define EXYNOS850_DRD_CLKRST			0x20
214 /*
215  * On versions without SS ports (like E850), bit 3 is for the 2.0 phy (HS),
216  * while on versions with (like gs101), bits 2 and 3 are for the 3.0 phy (SS)
217  * and bits 12 & 13 for the 2.0 phy.
218  */
219 #define CLKRST_PHY20_SW_POR			BIT(13)
220 #define CLKRST_PHY20_SW_POR_SEL			BIT(12)
221 #define CLKRST_LINK_PCLK_SEL			BIT(7)
222 #define CLKRST_PHY_SW_RST			BIT(3)
223 #define CLKRST_PHY_RESET_SEL			BIT(2)
224 #define CLKRST_PORT_RST				BIT(1)
225 #define CLKRST_LINK_SW_RST			BIT(0)
226 
227 #define EXYNOS850_DRD_SSPPLLCTL			0x30
228 #define SSPPLLCTL_FSEL				GENMASK(2, 0)
229 
230 #define EXYNOS850_DRD_UTMI			0x50
231 #define UTMI_FORCE_VBUSVALID			BIT(5)
232 #define UTMI_FORCE_BVALID			BIT(4)
233 #define UTMI_DP_PULLDOWN			BIT(3)
234 #define UTMI_DM_PULLDOWN			BIT(2)
235 #define UTMI_FORCE_SUSPEND			BIT(1)
236 #define UTMI_FORCE_SLEEP			BIT(0)
237 
238 #define EXYNOS850_DRD_HSP			0x54
239 #define HSP_FSV_OUT_EN				BIT(24)
240 #define HSP_VBUSVLDEXTSEL			BIT(13)
241 #define HSP_VBUSVLDEXT				BIT(12)
242 #define HSP_EN_UTMISUSPEND			BIT(9)
243 #define HSP_COMMONONN				BIT(8)
244 
245 #define EXYNOS850_DRD_HSPPARACON		0x58
246 #define HSPPARACON_TXVREF			GENMASK(31, 28)
247 #define HSPPARACON_TXRISE			GENMASK(25, 24)
248 #define HSPPARACON_TXRES			GENMASK(22, 21)
249 #define HSPPARACON_TXPREEMPPULSE		BIT(20)
250 #define HSPPARACON_TXPREEMPAMP			GENMASK(19, 18)
251 #define HSPPARACON_TXHSXV			GENMASK(17, 16)
252 #define HSPPARACON_TXFSLS			GENMASK(15, 12)
253 #define HSPPARACON_SQRX				GENMASK(10, 8)
254 #define HSPPARACON_OTG				GENMASK(6, 4)
255 #define HSPPARACON_COMPDIS			GENMASK(2, 0)
256 
257 #define EXYNOS850_DRD_HSP_TEST			0x5c
258 #define HSP_TEST_SIDDQ				BIT(24)
259 
260 #define EXYNOSAUTOV920_DRD_HSP_CLKRST		0x100
261 #define HSPCLKRST_PHY20_SW_PORTRESET		BIT(3)
262 #define HSPCLKRST_PHY20_SW_POR			BIT(1)
263 #define HSPCLKRST_PHY20_SW_POR_SEL		BIT(0)
264 
265 #define EXYNOSAUTOV920_DRD_HSPCTL		0x104
266 #define HSPCTRL_VBUSVLDEXTSEL			BIT(13)
267 #define HSPCTRL_VBUSVLDEXT			BIT(12)
268 #define HSPCTRL_EN_UTMISUSPEND			BIT(9)
269 #define HSPCTRL_COMMONONN			BIT(8)
270 
271 #define EXYNOSAUTOV920_DRD_HSP_TEST		0x10c
272 
273 #define EXYNOSAUTOV920_DRD_HSPPLLTUNE		0x110
274 #define HSPPLLTUNE_FSEL				GENMASK(18, 16)
275 
276 /* ExynosAutov920 phy usb31drd port reg */
277 #define EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL	0x000
278 #define PHY_RST_CTRL_PIPE_LANE0_RESET_N_OVRD_EN	BIT(5)
279 #define PHY_RST_CTRL_PIPE_LANE0_RESET_N		BIT(4)
280 #define PHY_RST_CTRL_PHY_RESET_OVRD_EN		BIT(1)
281 #define PHY_RST_CTRL_PHY_RESET			BIT(0)
282 
283 #define EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0	0x0004
284 #define PHY_CR_PARA_CON0_PHY0_CR_PARA_ADDR		GENMASK(31, 16)
285 #define PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK		BIT(8)
286 #define PHY_CR_PARA_CON0_PHY0_CR_PARA_ACK		BIT(4)
287 #define PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL		BIT(0)
288 
289 #define EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON1	0x0008
290 
291 #define EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON2	0x000c
292 #define PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_EN		BIT(0)
293 #define PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_DATA		GENMASK(31, 16)
294 
295 #define EXYNOSAUTOV920_USB31DRD_PHY_CONFIG0	0x100
296 #define PHY_CONFIG0_PHY0_PMA_PWR_STABLE		BIT(14)
297 #define PHY_CONFIG0_PHY0_PCS_PWR_STABLE		BIT(13)
298 #define PHY_CONFIG0_PHY0_ANA_PWR_EN		BIT(1)
299 
300 #define EXYNOSAUTOV920_USB31DRD_PHY_CONFIG7	0x11c
301 #define PHY_CONFIG7_PHY_TEST_POWERDOWN		BIT(24)
302 
303 #define EXYNOSAUTOV920_USB31DRD_PHY_CONFIG4	0x110
304 #define PHY_CONFIG4_PIPE_RX0_SRIS_MODE_EN	BIT(2)
305 
306 /* Exynos9 - GS101 */
307 #define EXYNOS850_DRD_SECPMACTL			0x48
308 #define SECPMACTL_PMA_ROPLL_REF_CLK_SEL		GENMASK(13, 12)
309 #define SECPMACTL_PMA_LCPLL_REF_CLK_SEL		GENMASK(11, 10)
310 #define SECPMACTL_PMA_REF_FREQ_SEL		GENMASK(9, 8)
311 #define SECPMACTL_PMA_LOW_PWR			BIT(4)
312 #define SECPMACTL_PMA_TRSV_SW_RST		BIT(3)
313 #define SECPMACTL_PMA_CMN_SW_RST		BIT(2)
314 #define SECPMACTL_PMA_INIT_SW_RST		BIT(1)
315 #define SECPMACTL_PMA_APB_SW_RST		BIT(0)
316 
317 /* PMA registers */
318 #define EXYNOS9_PMA_USBDP_CMN_REG0008		0x0020
319 #define CMN_REG0008_OVRD_AUX_EN			BIT(3)
320 #define CMN_REG0008_AUX_EN			BIT(2)
321 
322 #define EXYNOS9_PMA_USBDP_CMN_REG00B8		0x02e0
323 #define CMN_REG00B8_LANE_MUX_SEL_DP		GENMASK(3, 0)
324 #define CMN_REG00B8_LANE_MUX_SEL_DP_LANE3	BIT(3)
325 #define CMN_REG00B8_LANE_MUX_SEL_DP_LANE2	BIT(2)
326 #define CMN_REG00B8_LANE_MUX_SEL_DP_LANE1	BIT(1)
327 #define CMN_REG00B8_LANE_MUX_SEL_DP_LANE0	BIT(0)
328 
329 #define EXYNOS9_PMA_USBDP_CMN_REG01C0		0x0700
330 #define CMN_REG01C0_ANA_LCPLL_LOCK_DONE		BIT(7)
331 #define CMN_REG01C0_ANA_LCPLL_AFC_DONE		BIT(6)
332 
333 /* these have similar register layout, for lanes 0 and 2 */
334 #define EXYNOS9_PMA_USBDP_TRSV_REG03C3			0x0f0c
335 #define EXYNOS9_PMA_USBDP_TRSV_REG07C3			0x1f0c
336 #define TRSV_REG03C3_LN0_MON_RX_CDR_AFC_DONE		BIT(3)
337 #define TRSV_REG03C3_LN0_MON_RX_CDR_CAL_DONE		BIT(2)
338 #define TRSV_REG03C3_LN0_MON_RX_CDR_FLD_PLL_MODE_DONE	BIT(1)
339 #define TRSV_REG03C3_LN0_MON_RX_CDR_LOCK_DONE		BIT(0)
340 
341 /* TRSV_REG0413 and TRSV_REG0813 have similar register layout */
342 #define EXYNOS9_PMA_USBDP_TRSV_REG0413		0x104c
343 #define TRSV_REG0413_OVRD_LN1_TX_RXD_COMP_EN	BIT(7)
344 #define TRSV_REG0413_OVRD_LN1_TX_RXD_EN		BIT(5)
345 
346 #define EXYNOS9_PMA_USBDP_TRSV_REG0813		0x204c
347 #define TRSV_REG0813_OVRD_LN3_TX_RXD_COMP_EN	BIT(7)
348 #define TRSV_REG0813_OVRD_LN3_TX_RXD_EN		BIT(5)
349 
350 /* PCS registers */
351 #define EXYNOS9_PCS_NS_VEC_PS1_N1		0x010c
352 #define EXYNOS9_PCS_NS_VEC_PS2_N0		0x0110
353 #define EXYNOS9_PCS_NS_VEC_PS3_N0		0x0118
354 #define NS_VEC_NS_REQ				GENMASK(31, 24)
355 #define NS_VEC_ENABLE_TIMER			BIT(22)
356 #define NS_VEC_SEL_TIMEOUT			GENMASK(21, 20)
357 #define NS_VEC_INV_MASK				GENMASK(19, 16)
358 #define NS_VEC_COND_MASK			GENMASK(11, 8)
359 #define NS_VEC_EXP_COND				GENMASK(3, 0)
360 
361 #define EXYNOS9_PCS_OUT_VEC_2			0x014c
362 #define EXYNOS9_PCS_OUT_VEC_3			0x0150
363 #define PCS_OUT_VEC_B9_DYNAMIC			BIT(19)
364 #define PCS_OUT_VEC_B9_SEL_OUT			BIT(18)
365 #define PCS_OUT_VEC_B8_DYNAMIC			BIT(17)
366 #define PCS_OUT_VEC_B8_SEL_OUT			BIT(16)
367 #define PCS_OUT_VEC_B7_DYNAMIC			BIT(15)
368 #define PCS_OUT_VEC_B7_SEL_OUT			BIT(14)
369 #define PCS_OUT_VEC_B6_DYNAMIC			BIT(13)
370 #define PCS_OUT_VEC_B6_SEL_OUT			BIT(12)
371 #define PCS_OUT_VEC_B5_DYNAMIC			BIT(11)
372 #define PCS_OUT_VEC_B5_SEL_OUT			BIT(10)
373 #define PCS_OUT_VEC_B4_DYNAMIC			BIT(9)
374 #define PCS_OUT_VEC_B4_SEL_OUT			BIT(8)
375 #define PCS_OUT_VEC_B3_DYNAMIC			BIT(7)
376 #define PCS_OUT_VEC_B3_SEL_OUT			BIT(6)
377 #define PCS_OUT_VEC_B2_DYNAMIC			BIT(5)
378 #define PCS_OUT_VEC_B2_SEL_OUT			BIT(4)
379 #define PCS_OUT_VEC_B1_DYNAMIC			BIT(3)
380 #define PCS_OUT_VEC_B1_SEL_OUT			BIT(2)
381 #define PCS_OUT_VEC_B0_DYNAMIC			BIT(1)
382 #define PCS_OUT_VEC_B0_SEL_OUT			BIT(0)
383 
384 #define EXYNOS9_PCS_TIMEOUT_0			0x0170
385 
386 #define EXYNOS9_PCS_TIMEOUT_3			0x017c
387 
388 #define EXYNOS9_PCS_EBUF_PARAM			0x0304
389 #define EBUF_PARAM_SKP_REMOVE_TH_EMPTY_MODE	GENMASK(29, 24)
390 
391 #define EXYNOS9_PCS_BACK_END_MODE_VEC		0x030c
392 #define BACK_END_MODE_VEC_FORCE_EBUF_EMPTY_MODE	BIT(1)
393 #define BACK_END_MODE_VEC_DISABLE_DATA_MASK	BIT(0)
394 
395 #define EXYNOS9_PCS_RX_CONTROL			0x03f0
396 #define RX_CONTROL_EN_BLOCK_ALIGNER_TYPE_B	BIT(22)
397 
398 #define EXYNOS9_PCS_RX_CONTROL_DEBUG		0x03f4
399 #define RX_CONTROL_DEBUG_EN_TS_CHECK		BIT(5)
400 #define RX_CONTROL_DEBUG_NUM_COM_FOUND		GENMASK(3, 0)
401 
402 #define EXYNOS9_PCS_LOCAL_COEF			0x040c
403 #define LOCAL_COEF_PMA_CENTER_COEF		GENMASK(21, 16)
404 #define LOCAL_COEF_LF				GENMASK(13, 8)
405 #define LOCAL_COEF_FS				GENMASK(5, 0)
406 
407 #define EXYNOS9_PCS_HS_TX_COEF_MAP_0		0x0410
408 #define HS_TX_COEF_MAP_0_SSTX_DEEMP		GENMASK(17, 12)
409 #define HS_TX_COEF_MAP_0_SSTX_LEVEL		GENMASK(11, 6)
410 #define HS_TX_COEF_MAP_0_SSTX_PRE_SHOOT		GENMASK(5, 0)
411 
412 
413 #define KHZ	1000
414 #define MHZ	(KHZ * KHZ)
415 
416 #define PHY_TUNING_ENTRY_PHY(o, m, v) {	\
417 		.off = (o),		\
418 		.mask = (m),		\
419 		.val = (v),		\
420 		.region = PTR_PHY	\
421 	}
422 
423 #define PHY_TUNING_ENTRY_PCS(o, m, v) {	\
424 		.off = (o),		\
425 		.mask = (m),		\
426 		.val = (v),		\
427 		.region = PTR_PCS	\
428 	}
429 
430 #define PHY_TUNING_ENTRY_PMA(o, m, v) {	\
431 		.off = (o),		\
432 		.mask = (m),		\
433 		.val = (v),		\
434 		.region = PTR_PMA,	\
435 	}
436 
437 #define PHY_TUNING_ENTRY_LAST { .region = PTR_INVALID }
438 
439 #define for_each_phy_tune(tune) \
440 	for (; (tune)->region != PTR_INVALID; ++(tune))
441 
442 struct exynos5_usbdrd_phy_tuning {
443 	u32 off;
444 	u32 mask;
445 	u32 val;
446 	char region;
447 #define PTR_INVALID	0
448 #define PTR_PHY		1
449 #define PTR_PCS		2
450 #define PTR_PMA		3
451 };
452 
453 enum exynos5_usbdrd_phy_tuning_state {
454 	PTS_UTMI_POSTINIT,
455 	PTS_PIPE3_PREINIT,
456 	PTS_PIPE3_INIT,
457 	PTS_PIPE3_POSTINIT,
458 	PTS_PIPE3_POSTLOCK,
459 	PTS_MAX,
460 };
461 
462 enum exynos5_usbdrd_phy_id {
463 	EXYNOS5_DRDPHY_UTMI,
464 	EXYNOS5_DRDPHY_PIPE3,
465 	EXYNOS5_DRDPHYS_NUM,
466 };
467 
468 struct phy_usb_instance;
469 struct exynos5_usbdrd_phy;
470 
471 struct exynos5_usbdrd_phy_config {
472 	u32 id;
473 	void (*phy_isol)(struct phy_usb_instance *inst, bool isolate);
474 	void (*phy_init)(struct exynos5_usbdrd_phy *phy_drd);
475 	unsigned int (*set_refclk)(struct phy_usb_instance *inst);
476 };
477 
478 struct exynos5_usbdrd_phy_drvdata {
479 	const struct exynos5_usbdrd_phy_config *phy_cfg;
480 	const struct exynos5_usbdrd_phy_tuning **phy_tunes;
481 	const struct phy_ops *phy_ops;
482 	const char * const *clk_names;
483 	int n_clks;
484 	const char * const *core_clk_names;
485 	int n_core_clks;
486 	const char * const *regulator_names;
487 	int n_regulators;
488 	u32 pmu_offset_usbdrd0_phy;
489 	u32 pmu_offset_usbdrd0_phy_ss;
490 	u32 pmu_offset_usbdrd1_phy;
491 };
492 
493 /**
494  * struct exynos5_usbdrd_phy - driver data for USB 3.0 PHY
495  * @dev: pointer to device instance of this platform device
496  * @reg_phy: usb phy controller register memory base
497  * @reg_pcs: usb phy physical coding sublayer register memory base
498  * @reg_pma: usb phy physical media attachment register memory base
499  * @clks: clocks for register access
500  * @core_clks: core clocks for phy (ref, pipe3, utmi+, ITP, etc. as required)
501  * @drv_data: pointer to SoC level driver data structure
502  * @hs_phy: pointer to non-Samsung IP high-speed phy controller
503  * @phy_mutex: mutex protecting phy_init/exit & TCPC callbacks
504  * @phys: array for 'EXYNOS5_DRDPHYS_NUM' number of PHY
505  *	    instances each with its 'phy' and 'phy_cfg'.
506  * @extrefclk: frequency select settings when using 'separate
507  *	       reference clocks' for SS and HS operations
508  * @regulators: regulators for phy
509  * @sw: TypeC orientation switch handle
510  * @orientation: TypeC connector orientation - normal or flipped
511  */
512 struct exynos5_usbdrd_phy {
513 	struct device *dev;
514 	void __iomem *reg_phy;
515 	void __iomem *reg_pcs;
516 	void __iomem *reg_pma;
517 	struct clk_bulk_data *clks;
518 	struct clk_bulk_data *core_clks;
519 	const struct exynos5_usbdrd_phy_drvdata *drv_data;
520 	struct phy *hs_phy;
521 	struct mutex phy_mutex;
522 	struct phy_usb_instance {
523 		struct phy *phy;
524 		u32 index;
525 		struct regmap *reg_pmu;
526 		u32 pmu_offset;
527 		const struct exynos5_usbdrd_phy_config *phy_cfg;
528 	} phys[EXYNOS5_DRDPHYS_NUM];
529 	u32 extrefclk;
530 	struct regulator_bulk_data *regulators;
531 
532 	struct typec_switch_dev *sw;
533 	enum typec_orientation orientation;
534 };
535 
536 static inline
to_usbdrd_phy(struct phy_usb_instance * inst)537 struct exynos5_usbdrd_phy *to_usbdrd_phy(struct phy_usb_instance *inst)
538 {
539 	return container_of((inst), struct exynos5_usbdrd_phy,
540 			    phys[(inst)->index]);
541 }
542 
543 /*
544  * exynos5_rate_to_clk() converts the supplied clock rate to the value that
545  * can be written to the phy register.
546  */
exynos5_rate_to_clk(unsigned long rate,u32 * reg)547 static unsigned int exynos5_rate_to_clk(unsigned long rate, u32 *reg)
548 {
549 	/* EXYNOS5_FSEL_MASK */
550 
551 	switch (rate) {
552 	case 9600 * KHZ:
553 		*reg = EXYNOS5_FSEL_9MHZ6;
554 		break;
555 	case 10 * MHZ:
556 		*reg = EXYNOS5_FSEL_10MHZ;
557 		break;
558 	case 12 * MHZ:
559 		*reg = EXYNOS5_FSEL_12MHZ;
560 		break;
561 	case 19200 * KHZ:
562 		*reg = EXYNOS5_FSEL_19MHZ2;
563 		break;
564 	case 20 * MHZ:
565 		*reg = EXYNOS5_FSEL_20MHZ;
566 		break;
567 	case 24 * MHZ:
568 		*reg = EXYNOS5_FSEL_24MHZ;
569 		break;
570 	case 26 * MHZ:
571 		*reg = EXYNOS5_FSEL_26MHZ;
572 		break;
573 	case 50 * MHZ:
574 		*reg = EXYNOS5_FSEL_50MHZ;
575 		break;
576 	default:
577 		return -EINVAL;
578 	}
579 
580 	return 0;
581 }
582 
exynos5_usbdrd_phy_isol(struct phy_usb_instance * inst,bool isolate)583 static void exynos5_usbdrd_phy_isol(struct phy_usb_instance *inst,
584 				    bool isolate)
585 {
586 	unsigned int val;
587 
588 	if (!inst->reg_pmu)
589 		return;
590 
591 	val = isolate ? 0 : EXYNOS4_PHY_ENABLE;
592 
593 	regmap_update_bits(inst->reg_pmu, inst->pmu_offset,
594 			   EXYNOS4_PHY_ENABLE, val);
595 }
596 
597 /*
598  * Sets the pipe3 phy's clk as EXTREFCLK (XXTI) which is internal clock
599  * from clock core. Further sets multiplier values and spread spectrum
600  * clock settings for SuperSpeed operations.
601  */
602 static unsigned int
exynos5_usbdrd_pipe3_set_refclk(struct phy_usb_instance * inst)603 exynos5_usbdrd_pipe3_set_refclk(struct phy_usb_instance *inst)
604 {
605 	u32 reg;
606 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
607 
608 	/* restore any previous reference clock settings */
609 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYCLKRST);
610 
611 	/* Use EXTREFCLK as ref clock */
612 	reg &= ~PHYCLKRST_REFCLKSEL;
613 	reg |= FIELD_PREP(PHYCLKRST_REFCLKSEL, PHYCLKRST_REFCLKSEL_EXT_REFCLK);
614 
615 	/* FSEL settings corresponding to reference clock */
616 	reg &= ~(PHYCLKRST_FSEL_PIPE |
617 		 PHYCLKRST_MPLL_MULTIPLIER |
618 		 PHYCLKRST_SSC_REFCLKSEL);
619 	switch (phy_drd->extrefclk) {
620 	case EXYNOS5_FSEL_50MHZ:
621 		reg |= (FIELD_PREP(PHYCLKRST_SSC_REFCLKSEL, 0x00) |
622 			FIELD_PREP(PHYCLKRST_MPLL_MULTIPLIER,
623 				   PHYCLKRST_MPLL_MULTIPLIER_50M_REF));
624 		break;
625 	case EXYNOS5_FSEL_24MHZ:
626 		reg |= (FIELD_PREP(PHYCLKRST_SSC_REFCLKSEL, 0x88) |
627 			FIELD_PREP(PHYCLKRST_MPLL_MULTIPLIER,
628 				   PHYCLKRST_MPLL_MULTIPLIER_24MHZ_REF));
629 		break;
630 	case EXYNOS5_FSEL_20MHZ:
631 		reg |= (FIELD_PREP(PHYCLKRST_SSC_REFCLKSEL, 0x00) |
632 			FIELD_PREP(PHYCLKRST_MPLL_MULTIPLIER,
633 				   PHYCLKRST_MPLL_MULTIPLIER_20MHZ_REF));
634 		break;
635 	case EXYNOS5_FSEL_19MHZ2:
636 		reg |= (FIELD_PREP(PHYCLKRST_SSC_REFCLKSEL, 0x88) |
637 			FIELD_PREP(PHYCLKRST_MPLL_MULTIPLIER,
638 				   PHYCLKRST_MPLL_MULTIPLIER_19200KHZ_REF));
639 		break;
640 	default:
641 		dev_dbg(phy_drd->dev, "unsupported ref clk\n");
642 		break;
643 	}
644 
645 	return reg;
646 }
647 
648 /*
649  * Sets the utmi phy's clk as EXTREFCLK (XXTI) which is internal clock
650  * from clock core. Further sets the FSEL values for HighSpeed operations.
651  */
652 static unsigned int
exynos5_usbdrd_utmi_set_refclk(struct phy_usb_instance * inst)653 exynos5_usbdrd_utmi_set_refclk(struct phy_usb_instance *inst)
654 {
655 	u32 reg;
656 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
657 
658 	/* restore any previous reference clock settings */
659 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYCLKRST);
660 
661 	reg &= ~PHYCLKRST_REFCLKSEL;
662 	reg |= FIELD_PREP(PHYCLKRST_REFCLKSEL, PHYCLKRST_REFCLKSEL_EXT_REFCLK);
663 
664 	reg &= ~(PHYCLKRST_FSEL_UTMI |
665 		 PHYCLKRST_MPLL_MULTIPLIER |
666 		 PHYCLKRST_SSC_REFCLKSEL);
667 	reg |= FIELD_PREP(PHYCLKRST_FSEL_UTMI, phy_drd->extrefclk);
668 
669 	return reg;
670 }
671 
672 static void
exynos5_usbdrd_apply_phy_tunes(struct exynos5_usbdrd_phy * phy_drd,enum exynos5_usbdrd_phy_tuning_state state)673 exynos5_usbdrd_apply_phy_tunes(struct exynos5_usbdrd_phy *phy_drd,
674 			       enum exynos5_usbdrd_phy_tuning_state state)
675 {
676 	const struct exynos5_usbdrd_phy_tuning *tune;
677 
678 	tune = phy_drd->drv_data->phy_tunes[state];
679 	if (!tune)
680 		return;
681 
682 	for_each_phy_tune(tune) {
683 		void __iomem *reg_base;
684 		u32 reg = 0;
685 
686 		switch (tune->region) {
687 		case PTR_PHY:
688 			reg_base = phy_drd->reg_phy;
689 			break;
690 		case PTR_PCS:
691 			reg_base = phy_drd->reg_pcs;
692 			break;
693 		case PTR_PMA:
694 			reg_base = phy_drd->reg_pma;
695 			break;
696 		default:
697 			dev_warn_once(phy_drd->dev,
698 				      "unknown phy region %d\n", tune->region);
699 			continue;
700 		}
701 
702 		if (~tune->mask) {
703 			reg = readl(reg_base + tune->off);
704 			reg &= ~tune->mask;
705 		}
706 		reg |= tune->val;
707 		writel(reg, reg_base + tune->off);
708 	}
709 }
710 
exynos5_usbdrd_pipe3_init(struct exynos5_usbdrd_phy * phy_drd)711 static void exynos5_usbdrd_pipe3_init(struct exynos5_usbdrd_phy *phy_drd)
712 {
713 	u32 reg;
714 
715 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYPARAM1);
716 	/* Set Tx De-Emphasis level */
717 	reg &= ~PHYPARAM1_PCS_TXDEEMPH;
718 	reg |= FIELD_PREP(PHYPARAM1_PCS_TXDEEMPH, PHYPARAM1_PCS_TXDEEMPH_VAL);
719 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYPARAM1);
720 
721 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYTEST);
722 	reg &= ~PHYTEST_POWERDOWN_SSP;
723 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYTEST);
724 }
725 
726 static void
exynos5_usbdrd_usbdp_g2_v4_ctrl_pma_ready(struct exynos5_usbdrd_phy * phy_drd)727 exynos5_usbdrd_usbdp_g2_v4_ctrl_pma_ready(struct exynos5_usbdrd_phy *phy_drd)
728 {
729 	void __iomem *regs_base = phy_drd->reg_phy;
730 	u32 reg;
731 
732 	/* link pipe_clock selection to pclk of PMA */
733 	reg = readl(regs_base + EXYNOS850_DRD_CLKRST);
734 	reg |= CLKRST_LINK_PCLK_SEL;
735 	writel(reg, regs_base + EXYNOS850_DRD_CLKRST);
736 
737 	reg = readl(regs_base + EXYNOS850_DRD_SECPMACTL);
738 	reg &= ~SECPMACTL_PMA_REF_FREQ_SEL;
739 	reg |= FIELD_PREP(SECPMACTL_PMA_REF_FREQ_SEL, 1);
740 	/* SFR reset */
741 	reg |= (SECPMACTL_PMA_LOW_PWR | SECPMACTL_PMA_APB_SW_RST);
742 	reg &= ~(SECPMACTL_PMA_ROPLL_REF_CLK_SEL |
743 		 SECPMACTL_PMA_LCPLL_REF_CLK_SEL);
744 	/* PMA power off */
745 	reg |= (SECPMACTL_PMA_TRSV_SW_RST | SECPMACTL_PMA_CMN_SW_RST |
746 		SECPMACTL_PMA_INIT_SW_RST);
747 	writel(reg, regs_base + EXYNOS850_DRD_SECPMACTL);
748 
749 	udelay(1);
750 
751 	reg = readl(regs_base + EXYNOS850_DRD_SECPMACTL);
752 	reg &= ~SECPMACTL_PMA_LOW_PWR;
753 	writel(reg, regs_base + EXYNOS850_DRD_SECPMACTL);
754 
755 	udelay(1);
756 
757 	/* release override */
758 	reg = readl(regs_base + EXYNOS850_DRD_LINKCTRL);
759 	reg &= ~LINKCTRL_FORCE_PIPE_EN;
760 	writel(reg, regs_base + EXYNOS850_DRD_LINKCTRL);
761 
762 	udelay(1);
763 
764 	/* APB enable */
765 	reg = readl(regs_base + EXYNOS850_DRD_SECPMACTL);
766 	reg &= ~SECPMACTL_PMA_APB_SW_RST;
767 	writel(reg, regs_base + EXYNOS850_DRD_SECPMACTL);
768 }
769 
770 static void
exynos5_usbdrd_usbdp_g2_v4_pma_lane_mux_sel(struct exynos5_usbdrd_phy * phy_drd)771 exynos5_usbdrd_usbdp_g2_v4_pma_lane_mux_sel(struct exynos5_usbdrd_phy *phy_drd)
772 {
773 	void __iomem *regs_base = phy_drd->reg_pma;
774 	u32 reg;
775 
776 	/* lane configuration: USB on all lanes */
777 	reg = readl(regs_base + EXYNOS9_PMA_USBDP_CMN_REG00B8);
778 	reg &= ~CMN_REG00B8_LANE_MUX_SEL_DP;
779 	/*
780 	 * USB on lanes 0 & 1 in normal mode, or 2 & 3 if reversed, DP on the
781 	 * other ones.
782 	 */
783 	reg |= FIELD_PREP(CMN_REG00B8_LANE_MUX_SEL_DP,
784 			  ((phy_drd->orientation == TYPEC_ORIENTATION_NORMAL)
785 			   ? (CMN_REG00B8_LANE_MUX_SEL_DP_LANE3
786 			      | CMN_REG00B8_LANE_MUX_SEL_DP_LANE2)
787 			   : (CMN_REG00B8_LANE_MUX_SEL_DP_LANE1
788 			      | CMN_REG00B8_LANE_MUX_SEL_DP_LANE0)));
789 	writel(reg, regs_base + EXYNOS9_PMA_USBDP_CMN_REG00B8);
790 
791 	/* override of TX receiver detector and comparator: lane 1 */
792 	reg = readl(regs_base + EXYNOS9_PMA_USBDP_TRSV_REG0413);
793 	if (phy_drd->orientation == TYPEC_ORIENTATION_NORMAL) {
794 		reg &= ~TRSV_REG0413_OVRD_LN1_TX_RXD_COMP_EN;
795 		reg &= ~TRSV_REG0413_OVRD_LN1_TX_RXD_EN;
796 	} else {
797 		reg |= TRSV_REG0413_OVRD_LN1_TX_RXD_COMP_EN;
798 		reg |= TRSV_REG0413_OVRD_LN1_TX_RXD_EN;
799 	}
800 	writel(reg, regs_base + EXYNOS9_PMA_USBDP_TRSV_REG0413);
801 
802 	/* lane 3 */
803 	reg = readl(regs_base + EXYNOS9_PMA_USBDP_TRSV_REG0813);
804 	if (phy_drd->orientation == TYPEC_ORIENTATION_NORMAL) {
805 		reg |= TRSV_REG0813_OVRD_LN3_TX_RXD_COMP_EN;
806 		reg |= TRSV_REG0813_OVRD_LN3_TX_RXD_EN;
807 	} else {
808 		reg &= ~TRSV_REG0813_OVRD_LN3_TX_RXD_COMP_EN;
809 		reg &= ~TRSV_REG0813_OVRD_LN3_TX_RXD_EN;
810 	}
811 	writel(reg, regs_base + EXYNOS9_PMA_USBDP_TRSV_REG0813);
812 }
813 
814 static int
exynos5_usbdrd_usbdp_g2_v4_pma_check_pll_lock(struct exynos5_usbdrd_phy * phy_drd)815 exynos5_usbdrd_usbdp_g2_v4_pma_check_pll_lock(struct exynos5_usbdrd_phy *phy_drd)
816 {
817 	static const unsigned int timeout_us = 40000;
818 	static const unsigned int sleep_us = 40;
819 	static const u32 locked = (CMN_REG01C0_ANA_LCPLL_LOCK_DONE |
820 				   CMN_REG01C0_ANA_LCPLL_AFC_DONE);
821 	u32 reg;
822 	int err;
823 
824 	err = readl_poll_timeout(
825 			phy_drd->reg_pma + EXYNOS9_PMA_USBDP_CMN_REG01C0,
826 			reg, (reg & locked) == locked, sleep_us, timeout_us);
827 	if (err)
828 		dev_err(phy_drd->dev,
829 			"timed out waiting for PLL lock: %#.8x\n", reg);
830 
831 	return err;
832 }
833 
834 static void
exynos5_usbdrd_usbdp_g2_v4_pma_check_cdr_lock(struct exynos5_usbdrd_phy * phy_drd)835 exynos5_usbdrd_usbdp_g2_v4_pma_check_cdr_lock(struct exynos5_usbdrd_phy *phy_drd)
836 {
837 	static const unsigned int timeout_us = 40000;
838 	static const unsigned int sleep_us = 40;
839 	static const u32 locked =
840 		(TRSV_REG03C3_LN0_MON_RX_CDR_AFC_DONE
841 		 | TRSV_REG03C3_LN0_MON_RX_CDR_CAL_DONE
842 		 | TRSV_REG03C3_LN0_MON_RX_CDR_FLD_PLL_MODE_DONE
843 		 | TRSV_REG03C3_LN0_MON_RX_CDR_LOCK_DONE);
844 	u32 reg;
845 	int err;
846 
847 	err = readl_poll_timeout(
848 			/* lane depends on cable orientation */
849 			(phy_drd->reg_pma
850 			 + ((phy_drd->orientation == TYPEC_ORIENTATION_NORMAL)
851 			    ? EXYNOS9_PMA_USBDP_TRSV_REG03C3
852 			    : EXYNOS9_PMA_USBDP_TRSV_REG07C3)),
853 			reg, (reg & locked) == locked, sleep_us, timeout_us);
854 	if (err)
855 		dev_err(phy_drd->dev,
856 			"timed out waiting for CDR(l%d) lock: %#.8x\n",
857 			((phy_drd->orientation == TYPEC_ORIENTATION_NORMAL)
858 			 ? 0
859 			 : 2), reg);
860 }
861 
exynos5_usbdrd_utmi_init(struct exynos5_usbdrd_phy * phy_drd)862 static void exynos5_usbdrd_utmi_init(struct exynos5_usbdrd_phy *phy_drd)
863 {
864 	u32 reg;
865 
866 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYPARAM0);
867 	/* Set Loss-of-Signal Detector sensitivity */
868 	reg &= ~PHYPARAM0_REF_LOSLEVEL;
869 	reg |= FIELD_PREP(PHYPARAM0_REF_LOSLEVEL, PHYPARAM0_REF_LOSLEVEL_VAL);
870 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYPARAM0);
871 
872 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYPARAM1);
873 	/* Set Tx De-Emphasis level */
874 	reg &= ~PHYPARAM1_PCS_TXDEEMPH;
875 	reg |= FIELD_PREP(PHYPARAM1_PCS_TXDEEMPH, PHYPARAM1_PCS_TXDEEMPH_VAL);
876 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYPARAM1);
877 
878 	/* UTMI Power Control */
879 	writel(PHYUTMI_OTGDISABLE, phy_drd->reg_phy + EXYNOS5_DRD_PHYUTMI);
880 
881 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYTEST);
882 	reg &= ~PHYTEST_POWERDOWN_HSP;
883 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYTEST);
884 }
885 
exynos5_usbdrd_phy_init(struct phy * phy)886 static int exynos5_usbdrd_phy_init(struct phy *phy)
887 {
888 	int ret;
889 	u32 reg;
890 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
891 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
892 
893 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
894 	if (ret)
895 		return ret;
896 
897 	/* Reset USB 3.0 PHY */
898 	writel(0x0, phy_drd->reg_phy + EXYNOS5_DRD_PHYREG0);
899 	writel(0x0, phy_drd->reg_phy + EXYNOS5_DRD_PHYRESUME);
900 
901 	/*
902 	 * Setting the Frame length Adj value[6:1] to default 0x20
903 	 * See xHCI 1.0 spec, 5.2.4
904 	 */
905 	reg =	LINKSYSTEM_XHCI_VERSION_CONTROL |
906 		FIELD_PREP(LINKSYSTEM_FLADJ, 0x20);
907 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_LINKSYSTEM);
908 
909 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYPARAM0);
910 	/* Select PHY CLK source */
911 	reg &= ~PHYPARAM0_REF_USE_PAD;
912 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYPARAM0);
913 
914 	/* This bit must be set for both HS and SS operations */
915 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYUTMICLKSEL);
916 	reg |= PHYUTMICLKSEL_UTMI_CLKSEL;
917 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYUTMICLKSEL);
918 
919 	/* UTMI or PIPE3 specific init */
920 	inst->phy_cfg->phy_init(phy_drd);
921 
922 	/* reference clock settings */
923 	reg = inst->phy_cfg->set_refclk(inst);
924 
925 		/* Digital power supply in normal operating mode */
926 	reg |=	PHYCLKRST_RETENABLEN |
927 		/* Enable ref clock for SS function */
928 		PHYCLKRST_REF_SSP_EN |
929 		/* Enable spread spectrum */
930 		PHYCLKRST_SSC_EN |
931 		/* Power down HS Bias and PLL blocks in suspend mode */
932 		PHYCLKRST_COMMONONN |
933 		/* Reset the port */
934 		PHYCLKRST_PORTRESET;
935 
936 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYCLKRST);
937 
938 	fsleep(10);
939 
940 	reg &= ~PHYCLKRST_PORTRESET;
941 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYCLKRST);
942 
943 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
944 
945 	return 0;
946 }
947 
exynos5_usbdrd_phy_exit(struct phy * phy)948 static int exynos5_usbdrd_phy_exit(struct phy *phy)
949 {
950 	int ret;
951 	u32 reg;
952 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
953 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
954 
955 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
956 	if (ret)
957 		return ret;
958 
959 	reg =	PHYUTMI_OTGDISABLE |
960 		PHYUTMI_FORCESUSPEND |
961 		PHYUTMI_FORCESLEEP;
962 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYUTMI);
963 
964 	/* Resetting the PHYCLKRST enable bits to reduce leakage current */
965 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYCLKRST);
966 	reg &= ~(PHYCLKRST_REF_SSP_EN |
967 		 PHYCLKRST_SSC_EN |
968 		 PHYCLKRST_COMMONONN);
969 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYCLKRST);
970 
971 	/* Control PHYTEST to remove leakage current */
972 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYTEST);
973 	reg |=	PHYTEST_POWERDOWN_SSP |
974 		PHYTEST_POWERDOWN_HSP;
975 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYTEST);
976 
977 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
978 
979 	return 0;
980 }
981 
exynos5_usbdrd_phy_power_on(struct phy * phy)982 static int exynos5_usbdrd_phy_power_on(struct phy *phy)
983 {
984 	int ret;
985 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
986 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
987 
988 	dev_dbg(phy_drd->dev, "Request to power_on usbdrd_phy phy\n");
989 
990 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_core_clks,
991 				      phy_drd->core_clks);
992 	if (ret)
993 		return ret;
994 
995 	/* Enable VBUS supply */
996 	ret = regulator_bulk_enable(phy_drd->drv_data->n_regulators,
997 				    phy_drd->regulators);
998 	if (ret) {
999 		dev_err(phy_drd->dev, "Failed to enable PHY regulator(s)\n");
1000 		goto fail_vbus;
1001 	}
1002 
1003 	/* Power-on PHY */
1004 	inst->phy_cfg->phy_isol(inst, false);
1005 
1006 	return 0;
1007 
1008 fail_vbus:
1009 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_core_clks,
1010 				   phy_drd->core_clks);
1011 
1012 	return ret;
1013 }
1014 
exynos5_usbdrd_phy_power_off(struct phy * phy)1015 static int exynos5_usbdrd_phy_power_off(struct phy *phy)
1016 {
1017 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
1018 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
1019 
1020 	dev_dbg(phy_drd->dev, "Request to power_off usbdrd_phy phy\n");
1021 
1022 	/* Power-off the PHY */
1023 	inst->phy_cfg->phy_isol(inst, true);
1024 
1025 	/* Disable VBUS supply */
1026 	regulator_bulk_disable(phy_drd->drv_data->n_regulators,
1027 			       phy_drd->regulators);
1028 
1029 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_core_clks,
1030 				   phy_drd->core_clks);
1031 
1032 	return 0;
1033 }
1034 
crport_handshake(struct exynos5_usbdrd_phy * phy_drd,u32 val,u32 cmd)1035 static int crport_handshake(struct exynos5_usbdrd_phy *phy_drd,
1036 			    u32 val, u32 cmd)
1037 {
1038 	unsigned int result;
1039 	int err;
1040 
1041 	writel(val | cmd, phy_drd->reg_phy + EXYNOS5_DRD_PHYREG0);
1042 
1043 	err = readl_poll_timeout(phy_drd->reg_phy + EXYNOS5_DRD_PHYREG1,
1044 				 result, (result & PHYREG1_CR_ACK), 1, 100);
1045 	if (err == -ETIMEDOUT) {
1046 		dev_err(phy_drd->dev, "CRPORT handshake timeout1 (0x%08x)\n", val);
1047 		return err;
1048 	}
1049 
1050 	writel(val, phy_drd->reg_phy + EXYNOS5_DRD_PHYREG0);
1051 
1052 	err = readl_poll_timeout(phy_drd->reg_phy + EXYNOS5_DRD_PHYREG1,
1053 				 result, !(result & PHYREG1_CR_ACK), 1, 100);
1054 	if (err == -ETIMEDOUT) {
1055 		dev_err(phy_drd->dev, "CRPORT handshake timeout2 (0x%08x)\n", val);
1056 		return err;
1057 	}
1058 
1059 	return 0;
1060 }
1061 
crport_ctrl_write(struct exynos5_usbdrd_phy * phy_drd,u32 addr,u32 data)1062 static int crport_ctrl_write(struct exynos5_usbdrd_phy *phy_drd,
1063 			     u32 addr, u32 data)
1064 {
1065 	u32 val;
1066 	int ret;
1067 
1068 	/* Write Address */
1069 	val = FIELD_PREP(PHYREG0_CR_DATA_IN, addr);
1070 	writel(val, phy_drd->reg_phy + EXYNOS5_DRD_PHYREG0);
1071 	ret = crport_handshake(phy_drd, val, PHYREG0_CR_CAP_ADDR);
1072 	if (ret)
1073 		return ret;
1074 
1075 	/* Write Data */
1076 	val = FIELD_PREP(PHYREG0_CR_DATA_IN, data);
1077 	writel(val, phy_drd->reg_phy + EXYNOS5_DRD_PHYREG0);
1078 	ret = crport_handshake(phy_drd, val, PHYREG0_CR_CAP_DATA);
1079 	if (ret)
1080 		return ret;
1081 
1082 	ret = crport_handshake(phy_drd, val, PHYREG0_CR_WRITE);
1083 
1084 	return ret;
1085 }
1086 
1087 /*
1088  * Calibrate few PHY parameters using CR_PORT register to meet
1089  * SuperSpeed requirements on Exynos5420 and Exynos5800 systems,
1090  * which have 28nm USB 3.0 DRD PHY.
1091  */
exynos5420_usbdrd_phy_calibrate(struct exynos5_usbdrd_phy * phy_drd)1092 static int exynos5420_usbdrd_phy_calibrate(struct exynos5_usbdrd_phy *phy_drd)
1093 {
1094 	unsigned int temp;
1095 	int ret = 0;
1096 
1097 	/*
1098 	 * Change los_bias to (0x5) for 28nm PHY from a
1099 	 * default value (0x0); los_level is set as default
1100 	 * (0x9) as also reflected in los_level[30:26] bits
1101 	 * of PHYPARAM0 register.
1102 	 */
1103 	temp = LOSLEVEL_OVRD_IN_LOS_BIAS_5420 |
1104 		LOSLEVEL_OVRD_IN_EN |
1105 		LOSLEVEL_OVRD_IN_LOS_LEVEL_DEFAULT;
1106 	ret = crport_ctrl_write(phy_drd,
1107 				EXYNOS5_DRD_PHYSS_LOSLEVEL_OVRD_IN,
1108 				temp);
1109 	if (ret) {
1110 		dev_err(phy_drd->dev,
1111 			"Failed setting Loss-of-Signal level for SuperSpeed\n");
1112 		return ret;
1113 	}
1114 
1115 	/*
1116 	 * Set tx_vboost_lvl to (0x5) for 28nm PHY Tuning,
1117 	 * to raise Tx signal level from its default value of (0x4)
1118 	 */
1119 	temp = TX_VBOOSTLEVEL_OVRD_IN_VBOOST_5420;
1120 	ret = crport_ctrl_write(phy_drd,
1121 				EXYNOS5_DRD_PHYSS_TX_VBOOSTLEVEL_OVRD_IN,
1122 				temp);
1123 	if (ret) {
1124 		dev_err(phy_drd->dev,
1125 			"Failed setting Tx-Vboost-Level for SuperSpeed\n");
1126 		return ret;
1127 	}
1128 
1129 	/*
1130 	 * Set proper time to wait for RxDetect measurement, for
1131 	 * desired reference clock of PHY, by tuning the CR_PORT
1132 	 * register LANE0.TX_DEBUG which is internal to PHY.
1133 	 * This fixes issue with few USB 3.0 devices, which are
1134 	 * not detected (not even generate interrupts on the bus
1135 	 * on insertion) without this change.
1136 	 * e.g. Samsung SUM-TSB16S 3.0 USB drive.
1137 	 */
1138 	switch (phy_drd->extrefclk) {
1139 	case EXYNOS5_FSEL_50MHZ:
1140 		temp = LANE0_TX_DEBUG_RXDET_MEAS_TIME_48M_50M_52M;
1141 		break;
1142 	case EXYNOS5_FSEL_20MHZ:
1143 	case EXYNOS5_FSEL_19MHZ2:
1144 		temp = LANE0_TX_DEBUG_RXDET_MEAS_TIME_19M2_20M;
1145 		break;
1146 	case EXYNOS5_FSEL_24MHZ:
1147 	default:
1148 		temp = LANE0_TX_DEBUG_RXDET_MEAS_TIME_24M;
1149 		break;
1150 	}
1151 
1152 	ret = crport_ctrl_write(phy_drd,
1153 				EXYNOS5_DRD_PHYSS_LANE0_TX_DEBUG,
1154 				temp);
1155 	if (ret)
1156 		dev_err(phy_drd->dev,
1157 			"Fail to set RxDet measurement time for SuperSpeed\n");
1158 
1159 	return ret;
1160 }
1161 
exynos5_usbdrd_phy_xlate(struct device * dev,const struct of_phandle_args * args)1162 static struct phy *exynos5_usbdrd_phy_xlate(struct device *dev,
1163 					const struct of_phandle_args *args)
1164 {
1165 	struct exynos5_usbdrd_phy *phy_drd = dev_get_drvdata(dev);
1166 
1167 	if (WARN_ON(args->args[0] >= EXYNOS5_DRDPHYS_NUM))
1168 		return ERR_PTR(-ENODEV);
1169 
1170 	return phy_drd->phys[args->args[0]].phy;
1171 }
1172 
exynos5_usbdrd_phy_calibrate(struct phy * phy)1173 static int exynos5_usbdrd_phy_calibrate(struct phy *phy)
1174 {
1175 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
1176 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
1177 
1178 	if (inst->phy_cfg->id == EXYNOS5_DRDPHY_UTMI)
1179 		return exynos5420_usbdrd_phy_calibrate(phy_drd);
1180 	return 0;
1181 }
1182 
1183 static const struct phy_ops exynos5_usbdrd_phy_ops = {
1184 	.init		= exynos5_usbdrd_phy_init,
1185 	.exit		= exynos5_usbdrd_phy_exit,
1186 	.power_on	= exynos5_usbdrd_phy_power_on,
1187 	.power_off	= exynos5_usbdrd_phy_power_off,
1188 	.calibrate	= exynos5_usbdrd_phy_calibrate,
1189 	.owner		= THIS_MODULE,
1190 };
1191 
exynos7870_usbdrd_phy_isol(struct phy_usb_instance * inst,bool isolate)1192 static void exynos7870_usbdrd_phy_isol(struct phy_usb_instance *inst,
1193 				       bool isolate)
1194 {
1195 	unsigned int val;
1196 
1197 	if (!inst->reg_pmu)
1198 		return;
1199 
1200 	val = isolate ? 0 : EXYNOS7870_USB2PHY_ENABLE;
1201 
1202 	regmap_update_bits(inst->reg_pmu, inst->pmu_offset,
1203 			   EXYNOS7870_USB2PHY_ENABLE, val);
1204 }
1205 
exynos7870_usbdrd_utmi_init(struct exynos5_usbdrd_phy * phy_drd)1206 static void exynos7870_usbdrd_utmi_init(struct exynos5_usbdrd_phy *phy_drd)
1207 {
1208 	u32 reg;
1209 
1210 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYCLKRST);
1211 	/* Use PADREFCLK as ref clock */
1212 	reg &= ~PHYCLKRST_REFCLKSEL;
1213 	reg |= FIELD_PREP(PHYCLKRST_REFCLKSEL, PHYCLKRST_REFCLKSEL_PAD_REFCLK);
1214 	/* Select ref clock rate */
1215 	reg &= ~PHYCLKRST_FSEL_UTMI;
1216 	reg &= ~PHYCLKRST_FSEL_PIPE;
1217 	reg |= FIELD_PREP(PHYCLKRST_FSEL_UTMI, phy_drd->extrefclk);
1218 	/* Enable suspend and reset the port */
1219 	reg |= PHYCLKRST_EN_UTMISUSPEND;
1220 	reg |= PHYCLKRST_COMMONONN;
1221 	reg |= PHYCLKRST_PORTRESET;
1222 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYCLKRST);
1223 	udelay(10);
1224 
1225 	/* Clear the port reset bit */
1226 	reg &= ~PHYCLKRST_PORTRESET;
1227 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYCLKRST);
1228 
1229 	/* Change PHY PLL tune value */
1230 	reg = readl(phy_drd->reg_phy + EXYNOS7870_DRD_HSPHYPLLTUNE);
1231 	if (phy_drd->extrefclk == EXYNOS5_FSEL_24MHZ)
1232 		reg |= HSPHYPLLTUNE_PLL_B_TUNE;
1233 	else
1234 		reg &= ~HSPHYPLLTUNE_PLL_B_TUNE;
1235 	reg &= ~HSPHYPLLTUNE_PLL_P_TUNE;
1236 	reg |= FIELD_PREP(HSPHYPLLTUNE_PLL_P_TUNE, 14);
1237 	writel(reg, phy_drd->reg_phy + EXYNOS7870_DRD_HSPHYPLLTUNE);
1238 
1239 	/* High-Speed PHY control */
1240 	reg = readl(phy_drd->reg_phy + EXYNOS7870_DRD_HSPHYCTRL);
1241 	reg &= ~HSPHYCTRL_SIDDQ;
1242 	reg &= ~HSPHYCTRL_PHYSWRST;
1243 	reg &= ~HSPHYCTRL_PHYSWRSTALL;
1244 	writel(reg, phy_drd->reg_phy + EXYNOS7870_DRD_HSPHYCTRL);
1245 	udelay(500);
1246 
1247 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_LINKSYSTEM);
1248 	/*
1249 	 * Setting the Frame length Adj value[6:1] to default 0x20
1250 	 * See xHCI 1.0 spec, 5.2.4
1251 	 */
1252 	reg |= LINKSYSTEM_XHCI_VERSION_CONTROL;
1253 	reg &= ~LINKSYSTEM_FLADJ;
1254 	reg |= FIELD_PREP(LINKSYSTEM_FLADJ, 0x20);
1255 	/* Set VBUSVALID signal as the VBUS pad is not used */
1256 	reg |= LINKSYSTEM_FORCE_BVALID;
1257 	reg |= LINKSYSTEM_FORCE_VBUSVALID;
1258 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_LINKSYSTEM);
1259 
1260 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYUTMI);
1261 	/* Release force_sleep & force_suspend */
1262 	reg &= ~PHYUTMI_FORCESLEEP;
1263 	reg &= ~PHYUTMI_FORCESUSPEND;
1264 	/* DP/DM pull down control */
1265 	reg &= ~PHYUTMI_DMPULLDOWN;
1266 	reg &= ~PHYUTMI_DPPULLDOWN;
1267 	reg &= ~PHYUTMI_DRVVBUS;
1268 	/* Set DP-pull up as the VBUS pad is not used */
1269 	reg |= PHYUTMI_VBUSVLDEXTSEL;
1270 	reg |= PHYUTMI_VBUSVLDEXT;
1271 	/* Disable OTG block and VBUS valid comparator */
1272 	reg |= PHYUTMI_OTGDISABLE;
1273 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYUTMI);
1274 
1275 	/* Configure OVC IO usage */
1276 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_LINKPORT);
1277 	reg |= LINKPORT_HOST_PORT_OVCR_U3_SEL | LINKPORT_HOST_PORT_OVCR_U2_SEL;
1278 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_LINKPORT);
1279 
1280 	/* High-Speed PHY swrst */
1281 	reg = readl(phy_drd->reg_phy + EXYNOS7870_DRD_HSPHYCTRL);
1282 	reg |= HSPHYCTRL_PHYSWRST;
1283 	writel(reg, phy_drd->reg_phy + EXYNOS7870_DRD_HSPHYCTRL);
1284 	udelay(20);
1285 
1286 	/* Clear the PHY swrst bit */
1287 	reg = readl(phy_drd->reg_phy + EXYNOS7870_DRD_HSPHYCTRL);
1288 	reg &= ~HSPHYCTRL_PHYSWRST;
1289 	writel(reg, phy_drd->reg_phy + EXYNOS7870_DRD_HSPHYCTRL);
1290 
1291 	if (phy_drd->drv_data->phy_tunes)
1292 		exynos5_usbdrd_apply_phy_tunes(phy_drd,
1293 					       PTS_UTMI_POSTINIT);
1294 }
1295 
exynos7870_usbdrd_phy_init(struct phy * phy)1296 static int exynos7870_usbdrd_phy_init(struct phy *phy)
1297 {
1298 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
1299 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
1300 	int ret;
1301 
1302 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
1303 	if (ret)
1304 		return ret;
1305 
1306 	/* UTMI or PIPE3 specific init */
1307 	inst->phy_cfg->phy_init(phy_drd);
1308 
1309 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
1310 
1311 	return 0;
1312 }
1313 
exynos7870_usbdrd_phy_exit(struct phy * phy)1314 static int exynos7870_usbdrd_phy_exit(struct phy *phy)
1315 {
1316 	int ret;
1317 	u32 reg;
1318 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
1319 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
1320 
1321 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
1322 	if (ret)
1323 		return ret;
1324 
1325 	/*
1326 	 * Disable the VBUS signal and the ID pull-up resistor.
1327 	 * Enable force-suspend and force-sleep modes.
1328 	 */
1329 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYUTMI);
1330 	reg &= ~(PHYUTMI_DRVVBUS | PHYUTMI_VBUSVLDEXT | PHYUTMI_VBUSVLDEXTSEL);
1331 	reg &= ~PHYUTMI_IDPULLUP;
1332 	reg |= PHYUTMI_FORCESUSPEND | PHYUTMI_FORCESLEEP;
1333 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYUTMI);
1334 
1335 	/* Power down PHY analog blocks */
1336 	reg = readl(phy_drd->reg_phy + EXYNOS7870_DRD_HSPHYCTRL);
1337 	reg |= HSPHYCTRL_SIDDQ;
1338 	writel(reg, phy_drd->reg_phy + EXYNOS7870_DRD_HSPHYCTRL);
1339 
1340 	/* Clear VBUSVALID signal as the VBUS pad is not used */
1341 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_LINKSYSTEM);
1342 	reg &= ~(LINKSYSTEM_FORCE_BVALID | LINKSYSTEM_FORCE_VBUSVALID);
1343 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_LINKSYSTEM);
1344 
1345 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
1346 
1347 	return 0;
1348 }
1349 
1350 static const struct phy_ops exynos7870_usbdrd_phy_ops = {
1351 	.init		= exynos7870_usbdrd_phy_init,
1352 	.exit		= exynos7870_usbdrd_phy_exit,
1353 	.power_on	= exynos5_usbdrd_phy_power_on,
1354 	.power_off	= exynos5_usbdrd_phy_power_off,
1355 	.owner		= THIS_MODULE,
1356 };
1357 
exynos2200_usbdrd_utmi_init(struct exynos5_usbdrd_phy * phy_drd)1358 static void exynos2200_usbdrd_utmi_init(struct exynos5_usbdrd_phy *phy_drd)
1359 {
1360 	/* Configure non-Samsung IP PHY, responsible for UTMI */
1361 	phy_init(phy_drd->hs_phy);
1362 }
1363 
exynos2200_usbdrd_link_init(struct exynos5_usbdrd_phy * phy_drd)1364 static void exynos2200_usbdrd_link_init(struct exynos5_usbdrd_phy *phy_drd)
1365 {
1366 	void __iomem *regs_base = phy_drd->reg_phy;
1367 	u32 reg;
1368 
1369 	/*
1370 	 * Disable HWACG (hardware auto clock gating control). This will force
1371 	 * QACTIVE signal in Q-Channel interface to HIGH level, to make sure
1372 	 * the PHY clock is not gated by the hardware.
1373 	 */
1374 	reg = readl(regs_base + EXYNOS850_DRD_LINKCTRL);
1375 	reg |= LINKCTRL_FORCE_QACT;
1376 	writel(reg, regs_base + EXYNOS850_DRD_LINKCTRL);
1377 
1378 	/* De-assert link reset */
1379 	reg = readl(regs_base + EXYNOS2200_DRD_CLKRST);
1380 	reg &= ~CLKRST_LINK_SW_RST;
1381 	writel(reg, regs_base + EXYNOS2200_DRD_CLKRST);
1382 
1383 	/* Set link VBUS Valid */
1384 	reg = readl(regs_base + EXYNOS2200_DRD_UTMI);
1385 	reg |= EXYNOS2200_UTMI_FORCE_BVALID | EXYNOS2200_UTMI_FORCE_VBUSVALID;
1386 	writel(reg, regs_base + EXYNOS2200_DRD_UTMI);
1387 }
1388 
1389 static void
exynos2200_usbdrd_link_attach_detach_pipe3_phy(struct phy_usb_instance * inst)1390 exynos2200_usbdrd_link_attach_detach_pipe3_phy(struct phy_usb_instance *inst)
1391 {
1392 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
1393 	void __iomem *regs_base = phy_drd->reg_phy;
1394 	u32 reg;
1395 
1396 	reg = readl(regs_base + EXYNOS850_DRD_LINKCTRL);
1397 	if (inst->phy_cfg->id == EXYNOS5_DRDPHY_UTMI) {
1398 		/* force pipe3 signal for link */
1399 		reg &= ~LINKCTRL_FORCE_PHYSTATUS;
1400 		reg |= LINKCTRL_FORCE_PIPE_EN | LINKCTRL_FORCE_RXELECIDLE;
1401 	} else {
1402 		/* disable forcing pipe interface */
1403 		reg &= ~LINKCTRL_FORCE_PIPE_EN;
1404 	}
1405 	writel(reg, regs_base + EXYNOS850_DRD_LINKCTRL);
1406 
1407 	reg = readl(regs_base + EXYNOS2200_DRD_HSP_MISC);
1408 	if (inst->phy_cfg->id == EXYNOS5_DRDPHY_UTMI) {
1409 		/* calibrate only eUSB phy */
1410 		reg |= FIELD_PREP(HSP_MISC_RES_TUNE, RES_TUNE_PHY1);
1411 		reg |= HSP_MISC_SET_REQ_IN2;
1412 	} else {
1413 		/* calibrate for dual phy */
1414 		reg |= FIELD_PREP(HSP_MISC_RES_TUNE, RES_TUNE_PHY1_PHY2);
1415 		reg &= ~HSP_MISC_SET_REQ_IN2;
1416 	}
1417 	writel(reg, regs_base + EXYNOS2200_DRD_HSP_MISC);
1418 
1419 	reg = readl(regs_base + EXYNOS2200_DRD_CLKRST);
1420 	if (inst->phy_cfg->id == EXYNOS5_DRDPHY_UTMI)
1421 		reg &= ~EXYNOS2200_CLKRST_LINK_PCLK_SEL;
1422 	else
1423 		reg |= EXYNOS2200_CLKRST_LINK_PCLK_SEL;
1424 
1425 	writel(reg, regs_base + EXYNOS2200_DRD_CLKRST);
1426 }
1427 
exynos2200_usbdrd_phy_init(struct phy * phy)1428 static int exynos2200_usbdrd_phy_init(struct phy *phy)
1429 {
1430 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
1431 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
1432 	int ret;
1433 
1434 	if (inst->phy_cfg->id == EXYNOS5_DRDPHY_UTMI) {
1435 		/* Power-on PHY ... */
1436 		ret = regulator_bulk_enable(phy_drd->drv_data->n_regulators,
1437 					    phy_drd->regulators);
1438 		if (ret) {
1439 			dev_err(phy_drd->dev,
1440 				"Failed to enable PHY regulator(s)\n");
1441 			return ret;
1442 		}
1443 	}
1444 	/*
1445 	 * ... and ungate power via PMU. Without this here, we get an SError
1446 	 * trying to access PMA registers
1447 	 */
1448 	exynos5_usbdrd_phy_isol(inst, false);
1449 
1450 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
1451 	if (ret)
1452 		return ret;
1453 
1454 	/* Set up the link controller */
1455 	exynos2200_usbdrd_link_init(phy_drd);
1456 
1457 	/* UTMI or PIPE3 link preparation */
1458 	exynos2200_usbdrd_link_attach_detach_pipe3_phy(inst);
1459 
1460 	/* UTMI or PIPE3 specific init */
1461 	inst->phy_cfg->phy_init(phy_drd);
1462 
1463 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
1464 
1465 	return 0;
1466 }
1467 
exynos2200_usbdrd_phy_exit(struct phy * phy)1468 static int exynos2200_usbdrd_phy_exit(struct phy *phy)
1469 {
1470 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
1471 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
1472 	void __iomem *regs_base = phy_drd->reg_phy;
1473 	u32 reg;
1474 	int ret;
1475 
1476 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
1477 	if (ret)
1478 		return ret;
1479 
1480 	reg = readl(regs_base + EXYNOS2200_DRD_UTMI);
1481 	reg &= ~(EXYNOS2200_UTMI_FORCE_BVALID | EXYNOS2200_UTMI_FORCE_VBUSVALID);
1482 	writel(reg, regs_base + EXYNOS2200_DRD_UTMI);
1483 
1484 	reg = readl(regs_base + EXYNOS2200_DRD_CLKRST);
1485 	reg |= CLKRST_LINK_SW_RST;
1486 	writel(reg, regs_base + EXYNOS2200_DRD_CLKRST);
1487 
1488 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
1489 
1490 	exynos5_usbdrd_phy_isol(inst, true);
1491 	return regulator_bulk_disable(phy_drd->drv_data->n_regulators,
1492 				      phy_drd->regulators);
1493 }
1494 
1495 static const struct phy_ops exynos2200_usbdrd_phy_ops = {
1496 	.init		= exynos2200_usbdrd_phy_init,
1497 	.exit		= exynos2200_usbdrd_phy_exit,
1498 	.owner		= THIS_MODULE,
1499 };
1500 
1501 static void
exynos5_usbdrd_usb_v3p1_pipe_override(struct exynos5_usbdrd_phy * phy_drd)1502 exynos5_usbdrd_usb_v3p1_pipe_override(struct exynos5_usbdrd_phy *phy_drd)
1503 {
1504 	void __iomem *regs_base = phy_drd->reg_phy;
1505 	u32 reg;
1506 
1507 	/* force pipe3 signal for link */
1508 	reg = readl(regs_base + EXYNOS850_DRD_LINKCTRL);
1509 	reg &= ~LINKCTRL_FORCE_PHYSTATUS;
1510 	reg |= LINKCTRL_FORCE_PIPE_EN | LINKCTRL_FORCE_RXELECIDLE;
1511 	writel(reg, regs_base + EXYNOS850_DRD_LINKCTRL);
1512 
1513 	/* PMA disable */
1514 	reg = readl(regs_base + EXYNOS850_DRD_SECPMACTL);
1515 	reg |= SECPMACTL_PMA_LOW_PWR;
1516 	writel(reg, regs_base + EXYNOS850_DRD_SECPMACTL);
1517 }
1518 
exynos850_usbdrd_utmi_init(struct exynos5_usbdrd_phy * phy_drd)1519 static void exynos850_usbdrd_utmi_init(struct exynos5_usbdrd_phy *phy_drd)
1520 {
1521 	void __iomem *regs_base = phy_drd->reg_phy;
1522 	u32 reg;
1523 	u32 ss_ports;
1524 
1525 	/*
1526 	 * Disable HWACG (hardware auto clock gating control). This will force
1527 	 * QACTIVE signal in Q-Channel interface to HIGH level, to make sure
1528 	 * the PHY clock is not gated by the hardware.
1529 	 */
1530 	reg = readl(regs_base + EXYNOS850_DRD_LINKCTRL);
1531 	reg |= LINKCTRL_FORCE_QACT;
1532 	writel(reg, regs_base + EXYNOS850_DRD_LINKCTRL);
1533 
1534 	reg = readl(regs_base + EXYNOS850_DRD_LINKPORT);
1535 	ss_ports = FIELD_GET(LINKPORT_HOST_NUM_U3, reg);
1536 
1537 	/* Start PHY Reset (POR=high) */
1538 	reg = readl(regs_base + EXYNOS850_DRD_CLKRST);
1539 	if (ss_ports) {
1540 		reg |= CLKRST_PHY20_SW_POR;
1541 		reg |= CLKRST_PHY20_SW_POR_SEL;
1542 		reg |= CLKRST_PHY_RESET_SEL;
1543 	}
1544 	reg |= CLKRST_PHY_SW_RST;
1545 	writel(reg, regs_base + EXYNOS850_DRD_CLKRST);
1546 
1547 	/* Enable UTMI+ */
1548 	reg = readl(regs_base + EXYNOS850_DRD_UTMI);
1549 	reg &= ~(UTMI_FORCE_SUSPEND | UTMI_FORCE_SLEEP | UTMI_DP_PULLDOWN |
1550 		 UTMI_DM_PULLDOWN);
1551 	writel(reg, regs_base + EXYNOS850_DRD_UTMI);
1552 
1553 	/* Set PHY clock and control HS PHY */
1554 	reg = readl(regs_base + EXYNOS850_DRD_HSP);
1555 	reg |= HSP_EN_UTMISUSPEND | HSP_COMMONONN;
1556 	writel(reg, regs_base + EXYNOS850_DRD_HSP);
1557 
1558 	/* Set VBUS Valid and D+ pull-up control by VBUS pad usage */
1559 	reg = readl(regs_base + EXYNOS850_DRD_LINKCTRL);
1560 	reg |= FIELD_PREP(LINKCTRL_BUS_FILTER_BYPASS, 0xf);
1561 	writel(reg, regs_base + EXYNOS850_DRD_LINKCTRL);
1562 
1563 	if (!phy_drd->sw) {
1564 		reg = readl(regs_base + EXYNOS850_DRD_UTMI);
1565 		reg |= UTMI_FORCE_BVALID | UTMI_FORCE_VBUSVALID;
1566 		writel(reg, regs_base + EXYNOS850_DRD_UTMI);
1567 
1568 		reg = readl(regs_base + EXYNOS850_DRD_HSP);
1569 		reg |= HSP_VBUSVLDEXT | HSP_VBUSVLDEXTSEL;
1570 		writel(reg, regs_base + EXYNOS850_DRD_HSP);
1571 	}
1572 
1573 	reg = readl(regs_base + EXYNOS850_DRD_SSPPLLCTL);
1574 	reg &= ~SSPPLLCTL_FSEL;
1575 	switch (phy_drd->extrefclk) {
1576 	case EXYNOS5_FSEL_50MHZ:
1577 		reg |= FIELD_PREP(SSPPLLCTL_FSEL, 7);
1578 		break;
1579 	case EXYNOS5_FSEL_26MHZ:
1580 		reg |= FIELD_PREP(SSPPLLCTL_FSEL, 6);
1581 		break;
1582 	case EXYNOS5_FSEL_24MHZ:
1583 		reg |= FIELD_PREP(SSPPLLCTL_FSEL, 2);
1584 		break;
1585 	case EXYNOS5_FSEL_20MHZ:
1586 		reg |= FIELD_PREP(SSPPLLCTL_FSEL, 1);
1587 		break;
1588 	case EXYNOS5_FSEL_19MHZ2:
1589 		reg |= FIELD_PREP(SSPPLLCTL_FSEL, 0);
1590 		break;
1591 	default:
1592 		dev_warn(phy_drd->dev, "unsupported ref clk: %#.2x\n",
1593 			 phy_drd->extrefclk);
1594 		break;
1595 	}
1596 	writel(reg, regs_base + EXYNOS850_DRD_SSPPLLCTL);
1597 
1598 	if (phy_drd->drv_data->phy_tunes)
1599 		exynos5_usbdrd_apply_phy_tunes(phy_drd,
1600 					       PTS_UTMI_POSTINIT);
1601 
1602 	/* Power up PHY analog blocks */
1603 	reg = readl(regs_base + EXYNOS850_DRD_HSP_TEST);
1604 	reg &= ~HSP_TEST_SIDDQ;
1605 	writel(reg, regs_base + EXYNOS850_DRD_HSP_TEST);
1606 
1607 	/* Finish PHY reset (POR=low) */
1608 	fsleep(10); /* required before doing POR=low */
1609 	reg = readl(regs_base + EXYNOS850_DRD_CLKRST);
1610 	if (ss_ports) {
1611 		reg |= CLKRST_PHY20_SW_POR_SEL;
1612 		reg &= ~CLKRST_PHY20_SW_POR;
1613 	}
1614 	reg &= ~(CLKRST_PHY_SW_RST | CLKRST_PORT_RST);
1615 	writel(reg, regs_base + EXYNOS850_DRD_CLKRST);
1616 	fsleep(75); /* required after POR=low for guaranteed PHY clock */
1617 
1618 	/* Disable single ended signal out */
1619 	reg = readl(regs_base + EXYNOS850_DRD_HSP);
1620 	reg &= ~HSP_FSV_OUT_EN;
1621 	writel(reg, regs_base + EXYNOS850_DRD_HSP);
1622 
1623 	if (ss_ports)
1624 		exynos5_usbdrd_usb_v3p1_pipe_override(phy_drd);
1625 }
1626 
exynos850_usbdrd_phy_init(struct phy * phy)1627 static int exynos850_usbdrd_phy_init(struct phy *phy)
1628 {
1629 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
1630 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
1631 	int ret;
1632 
1633 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
1634 	if (ret)
1635 		return ret;
1636 
1637 	/* UTMI or PIPE3 specific init */
1638 	scoped_guard(mutex, &phy_drd->phy_mutex)
1639 		inst->phy_cfg->phy_init(phy_drd);
1640 
1641 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
1642 
1643 	return 0;
1644 }
1645 
exynos850_usbdrd_phy_exit(struct phy * phy)1646 static int exynos850_usbdrd_phy_exit(struct phy *phy)
1647 {
1648 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
1649 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
1650 	void __iomem *regs_base = phy_drd->reg_phy;
1651 	u32 reg;
1652 	int ret;
1653 
1654 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
1655 	if (ret)
1656 		return ret;
1657 
1658 	guard(mutex)(&phy_drd->phy_mutex);
1659 
1660 	/* Set PHY clock and control HS PHY */
1661 	reg = readl(regs_base + EXYNOS850_DRD_UTMI);
1662 	reg &= ~(UTMI_DP_PULLDOWN | UTMI_DM_PULLDOWN);
1663 	reg |= UTMI_FORCE_SUSPEND | UTMI_FORCE_SLEEP;
1664 	writel(reg, regs_base + EXYNOS850_DRD_UTMI);
1665 
1666 	/* Power down PHY analog blocks */
1667 	reg = readl(regs_base + EXYNOS850_DRD_HSP_TEST);
1668 	reg |= HSP_TEST_SIDDQ;
1669 	writel(reg, regs_base + EXYNOS850_DRD_HSP_TEST);
1670 
1671 	/* Link reset */
1672 	reg = readl(regs_base + EXYNOS850_DRD_CLKRST);
1673 	reg |= CLKRST_LINK_SW_RST;
1674 	writel(reg, regs_base + EXYNOS850_DRD_CLKRST);
1675 	fsleep(10); /* required before doing POR=low */
1676 	reg &= ~CLKRST_LINK_SW_RST;
1677 	writel(reg, regs_base + EXYNOS850_DRD_CLKRST);
1678 
1679 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
1680 
1681 	return 0;
1682 }
1683 
1684 static const struct phy_ops exynos850_usbdrd_phy_ops = {
1685 	.init		= exynos850_usbdrd_phy_init,
1686 	.exit		= exynos850_usbdrd_phy_exit,
1687 	.power_on	= exynos5_usbdrd_phy_power_on,
1688 	.power_off	= exynos5_usbdrd_phy_power_off,
1689 	.owner		= THIS_MODULE,
1690 };
1691 
exynos5_usbdrd_gs101_pipe3_init(struct exynos5_usbdrd_phy * phy_drd)1692 static void exynos5_usbdrd_gs101_pipe3_init(struct exynos5_usbdrd_phy *phy_drd)
1693 {
1694 	void __iomem *regs_pma = phy_drd->reg_pma;
1695 	void __iomem *regs_phy = phy_drd->reg_phy;
1696 	u32 reg;
1697 
1698 	exynos5_usbdrd_usbdp_g2_v4_ctrl_pma_ready(phy_drd);
1699 
1700 	/* force aux off */
1701 	reg = readl(regs_pma + EXYNOS9_PMA_USBDP_CMN_REG0008);
1702 	reg &= ~CMN_REG0008_AUX_EN;
1703 	reg |= CMN_REG0008_OVRD_AUX_EN;
1704 	writel(reg, regs_pma + EXYNOS9_PMA_USBDP_CMN_REG0008);
1705 
1706 	exynos5_usbdrd_apply_phy_tunes(phy_drd, PTS_PIPE3_PREINIT);
1707 	exynos5_usbdrd_apply_phy_tunes(phy_drd, PTS_PIPE3_INIT);
1708 	exynos5_usbdrd_apply_phy_tunes(phy_drd, PTS_PIPE3_POSTINIT);
1709 
1710 	exynos5_usbdrd_usbdp_g2_v4_pma_lane_mux_sel(phy_drd);
1711 
1712 	/* reset release from port */
1713 	reg = readl(regs_phy + EXYNOS850_DRD_SECPMACTL);
1714 	reg &= ~(SECPMACTL_PMA_TRSV_SW_RST | SECPMACTL_PMA_CMN_SW_RST |
1715 		 SECPMACTL_PMA_INIT_SW_RST);
1716 	writel(reg, regs_phy + EXYNOS850_DRD_SECPMACTL);
1717 
1718 	if (!exynos5_usbdrd_usbdp_g2_v4_pma_check_pll_lock(phy_drd))
1719 		exynos5_usbdrd_usbdp_g2_v4_pma_check_cdr_lock(phy_drd);
1720 }
1721 
exynos5_usbdrd_gs101_phy_init(struct phy * phy)1722 static int exynos5_usbdrd_gs101_phy_init(struct phy *phy)
1723 {
1724 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
1725 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
1726 	int ret;
1727 
1728 	if (inst->phy_cfg->id == EXYNOS5_DRDPHY_UTMI) {
1729 		/* Power-on PHY ... */
1730 		ret = regulator_bulk_enable(phy_drd->drv_data->n_regulators,
1731 					    phy_drd->regulators);
1732 		if (ret) {
1733 			dev_err(phy_drd->dev,
1734 				"Failed to enable PHY regulator(s)\n");
1735 			return ret;
1736 		}
1737 	}
1738 	/*
1739 	 * ... and ungate power via PMU. Without this here, we get an SError
1740 	 * trying to access PMA registers
1741 	 */
1742 	exynos5_usbdrd_phy_isol(inst, false);
1743 
1744 	return exynos850_usbdrd_phy_init(phy);
1745 }
1746 
exynos5_usbdrd_gs101_phy_exit(struct phy * phy)1747 static int exynos5_usbdrd_gs101_phy_exit(struct phy *phy)
1748 {
1749 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
1750 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
1751 	int ret;
1752 
1753 	if (inst->phy_cfg->id == EXYNOS5_DRDPHY_UTMI) {
1754 		ret = exynos850_usbdrd_phy_exit(phy);
1755 		if (ret)
1756 			return ret;
1757 	}
1758 
1759 	exynos5_usbdrd_phy_isol(inst, true);
1760 
1761 	if (inst->phy_cfg->id != EXYNOS5_DRDPHY_UTMI)
1762 		return 0;
1763 
1764 	return regulator_bulk_disable(phy_drd->drv_data->n_regulators,
1765 				      phy_drd->regulators);
1766 }
1767 
1768 static const struct phy_ops gs101_usbdrd_phy_ops = {
1769 	.init		= exynos5_usbdrd_gs101_phy_init,
1770 	.exit		= exynos5_usbdrd_gs101_phy_exit,
1771 	.owner		= THIS_MODULE,
1772 };
1773 
exynos5_usbdrd_phy_clk_handle(struct exynos5_usbdrd_phy * phy_drd)1774 static int exynos5_usbdrd_phy_clk_handle(struct exynos5_usbdrd_phy *phy_drd)
1775 {
1776 	int ret;
1777 	struct clk *ref_clk;
1778 	unsigned long ref_rate;
1779 
1780 	phy_drd->clks = devm_kcalloc(phy_drd->dev, phy_drd->drv_data->n_clks,
1781 				     sizeof(*phy_drd->clks), GFP_KERNEL);
1782 	if (!phy_drd->clks)
1783 		return -ENOMEM;
1784 
1785 	for (int i = 0; i < phy_drd->drv_data->n_clks; ++i)
1786 		phy_drd->clks[i].id = phy_drd->drv_data->clk_names[i];
1787 
1788 	ret = devm_clk_bulk_get(phy_drd->dev, phy_drd->drv_data->n_clks,
1789 				phy_drd->clks);
1790 	if (ret)
1791 		return dev_err_probe(phy_drd->dev, ret,
1792 				     "failed to get phy clock(s)\n");
1793 
1794 	phy_drd->core_clks = devm_kcalloc(phy_drd->dev,
1795 					  phy_drd->drv_data->n_core_clks,
1796 					  sizeof(*phy_drd->core_clks),
1797 					  GFP_KERNEL);
1798 	if (!phy_drd->core_clks)
1799 		return -ENOMEM;
1800 
1801 	for (int i = 0; i < phy_drd->drv_data->n_core_clks; ++i)
1802 		phy_drd->core_clks[i].id = phy_drd->drv_data->core_clk_names[i];
1803 
1804 	ret = devm_clk_bulk_get(phy_drd->dev, phy_drd->drv_data->n_core_clks,
1805 				phy_drd->core_clks);
1806 	if (ret)
1807 		return dev_err_probe(phy_drd->dev, ret,
1808 				     "failed to get phy core clock(s)\n");
1809 
1810 	if (phy_drd->drv_data->n_core_clks) {
1811 		ref_clk = NULL;
1812 		for (int i = 0; i < phy_drd->drv_data->n_core_clks; ++i) {
1813 			if (!strcmp(phy_drd->core_clks[i].id, "ref")) {
1814 				ref_clk = phy_drd->core_clks[i].clk;
1815 				break;
1816 			}
1817 		}
1818 		if (!ref_clk)
1819 			return dev_err_probe(phy_drd->dev, -ENODEV,
1820 					     "failed to find phy reference clock\n");
1821 
1822 		ref_rate = clk_get_rate(ref_clk);
1823 		ret = exynos5_rate_to_clk(ref_rate, &phy_drd->extrefclk);
1824 		if (ret)
1825 			return dev_err_probe(phy_drd->dev, ret,
1826 					     "clock rate (%ld) not supported\n",
1827 					     ref_rate);
1828 	}
1829 
1830 	return 0;
1831 }
1832 
1833 static const struct exynos5_usbdrd_phy_config phy_cfg_exynos2200[] = {
1834 	{
1835 		.id		= EXYNOS5_DRDPHY_UTMI,
1836 		.phy_isol	= exynos5_usbdrd_phy_isol,
1837 		.phy_init	= exynos2200_usbdrd_utmi_init,
1838 	},
1839 };
1840 
exynos5_usbdrd_orien_sw_set(struct typec_switch_dev * sw,enum typec_orientation orientation)1841 static int exynos5_usbdrd_orien_sw_set(struct typec_switch_dev *sw,
1842 				       enum typec_orientation orientation)
1843 {
1844 	struct exynos5_usbdrd_phy *phy_drd = typec_switch_get_drvdata(sw);
1845 	int ret;
1846 
1847 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
1848 	if (ret) {
1849 		dev_err(phy_drd->dev, "Failed to enable PHY clocks(s)\n");
1850 		return ret;
1851 	}
1852 
1853 	scoped_guard(mutex, &phy_drd->phy_mutex) {
1854 		void __iomem * const regs_base = phy_drd->reg_phy;
1855 		unsigned int reg;
1856 
1857 		if (orientation == TYPEC_ORIENTATION_NONE) {
1858 			reg = readl(regs_base + EXYNOS850_DRD_UTMI);
1859 			reg &= ~(UTMI_FORCE_VBUSVALID | UTMI_FORCE_BVALID);
1860 			writel(reg, regs_base +  EXYNOS850_DRD_UTMI);
1861 
1862 			reg = readl(regs_base + EXYNOS850_DRD_HSP);
1863 			reg |= HSP_VBUSVLDEXTSEL;
1864 			reg &= ~HSP_VBUSVLDEXT;
1865 			writel(reg, regs_base + EXYNOS850_DRD_HSP);
1866 		} else {
1867 			reg = readl(regs_base + EXYNOS850_DRD_UTMI);
1868 			reg |= UTMI_FORCE_VBUSVALID | UTMI_FORCE_BVALID;
1869 			writel(reg, regs_base +  EXYNOS850_DRD_UTMI);
1870 
1871 			reg = readl(regs_base + EXYNOS850_DRD_HSP);
1872 			reg |= HSP_VBUSVLDEXTSEL | HSP_VBUSVLDEXT;
1873 			writel(reg, regs_base + EXYNOS850_DRD_HSP);
1874 		}
1875 
1876 		phy_drd->orientation = orientation;
1877 	}
1878 
1879 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
1880 
1881 	return 0;
1882 }
1883 
exynos5_usbdrd_orien_switch_unregister(void * data)1884 static void exynos5_usbdrd_orien_switch_unregister(void *data)
1885 {
1886 	struct exynos5_usbdrd_phy *phy_drd = data;
1887 
1888 	typec_switch_unregister(phy_drd->sw);
1889 }
1890 
exynos5_usbdrd_setup_notifiers(struct exynos5_usbdrd_phy * phy_drd)1891 static int exynos5_usbdrd_setup_notifiers(struct exynos5_usbdrd_phy *phy_drd)
1892 {
1893 	int ret;
1894 
1895 	if (!IS_ENABLED(CONFIG_TYPEC))
1896 		return 0;
1897 
1898 	if (device_property_present(phy_drd->dev, "orientation-switch")) {
1899 		struct typec_switch_desc sw_desc = { };
1900 
1901 		sw_desc.drvdata = phy_drd;
1902 		sw_desc.fwnode = dev_fwnode(phy_drd->dev);
1903 		sw_desc.set = exynos5_usbdrd_orien_sw_set;
1904 
1905 		phy_drd->sw = typec_switch_register(phy_drd->dev, &sw_desc);
1906 		if (IS_ERR(phy_drd->sw))
1907 			return dev_err_probe(phy_drd->dev,
1908 					     PTR_ERR(phy_drd->sw),
1909 					     "Failed to register TypeC orientation switch\n");
1910 
1911 		ret = devm_add_action_or_reset(phy_drd->dev,
1912 					       exynos5_usbdrd_orien_switch_unregister,
1913 					       phy_drd);
1914 		if (ret)
1915 			return dev_err_probe(phy_drd->dev, ret,
1916 					     "Failed to register TypeC orientation devm action\n");
1917 	}
1918 
1919 	return 0;
1920 }
1921 
1922 static const struct exynos5_usbdrd_phy_config phy_cfg_exynos5[] = {
1923 	{
1924 		.id		= EXYNOS5_DRDPHY_UTMI,
1925 		.phy_isol	= exynos5_usbdrd_phy_isol,
1926 		.phy_init	= exynos5_usbdrd_utmi_init,
1927 		.set_refclk	= exynos5_usbdrd_utmi_set_refclk,
1928 	},
1929 	{
1930 		.id		= EXYNOS5_DRDPHY_PIPE3,
1931 		.phy_isol	= exynos5_usbdrd_phy_isol,
1932 		.phy_init	= exynos5_usbdrd_pipe3_init,
1933 		.set_refclk	= exynos5_usbdrd_pipe3_set_refclk,
1934 	},
1935 };
1936 
1937 static const struct exynos5_usbdrd_phy_config phy_cfg_exynos7870[] = {
1938 	{
1939 		.id		= EXYNOS5_DRDPHY_UTMI,
1940 		.phy_isol	= exynos7870_usbdrd_phy_isol,
1941 		.phy_init	= exynos7870_usbdrd_utmi_init,
1942 	},
1943 };
1944 
1945 static const struct exynos5_usbdrd_phy_config phy_cfg_exynos850[] = {
1946 	{
1947 		.id		= EXYNOS5_DRDPHY_UTMI,
1948 		.phy_isol	= exynos5_usbdrd_phy_isol,
1949 		.phy_init	= exynos850_usbdrd_utmi_init,
1950 	},
1951 };
1952 
1953 static
1954 const struct exynos5_usbdrd_phy_tuning exynos7870_tunes_utmi_postinit[] = {
1955 	PHY_TUNING_ENTRY_PHY(EXYNOS5_DRD_PHYPARAM0,
1956 			     (PHYPARAM0_TXVREFTUNE | PHYPARAM0_TXRISETUNE |
1957 			      PHYPARAM0_TXRESTUNE | PHYPARAM0_TXPREEMPPULSETUNE |
1958 			      PHYPARAM0_TXPREEMPAMPTUNE | PHYPARAM0_TXHSXVTUNE |
1959 			      PHYPARAM0_TXFSLSTUNE | PHYPARAM0_SQRXTUNE |
1960 			      PHYPARAM0_OTGTUNE | PHYPARAM0_COMPDISTUNE),
1961 			     (FIELD_PREP_CONST(PHYPARAM0_TXVREFTUNE, 3) |
1962 			      FIELD_PREP_CONST(PHYPARAM0_TXRISETUNE, 1) |
1963 			      FIELD_PREP_CONST(PHYPARAM0_TXRESTUNE, 2) |
1964 			      FIELD_PREP_CONST(PHYPARAM0_TXPREEMPPULSETUNE, 0) |
1965 			      FIELD_PREP_CONST(PHYPARAM0_TXPREEMPAMPTUNE, 0) |
1966 			      FIELD_PREP_CONST(PHYPARAM0_TXHSXVTUNE, 0) |
1967 			      FIELD_PREP_CONST(PHYPARAM0_TXFSLSTUNE, 3) |
1968 			      FIELD_PREP_CONST(PHYPARAM0_SQRXTUNE, 5) |
1969 			      FIELD_PREP_CONST(PHYPARAM0_OTGTUNE, 2) |
1970 			      FIELD_PREP_CONST(PHYPARAM0_COMPDISTUNE, 3))),
1971 	PHY_TUNING_ENTRY_LAST
1972 };
1973 
1974 static const struct exynos5_usbdrd_phy_tuning *exynos7870_tunes[PTS_MAX] = {
1975 	[PTS_UTMI_POSTINIT] = exynos7870_tunes_utmi_postinit,
1976 };
1977 
1978 static const char * const exynos5_clk_names[] = {
1979 	"phy",
1980 };
1981 
1982 static const char * const exynos5_core_clk_names[] = {
1983 	"ref",
1984 };
1985 
1986 static const char * const exynos5433_core_clk_names[] = {
1987 	"ref", "phy_pipe", "phy_utmi", "itp",
1988 };
1989 
1990 static const char * const exynos5_regulator_names[] = {
1991 	"vbus", "vbus-boost",
1992 };
1993 
1994 static const struct exynos5_usbdrd_phy_drvdata exynos2200_usb32drd_phy = {
1995 	.phy_cfg		= phy_cfg_exynos2200,
1996 	.phy_ops		= &exynos2200_usbdrd_phy_ops,
1997 	.pmu_offset_usbdrd0_phy	= EXYNOS2200_PHY_CTRL_USB20,
1998 	.clk_names		= exynos5_clk_names,
1999 	.n_clks			= ARRAY_SIZE(exynos5_clk_names),
2000 	/* clocks and regulators are specific to the underlying PHY blocks */
2001 	.core_clk_names		= NULL,
2002 	.n_core_clks		= 0,
2003 	.regulator_names	= NULL,
2004 	.n_regulators		= 0,
2005 };
2006 
2007 static const struct exynos5_usbdrd_phy_drvdata exynos5420_usbdrd_phy = {
2008 	.phy_cfg		= phy_cfg_exynos5,
2009 	.phy_ops		= &exynos5_usbdrd_phy_ops,
2010 	.pmu_offset_usbdrd0_phy	= EXYNOS5_USBDRD_PHY_CONTROL,
2011 	.pmu_offset_usbdrd1_phy	= EXYNOS5420_USBDRD1_PHY_CONTROL,
2012 	.clk_names		= exynos5_clk_names,
2013 	.n_clks			= ARRAY_SIZE(exynos5_clk_names),
2014 	.core_clk_names		= exynos5_core_clk_names,
2015 	.n_core_clks		= ARRAY_SIZE(exynos5_core_clk_names),
2016 	.regulator_names	= exynos5_regulator_names,
2017 	.n_regulators		= ARRAY_SIZE(exynos5_regulator_names),
2018 };
2019 
2020 static const struct exynos5_usbdrd_phy_drvdata exynos5250_usbdrd_phy = {
2021 	.phy_cfg		= phy_cfg_exynos5,
2022 	.phy_ops		= &exynos5_usbdrd_phy_ops,
2023 	.pmu_offset_usbdrd0_phy	= EXYNOS5_USBDRD_PHY_CONTROL,
2024 	.clk_names		= exynos5_clk_names,
2025 	.n_clks			= ARRAY_SIZE(exynos5_clk_names),
2026 	.core_clk_names		= exynos5_core_clk_names,
2027 	.n_core_clks		= ARRAY_SIZE(exynos5_core_clk_names),
2028 	.regulator_names	= exynos5_regulator_names,
2029 	.n_regulators		= ARRAY_SIZE(exynos5_regulator_names),
2030 };
2031 
2032 static const struct exynos5_usbdrd_phy_drvdata exynos5433_usbdrd_phy = {
2033 	.phy_cfg		= phy_cfg_exynos5,
2034 	.phy_ops		= &exynos5_usbdrd_phy_ops,
2035 	.pmu_offset_usbdrd0_phy	= EXYNOS5_USBDRD_PHY_CONTROL,
2036 	.pmu_offset_usbdrd1_phy	= EXYNOS5433_USBHOST30_PHY_CONTROL,
2037 	.clk_names		= exynos5_clk_names,
2038 	.n_clks			= ARRAY_SIZE(exynos5_clk_names),
2039 	.core_clk_names		= exynos5433_core_clk_names,
2040 	.n_core_clks		= ARRAY_SIZE(exynos5433_core_clk_names),
2041 	.regulator_names	= exynos5_regulator_names,
2042 	.n_regulators		= ARRAY_SIZE(exynos5_regulator_names),
2043 };
2044 
2045 static const struct exynos5_usbdrd_phy_drvdata exynos7_usbdrd_phy = {
2046 	.phy_cfg		= phy_cfg_exynos5,
2047 	.phy_ops		= &exynos5_usbdrd_phy_ops,
2048 	.pmu_offset_usbdrd0_phy	= EXYNOS5_USBDRD_PHY_CONTROL,
2049 	.clk_names		= exynos5_clk_names,
2050 	.n_clks			= ARRAY_SIZE(exynos5_clk_names),
2051 	.core_clk_names		= exynos5433_core_clk_names,
2052 	.n_core_clks		= ARRAY_SIZE(exynos5433_core_clk_names),
2053 	.regulator_names	= exynos5_regulator_names,
2054 	.n_regulators		= ARRAY_SIZE(exynos5_regulator_names),
2055 };
2056 
2057 static const struct exynos5_usbdrd_phy_drvdata exynos7870_usbdrd_phy = {
2058 	.phy_cfg		= phy_cfg_exynos7870,
2059 	.phy_tunes		= exynos7870_tunes,
2060 	.phy_ops		= &exynos7870_usbdrd_phy_ops,
2061 	.pmu_offset_usbdrd0_phy	= EXYNOS5_USBDRD_PHY_CONTROL,
2062 	.clk_names		= exynos5_clk_names,
2063 	.n_clks			= ARRAY_SIZE(exynos5_clk_names),
2064 	.core_clk_names		= exynos5_core_clk_names,
2065 	.n_core_clks		= ARRAY_SIZE(exynos5_core_clk_names),
2066 	.regulator_names	= exynos5_regulator_names,
2067 	.n_regulators		= ARRAY_SIZE(exynos5_regulator_names),
2068 };
2069 
2070 static const struct exynos5_usbdrd_phy_drvdata exynos850_usbdrd_phy = {
2071 	.phy_cfg		= phy_cfg_exynos850,
2072 	.phy_ops		= &exynos850_usbdrd_phy_ops,
2073 	.pmu_offset_usbdrd0_phy	= EXYNOS5_USBDRD_PHY_CONTROL,
2074 	.clk_names		= exynos5_clk_names,
2075 	.n_clks			= ARRAY_SIZE(exynos5_clk_names),
2076 	.core_clk_names		= exynos5_core_clk_names,
2077 	.n_core_clks		= ARRAY_SIZE(exynos5_core_clk_names),
2078 	.regulator_names	= exynos5_regulator_names,
2079 	.n_regulators		= ARRAY_SIZE(exynos5_regulator_names),
2080 };
2081 
2082 static const struct exynos5_usbdrd_phy_tuning exynos990_tunes_utmi_postinit[] = {
2083 	PHY_TUNING_ENTRY_PHY(EXYNOS850_DRD_HSPPARACON,
2084 			     (HSPPARACON_TXVREF |
2085 			      HSPPARACON_TXPREEMPAMP | HSPPARACON_SQRX |
2086 			      HSPPARACON_COMPDIS),
2087 			     (FIELD_PREP_CONST(HSPPARACON_TXVREF, 7) |
2088 			      FIELD_PREP_CONST(HSPPARACON_TXPREEMPAMP, 3) |
2089 			      FIELD_PREP_CONST(HSPPARACON_SQRX, 5) |
2090 			      FIELD_PREP_CONST(HSPPARACON_COMPDIS, 7))),
2091 	PHY_TUNING_ENTRY_LAST
2092 };
2093 
2094 static const struct exynos5_usbdrd_phy_tuning *exynos990_tunes[PTS_MAX] = {
2095 	[PTS_UTMI_POSTINIT] = exynos990_tunes_utmi_postinit,
2096 };
2097 
2098 static const struct exynos5_usbdrd_phy_drvdata exynos990_usbdrd_phy = {
2099 	.phy_cfg		= phy_cfg_exynos850,
2100 	.phy_ops		= &exynos850_usbdrd_phy_ops,
2101 	.phy_tunes		= exynos990_tunes,
2102 	.pmu_offset_usbdrd0_phy	= EXYNOS990_PHY_CTRL_USB20,
2103 	.clk_names		= exynos5_clk_names,
2104 	.n_clks			= ARRAY_SIZE(exynos5_clk_names),
2105 	.core_clk_names		= exynos5_core_clk_names,
2106 	.n_core_clks		= ARRAY_SIZE(exynos5_core_clk_names),
2107 	.regulator_names	= exynos5_regulator_names,
2108 	.n_regulators		= ARRAY_SIZE(exynos5_regulator_names),
2109 };
2110 
2111 static void
exynosautov920_usb31drd_cr_clk(struct exynos5_usbdrd_phy * phy_drd,bool high)2112 exynosautov920_usb31drd_cr_clk(struct exynos5_usbdrd_phy *phy_drd, bool high)
2113 {
2114 	void __iomem *reg_phy = phy_drd->reg_phy;
2115 	u32 reg;
2116 
2117 	reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
2118 	if (high)
2119 		reg |= PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK;
2120 	else
2121 		reg &= ~PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK;
2122 
2123 	writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
2124 	fsleep(1);
2125 }
2126 
2127 static void
exynosautov920_usb31drd_port_phy_ready(struct exynos5_usbdrd_phy * phy_drd)2128 exynosautov920_usb31drd_port_phy_ready(struct exynos5_usbdrd_phy *phy_drd)
2129 {
2130 	struct device *dev = phy_drd->dev;
2131 	void __iomem *reg_phy = phy_drd->reg_phy;
2132 	static const unsigned int timeout_us = 20000;
2133 	static const unsigned int sleep_us = 40;
2134 	u32 reg;
2135 	int err;
2136 
2137 	/* Clear cr_para_con */
2138 	reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
2139 	reg &= ~(PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK |
2140 			PHY_CR_PARA_CON0_PHY0_CR_PARA_ADDR);
2141 	reg |= PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL;
2142 	writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
2143 	writel(0x0, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON1);
2144 	writel(0x0, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON2);
2145 
2146 	exynosautov920_usb31drd_cr_clk(phy_drd, true);
2147 	exynosautov920_usb31drd_cr_clk(phy_drd, false);
2148 
2149 	/*
2150 	 * The maximum time from phy reset de-assertion to de-assertion of
2151 	 * tx/rx_ack can be as high as 5ms in fast simulation mode.
2152 	 * Time to phy ready is < 20ms
2153 	 */
2154 	err = readl_poll_timeout(reg_phy +
2155 				EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0,
2156 			reg, !(reg & PHY_CR_PARA_CON0_PHY0_CR_PARA_ACK),
2157 			sleep_us, timeout_us);
2158 	if (err)
2159 		dev_err(dev, "timed out waiting for rx/tx_ack: %#.8x\n", reg);
2160 
2161 	reg &= ~PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK;
2162 	writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
2163 }
2164 
2165 static void
exynosautov920_usb31drd_cr_write(struct exynos5_usbdrd_phy * phy_drd,u16 addr,u16 data)2166 exynosautov920_usb31drd_cr_write(struct exynos5_usbdrd_phy *phy_drd,
2167 				 u16 addr, u16 data)
2168 {
2169 	void __iomem *reg_phy = phy_drd->reg_phy;
2170 	u32 cnt = 0;
2171 	u32 reg;
2172 
2173 	/* Pre Clocking */
2174 	reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
2175 	reg |= PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL;
2176 	writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
2177 
2178 	/*
2179 	 * tx clks must be available prior to assertion of tx req.
2180 	 * tx pstate p2 to p0 transition directly is not permitted.
2181 	 * tx clk ready must be asserted synchronously on tx clk prior
2182 	 * to internal transmit clk alignment sequence in the phy
2183 	 * when entering from p2 to p1 to p0.
2184 	 */
2185 	do {
2186 		exynosautov920_usb31drd_cr_clk(phy_drd, true);
2187 		exynosautov920_usb31drd_cr_clk(phy_drd, false);
2188 		cnt++;
2189 	} while (cnt < 15);
2190 
2191 	reg &= ~PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL;
2192 	writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
2193 
2194 	/*
2195 	 * tx data path is active when tx lane is in p0 state
2196 	 * and tx data en asserted. enable cr_para_wr_en.
2197 	 */
2198 	reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON2);
2199 	reg &= ~PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_DATA;
2200 	reg |= FIELD_PREP(PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_DATA, data) |
2201 		PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_EN;
2202 	writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON2);
2203 
2204 	/* write addr */
2205 	reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
2206 	reg &= ~PHY_CR_PARA_CON0_PHY0_CR_PARA_ADDR;
2207 	reg |= FIELD_PREP(PHY_CR_PARA_CON0_PHY0_CR_PARA_ADDR, addr) |
2208 		PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK |
2209 		PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL;
2210 	writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
2211 
2212 	/* check cr_para_ack*/
2213 	cnt = 0;
2214 	do {
2215 		/*
2216 		 * data symbols are captured by phy on rising edge of the
2217 		 * tx_clk when tx data enabled.
2218 		 * completion of the write cycle is acknowledged by assertion
2219 		 * of the cr_para_ack.
2220 		 */
2221 		exynosautov920_usb31drd_cr_clk(phy_drd, true);
2222 		reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
2223 		if ((reg & PHY_CR_PARA_CON0_PHY0_CR_PARA_ACK))
2224 			break;
2225 
2226 		exynosautov920_usb31drd_cr_clk(phy_drd, false);
2227 
2228 		/*
2229 		 * wait for minimum of 10 cr_para_clk cycles after phy reset
2230 		 * is negated, before accessing control regs to allow for
2231 		 * internal resets.
2232 		 */
2233 		cnt++;
2234 	} while (cnt < 10);
2235 
2236 	if (cnt < 10)
2237 		exynosautov920_usb31drd_cr_clk(phy_drd, false);
2238 }
2239 
2240 static void
exynosautov920_usb31drd_phy_reset(struct exynos5_usbdrd_phy * phy_drd,int val)2241 exynosautov920_usb31drd_phy_reset(struct exynos5_usbdrd_phy *phy_drd, int val)
2242 {
2243 	void __iomem *reg_phy = phy_drd->reg_phy;
2244 	u32 reg;
2245 
2246 	reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL);
2247 	reg &= ~PHY_RST_CTRL_PHY_RESET_OVRD_EN;
2248 	writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL);
2249 
2250 	reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL);
2251 	if (val)
2252 		reg |= PHY_RST_CTRL_PHY_RESET;
2253 	else
2254 		reg &= ~PHY_RST_CTRL_PHY_RESET;
2255 
2256 	reg |= PHY_RST_CTRL_PHY_RESET_OVRD_EN;
2257 	writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL);
2258 }
2259 
2260 static void
exynosautov920_usb31drd_lane0_reset(struct exynos5_usbdrd_phy * phy_drd,int val)2261 exynosautov920_usb31drd_lane0_reset(struct exynos5_usbdrd_phy *phy_drd, int val)
2262 {
2263 	void __iomem *reg_phy = phy_drd->reg_phy;
2264 	u32 reg;
2265 
2266 	reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL);
2267 	reg |= PHY_RST_CTRL_PIPE_LANE0_RESET_N_OVRD_EN;
2268 	writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL);
2269 
2270 	reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL);
2271 	if (val)
2272 		reg &= ~PHY_RST_CTRL_PIPE_LANE0_RESET_N;
2273 	else
2274 		reg |= PHY_RST_CTRL_PIPE_LANE0_RESET_N;
2275 
2276 	reg &= ~PHY_RST_CTRL_PIPE_LANE0_RESET_N_OVRD_EN;
2277 	writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL);
2278 }
2279 
2280 static void
exynosautov920_usb31drd_pipe3_init(struct exynos5_usbdrd_phy * phy_drd)2281 exynosautov920_usb31drd_pipe3_init(struct exynos5_usbdrd_phy *phy_drd)
2282 {
2283 	void __iomem *reg_phy = phy_drd->reg_phy;
2284 	u32 reg;
2285 
2286 	/*
2287 	 * Phy and Pipe Lane reset assert.
2288 	 * assert reset (phy_reset = 1).
2289 	 * The lane-ack outputs are asserted during reset (tx_ack = rx_ack = 1)
2290 	 */
2291 	exynosautov920_usb31drd_phy_reset(phy_drd, 1);
2292 	exynosautov920_usb31drd_lane0_reset(phy_drd, 1);
2293 
2294 	/*
2295 	 * ANA Power En, PCS & PMA PWR Stable Set
2296 	 * ramp-up power suppiles
2297 	 */
2298 	reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CONFIG0);
2299 	reg |= PHY_CONFIG0_PHY0_ANA_PWR_EN | PHY_CONFIG0_PHY0_PCS_PWR_STABLE |
2300 		PHY_CONFIG0_PHY0_PMA_PWR_STABLE;
2301 	writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CONFIG0);
2302 
2303 	fsleep(10);
2304 
2305 	/*
2306 	 * phy is not functional in test_powerdown mode, test_powerdown to be
2307 	 * de-asserted for normal operation
2308 	 */
2309 	reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CONFIG7);
2310 	reg &= ~PHY_CONFIG7_PHY_TEST_POWERDOWN;
2311 	writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CONFIG7);
2312 
2313 	/*
2314 	 * phy reset signal be asserted for minimum 10us after power
2315 	 * supplies are ramped-up
2316 	 */
2317 	fsleep(10);
2318 
2319 	/*
2320 	 * Phy and Pipe Lane reset assert de-assert
2321 	 */
2322 	exynosautov920_usb31drd_phy_reset(phy_drd, 0);
2323 	exynosautov920_usb31drd_lane0_reset(phy_drd, 0);
2324 
2325 	/* Pipe_rx0_sris_mode_en  = 1 */
2326 	reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CONFIG4);
2327 	reg |= PHY_CONFIG4_PIPE_RX0_SRIS_MODE_EN;
2328 	writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CONFIG4);
2329 
2330 	/*
2331 	 * wait for lane ack outputs to de-assert (tx_ack = rx_ack = 0)
2332 	 * Exit from the reset state is indicated by de-assertion of *_ack
2333 	 */
2334 	exynosautov920_usb31drd_port_phy_ready(phy_drd);
2335 
2336 	/* override values for level settings */
2337 	exynosautov920_usb31drd_cr_write(phy_drd, 0x22, 0x00F5);
2338 }
2339 
2340 static void
exynosautov920_usb31drd_ssphy_disable(struct exynos5_usbdrd_phy * phy_drd)2341 exynosautov920_usb31drd_ssphy_disable(struct exynos5_usbdrd_phy *phy_drd)
2342 {
2343 	void __iomem *reg_phy = phy_drd->reg_phy;
2344 	u32 reg;
2345 
2346 	/* 1. Assert reset (phy_reset = 1) */
2347 	exynosautov920_usb31drd_lane0_reset(phy_drd, 1);
2348 	exynosautov920_usb31drd_phy_reset(phy_drd, 1);
2349 
2350 	/* phy test power down */
2351 	reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CONFIG7);
2352 	reg |= PHY_CONFIG7_PHY_TEST_POWERDOWN;
2353 	writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CONFIG7);
2354 }
2355 
2356 static void
exynosautov920_usbdrd_utmi_init(struct exynos5_usbdrd_phy * phy_drd)2357 exynosautov920_usbdrd_utmi_init(struct exynos5_usbdrd_phy *phy_drd)
2358 {
2359 	void __iomem *reg_phy = phy_drd->reg_phy;
2360 	u32 reg;
2361 
2362 	/*
2363 	 * Disable HWACG (hardware auto clock gating control). This
2364 	 * forces QACTIVE signal in Q-Channel interface to HIGH level,
2365 	 * to make sure the PHY clock is not gated by the hardware.
2366 	 */
2367 	reg = readl(reg_phy + EXYNOS850_DRD_LINKCTRL);
2368 	reg |= LINKCTRL_FORCE_QACT;
2369 	writel(reg, reg_phy + EXYNOS850_DRD_LINKCTRL);
2370 
2371 	/* De-assert link reset */
2372 	reg = readl(reg_phy + EXYNOS2200_DRD_CLKRST);
2373 	reg &= ~CLKRST_LINK_SW_RST;
2374 	writel(reg, reg_phy + EXYNOS2200_DRD_CLKRST);
2375 
2376 	/* Set PHY POR High */
2377 	reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSP_CLKRST);
2378 	reg |= HSPCLKRST_PHY20_SW_POR | HSPCLKRST_PHY20_SW_POR_SEL;
2379 	writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSP_CLKRST);
2380 
2381 	/* Enable UTMI+ */
2382 	reg = readl(reg_phy + EXYNOS2200_DRD_UTMI);
2383 	reg &= ~(UTMICTL_FORCE_UTMI_SUSPEND | UTMICTL_FORCE_UTMI_SLEEP |
2384 		UTMICTL_FORCE_DPPULLDOWN | UTMICTL_FORCE_DMPULLDOWN);
2385 	writel(reg, reg_phy + EXYNOS2200_DRD_UTMI);
2386 
2387 	/* set phy clock & control HS phy */
2388 	reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSPCTL);
2389 	reg |= HSPCTRL_EN_UTMISUSPEND | HSPCTRL_COMMONONN;
2390 	writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSPCTL);
2391 
2392 	fsleep(100);
2393 
2394 	/* Set VBUS Valid and DP-Pull up control by VBUS pad usage */
2395 	reg = readl(reg_phy + EXYNOS850_DRD_LINKCTRL);
2396 	reg |= FIELD_PREP_CONST(LINKCTRL_BUS_FILTER_BYPASS, 0xf);
2397 	writel(reg, reg_phy + EXYNOS850_DRD_LINKCTRL);
2398 
2399 	reg = readl(reg_phy + EXYNOS2200_DRD_UTMI);
2400 	reg |= EXYNOS2200_UTMI_FORCE_VBUSVALID | EXYNOS2200_UTMI_FORCE_BVALID;
2401 	writel(reg, reg_phy + EXYNOS2200_DRD_UTMI);
2402 
2403 	reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSPCTL);
2404 	reg |= HSPCTRL_VBUSVLDEXTSEL | HSPCTRL_VBUSVLDEXT;
2405 	writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSPCTL);
2406 
2407 	/* Setting FSEL for refference clock */
2408 	reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSPPLLTUNE);
2409 	reg &= ~HSPPLLTUNE_FSEL;
2410 
2411 	switch (phy_drd->extrefclk) {
2412 	case EXYNOS5_FSEL_50MHZ:
2413 		reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 7);
2414 		break;
2415 	case EXYNOS5_FSEL_26MHZ:
2416 		reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 6);
2417 		break;
2418 	case EXYNOS5_FSEL_24MHZ:
2419 		reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 2);
2420 		break;
2421 	case EXYNOS5_FSEL_20MHZ:
2422 		reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 1);
2423 		break;
2424 	case EXYNOS5_FSEL_19MHZ2:
2425 		reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 0);
2426 		break;
2427 	default:
2428 		dev_warn(phy_drd->dev, "unsupported ref clk: %#.2x\n",
2429 			 phy_drd->extrefclk);
2430 		break;
2431 	}
2432 	writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSPPLLTUNE);
2433 
2434 	/* Enable PHY Power Mode */
2435 	reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSP_TEST);
2436 	reg &= ~HSP_TEST_SIDDQ;
2437 	writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSP_TEST);
2438 
2439 	/* before POR low, 10us delay is needed to Finish PHY reset */
2440 	fsleep(10);
2441 
2442 	/* Set PHY POR Low */
2443 	reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSP_CLKRST);
2444 	reg |= HSPCLKRST_PHY20_SW_POR_SEL;
2445 	reg &= ~(HSPCLKRST_PHY20_SW_POR | HSPCLKRST_PHY20_SW_PORTRESET);
2446 	writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSP_CLKRST);
2447 
2448 	/* after POR low and delay 75us, PHYCLOCK is guaranteed. */
2449 	fsleep(75);
2450 
2451 	/* Disable forcing pipe interface */
2452 	reg = readl(reg_phy + EXYNOS850_DRD_LINKCTRL);
2453 	reg &= ~LINKCTRL_FORCE_PIPE_EN;
2454 	writel(reg, reg_phy + EXYNOS850_DRD_LINKCTRL);
2455 
2456 	/* Pclk to pipe_clk */
2457 	reg = readl(reg_phy + EXYNOS2200_DRD_CLKRST);
2458 	reg |= EXYNOS2200_CLKRST_LINK_PCLK_SEL;
2459 	writel(reg, reg_phy + EXYNOS2200_DRD_CLKRST);
2460 }
2461 
2462 static void
exynosautov920_usbdrd_hsphy_disable(struct exynos5_usbdrd_phy * phy_drd)2463 exynosautov920_usbdrd_hsphy_disable(struct exynos5_usbdrd_phy *phy_drd)
2464 {
2465 	u32 reg;
2466 	void __iomem *reg_phy = phy_drd->reg_phy;
2467 
2468 	/* set phy clock & control HS phy */
2469 	reg = readl(reg_phy + EXYNOS2200_DRD_UTMI);
2470 	reg |= UTMICTL_FORCE_UTMI_SUSPEND | UTMICTL_FORCE_UTMI_SLEEP;
2471 	reg &= ~(UTMICTL_FORCE_DPPULLDOWN | UTMICTL_FORCE_DMPULLDOWN);
2472 	writel(reg, reg_phy + EXYNOS2200_DRD_UTMI);
2473 
2474 	/* Disable PHY Power Mode */
2475 	reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSP_TEST);
2476 	reg |= HSP_TEST_SIDDQ;
2477 	writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSP_TEST);
2478 
2479 	/* clear force q-channel */
2480 	reg = readl(reg_phy + EXYNOS850_DRD_LINKCTRL);
2481 	reg &= ~LINKCTRL_FORCE_QACT;
2482 	writel(reg, reg_phy + EXYNOS850_DRD_LINKCTRL);
2483 
2484 	/* link sw reset is need for USB_DP/DM high-z in host mode */
2485 	reg = readl(reg_phy + EXYNOS2200_DRD_CLKRST);
2486 	reg |= CLKRST_LINK_SW_RST;
2487 	writel(reg, reg_phy + EXYNOS2200_DRD_CLKRST);
2488 	fsleep(10);
2489 	reg &= ~CLKRST_LINK_SW_RST;
2490 	writel(reg, reg_phy + EXYNOS2200_DRD_CLKRST);
2491 }
2492 
exynosautov920_usbdrd_phy_init(struct phy * phy)2493 static int exynosautov920_usbdrd_phy_init(struct phy *phy)
2494 {
2495 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
2496 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
2497 	int ret;
2498 
2499 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
2500 	if (ret)
2501 		return ret;
2502 
2503 	/* Bypass PHY isol */
2504 	inst->phy_cfg->phy_isol(inst, false);
2505 
2506 	/* UTMI or PIPE3 specific init */
2507 	inst->phy_cfg->phy_init(phy_drd);
2508 
2509 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
2510 
2511 	return 0;
2512 }
2513 
exynosautov920_usbdrd_phy_exit(struct phy * phy)2514 static int exynosautov920_usbdrd_phy_exit(struct phy *phy)
2515 {
2516 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
2517 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
2518 	int ret;
2519 
2520 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
2521 	if (ret)
2522 		return ret;
2523 
2524 	exynos850_usbdrd_phy_exit(phy);
2525 
2526 	/* enable PHY isol */
2527 	inst->phy_cfg->phy_isol(inst, true);
2528 
2529 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
2530 
2531 	return 0;
2532 }
2533 
exynosautov920_usbdrd_combo_phy_exit(struct phy * phy)2534 static int exynosautov920_usbdrd_combo_phy_exit(struct phy *phy)
2535 {
2536 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
2537 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
2538 	int ret = 0;
2539 
2540 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
2541 	if (ret)
2542 		return ret;
2543 
2544 	if (inst->phy_cfg->id == EXYNOS5_DRDPHY_UTMI)
2545 		exynosautov920_usbdrd_hsphy_disable(phy_drd);
2546 	else if (inst->phy_cfg->id == EXYNOS5_DRDPHY_PIPE3)
2547 		exynosautov920_usb31drd_ssphy_disable(phy_drd);
2548 
2549 	/* enable PHY isol */
2550 	inst->phy_cfg->phy_isol(inst, true);
2551 
2552 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
2553 
2554 	return 0;
2555 }
2556 
exynosautov920_usbdrd_phy_power_on(struct phy * phy)2557 static int exynosautov920_usbdrd_phy_power_on(struct phy *phy)
2558 {
2559 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
2560 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
2561 	int ret;
2562 
2563 	dev_dbg(phy_drd->dev, "Request to power_on usbdrd_phy phy\n");
2564 
2565 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_core_clks,
2566 				      phy_drd->core_clks);
2567 	if (ret)
2568 		return ret;
2569 
2570 	/* Enable supply */
2571 	ret = regulator_bulk_enable(phy_drd->drv_data->n_regulators,
2572 				    phy_drd->regulators);
2573 	if (ret) {
2574 		dev_err(phy_drd->dev, "Failed to enable PHY regulator(s)\n");
2575 		goto fail_supply;
2576 	}
2577 
2578 	return 0;
2579 
2580 fail_supply:
2581 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_core_clks,
2582 				   phy_drd->core_clks);
2583 
2584 	return ret;
2585 }
2586 
exynosautov920_usbdrd_phy_power_off(struct phy * phy)2587 static int exynosautov920_usbdrd_phy_power_off(struct phy *phy)
2588 {
2589 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
2590 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
2591 
2592 	dev_dbg(phy_drd->dev, "Request to power_off usbdrd_phy phy\n");
2593 
2594 	/* Disable supply */
2595 	regulator_bulk_disable(phy_drd->drv_data->n_regulators,
2596 			       phy_drd->regulators);
2597 
2598 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_core_clks,
2599 				   phy_drd->core_clks);
2600 
2601 	return 0;
2602 }
2603 
2604 static const char * const exynosautov920_usb30_regulators[] = {
2605 	"dvdd", "vdd18",
2606 };
2607 
2608 static const char * const exynosautov920_usb20_regulators[] = {
2609 	"dvdd", "vdd18", "vdd33",
2610 };
2611 
2612 static const struct
2613 exynos5_usbdrd_phy_config usb31drd_phy_cfg_exynosautov920[] = {
2614 	{
2615 		.id		= EXYNOS5_DRDPHY_PIPE3,
2616 		.phy_isol	= exynos5_usbdrd_phy_isol,
2617 		.phy_init	= exynosautov920_usb31drd_pipe3_init,
2618 	},
2619 };
2620 
2621 static const struct phy_ops exynosautov920_usb31drd_combo_ssphy_ops = {
2622 	.init		= exynosautov920_usbdrd_phy_init,
2623 	.exit		= exynosautov920_usbdrd_combo_phy_exit,
2624 	.power_on	= exynosautov920_usbdrd_phy_power_on,
2625 	.power_off	= exynosautov920_usbdrd_phy_power_off,
2626 	.owner		= THIS_MODULE,
2627 };
2628 
2629 static const
2630 struct exynos5_usbdrd_phy_drvdata exynosautov920_usb31drd_combo_ssphy = {
2631 	.phy_cfg		= usb31drd_phy_cfg_exynosautov920,
2632 	.phy_ops		= &exynosautov920_usb31drd_combo_ssphy_ops,
2633 	.pmu_offset_usbdrd0_phy	= EXYNOSAUTOV920_PHY_CTRL_USB31,
2634 	.clk_names		= exynos5_clk_names,
2635 	.n_clks			= ARRAY_SIZE(exynos5_clk_names),
2636 	.core_clk_names		= exynos5_core_clk_names,
2637 	.n_core_clks		= ARRAY_SIZE(exynos5_core_clk_names),
2638 	.regulator_names	= exynosautov920_usb30_regulators,
2639 	.n_regulators		= ARRAY_SIZE(exynosautov920_usb30_regulators),
2640 };
2641 
2642 static const struct phy_ops exynosautov920_usbdrd_combo_hsphy_ops = {
2643 	.init		= exynosautov920_usbdrd_phy_init,
2644 	.exit		= exynosautov920_usbdrd_combo_phy_exit,
2645 	.power_on	= exynosautov920_usbdrd_phy_power_on,
2646 	.power_off	= exynosautov920_usbdrd_phy_power_off,
2647 	.owner		= THIS_MODULE,
2648 };
2649 
2650 static const struct
2651 exynos5_usbdrd_phy_config usbdrd_hsphy_cfg_exynosautov920[] = {
2652 	{
2653 		.id		= EXYNOS5_DRDPHY_UTMI,
2654 		.phy_isol	= exynos5_usbdrd_phy_isol,
2655 		.phy_init	= exynosautov920_usbdrd_utmi_init,
2656 	},
2657 };
2658 
2659 static const
2660 struct exynos5_usbdrd_phy_drvdata exynosautov920_usbdrd_combo_hsphy = {
2661 	.phy_cfg		= usbdrd_hsphy_cfg_exynosautov920,
2662 	.phy_ops		= &exynosautov920_usbdrd_combo_hsphy_ops,
2663 	.pmu_offset_usbdrd0_phy	= EXYNOSAUTOV920_PHY_CTRL_USB20,
2664 	.clk_names		= exynos5_clk_names,
2665 	.n_clks			= ARRAY_SIZE(exynos5_clk_names),
2666 	.core_clk_names		= exynos5_core_clk_names,
2667 	.n_core_clks		= ARRAY_SIZE(exynos5_core_clk_names),
2668 	.regulator_names	= exynosautov920_usb20_regulators,
2669 	.n_regulators		= ARRAY_SIZE(exynosautov920_usb20_regulators),
2670 };
2671 
2672 static const struct phy_ops exynosautov920_usbdrd_phy_ops = {
2673 	.init		= exynosautov920_usbdrd_phy_init,
2674 	.exit		= exynosautov920_usbdrd_phy_exit,
2675 	.power_on       = exynosautov920_usbdrd_phy_power_on,
2676 	.power_off      = exynosautov920_usbdrd_phy_power_off,
2677 	.owner		= THIS_MODULE,
2678 };
2679 
2680 static const struct exynos5_usbdrd_phy_config phy_cfg_exynosautov920[] = {
2681 	{
2682 		.id		= EXYNOS5_DRDPHY_UTMI,
2683 		.phy_isol	= exynos5_usbdrd_phy_isol,
2684 		.phy_init	= exynos850_usbdrd_utmi_init,
2685 	},
2686 };
2687 
2688 static const struct exynos5_usbdrd_phy_drvdata exynosautov920_usbdrd_phy = {
2689 	.phy_cfg		= phy_cfg_exynosautov920,
2690 	.phy_ops		= &exynosautov920_usbdrd_phy_ops,
2691 	.pmu_offset_usbdrd0_phy	= EXYNOSAUTOV920_PHY_CTRL_USB20,
2692 	.clk_names		= exynos5_clk_names,
2693 	.n_clks			= ARRAY_SIZE(exynos5_clk_names),
2694 	.core_clk_names		= exynos5_core_clk_names,
2695 	.n_core_clks		= ARRAY_SIZE(exynos5_core_clk_names),
2696 	.regulator_names	= exynosautov920_usb20_regulators,
2697 	.n_regulators		= ARRAY_SIZE(exynosautov920_usb20_regulators),
2698 };
2699 
2700 static const struct exynos5_usbdrd_phy_config phy_cfg_gs101[] = {
2701 	{
2702 		.id		= EXYNOS5_DRDPHY_UTMI,
2703 		.phy_isol	= exynos5_usbdrd_phy_isol,
2704 		.phy_init	= exynos850_usbdrd_utmi_init,
2705 	},
2706 	{
2707 		.id		= EXYNOS5_DRDPHY_PIPE3,
2708 		.phy_isol	= exynos5_usbdrd_phy_isol,
2709 		.phy_init	= exynos5_usbdrd_gs101_pipe3_init,
2710 	},
2711 };
2712 
2713 static const struct exynos5_usbdrd_phy_tuning gs101_tunes_utmi_postinit[] = {
2714 	PHY_TUNING_ENTRY_PHY(EXYNOS850_DRD_HSPPARACON,
2715 			     (HSPPARACON_TXVREF | HSPPARACON_TXRES |
2716 			      HSPPARACON_TXPREEMPAMP | HSPPARACON_SQRX |
2717 			      HSPPARACON_COMPDIS),
2718 			     (FIELD_PREP_CONST(HSPPARACON_TXVREF, 6) |
2719 			      FIELD_PREP_CONST(HSPPARACON_TXRES, 1) |
2720 			      FIELD_PREP_CONST(HSPPARACON_TXPREEMPAMP, 3) |
2721 			      FIELD_PREP_CONST(HSPPARACON_SQRX, 5) |
2722 			      FIELD_PREP_CONST(HSPPARACON_COMPDIS, 7))),
2723 	PHY_TUNING_ENTRY_LAST
2724 };
2725 
2726 static const struct exynos5_usbdrd_phy_tuning gs101_tunes_pipe3_preinit[] = {
2727 	/* preinit */
2728 	/* CDR data mode exit GEN1 ON / GEN2 OFF */
2729 	PHY_TUNING_ENTRY_PMA(0x0c8c, -1, 0xff),
2730 	PHY_TUNING_ENTRY_PMA(0x1c8c, -1, 0xff),
2731 	PHY_TUNING_ENTRY_PMA(0x0c9c, -1, 0x7d),
2732 	PHY_TUNING_ENTRY_PMA(0x1c9c, -1, 0x7d),
2733 	/* improve EDS distribution */
2734 	PHY_TUNING_ENTRY_PMA(0x0e7c, -1, 0x06),
2735 	PHY_TUNING_ENTRY_PMA(0x09e0, -1, 0x00),
2736 	PHY_TUNING_ENTRY_PMA(0x09e4, -1, 0x36),
2737 	PHY_TUNING_ENTRY_PMA(0x1e7c, -1, 0x06),
2738 	PHY_TUNING_ENTRY_PMA(0x19e0, -1, 0x00),
2739 	PHY_TUNING_ENTRY_PMA(0x19e4, -1, 0x36),
2740 	/* fix bootloader bug */
2741 	PHY_TUNING_ENTRY_PMA(0x1e90, -1, 0x02),
2742 	PHY_TUNING_ENTRY_PMA(0x1e94, -1, 0x0b),
2743 	/* improve LVCC */
2744 	PHY_TUNING_ENTRY_PMA(0x08f0, -1, 0x30),
2745 	PHY_TUNING_ENTRY_PMA(0x18f0, -1, 0x30),
2746 	/* LFPS RX VIH shmoo hole */
2747 	PHY_TUNING_ENTRY_PMA(0x0a08, -1, 0x0c),
2748 	PHY_TUNING_ENTRY_PMA(0x1a08, -1, 0x0c),
2749 	/* remove unrelated option for v4 phy */
2750 	PHY_TUNING_ENTRY_PMA(0x0a0c, -1, 0x05),
2751 	PHY_TUNING_ENTRY_PMA(0x1a0c, -1, 0x05),
2752 	/* improve Gen2 LVCC */
2753 	PHY_TUNING_ENTRY_PMA(0x00f8, -1, 0x1c),
2754 	PHY_TUNING_ENTRY_PMA(0x00fc, -1, 0x54),
2755 	/* Change Vth of RCV_DET because of TD 7.40 Polling Retry Test */
2756 	PHY_TUNING_ENTRY_PMA(0x104c, -1, 0x07),
2757 	PHY_TUNING_ENTRY_PMA(0x204c, -1, 0x07),
2758 	/* reduce Ux Exit time, assuming 26MHz clock */
2759 	/* Gen1 */
2760 	PHY_TUNING_ENTRY_PMA(0x0ca8, -1, 0x00),
2761 	PHY_TUNING_ENTRY_PMA(0x0cac, -1, 0x04),
2762 	PHY_TUNING_ENTRY_PMA(0x1ca8, -1, 0x00),
2763 	PHY_TUNING_ENTRY_PMA(0x1cac, -1, 0x04),
2764 	/* Gen2 */
2765 	PHY_TUNING_ENTRY_PMA(0x0cb8, -1, 0x00),
2766 	PHY_TUNING_ENTRY_PMA(0x0cbc, -1, 0x04),
2767 	PHY_TUNING_ENTRY_PMA(0x1cb8, -1, 0x00),
2768 	PHY_TUNING_ENTRY_PMA(0x1cbc, -1, 0x04),
2769 	/* RX impedance setting */
2770 	PHY_TUNING_ENTRY_PMA(0x0bb0, 0x03, 0x01),
2771 	PHY_TUNING_ENTRY_PMA(0x0bb4, 0xf0, 0xa0),
2772 	PHY_TUNING_ENTRY_PMA(0x1bb0, 0x03, 0x01),
2773 	PHY_TUNING_ENTRY_PMA(0x1bb4, 0xf0, 0xa0),
2774 
2775 	PHY_TUNING_ENTRY_LAST
2776 };
2777 
2778 static const struct exynos5_usbdrd_phy_tuning gs101_tunes_pipe3_init[] = {
2779 	/* init */
2780 	/* abnormal common pattern mask */
2781 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_BACK_END_MODE_VEC,
2782 			     BACK_END_MODE_VEC_DISABLE_DATA_MASK, 0),
2783 	/* de-serializer enabled when U2 */
2784 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_OUT_VEC_2, PCS_OUT_VEC_B4_DYNAMIC,
2785 			     PCS_OUT_VEC_B4_SEL_OUT),
2786 	/* TX Keeper Disable, Squelch on when U3 */
2787 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_OUT_VEC_3, PCS_OUT_VEC_B7_DYNAMIC,
2788 			     PCS_OUT_VEC_B7_SEL_OUT | PCS_OUT_VEC_B2_SEL_OUT),
2789 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_NS_VEC_PS1_N1, -1,
2790 			     (FIELD_PREP_CONST(NS_VEC_NS_REQ, 5) |
2791 			      NS_VEC_ENABLE_TIMER |
2792 			      FIELD_PREP_CONST(NS_VEC_SEL_TIMEOUT, 3))),
2793 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_NS_VEC_PS2_N0, -1,
2794 			     (FIELD_PREP_CONST(NS_VEC_NS_REQ, 1) |
2795 			      NS_VEC_ENABLE_TIMER |
2796 			      FIELD_PREP_CONST(NS_VEC_SEL_TIMEOUT, 3) |
2797 			      FIELD_PREP_CONST(NS_VEC_COND_MASK, 2) |
2798 			      FIELD_PREP_CONST(NS_VEC_EXP_COND, 2))),
2799 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_NS_VEC_PS3_N0, -1,
2800 			     (FIELD_PREP_CONST(NS_VEC_NS_REQ, 1) |
2801 			      NS_VEC_ENABLE_TIMER |
2802 			      FIELD_PREP_CONST(NS_VEC_SEL_TIMEOUT, 3) |
2803 			      FIELD_PREP_CONST(NS_VEC_COND_MASK, 7) |
2804 			      FIELD_PREP_CONST(NS_VEC_EXP_COND, 7))),
2805 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_TIMEOUT_0, -1, 112),
2806 	/* Block Aligner Type B */
2807 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_RX_CONTROL, 0,
2808 			     RX_CONTROL_EN_BLOCK_ALIGNER_TYPE_B),
2809 	/* Block align at TS1/TS2 for Gen2 stability (Gen2 only) */
2810 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_RX_CONTROL_DEBUG,
2811 		RX_CONTROL_DEBUG_NUM_COM_FOUND,
2812 		(RX_CONTROL_DEBUG_EN_TS_CHECK |
2813 		 /*
2814 		  * increase pcs ts1 adding packet-cnt 1 --> 4
2815 		  * lnx_rx_valid_rstn_delay_rise_sp/ssp :
2816 		  * 19.6us(0x200) -> 15.3us(0x4)
2817 		  */
2818 		 FIELD_PREP_CONST(RX_CONTROL_DEBUG_NUM_COM_FOUND, 4))),
2819 	/* Gen1 Tx DRIVER pre-shoot, de-emphasis, level ctrl */
2820 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_HS_TX_COEF_MAP_0,
2821 		(HS_TX_COEF_MAP_0_SSTX_DEEMP | HS_TX_COEF_MAP_0_SSTX_LEVEL |
2822 		 HS_TX_COEF_MAP_0_SSTX_PRE_SHOOT),
2823 		(FIELD_PREP_CONST(HS_TX_COEF_MAP_0_SSTX_DEEMP, 8) |
2824 		 FIELD_PREP_CONST(HS_TX_COEF_MAP_0_SSTX_LEVEL, 0xb) |
2825 		 FIELD_PREP_CONST(HS_TX_COEF_MAP_0_SSTX_PRE_SHOOT, 0))),
2826 	/* Gen2 Tx DRIVER level ctrl */
2827 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_LOCAL_COEF,
2828 		LOCAL_COEF_PMA_CENTER_COEF,
2829 		FIELD_PREP_CONST(LOCAL_COEF_PMA_CENTER_COEF, 0xb)),
2830 	/* Gen2 U1 exit LFPS duration : 900ns ~ 1.2us */
2831 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_TIMEOUT_3, -1, 4096),
2832 	/* set skp_remove_th 0x2 -> 0x7 for avoiding retry problem. */
2833 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_EBUF_PARAM,
2834 		EBUF_PARAM_SKP_REMOVE_TH_EMPTY_MODE,
2835 		FIELD_PREP_CONST(EBUF_PARAM_SKP_REMOVE_TH_EMPTY_MODE, 0x7)),
2836 
2837 	PHY_TUNING_ENTRY_LAST
2838 };
2839 
2840 static const struct exynos5_usbdrd_phy_tuning gs101_tunes_pipe3_postlock[] = {
2841 	/* Squelch off when U3 */
2842 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_OUT_VEC_3, PCS_OUT_VEC_B2_SEL_OUT, 0),
2843 
2844 	PHY_TUNING_ENTRY_LAST
2845 };
2846 
2847 static const struct exynos5_usbdrd_phy_tuning *gs101_tunes[PTS_MAX] = {
2848 	[PTS_UTMI_POSTINIT] = gs101_tunes_utmi_postinit,
2849 	[PTS_PIPE3_PREINIT] = gs101_tunes_pipe3_preinit,
2850 	[PTS_PIPE3_INIT] = gs101_tunes_pipe3_init,
2851 	[PTS_PIPE3_POSTLOCK] = gs101_tunes_pipe3_postlock,
2852 };
2853 
2854 static const char * const gs101_clk_names[] = {
2855 	"phy", "ctrl_aclk", "ctrl_pclk", "scl_pclk",
2856 };
2857 
2858 static const char * const gs101_regulator_names[] = {
2859 	"pll",
2860 	"dvdd-usb20", "vddh-usb20", "vdd33-usb20",
2861 	"vdda-usbdp", "vddh-usbdp",
2862 };
2863 
2864 static const struct exynos5_usbdrd_phy_drvdata gs101_usbd31rd_phy = {
2865 	.phy_cfg			= phy_cfg_gs101,
2866 	.phy_tunes			= gs101_tunes,
2867 	.phy_ops			= &gs101_usbdrd_phy_ops,
2868 	.pmu_offset_usbdrd0_phy		= GS101_PHY_CTRL_USB20,
2869 	.pmu_offset_usbdrd0_phy_ss	= GS101_PHY_CTRL_USBDP,
2870 	.clk_names			= gs101_clk_names,
2871 	.n_clks				= ARRAY_SIZE(gs101_clk_names),
2872 	.core_clk_names			= exynos5_core_clk_names,
2873 	.n_core_clks			= ARRAY_SIZE(exynos5_core_clk_names),
2874 	.regulator_names		= gs101_regulator_names,
2875 	.n_regulators			= ARRAY_SIZE(gs101_regulator_names),
2876 };
2877 
2878 static const struct of_device_id exynos5_usbdrd_phy_of_match[] = {
2879 	{
2880 		.compatible = "google,gs101-usb31drd-phy",
2881 		.data = &gs101_usbd31rd_phy
2882 	}, {
2883 		.compatible = "samsung,exynos2200-usb32drd-phy",
2884 		.data = &exynos2200_usb32drd_phy,
2885 	}, {
2886 		.compatible = "samsung,exynos5250-usbdrd-phy",
2887 		.data = &exynos5250_usbdrd_phy
2888 	}, {
2889 		.compatible = "samsung,exynos5420-usbdrd-phy",
2890 		.data = &exynos5420_usbdrd_phy
2891 	}, {
2892 		.compatible = "samsung,exynos5433-usbdrd-phy",
2893 		.data = &exynos5433_usbdrd_phy
2894 	}, {
2895 		.compatible = "samsung,exynos7-usbdrd-phy",
2896 		.data = &exynos7_usbdrd_phy
2897 	}, {
2898 		.compatible = "samsung,exynos7870-usbdrd-phy",
2899 		.data = &exynos7870_usbdrd_phy
2900 	}, {
2901 		.compatible = "samsung,exynos850-usbdrd-phy",
2902 		.data = &exynos850_usbdrd_phy
2903 	}, {
2904 		.compatible = "samsung,exynos990-usbdrd-phy",
2905 		.data = &exynos990_usbdrd_phy
2906 	}, {
2907 		.compatible = "samsung,exynosautov920-usb31drd-combo-ssphy",
2908 		.data = &exynosautov920_usb31drd_combo_ssphy
2909 	}, {
2910 		.compatible = "samsung,exynosautov920-usbdrd-combo-hsphy",
2911 		.data = &exynosautov920_usbdrd_combo_hsphy
2912 	}, {
2913 		.compatible = "samsung,exynosautov920-usbdrd-phy",
2914 		.data = &exynosautov920_usbdrd_phy
2915 	},
2916 	{ },
2917 };
2918 MODULE_DEVICE_TABLE(of, exynos5_usbdrd_phy_of_match);
2919 
exynos5_usbdrd_phy_probe(struct platform_device * pdev)2920 static int exynos5_usbdrd_phy_probe(struct platform_device *pdev)
2921 {
2922 	struct device *dev = &pdev->dev;
2923 	struct device_node *node = dev->of_node;
2924 	struct exynos5_usbdrd_phy *phy_drd;
2925 	struct phy_provider *phy_provider;
2926 	const struct exynos5_usbdrd_phy_drvdata *drv_data;
2927 	struct regmap *reg_pmu;
2928 	u32 pmu_offset;
2929 	int i, ret;
2930 	int channel;
2931 
2932 	phy_drd = devm_kzalloc(dev, sizeof(*phy_drd), GFP_KERNEL);
2933 	if (!phy_drd)
2934 		return -ENOMEM;
2935 
2936 	dev_set_drvdata(dev, phy_drd);
2937 	phy_drd->dev = dev;
2938 
2939 	drv_data = of_device_get_match_data(dev);
2940 	if (!drv_data)
2941 		return -EINVAL;
2942 	phy_drd->drv_data = drv_data;
2943 
2944 	ret = devm_mutex_init(dev, &phy_drd->phy_mutex);
2945 	if (ret)
2946 		return ret;
2947 
2948 	if (of_property_present(dev->of_node, "reg-names")) {
2949 		void __iomem *reg;
2950 
2951 		reg = devm_platform_ioremap_resource_byname(pdev, "phy");
2952 		if (IS_ERR(reg))
2953 			return PTR_ERR(reg);
2954 		phy_drd->reg_phy = reg;
2955 
2956 		reg = devm_platform_ioremap_resource_byname(pdev, "pcs");
2957 		if (IS_ERR(reg))
2958 			return PTR_ERR(reg);
2959 		phy_drd->reg_pcs = reg;
2960 
2961 		reg = devm_platform_ioremap_resource_byname(pdev, "pma");
2962 		if (IS_ERR(reg))
2963 			return PTR_ERR(reg);
2964 		phy_drd->reg_pma = reg;
2965 	} else {
2966 		/* DTB with just a single region */
2967 		phy_drd->reg_phy = devm_platform_ioremap_resource(pdev, 0);
2968 		if (IS_ERR(phy_drd->reg_phy))
2969 			return PTR_ERR(phy_drd->reg_phy);
2970 	}
2971 
2972 	/*
2973 	 * USB32DRD 4nm controller implements Synopsys eUSB2.0 PHY
2974 	 * and Synopsys SS/USBDP COMBOPHY, managed by external code.
2975 	 */
2976 	if (of_property_present(dev->of_node, "phy-names")) {
2977 		phy_drd->hs_phy = devm_of_phy_get(dev, dev->of_node, "hs");
2978 		if (IS_ERR(phy_drd->hs_phy))
2979 			return dev_err_probe(dev, PTR_ERR(phy_drd->hs_phy),
2980 					     "failed to get hs_phy\n");
2981 	}
2982 
2983 	ret = exynos5_usbdrd_phy_clk_handle(phy_drd);
2984 	if (ret)
2985 		return ret;
2986 
2987 	reg_pmu = syscon_regmap_lookup_by_phandle(dev->of_node,
2988 						   "samsung,pmu-syscon");
2989 	if (IS_ERR(reg_pmu))
2990 		return dev_err_probe(dev, PTR_ERR(reg_pmu),
2991 				     "Failed to lookup PMU regmap\n");
2992 
2993 	/*
2994 	 * Exynos5420 SoC has multiple channels for USB 3.0 PHY, with
2995 	 * each having separate power control registers.
2996 	 * 'channel' facilitates to set such registers.
2997 	 */
2998 	channel = of_alias_get_id(node, "usbdrdphy");
2999 	if (channel < 0)
3000 		dev_dbg(dev, "Not a multi-controller usbdrd phy\n");
3001 
3002 	/* Get regulators */
3003 	phy_drd->regulators = devm_kcalloc(dev,
3004 					   drv_data->n_regulators,
3005 					   sizeof(*phy_drd->regulators),
3006 					   GFP_KERNEL);
3007 	if (!phy_drd->regulators)
3008 		return -ENOMEM;
3009 	regulator_bulk_set_supply_names(phy_drd->regulators,
3010 					drv_data->regulator_names,
3011 					drv_data->n_regulators);
3012 	ret = devm_regulator_bulk_get(dev, drv_data->n_regulators,
3013 				      phy_drd->regulators);
3014 	if (ret)
3015 		return dev_err_probe(dev, ret, "failed to get regulators\n");
3016 
3017 	ret = exynos5_usbdrd_setup_notifiers(phy_drd);
3018 	if (ret)
3019 		return ret;
3020 
3021 	dev_vdbg(dev, "Creating usbdrd_phy phy\n");
3022 
3023 	for (i = 0; i < EXYNOS5_DRDPHYS_NUM; i++) {
3024 		struct phy *phy = devm_phy_create(dev, NULL, drv_data->phy_ops);
3025 
3026 		if (IS_ERR(phy))
3027 			return dev_err_probe(dev, PTR_ERR(phy),
3028 					     "Failed to create usbdrd_phy phy\n");
3029 
3030 		phy_drd->phys[i].phy = phy;
3031 		phy_drd->phys[i].index = i;
3032 		phy_drd->phys[i].reg_pmu = reg_pmu;
3033 		switch (channel) {
3034 		case 1:
3035 			pmu_offset = drv_data->pmu_offset_usbdrd1_phy;
3036 			break;
3037 		case 0:
3038 		default:
3039 			pmu_offset = drv_data->pmu_offset_usbdrd0_phy;
3040 			if (i == EXYNOS5_DRDPHY_PIPE3 && drv_data
3041 						->pmu_offset_usbdrd0_phy_ss)
3042 				pmu_offset = drv_data->pmu_offset_usbdrd0_phy_ss;
3043 			break;
3044 		}
3045 		phy_drd->phys[i].pmu_offset = pmu_offset;
3046 		phy_drd->phys[i].phy_cfg = &drv_data->phy_cfg[i];
3047 		phy_set_drvdata(phy, &phy_drd->phys[i]);
3048 	}
3049 
3050 	phy_provider = devm_of_phy_provider_register(dev,
3051 						     exynos5_usbdrd_phy_xlate);
3052 	if (IS_ERR(phy_provider))
3053 		return dev_err_probe(phy_drd->dev, PTR_ERR(phy_provider),
3054 				     "Failed to register phy provider\n");
3055 
3056 	return 0;
3057 }
3058 
3059 static struct platform_driver exynos5_usb3drd_phy = {
3060 	.probe	= exynos5_usbdrd_phy_probe,
3061 	.driver = {
3062 		.of_match_table	= exynos5_usbdrd_phy_of_match,
3063 		.name		= "exynos5_usb3drd_phy",
3064 		.suppress_bind_attrs = true,
3065 	}
3066 };
3067 
3068 module_platform_driver(exynos5_usb3drd_phy);
3069 MODULE_DESCRIPTION("Samsung Exynos5 SoCs USB 3.0 DRD controller PHY driver");
3070 MODULE_AUTHOR("Vivek Gautam <gautam.vivek@samsung.com>");
3071 MODULE_LICENSE("GPL v2");
3072