xref: /linux/drivers/phy/samsung/phy-exynos5-usbdrd.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
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 
27 /* Exynos USB PHY registers */
28 #define EXYNOS5_FSEL_9MHZ6		0x0
29 #define EXYNOS5_FSEL_10MHZ		0x1
30 #define EXYNOS5_FSEL_12MHZ		0x2
31 #define EXYNOS5_FSEL_19MHZ2		0x3
32 #define EXYNOS5_FSEL_20MHZ		0x4
33 #define EXYNOS5_FSEL_24MHZ		0x5
34 #define EXYNOS5_FSEL_26MHZ		0x6
35 #define EXYNOS5_FSEL_50MHZ		0x7
36 
37 /* Exynos5: USB 3.0 DRD PHY registers */
38 #define EXYNOS5_DRD_LINKSYSTEM			0x04
39 #define LINKSYSTEM_XHCI_VERSION_CONTROL		BIT(27)
40 #define LINKSYSTEM_FLADJ_MASK			(0x3f << 1)
41 #define LINKSYSTEM_FLADJ(_x)			((_x) << 1)
42 
43 #define EXYNOS5_DRD_PHYUTMI			0x08
44 #define PHYUTMI_OTGDISABLE			BIT(6)
45 #define PHYUTMI_FORCESUSPEND			BIT(1)
46 #define PHYUTMI_FORCESLEEP			BIT(0)
47 
48 #define EXYNOS5_DRD_PHYPIPE			0x0c
49 
50 #define EXYNOS5_DRD_PHYCLKRST			0x10
51 #define PHYCLKRST_EN_UTMISUSPEND		BIT(31)
52 #define PHYCLKRST_SSC_REFCLKSEL_MASK		(0xff << 23)
53 #define PHYCLKRST_SSC_REFCLKSEL(_x)		((_x) << 23)
54 #define PHYCLKRST_SSC_RANGE_MASK		(0x03 << 21)
55 #define PHYCLKRST_SSC_RANGE(_x)			((_x) << 21)
56 #define PHYCLKRST_SSC_EN			BIT(20)
57 #define PHYCLKRST_REF_SSP_EN			BIT(19)
58 #define PHYCLKRST_REF_CLKDIV2			BIT(18)
59 #define PHYCLKRST_MPLL_MULTIPLIER_MASK		(0x7f << 11)
60 #define PHYCLKRST_MPLL_MULTIPLIER_100MHZ_REF	(0x19 << 11)
61 #define PHYCLKRST_MPLL_MULTIPLIER_50M_REF	(0x32 << 11)
62 #define PHYCLKRST_MPLL_MULTIPLIER_24MHZ_REF	(0x68 << 11)
63 #define PHYCLKRST_MPLL_MULTIPLIER_20MHZ_REF	(0x7d << 11)
64 #define PHYCLKRST_MPLL_MULTIPLIER_19200KHZ_REF	(0x02 << 11)
65 #define PHYCLKRST_FSEL_PIPE_MASK		(0x7 << 8)
66 #define PHYCLKRST_FSEL_UTMI_MASK		(0x7 << 5)
67 #define PHYCLKRST_FSEL(_x)			((_x) << 5)
68 #define PHYCLKRST_FSEL_PAD_100MHZ		(0x27 << 5)
69 #define PHYCLKRST_FSEL_PAD_24MHZ		(0x2a << 5)
70 #define PHYCLKRST_FSEL_PAD_20MHZ		(0x31 << 5)
71 #define PHYCLKRST_FSEL_PAD_19_2MHZ		(0x38 << 5)
72 #define PHYCLKRST_RETENABLEN			BIT(4)
73 #define PHYCLKRST_REFCLKSEL_MASK		(0x03 << 2)
74 #define PHYCLKRST_REFCLKSEL_PAD_REFCLK		(0x2 << 2)
75 #define PHYCLKRST_REFCLKSEL_EXT_REFCLK		(0x3 << 2)
76 #define PHYCLKRST_PORTRESET			BIT(1)
77 #define PHYCLKRST_COMMONONN			BIT(0)
78 
79 #define EXYNOS5_DRD_PHYREG0			0x14
80 #define PHYREG0_SSC_REF_CLK_SEL			BIT(21)
81 #define PHYREG0_SSC_RANGE			BIT(20)
82 #define PHYREG0_CR_WRITE			BIT(19)
83 #define PHYREG0_CR_READ				BIT(18)
84 #define PHYREG0_CR_DATA_IN(_x)			((_x) << 2)
85 #define PHYREG0_CR_CAP_DATA			BIT(1)
86 #define PHYREG0_CR_CAP_ADDR			BIT(0)
87 
88 #define EXYNOS5_DRD_PHYREG1			0x18
89 #define PHYREG1_CR_DATA_OUT(_x)			((_x) << 1)
90 #define PHYREG1_CR_ACK				BIT(0)
91 
92 #define EXYNOS5_DRD_PHYPARAM0			0x1c
93 #define PHYPARAM0_REF_USE_PAD			BIT(31)
94 #define PHYPARAM0_REF_LOSLEVEL_MASK		(0x1f << 26)
95 #define PHYPARAM0_REF_LOSLEVEL			(0x9 << 26)
96 
97 #define EXYNOS5_DRD_PHYPARAM1			0x20
98 #define PHYPARAM1_PCS_TXDEEMPH_MASK		(0x1f << 0)
99 #define PHYPARAM1_PCS_TXDEEMPH			(0x1c)
100 
101 #define EXYNOS5_DRD_PHYTERM			0x24
102 
103 #define EXYNOS5_DRD_PHYTEST			0x28
104 #define PHYTEST_POWERDOWN_SSP			BIT(3)
105 #define PHYTEST_POWERDOWN_HSP			BIT(2)
106 
107 #define EXYNOS5_DRD_PHYADP			0x2c
108 
109 #define EXYNOS5_DRD_PHYUTMICLKSEL		0x30
110 #define PHYUTMICLKSEL_UTMI_CLKSEL		BIT(2)
111 
112 #define EXYNOS5_DRD_PHYRESUME			0x34
113 
114 #define EXYNOS5_DRD_LINKPORT			0x44
115 
116 /* USB 3.0 DRD PHY SS Function Control Reg; accessed by CR_PORT */
117 #define EXYNOS5_DRD_PHYSS_LOSLEVEL_OVRD_IN		(0x15)
118 #define LOSLEVEL_OVRD_IN_LOS_BIAS_5420			(0x5 << 13)
119 #define LOSLEVEL_OVRD_IN_LOS_BIAS_DEFAULT		(0x0 << 13)
120 #define LOSLEVEL_OVRD_IN_EN				(0x1 << 10)
121 #define LOSLEVEL_OVRD_IN_LOS_LEVEL_DEFAULT		(0x9 << 0)
122 
123 #define EXYNOS5_DRD_PHYSS_TX_VBOOSTLEVEL_OVRD_IN	(0x12)
124 #define TX_VBOOSTLEVEL_OVRD_IN_VBOOST_5420		(0x5 << 13)
125 #define TX_VBOOSTLEVEL_OVRD_IN_VBOOST_DEFAULT		(0x4 << 13)
126 
127 #define EXYNOS5_DRD_PHYSS_LANE0_TX_DEBUG		(0x1010)
128 #define LANE0_TX_DEBUG_RXDET_MEAS_TIME_19M2_20M		(0x4 << 4)
129 #define LANE0_TX_DEBUG_RXDET_MEAS_TIME_24M		(0x8 << 4)
130 #define LANE0_TX_DEBUG_RXDET_MEAS_TIME_25M_26M		(0x8 << 4)
131 #define LANE0_TX_DEBUG_RXDET_MEAS_TIME_48M_50M_52M	(0x20 << 4)
132 #define LANE0_TX_DEBUG_RXDET_MEAS_TIME_62M5		(0x20 << 4)
133 #define LANE0_TX_DEBUG_RXDET_MEAS_TIME_96M_100M		(0x40 << 4)
134 
135 /* Exynos850: USB DRD PHY registers */
136 #define EXYNOS850_DRD_LINKCTRL			0x04
137 #define LINKCTRL_FORCE_RXELECIDLE		BIT(18)
138 #define LINKCTRL_FORCE_PHYSTATUS		BIT(17)
139 #define LINKCTRL_FORCE_PIPE_EN			BIT(16)
140 #define LINKCTRL_FORCE_QACT			BIT(8)
141 #define LINKCTRL_BUS_FILTER_BYPASS(_x)		((_x) << 4)
142 
143 #define EXYNOS850_DRD_LINKPORT			0x08
144 #define LINKPORT_HOST_NUM_U3			GENMASK(19, 16)
145 #define LINKPORT_HOST_NUM_U2			GENMASK(15, 12)
146 
147 #define EXYNOS850_DRD_CLKRST			0x20
148 /*
149  * On versions without SS ports (like E850), bit 3 is for the 2.0 phy (HS),
150  * while on versions with (like gs101), bits 2 and 3 are for the 3.0 phy (SS)
151  * and bits 12 & 13 for the 2.0 phy.
152  */
153 #define CLKRST_PHY20_SW_POR			BIT(13)
154 #define CLKRST_PHY20_SW_POR_SEL			BIT(12)
155 #define CLKRST_LINK_PCLK_SEL			BIT(7)
156 #define CLKRST_PHY_SW_RST			BIT(3)
157 #define CLKRST_PHY_RESET_SEL			BIT(2)
158 #define CLKRST_PORT_RST				BIT(1)
159 #define CLKRST_LINK_SW_RST			BIT(0)
160 
161 #define EXYNOS850_DRD_SSPPLLCTL			0x30
162 #define SSPPLLCTL_FSEL				GENMASK(2, 0)
163 
164 #define EXYNOS850_DRD_UTMI			0x50
165 #define UTMI_FORCE_VBUSVALID			BIT(5)
166 #define UTMI_FORCE_BVALID			BIT(4)
167 #define UTMI_DP_PULLDOWN			BIT(3)
168 #define UTMI_DM_PULLDOWN			BIT(2)
169 #define UTMI_FORCE_SUSPEND			BIT(1)
170 #define UTMI_FORCE_SLEEP			BIT(0)
171 
172 #define EXYNOS850_DRD_HSP			0x54
173 #define HSP_FSV_OUT_EN				BIT(24)
174 #define HSP_VBUSVLDEXTSEL			BIT(13)
175 #define HSP_VBUSVLDEXT				BIT(12)
176 #define HSP_EN_UTMISUSPEND			BIT(9)
177 #define HSP_COMMONONN				BIT(8)
178 
179 #define EXYNOS850_DRD_HSPPARACON		0x58
180 #define HSPPARACON_TXVREF			GENMASK(31, 28)
181 #define HSPPARACON_TXRISE			GENMASK(25, 24)
182 #define HSPPARACON_TXRES			GENMASK(22, 21)
183 #define HSPPARACON_TXPREEMPPULSE		BIT(20)
184 #define HSPPARACON_TXPREEMPAMP			GENMASK(19, 18)
185 #define HSPPARACON_TXHSXV			GENMASK(17, 16)
186 #define HSPPARACON_TXFSLS			GENMASK(15, 12)
187 #define HSPPARACON_SQRX				GENMASK(10, 8)
188 #define HSPPARACON_OTG				GENMASK(6, 4)
189 #define HSPPARACON_COMPDIS			GENMASK(2, 0)
190 
191 #define EXYNOS850_DRD_HSP_TEST			0x5c
192 #define HSP_TEST_SIDDQ				BIT(24)
193 
194 /* Exynos9 - GS101 */
195 #define EXYNOS850_DRD_SECPMACTL			0x48
196 #define SECPMACTL_PMA_ROPLL_REF_CLK_SEL		GENMASK(13, 12)
197 #define SECPMACTL_PMA_LCPLL_REF_CLK_SEL		GENMASK(11, 10)
198 #define SECPMACTL_PMA_REF_FREQ_SEL		GENMASK(9, 8)
199 #define SECPMACTL_PMA_LOW_PWR			BIT(4)
200 #define SECPMACTL_PMA_TRSV_SW_RST		BIT(3)
201 #define SECPMACTL_PMA_CMN_SW_RST		BIT(2)
202 #define SECPMACTL_PMA_INIT_SW_RST		BIT(1)
203 #define SECPMACTL_PMA_APB_SW_RST		BIT(0)
204 
205 /* PMA registers */
206 #define EXYNOS9_PMA_USBDP_CMN_REG0008		0x0020
207 #define CMN_REG0008_OVRD_AUX_EN			BIT(3)
208 #define CMN_REG0008_AUX_EN			BIT(2)
209 
210 #define EXYNOS9_PMA_USBDP_CMN_REG00B8		0x02e0
211 #define CMN_REG00B8_LANE_MUX_SEL_DP		GENMASK(3, 0)
212 
213 #define EXYNOS9_PMA_USBDP_CMN_REG01C0		0x0700
214 #define CMN_REG01C0_ANA_LCPLL_LOCK_DONE		BIT(7)
215 #define CMN_REG01C0_ANA_LCPLL_AFC_DONE		BIT(6)
216 
217 /* these have similar register layout, for lanes 0 and 2 */
218 #define EXYNOS9_PMA_USBDP_TRSV_REG03C3			0x0f0c
219 #define EXYNOS9_PMA_USBDP_TRSV_REG07C3			0x1f0c
220 #define TRSV_REG03C3_LN0_MON_RX_CDR_AFC_DONE		BIT(3)
221 #define TRSV_REG03C3_LN0_MON_RX_CDR_CAL_DONE		BIT(2)
222 #define TRSV_REG03C3_LN0_MON_RX_CDR_FLD_PLL_MODE_DONE	BIT(1)
223 #define TRSV_REG03C3_LN0_MON_RX_CDR_LOCK_DONE		BIT(0)
224 
225 /* TRSV_REG0413 and TRSV_REG0813 have similar register layout */
226 #define EXYNOS9_PMA_USBDP_TRSV_REG0413		0x104c
227 #define TRSV_REG0413_OVRD_LN1_TX_RXD_COMP_EN	BIT(7)
228 #define TRSV_REG0413_OVRD_LN1_TX_RXD_EN		BIT(5)
229 
230 #define EXYNOS9_PMA_USBDP_TRSV_REG0813		0x204c
231 #define TRSV_REG0813_OVRD_LN3_TX_RXD_COMP_EN	BIT(7)
232 #define TRSV_REG0813_OVRD_LN3_TX_RXD_EN		BIT(5)
233 
234 /* PCS registers */
235 #define EXYNOS9_PCS_NS_VEC_PS1_N1		0x010c
236 #define EXYNOS9_PCS_NS_VEC_PS2_N0		0x0110
237 #define EXYNOS9_PCS_NS_VEC_PS3_N0		0x0118
238 #define NS_VEC_NS_REQ				GENMASK(31, 24)
239 #define NS_VEC_ENABLE_TIMER			BIT(22)
240 #define NS_VEC_SEL_TIMEOUT			GENMASK(21, 20)
241 #define NS_VEC_INV_MASK				GENMASK(19, 16)
242 #define NS_VEC_COND_MASK			GENMASK(11, 8)
243 #define NS_VEC_EXP_COND				GENMASK(3, 0)
244 
245 #define EXYNOS9_PCS_OUT_VEC_2			0x014c
246 #define EXYNOS9_PCS_OUT_VEC_3			0x0150
247 #define PCS_OUT_VEC_B9_DYNAMIC			BIT(19)
248 #define PCS_OUT_VEC_B9_SEL_OUT			BIT(18)
249 #define PCS_OUT_VEC_B8_DYNAMIC			BIT(17)
250 #define PCS_OUT_VEC_B8_SEL_OUT			BIT(16)
251 #define PCS_OUT_VEC_B7_DYNAMIC			BIT(15)
252 #define PCS_OUT_VEC_B7_SEL_OUT			BIT(14)
253 #define PCS_OUT_VEC_B6_DYNAMIC			BIT(13)
254 #define PCS_OUT_VEC_B6_SEL_OUT			BIT(12)
255 #define PCS_OUT_VEC_B5_DYNAMIC			BIT(11)
256 #define PCS_OUT_VEC_B5_SEL_OUT			BIT(10)
257 #define PCS_OUT_VEC_B4_DYNAMIC			BIT(9)
258 #define PCS_OUT_VEC_B4_SEL_OUT			BIT(8)
259 #define PCS_OUT_VEC_B3_DYNAMIC			BIT(7)
260 #define PCS_OUT_VEC_B3_SEL_OUT			BIT(6)
261 #define PCS_OUT_VEC_B2_DYNAMIC			BIT(5)
262 #define PCS_OUT_VEC_B2_SEL_OUT			BIT(4)
263 #define PCS_OUT_VEC_B1_DYNAMIC			BIT(3)
264 #define PCS_OUT_VEC_B1_SEL_OUT			BIT(2)
265 #define PCS_OUT_VEC_B0_DYNAMIC			BIT(1)
266 #define PCS_OUT_VEC_B0_SEL_OUT			BIT(0)
267 
268 #define EXYNOS9_PCS_TIMEOUT_0			0x0170
269 
270 #define EXYNOS9_PCS_TIMEOUT_3			0x017c
271 
272 #define EXYNOS9_PCS_EBUF_PARAM			0x0304
273 #define EBUF_PARAM_SKP_REMOVE_TH_EMPTY_MODE	GENMASK(29, 24)
274 
275 #define EXYNOS9_PCS_BACK_END_MODE_VEC		0x030c
276 #define BACK_END_MODE_VEC_FORCE_EBUF_EMPTY_MODE	BIT(1)
277 #define BACK_END_MODE_VEC_DISABLE_DATA_MASK	BIT(0)
278 
279 #define EXYNOS9_PCS_RX_CONTROL			0x03f0
280 #define RX_CONTROL_EN_BLOCK_ALIGNER_TYPE_B	BIT(22)
281 
282 #define EXYNOS9_PCS_RX_CONTROL_DEBUG		0x03f4
283 #define RX_CONTROL_DEBUG_EN_TS_CHECK		BIT(5)
284 #define RX_CONTROL_DEBUG_NUM_COM_FOUND		GENMASK(3, 0)
285 
286 #define EXYNOS9_PCS_LOCAL_COEF			0x040c
287 #define LOCAL_COEF_PMA_CENTER_COEF		GENMASK(21, 16)
288 #define LOCAL_COEF_LF				GENMASK(13, 8)
289 #define LOCAL_COEF_FS				GENMASK(5, 0)
290 
291 #define EXYNOS9_PCS_HS_TX_COEF_MAP_0		0x0410
292 #define HS_TX_COEF_MAP_0_SSTX_DEEMP		GENMASK(17, 12)
293 #define HS_TX_COEF_MAP_0_SSTX_LEVEL		GENMASK(11, 6)
294 #define HS_TX_COEF_MAP_0_SSTX_PRE_SHOOT		GENMASK(5, 0)
295 
296 
297 #define KHZ	1000
298 #define MHZ	(KHZ * KHZ)
299 
300 #define PHY_TUNING_ENTRY_PHY(o, m, v) {	\
301 		.off = (o),		\
302 		.mask = (m),		\
303 		.val = (v),		\
304 		.region = PTR_PHY	\
305 	}
306 
307 #define PHY_TUNING_ENTRY_PCS(o, m, v) {	\
308 		.off = (o),		\
309 		.mask = (m),		\
310 		.val = (v),		\
311 		.region = PTR_PCS	\
312 	}
313 
314 #define PHY_TUNING_ENTRY_PMA(o, m, v) {	\
315 		.off = (o),		\
316 		.mask = (m),		\
317 		.val = (v),		\
318 		.region = PTR_PMA,	\
319 	}
320 
321 #define PHY_TUNING_ENTRY_LAST { .region = PTR_INVALID }
322 
323 #define for_each_phy_tune(tune) \
324 	for (; (tune)->region != PTR_INVALID; ++(tune))
325 
326 struct exynos5_usbdrd_phy_tuning {
327 	u32 off;
328 	u32 mask;
329 	u32 val;
330 	char region;
331 #define PTR_INVALID	0
332 #define PTR_PHY		1
333 #define PTR_PCS		2
334 #define PTR_PMA		3
335 };
336 
337 enum exynos5_usbdrd_phy_tuning_state {
338 	PTS_UTMI_POSTINIT,
339 	PTS_PIPE3_PREINIT,
340 	PTS_PIPE3_INIT,
341 	PTS_PIPE3_POSTINIT,
342 	PTS_PIPE3_POSTLOCK,
343 	PTS_MAX,
344 };
345 
346 enum exynos5_usbdrd_phy_id {
347 	EXYNOS5_DRDPHY_UTMI,
348 	EXYNOS5_DRDPHY_PIPE3,
349 	EXYNOS5_DRDPHYS_NUM,
350 };
351 
352 struct phy_usb_instance;
353 struct exynos5_usbdrd_phy;
354 
355 struct exynos5_usbdrd_phy_config {
356 	u32 id;
357 	void (*phy_isol)(struct phy_usb_instance *inst, bool isolate);
358 	void (*phy_init)(struct exynos5_usbdrd_phy *phy_drd);
359 	unsigned int (*set_refclk)(struct phy_usb_instance *inst);
360 };
361 
362 struct exynos5_usbdrd_phy_drvdata {
363 	const struct exynos5_usbdrd_phy_config *phy_cfg;
364 	const struct exynos5_usbdrd_phy_tuning **phy_tunes;
365 	const struct phy_ops *phy_ops;
366 	const char * const *clk_names;
367 	int n_clks;
368 	const char * const *core_clk_names;
369 	int n_core_clks;
370 	const char * const *regulator_names;
371 	int n_regulators;
372 	u32 pmu_offset_usbdrd0_phy;
373 	u32 pmu_offset_usbdrd0_phy_ss;
374 	u32 pmu_offset_usbdrd1_phy;
375 };
376 
377 /**
378  * struct exynos5_usbdrd_phy - driver data for USB 3.0 PHY
379  * @dev: pointer to device instance of this platform device
380  * @reg_phy: usb phy controller register memory base
381  * @reg_pcs: usb phy physical coding sublayer register memory base
382  * @reg_pma: usb phy physical media attachment register memory base
383  * @clks: clocks for register access
384  * @core_clks: core clocks for phy (ref, pipe3, utmi+, ITP, etc. as required)
385  * @drv_data: pointer to SoC level driver data structure
386  * @phys: array for 'EXYNOS5_DRDPHYS_NUM' number of PHY
387  *	    instances each with its 'phy' and 'phy_cfg'.
388  * @extrefclk: frequency select settings when using 'separate
389  *	       reference clocks' for SS and HS operations
390  * @regulators: regulators for phy
391  */
392 struct exynos5_usbdrd_phy {
393 	struct device *dev;
394 	void __iomem *reg_phy;
395 	void __iomem *reg_pcs;
396 	void __iomem *reg_pma;
397 	struct clk_bulk_data *clks;
398 	struct clk_bulk_data *core_clks;
399 	const struct exynos5_usbdrd_phy_drvdata *drv_data;
400 	struct phy_usb_instance {
401 		struct phy *phy;
402 		u32 index;
403 		struct regmap *reg_pmu;
404 		u32 pmu_offset;
405 		const struct exynos5_usbdrd_phy_config *phy_cfg;
406 	} phys[EXYNOS5_DRDPHYS_NUM];
407 	u32 extrefclk;
408 	struct regulator_bulk_data *regulators;
409 };
410 
411 static inline
412 struct exynos5_usbdrd_phy *to_usbdrd_phy(struct phy_usb_instance *inst)
413 {
414 	return container_of((inst), struct exynos5_usbdrd_phy,
415 			    phys[(inst)->index]);
416 }
417 
418 /*
419  * exynos5_rate_to_clk() converts the supplied clock rate to the value that
420  * can be written to the phy register.
421  */
422 static unsigned int exynos5_rate_to_clk(unsigned long rate, u32 *reg)
423 {
424 	/* EXYNOS5_FSEL_MASK */
425 
426 	switch (rate) {
427 	case 9600 * KHZ:
428 		*reg = EXYNOS5_FSEL_9MHZ6;
429 		break;
430 	case 10 * MHZ:
431 		*reg = EXYNOS5_FSEL_10MHZ;
432 		break;
433 	case 12 * MHZ:
434 		*reg = EXYNOS5_FSEL_12MHZ;
435 		break;
436 	case 19200 * KHZ:
437 		*reg = EXYNOS5_FSEL_19MHZ2;
438 		break;
439 	case 20 * MHZ:
440 		*reg = EXYNOS5_FSEL_20MHZ;
441 		break;
442 	case 24 * MHZ:
443 		*reg = EXYNOS5_FSEL_24MHZ;
444 		break;
445 	case 26 * MHZ:
446 		*reg = EXYNOS5_FSEL_26MHZ;
447 		break;
448 	case 50 * MHZ:
449 		*reg = EXYNOS5_FSEL_50MHZ;
450 		break;
451 	default:
452 		return -EINVAL;
453 	}
454 
455 	return 0;
456 }
457 
458 static void exynos5_usbdrd_phy_isol(struct phy_usb_instance *inst,
459 				    bool isolate)
460 {
461 	unsigned int val;
462 
463 	if (!inst->reg_pmu)
464 		return;
465 
466 	val = isolate ? 0 : EXYNOS4_PHY_ENABLE;
467 
468 	regmap_update_bits(inst->reg_pmu, inst->pmu_offset,
469 			   EXYNOS4_PHY_ENABLE, val);
470 }
471 
472 /*
473  * Sets the pipe3 phy's clk as EXTREFCLK (XXTI) which is internal clock
474  * from clock core. Further sets multiplier values and spread spectrum
475  * clock settings for SuperSpeed operations.
476  */
477 static unsigned int
478 exynos5_usbdrd_pipe3_set_refclk(struct phy_usb_instance *inst)
479 {
480 	u32 reg;
481 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
482 
483 	/* restore any previous reference clock settings */
484 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYCLKRST);
485 
486 	/* Use EXTREFCLK as ref clock */
487 	reg &= ~PHYCLKRST_REFCLKSEL_MASK;
488 	reg |=	PHYCLKRST_REFCLKSEL_EXT_REFCLK;
489 
490 	/* FSEL settings corresponding to reference clock */
491 	reg &= ~PHYCLKRST_FSEL_PIPE_MASK |
492 		PHYCLKRST_MPLL_MULTIPLIER_MASK |
493 		PHYCLKRST_SSC_REFCLKSEL_MASK;
494 	switch (phy_drd->extrefclk) {
495 	case EXYNOS5_FSEL_50MHZ:
496 		reg |= (PHYCLKRST_MPLL_MULTIPLIER_50M_REF |
497 			PHYCLKRST_SSC_REFCLKSEL(0x00));
498 		break;
499 	case EXYNOS5_FSEL_24MHZ:
500 		reg |= (PHYCLKRST_MPLL_MULTIPLIER_24MHZ_REF |
501 			PHYCLKRST_SSC_REFCLKSEL(0x88));
502 		break;
503 	case EXYNOS5_FSEL_20MHZ:
504 		reg |= (PHYCLKRST_MPLL_MULTIPLIER_20MHZ_REF |
505 			PHYCLKRST_SSC_REFCLKSEL(0x00));
506 		break;
507 	case EXYNOS5_FSEL_19MHZ2:
508 		reg |= (PHYCLKRST_MPLL_MULTIPLIER_19200KHZ_REF |
509 			PHYCLKRST_SSC_REFCLKSEL(0x88));
510 		break;
511 	default:
512 		dev_dbg(phy_drd->dev, "unsupported ref clk\n");
513 		break;
514 	}
515 
516 	return reg;
517 }
518 
519 /*
520  * Sets the utmi phy's clk as EXTREFCLK (XXTI) which is internal clock
521  * from clock core. Further sets the FSEL values for HighSpeed operations.
522  */
523 static unsigned int
524 exynos5_usbdrd_utmi_set_refclk(struct phy_usb_instance *inst)
525 {
526 	u32 reg;
527 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
528 
529 	/* restore any previous reference clock settings */
530 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYCLKRST);
531 
532 	reg &= ~PHYCLKRST_REFCLKSEL_MASK;
533 	reg |=	PHYCLKRST_REFCLKSEL_EXT_REFCLK;
534 
535 	reg &= ~PHYCLKRST_FSEL_UTMI_MASK |
536 		PHYCLKRST_MPLL_MULTIPLIER_MASK |
537 		PHYCLKRST_SSC_REFCLKSEL_MASK;
538 	reg |= PHYCLKRST_FSEL(phy_drd->extrefclk);
539 
540 	return reg;
541 }
542 
543 static void
544 exynos5_usbdrd_apply_phy_tunes(struct exynos5_usbdrd_phy *phy_drd,
545 			       enum exynos5_usbdrd_phy_tuning_state state)
546 {
547 	const struct exynos5_usbdrd_phy_tuning *tune;
548 
549 	tune = phy_drd->drv_data->phy_tunes[state];
550 	if (!tune)
551 		return;
552 
553 	for_each_phy_tune(tune) {
554 		void __iomem *reg_base;
555 		u32 reg = 0;
556 
557 		switch (tune->region) {
558 		case PTR_PHY:
559 			reg_base = phy_drd->reg_phy;
560 			break;
561 		case PTR_PCS:
562 			reg_base = phy_drd->reg_pcs;
563 			break;
564 		case PTR_PMA:
565 			reg_base = phy_drd->reg_pma;
566 			break;
567 		default:
568 			dev_warn_once(phy_drd->dev,
569 				      "unknown phy region %d\n", tune->region);
570 			continue;
571 		}
572 
573 		if (~tune->mask) {
574 			reg = readl(reg_base + tune->off);
575 			reg &= ~tune->mask;
576 		}
577 		reg |= tune->val;
578 		writel(reg, reg_base + tune->off);
579 	}
580 }
581 
582 static void exynos5_usbdrd_pipe3_init(struct exynos5_usbdrd_phy *phy_drd)
583 {
584 	u32 reg;
585 
586 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYPARAM1);
587 	/* Set Tx De-Emphasis level */
588 	reg &= ~PHYPARAM1_PCS_TXDEEMPH_MASK;
589 	reg |=	PHYPARAM1_PCS_TXDEEMPH;
590 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYPARAM1);
591 
592 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYTEST);
593 	reg &= ~PHYTEST_POWERDOWN_SSP;
594 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYTEST);
595 }
596 
597 static void
598 exynos5_usbdrd_usbdp_g2_v4_ctrl_pma_ready(struct exynos5_usbdrd_phy *phy_drd)
599 {
600 	void __iomem *regs_base = phy_drd->reg_phy;
601 	u32 reg;
602 
603 	/* link pipe_clock selection to pclk of PMA */
604 	reg = readl(regs_base + EXYNOS850_DRD_CLKRST);
605 	reg |= CLKRST_LINK_PCLK_SEL;
606 	writel(reg, regs_base + EXYNOS850_DRD_CLKRST);
607 
608 	reg = readl(regs_base + EXYNOS850_DRD_SECPMACTL);
609 	reg &= ~SECPMACTL_PMA_REF_FREQ_SEL;
610 	reg |= FIELD_PREP(SECPMACTL_PMA_REF_FREQ_SEL, 1);
611 	/* SFR reset */
612 	reg |= (SECPMACTL_PMA_LOW_PWR | SECPMACTL_PMA_APB_SW_RST);
613 	reg &= ~(SECPMACTL_PMA_ROPLL_REF_CLK_SEL |
614 		 SECPMACTL_PMA_LCPLL_REF_CLK_SEL);
615 	/* PMA power off */
616 	reg |= (SECPMACTL_PMA_TRSV_SW_RST | SECPMACTL_PMA_CMN_SW_RST |
617 		SECPMACTL_PMA_INIT_SW_RST);
618 	writel(reg, regs_base + EXYNOS850_DRD_SECPMACTL);
619 
620 	udelay(1);
621 
622 	reg = readl(regs_base + EXYNOS850_DRD_SECPMACTL);
623 	reg &= ~SECPMACTL_PMA_LOW_PWR;
624 	writel(reg, regs_base + EXYNOS850_DRD_SECPMACTL);
625 
626 	udelay(1);
627 
628 	/* release override */
629 	reg = readl(regs_base + EXYNOS850_DRD_LINKCTRL);
630 	reg &= ~LINKCTRL_FORCE_PIPE_EN;
631 	writel(reg, regs_base + EXYNOS850_DRD_LINKCTRL);
632 
633 	udelay(1);
634 
635 	/* APB enable */
636 	reg = readl(regs_base + EXYNOS850_DRD_SECPMACTL);
637 	reg &= ~SECPMACTL_PMA_APB_SW_RST;
638 	writel(reg, regs_base + EXYNOS850_DRD_SECPMACTL);
639 }
640 
641 static void
642 exynos5_usbdrd_usbdp_g2_v4_pma_lane_mux_sel(struct exynos5_usbdrd_phy *phy_drd)
643 {
644 	void __iomem *regs_base = phy_drd->reg_pma;
645 	u32 reg;
646 
647 	/* lane configuration: USB on all lanes */
648 	reg = readl(regs_base + EXYNOS9_PMA_USBDP_CMN_REG00B8);
649 	reg &= ~CMN_REG00B8_LANE_MUX_SEL_DP;
650 	writel(reg, regs_base + EXYNOS9_PMA_USBDP_CMN_REG00B8);
651 
652 	/*
653 	 * FIXME: below code supports one connector orientation only. It needs
654 	 * updating once we can receive connector events.
655 	 */
656 	/* override of TX receiver detector and comparator: lane 1 */
657 	reg = readl(regs_base + EXYNOS9_PMA_USBDP_TRSV_REG0413);
658 	reg &= ~TRSV_REG0413_OVRD_LN1_TX_RXD_COMP_EN;
659 	reg &= ~TRSV_REG0413_OVRD_LN1_TX_RXD_EN;
660 	writel(reg, regs_base + EXYNOS9_PMA_USBDP_TRSV_REG0413);
661 
662 	/* lane 3 */
663 	reg = readl(regs_base + EXYNOS9_PMA_USBDP_TRSV_REG0813);
664 	reg |= TRSV_REG0813_OVRD_LN3_TX_RXD_COMP_EN;
665 	reg |= TRSV_REG0813_OVRD_LN3_TX_RXD_EN;
666 	writel(reg, regs_base + EXYNOS9_PMA_USBDP_TRSV_REG0813);
667 }
668 
669 static int
670 exynos5_usbdrd_usbdp_g2_v4_pma_check_pll_lock(struct exynos5_usbdrd_phy *phy_drd)
671 {
672 	static const unsigned int timeout_us = 40000;
673 	static const unsigned int sleep_us = 40;
674 	static const u32 locked = (CMN_REG01C0_ANA_LCPLL_LOCK_DONE |
675 				   CMN_REG01C0_ANA_LCPLL_AFC_DONE);
676 	u32 reg;
677 	int err;
678 
679 	err = readl_poll_timeout(
680 			phy_drd->reg_pma + EXYNOS9_PMA_USBDP_CMN_REG01C0,
681 			reg, (reg & locked) == locked, sleep_us, timeout_us);
682 	if (err)
683 		dev_err(phy_drd->dev,
684 			"timed out waiting for PLL lock: %#.8x\n", reg);
685 
686 	return err;
687 }
688 
689 static void
690 exynos5_usbdrd_usbdp_g2_v4_pma_check_cdr_lock(struct exynos5_usbdrd_phy *phy_drd)
691 {
692 	static const unsigned int timeout_us = 40000;
693 	static const unsigned int sleep_us = 40;
694 	static const u32 locked =
695 		(TRSV_REG03C3_LN0_MON_RX_CDR_AFC_DONE
696 		 | TRSV_REG03C3_LN0_MON_RX_CDR_CAL_DONE
697 		 | TRSV_REG03C3_LN0_MON_RX_CDR_FLD_PLL_MODE_DONE
698 		 | TRSV_REG03C3_LN0_MON_RX_CDR_LOCK_DONE);
699 	u32 reg;
700 	int err;
701 
702 	err = readl_poll_timeout(
703 			phy_drd->reg_pma + EXYNOS9_PMA_USBDP_TRSV_REG03C3,
704 			reg, (reg & locked) == locked, sleep_us, timeout_us);
705 	if (!err)
706 		return;
707 
708 	dev_err(phy_drd->dev,
709 		"timed out waiting for CDR lock (l0): %#.8x, retrying\n", reg);
710 
711 	/* based on cable orientation, this might be on the other phy port */
712 	err = readl_poll_timeout(
713 			phy_drd->reg_pma + EXYNOS9_PMA_USBDP_TRSV_REG07C3,
714 			reg, (reg & locked) == locked, sleep_us, timeout_us);
715 	if (err)
716 		dev_err(phy_drd->dev,
717 			"timed out waiting for CDR lock (l2): %#.8x\n", reg);
718 }
719 
720 static void exynos5_usbdrd_utmi_init(struct exynos5_usbdrd_phy *phy_drd)
721 {
722 	u32 reg;
723 
724 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYPARAM0);
725 	/* Set Loss-of-Signal Detector sensitivity */
726 	reg &= ~PHYPARAM0_REF_LOSLEVEL_MASK;
727 	reg |=	PHYPARAM0_REF_LOSLEVEL;
728 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYPARAM0);
729 
730 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYPARAM1);
731 	/* Set Tx De-Emphasis level */
732 	reg &= ~PHYPARAM1_PCS_TXDEEMPH_MASK;
733 	reg |=	PHYPARAM1_PCS_TXDEEMPH;
734 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYPARAM1);
735 
736 	/* UTMI Power Control */
737 	writel(PHYUTMI_OTGDISABLE, phy_drd->reg_phy + EXYNOS5_DRD_PHYUTMI);
738 
739 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYTEST);
740 	reg &= ~PHYTEST_POWERDOWN_HSP;
741 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYTEST);
742 }
743 
744 static int exynos5_usbdrd_phy_init(struct phy *phy)
745 {
746 	int ret;
747 	u32 reg;
748 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
749 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
750 
751 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
752 	if (ret)
753 		return ret;
754 
755 	/* Reset USB 3.0 PHY */
756 	writel(0x0, phy_drd->reg_phy + EXYNOS5_DRD_PHYREG0);
757 	writel(0x0, phy_drd->reg_phy + EXYNOS5_DRD_PHYRESUME);
758 
759 	/*
760 	 * Setting the Frame length Adj value[6:1] to default 0x20
761 	 * See xHCI 1.0 spec, 5.2.4
762 	 */
763 	reg =	LINKSYSTEM_XHCI_VERSION_CONTROL |
764 		LINKSYSTEM_FLADJ(0x20);
765 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_LINKSYSTEM);
766 
767 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYPARAM0);
768 	/* Select PHY CLK source */
769 	reg &= ~PHYPARAM0_REF_USE_PAD;
770 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYPARAM0);
771 
772 	/* This bit must be set for both HS and SS operations */
773 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYUTMICLKSEL);
774 	reg |= PHYUTMICLKSEL_UTMI_CLKSEL;
775 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYUTMICLKSEL);
776 
777 	/* UTMI or PIPE3 specific init */
778 	inst->phy_cfg->phy_init(phy_drd);
779 
780 	/* reference clock settings */
781 	reg = inst->phy_cfg->set_refclk(inst);
782 
783 		/* Digital power supply in normal operating mode */
784 	reg |=	PHYCLKRST_RETENABLEN |
785 		/* Enable ref clock for SS function */
786 		PHYCLKRST_REF_SSP_EN |
787 		/* Enable spread spectrum */
788 		PHYCLKRST_SSC_EN |
789 		/* Power down HS Bias and PLL blocks in suspend mode */
790 		PHYCLKRST_COMMONONN |
791 		/* Reset the port */
792 		PHYCLKRST_PORTRESET;
793 
794 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYCLKRST);
795 
796 	fsleep(10);
797 
798 	reg &= ~PHYCLKRST_PORTRESET;
799 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYCLKRST);
800 
801 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
802 
803 	return 0;
804 }
805 
806 static int exynos5_usbdrd_phy_exit(struct phy *phy)
807 {
808 	int ret;
809 	u32 reg;
810 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
811 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
812 
813 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
814 	if (ret)
815 		return ret;
816 
817 	reg =	PHYUTMI_OTGDISABLE |
818 		PHYUTMI_FORCESUSPEND |
819 		PHYUTMI_FORCESLEEP;
820 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYUTMI);
821 
822 	/* Resetting the PHYCLKRST enable bits to reduce leakage current */
823 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYCLKRST);
824 	reg &= ~(PHYCLKRST_REF_SSP_EN |
825 		 PHYCLKRST_SSC_EN |
826 		 PHYCLKRST_COMMONONN);
827 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYCLKRST);
828 
829 	/* Control PHYTEST to remove leakage current */
830 	reg = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYTEST);
831 	reg |=	PHYTEST_POWERDOWN_SSP |
832 		PHYTEST_POWERDOWN_HSP;
833 	writel(reg, phy_drd->reg_phy + EXYNOS5_DRD_PHYTEST);
834 
835 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
836 
837 	return 0;
838 }
839 
840 static int exynos5_usbdrd_phy_power_on(struct phy *phy)
841 {
842 	int ret;
843 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
844 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
845 
846 	dev_dbg(phy_drd->dev, "Request to power_on usbdrd_phy phy\n");
847 
848 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_core_clks,
849 				      phy_drd->core_clks);
850 	if (ret)
851 		return ret;
852 
853 	/* Enable VBUS supply */
854 	ret = regulator_bulk_enable(phy_drd->drv_data->n_regulators,
855 				    phy_drd->regulators);
856 	if (ret) {
857 		dev_err(phy_drd->dev, "Failed to enable PHY regulator(s)\n");
858 		goto fail_vbus;
859 	}
860 
861 	/* Power-on PHY */
862 	inst->phy_cfg->phy_isol(inst, false);
863 
864 	return 0;
865 
866 fail_vbus:
867 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_core_clks,
868 				   phy_drd->core_clks);
869 
870 	return ret;
871 }
872 
873 static int exynos5_usbdrd_phy_power_off(struct phy *phy)
874 {
875 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
876 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
877 
878 	dev_dbg(phy_drd->dev, "Request to power_off usbdrd_phy phy\n");
879 
880 	/* Power-off the PHY */
881 	inst->phy_cfg->phy_isol(inst, true);
882 
883 	/* Disable VBUS supply */
884 	regulator_bulk_disable(phy_drd->drv_data->n_regulators,
885 			       phy_drd->regulators);
886 
887 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_core_clks,
888 				   phy_drd->core_clks);
889 
890 	return 0;
891 }
892 
893 static int crport_handshake(struct exynos5_usbdrd_phy *phy_drd,
894 			    u32 val, u32 cmd)
895 {
896 	unsigned int result;
897 	int err;
898 
899 	writel(val | cmd, phy_drd->reg_phy + EXYNOS5_DRD_PHYREG0);
900 
901 	err = readl_poll_timeout(phy_drd->reg_phy + EXYNOS5_DRD_PHYREG1,
902 				 result, (result & PHYREG1_CR_ACK), 1, 100);
903 	if (err == -ETIMEDOUT) {
904 		dev_err(phy_drd->dev, "CRPORT handshake timeout1 (0x%08x)\n", val);
905 		return err;
906 	}
907 
908 	writel(val, phy_drd->reg_phy + EXYNOS5_DRD_PHYREG0);
909 
910 	err = readl_poll_timeout(phy_drd->reg_phy + EXYNOS5_DRD_PHYREG1,
911 				 result, !(result & PHYREG1_CR_ACK), 1, 100);
912 	if (err == -ETIMEDOUT) {
913 		dev_err(phy_drd->dev, "CRPORT handshake timeout2 (0x%08x)\n", val);
914 		return err;
915 	}
916 
917 	return 0;
918 }
919 
920 static int crport_ctrl_write(struct exynos5_usbdrd_phy *phy_drd,
921 			     u32 addr, u32 data)
922 {
923 	int ret;
924 
925 	/* Write Address */
926 	writel(PHYREG0_CR_DATA_IN(addr),
927 	       phy_drd->reg_phy + EXYNOS5_DRD_PHYREG0);
928 	ret = crport_handshake(phy_drd, PHYREG0_CR_DATA_IN(addr),
929 			       PHYREG0_CR_CAP_ADDR);
930 	if (ret)
931 		return ret;
932 
933 	/* Write Data */
934 	writel(PHYREG0_CR_DATA_IN(data),
935 	       phy_drd->reg_phy + EXYNOS5_DRD_PHYREG0);
936 	ret = crport_handshake(phy_drd, PHYREG0_CR_DATA_IN(data),
937 			       PHYREG0_CR_CAP_DATA);
938 	if (ret)
939 		return ret;
940 
941 	ret = crport_handshake(phy_drd, PHYREG0_CR_DATA_IN(data),
942 			       PHYREG0_CR_WRITE);
943 
944 	return ret;
945 }
946 
947 /*
948  * Calibrate few PHY parameters using CR_PORT register to meet
949  * SuperSpeed requirements on Exynos5420 and Exynos5800 systems,
950  * which have 28nm USB 3.0 DRD PHY.
951  */
952 static int exynos5420_usbdrd_phy_calibrate(struct exynos5_usbdrd_phy *phy_drd)
953 {
954 	unsigned int temp;
955 	int ret = 0;
956 
957 	/*
958 	 * Change los_bias to (0x5) for 28nm PHY from a
959 	 * default value (0x0); los_level is set as default
960 	 * (0x9) as also reflected in los_level[30:26] bits
961 	 * of PHYPARAM0 register.
962 	 */
963 	temp = LOSLEVEL_OVRD_IN_LOS_BIAS_5420 |
964 		LOSLEVEL_OVRD_IN_EN |
965 		LOSLEVEL_OVRD_IN_LOS_LEVEL_DEFAULT;
966 	ret = crport_ctrl_write(phy_drd,
967 				EXYNOS5_DRD_PHYSS_LOSLEVEL_OVRD_IN,
968 				temp);
969 	if (ret) {
970 		dev_err(phy_drd->dev,
971 			"Failed setting Loss-of-Signal level for SuperSpeed\n");
972 		return ret;
973 	}
974 
975 	/*
976 	 * Set tx_vboost_lvl to (0x5) for 28nm PHY Tuning,
977 	 * to raise Tx signal level from its default value of (0x4)
978 	 */
979 	temp = TX_VBOOSTLEVEL_OVRD_IN_VBOOST_5420;
980 	ret = crport_ctrl_write(phy_drd,
981 				EXYNOS5_DRD_PHYSS_TX_VBOOSTLEVEL_OVRD_IN,
982 				temp);
983 	if (ret) {
984 		dev_err(phy_drd->dev,
985 			"Failed setting Tx-Vboost-Level for SuperSpeed\n");
986 		return ret;
987 	}
988 
989 	/*
990 	 * Set proper time to wait for RxDetect measurement, for
991 	 * desired reference clock of PHY, by tuning the CR_PORT
992 	 * register LANE0.TX_DEBUG which is internal to PHY.
993 	 * This fixes issue with few USB 3.0 devices, which are
994 	 * not detected (not even generate interrupts on the bus
995 	 * on insertion) without this change.
996 	 * e.g. Samsung SUM-TSB16S 3.0 USB drive.
997 	 */
998 	switch (phy_drd->extrefclk) {
999 	case EXYNOS5_FSEL_50MHZ:
1000 		temp = LANE0_TX_DEBUG_RXDET_MEAS_TIME_48M_50M_52M;
1001 		break;
1002 	case EXYNOS5_FSEL_20MHZ:
1003 	case EXYNOS5_FSEL_19MHZ2:
1004 		temp = LANE0_TX_DEBUG_RXDET_MEAS_TIME_19M2_20M;
1005 		break;
1006 	case EXYNOS5_FSEL_24MHZ:
1007 	default:
1008 		temp = LANE0_TX_DEBUG_RXDET_MEAS_TIME_24M;
1009 		break;
1010 	}
1011 
1012 	ret = crport_ctrl_write(phy_drd,
1013 				EXYNOS5_DRD_PHYSS_LANE0_TX_DEBUG,
1014 				temp);
1015 	if (ret)
1016 		dev_err(phy_drd->dev,
1017 			"Fail to set RxDet measurement time for SuperSpeed\n");
1018 
1019 	return ret;
1020 }
1021 
1022 static struct phy *exynos5_usbdrd_phy_xlate(struct device *dev,
1023 					const struct of_phandle_args *args)
1024 {
1025 	struct exynos5_usbdrd_phy *phy_drd = dev_get_drvdata(dev);
1026 
1027 	if (WARN_ON(args->args[0] >= EXYNOS5_DRDPHYS_NUM))
1028 		return ERR_PTR(-ENODEV);
1029 
1030 	return phy_drd->phys[args->args[0]].phy;
1031 }
1032 
1033 static int exynos5_usbdrd_phy_calibrate(struct phy *phy)
1034 {
1035 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
1036 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
1037 
1038 	if (inst->phy_cfg->id == EXYNOS5_DRDPHY_UTMI)
1039 		return exynos5420_usbdrd_phy_calibrate(phy_drd);
1040 	return 0;
1041 }
1042 
1043 static const struct phy_ops exynos5_usbdrd_phy_ops = {
1044 	.init		= exynos5_usbdrd_phy_init,
1045 	.exit		= exynos5_usbdrd_phy_exit,
1046 	.power_on	= exynos5_usbdrd_phy_power_on,
1047 	.power_off	= exynos5_usbdrd_phy_power_off,
1048 	.calibrate	= exynos5_usbdrd_phy_calibrate,
1049 	.owner		= THIS_MODULE,
1050 };
1051 
1052 static void
1053 exynos5_usbdrd_usb_v3p1_pipe_override(struct exynos5_usbdrd_phy *phy_drd)
1054 {
1055 	void __iomem *regs_base = phy_drd->reg_phy;
1056 	u32 reg;
1057 
1058 	/* force pipe3 signal for link */
1059 	reg = readl(regs_base + EXYNOS850_DRD_LINKCTRL);
1060 	reg &= ~LINKCTRL_FORCE_PHYSTATUS;
1061 	reg |= LINKCTRL_FORCE_PIPE_EN | LINKCTRL_FORCE_RXELECIDLE;
1062 	writel(reg, regs_base + EXYNOS850_DRD_LINKCTRL);
1063 
1064 	/* PMA disable */
1065 	reg = readl(regs_base + EXYNOS850_DRD_SECPMACTL);
1066 	reg |= SECPMACTL_PMA_LOW_PWR;
1067 	writel(reg, regs_base + EXYNOS850_DRD_SECPMACTL);
1068 }
1069 
1070 static void exynos850_usbdrd_utmi_init(struct exynos5_usbdrd_phy *phy_drd)
1071 {
1072 	void __iomem *regs_base = phy_drd->reg_phy;
1073 	u32 reg;
1074 	u32 ss_ports;
1075 
1076 	/*
1077 	 * Disable HWACG (hardware auto clock gating control). This will force
1078 	 * QACTIVE signal in Q-Channel interface to HIGH level, to make sure
1079 	 * the PHY clock is not gated by the hardware.
1080 	 */
1081 	reg = readl(regs_base + EXYNOS850_DRD_LINKCTRL);
1082 	reg |= LINKCTRL_FORCE_QACT;
1083 	writel(reg, regs_base + EXYNOS850_DRD_LINKCTRL);
1084 
1085 	reg = readl(regs_base + EXYNOS850_DRD_LINKPORT);
1086 	ss_ports = FIELD_GET(LINKPORT_HOST_NUM_U3, reg);
1087 
1088 	/* Start PHY Reset (POR=high) */
1089 	reg = readl(regs_base + EXYNOS850_DRD_CLKRST);
1090 	if (ss_ports) {
1091 		reg |= CLKRST_PHY20_SW_POR;
1092 		reg |= CLKRST_PHY20_SW_POR_SEL;
1093 		reg |= CLKRST_PHY_RESET_SEL;
1094 	}
1095 	reg |= CLKRST_PHY_SW_RST;
1096 	writel(reg, regs_base + EXYNOS850_DRD_CLKRST);
1097 
1098 	/* Enable UTMI+ */
1099 	reg = readl(regs_base + EXYNOS850_DRD_UTMI);
1100 	reg &= ~(UTMI_FORCE_SUSPEND | UTMI_FORCE_SLEEP | UTMI_DP_PULLDOWN |
1101 		 UTMI_DM_PULLDOWN);
1102 	writel(reg, regs_base + EXYNOS850_DRD_UTMI);
1103 
1104 	/* Set PHY clock and control HS PHY */
1105 	reg = readl(regs_base + EXYNOS850_DRD_HSP);
1106 	reg |= HSP_EN_UTMISUSPEND | HSP_COMMONONN;
1107 	writel(reg, regs_base + EXYNOS850_DRD_HSP);
1108 
1109 	/* Set VBUS Valid and D+ pull-up control by VBUS pad usage */
1110 	reg = readl(regs_base + EXYNOS850_DRD_LINKCTRL);
1111 	reg |= LINKCTRL_BUS_FILTER_BYPASS(0xf);
1112 	writel(reg, regs_base + EXYNOS850_DRD_LINKCTRL);
1113 
1114 	reg = readl(regs_base + EXYNOS850_DRD_UTMI);
1115 	reg |= UTMI_FORCE_BVALID | UTMI_FORCE_VBUSVALID;
1116 	writel(reg, regs_base + EXYNOS850_DRD_UTMI);
1117 
1118 	reg = readl(regs_base + EXYNOS850_DRD_HSP);
1119 	reg |= HSP_VBUSVLDEXT | HSP_VBUSVLDEXTSEL;
1120 	writel(reg, regs_base + EXYNOS850_DRD_HSP);
1121 
1122 	reg = readl(regs_base + EXYNOS850_DRD_SSPPLLCTL);
1123 	reg &= ~SSPPLLCTL_FSEL;
1124 	switch (phy_drd->extrefclk) {
1125 	case EXYNOS5_FSEL_50MHZ:
1126 		reg |= FIELD_PREP(SSPPLLCTL_FSEL, 7);
1127 		break;
1128 	case EXYNOS5_FSEL_26MHZ:
1129 		reg |= FIELD_PREP(SSPPLLCTL_FSEL, 6);
1130 		break;
1131 	case EXYNOS5_FSEL_24MHZ:
1132 		reg |= FIELD_PREP(SSPPLLCTL_FSEL, 2);
1133 		break;
1134 	case EXYNOS5_FSEL_20MHZ:
1135 		reg |= FIELD_PREP(SSPPLLCTL_FSEL, 1);
1136 		break;
1137 	case EXYNOS5_FSEL_19MHZ2:
1138 		reg |= FIELD_PREP(SSPPLLCTL_FSEL, 0);
1139 		break;
1140 	default:
1141 		dev_warn(phy_drd->dev, "unsupported ref clk: %#.2x\n",
1142 			 phy_drd->extrefclk);
1143 		break;
1144 	}
1145 	writel(reg, regs_base + EXYNOS850_DRD_SSPPLLCTL);
1146 
1147 	if (phy_drd->drv_data->phy_tunes)
1148 		exynos5_usbdrd_apply_phy_tunes(phy_drd,
1149 					       PTS_UTMI_POSTINIT);
1150 
1151 	/* Power up PHY analog blocks */
1152 	reg = readl(regs_base + EXYNOS850_DRD_HSP_TEST);
1153 	reg &= ~HSP_TEST_SIDDQ;
1154 	writel(reg, regs_base + EXYNOS850_DRD_HSP_TEST);
1155 
1156 	/* Finish PHY reset (POR=low) */
1157 	fsleep(10); /* required before doing POR=low */
1158 	reg = readl(regs_base + EXYNOS850_DRD_CLKRST);
1159 	if (ss_ports) {
1160 		reg |= CLKRST_PHY20_SW_POR_SEL;
1161 		reg &= ~CLKRST_PHY20_SW_POR;
1162 	}
1163 	reg &= ~(CLKRST_PHY_SW_RST | CLKRST_PORT_RST);
1164 	writel(reg, regs_base + EXYNOS850_DRD_CLKRST);
1165 	fsleep(75); /* required after POR=low for guaranteed PHY clock */
1166 
1167 	/* Disable single ended signal out */
1168 	reg = readl(regs_base + EXYNOS850_DRD_HSP);
1169 	reg &= ~HSP_FSV_OUT_EN;
1170 	writel(reg, regs_base + EXYNOS850_DRD_HSP);
1171 
1172 	if (ss_ports)
1173 		exynos5_usbdrd_usb_v3p1_pipe_override(phy_drd);
1174 }
1175 
1176 static int exynos850_usbdrd_phy_init(struct phy *phy)
1177 {
1178 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
1179 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
1180 	int ret;
1181 
1182 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
1183 	if (ret)
1184 		return ret;
1185 
1186 	/* UTMI or PIPE3 specific init */
1187 	inst->phy_cfg->phy_init(phy_drd);
1188 
1189 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
1190 
1191 	return 0;
1192 }
1193 
1194 static int exynos850_usbdrd_phy_exit(struct phy *phy)
1195 {
1196 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
1197 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
1198 	void __iomem *regs_base = phy_drd->reg_phy;
1199 	u32 reg;
1200 	int ret;
1201 
1202 	ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
1203 	if (ret)
1204 		return ret;
1205 
1206 	/* Set PHY clock and control HS PHY */
1207 	reg = readl(regs_base + EXYNOS850_DRD_UTMI);
1208 	reg &= ~(UTMI_DP_PULLDOWN | UTMI_DM_PULLDOWN);
1209 	reg |= UTMI_FORCE_SUSPEND | UTMI_FORCE_SLEEP;
1210 	writel(reg, regs_base + EXYNOS850_DRD_UTMI);
1211 
1212 	/* Power down PHY analog blocks */
1213 	reg = readl(regs_base + EXYNOS850_DRD_HSP_TEST);
1214 	reg |= HSP_TEST_SIDDQ;
1215 	writel(reg, regs_base + EXYNOS850_DRD_HSP_TEST);
1216 
1217 	/* Link reset */
1218 	reg = readl(regs_base + EXYNOS850_DRD_CLKRST);
1219 	reg |= CLKRST_LINK_SW_RST;
1220 	writel(reg, regs_base + EXYNOS850_DRD_CLKRST);
1221 	fsleep(10); /* required before doing POR=low */
1222 	reg &= ~CLKRST_LINK_SW_RST;
1223 	writel(reg, regs_base + EXYNOS850_DRD_CLKRST);
1224 
1225 	clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
1226 
1227 	return 0;
1228 }
1229 
1230 static const struct phy_ops exynos850_usbdrd_phy_ops = {
1231 	.init		= exynos850_usbdrd_phy_init,
1232 	.exit		= exynos850_usbdrd_phy_exit,
1233 	.power_on	= exynos5_usbdrd_phy_power_on,
1234 	.power_off	= exynos5_usbdrd_phy_power_off,
1235 	.owner		= THIS_MODULE,
1236 };
1237 
1238 static void exynos5_usbdrd_gs101_pipe3_init(struct exynos5_usbdrd_phy *phy_drd)
1239 {
1240 	void __iomem *regs_pma = phy_drd->reg_pma;
1241 	void __iomem *regs_phy = phy_drd->reg_phy;
1242 	u32 reg;
1243 
1244 	exynos5_usbdrd_usbdp_g2_v4_ctrl_pma_ready(phy_drd);
1245 
1246 	/* force aux off */
1247 	reg = readl(regs_pma + EXYNOS9_PMA_USBDP_CMN_REG0008);
1248 	reg &= ~CMN_REG0008_AUX_EN;
1249 	reg |= CMN_REG0008_OVRD_AUX_EN;
1250 	writel(reg, regs_pma + EXYNOS9_PMA_USBDP_CMN_REG0008);
1251 
1252 	exynos5_usbdrd_apply_phy_tunes(phy_drd, PTS_PIPE3_PREINIT);
1253 	exynos5_usbdrd_apply_phy_tunes(phy_drd, PTS_PIPE3_INIT);
1254 	exynos5_usbdrd_apply_phy_tunes(phy_drd, PTS_PIPE3_POSTINIT);
1255 
1256 	exynos5_usbdrd_usbdp_g2_v4_pma_lane_mux_sel(phy_drd);
1257 
1258 	/* reset release from port */
1259 	reg = readl(regs_phy + EXYNOS850_DRD_SECPMACTL);
1260 	reg &= ~(SECPMACTL_PMA_TRSV_SW_RST | SECPMACTL_PMA_CMN_SW_RST |
1261 		 SECPMACTL_PMA_INIT_SW_RST);
1262 	writel(reg, regs_phy + EXYNOS850_DRD_SECPMACTL);
1263 
1264 	if (!exynos5_usbdrd_usbdp_g2_v4_pma_check_pll_lock(phy_drd))
1265 		exynos5_usbdrd_usbdp_g2_v4_pma_check_cdr_lock(phy_drd);
1266 }
1267 
1268 static int exynos5_usbdrd_gs101_phy_init(struct phy *phy)
1269 {
1270 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
1271 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
1272 	int ret;
1273 
1274 	if (inst->phy_cfg->id == EXYNOS5_DRDPHY_UTMI) {
1275 		/* Power-on PHY ... */
1276 		ret = regulator_bulk_enable(phy_drd->drv_data->n_regulators,
1277 					    phy_drd->regulators);
1278 		if (ret) {
1279 			dev_err(phy_drd->dev,
1280 				"Failed to enable PHY regulator(s)\n");
1281 			return ret;
1282 		}
1283 	}
1284 	/*
1285 	 * ... and ungate power via PMU. Without this here, we get an SError
1286 	 * trying to access PMA registers
1287 	 */
1288 	exynos5_usbdrd_phy_isol(inst, false);
1289 
1290 	return exynos850_usbdrd_phy_init(phy);
1291 }
1292 
1293 static int exynos5_usbdrd_gs101_phy_exit(struct phy *phy)
1294 {
1295 	struct phy_usb_instance *inst = phy_get_drvdata(phy);
1296 	struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
1297 	int ret;
1298 
1299 	if (inst->phy_cfg->id != EXYNOS5_DRDPHY_UTMI)
1300 		return 0;
1301 
1302 	ret = exynos850_usbdrd_phy_exit(phy);
1303 	if (ret)
1304 		return ret;
1305 
1306 	exynos5_usbdrd_phy_isol(inst, true);
1307 	return regulator_bulk_disable(phy_drd->drv_data->n_regulators,
1308 				      phy_drd->regulators);
1309 }
1310 
1311 static const struct phy_ops gs101_usbdrd_phy_ops = {
1312 	.init		= exynos5_usbdrd_gs101_phy_init,
1313 	.exit		= exynos5_usbdrd_gs101_phy_exit,
1314 	.owner		= THIS_MODULE,
1315 };
1316 
1317 static int exynos5_usbdrd_phy_clk_handle(struct exynos5_usbdrd_phy *phy_drd)
1318 {
1319 	int ret;
1320 	struct clk *ref_clk;
1321 	unsigned long ref_rate;
1322 
1323 	phy_drd->clks = devm_kcalloc(phy_drd->dev, phy_drd->drv_data->n_clks,
1324 				     sizeof(*phy_drd->clks), GFP_KERNEL);
1325 	if (!phy_drd->clks)
1326 		return -ENOMEM;
1327 
1328 	for (int i = 0; i < phy_drd->drv_data->n_clks; ++i)
1329 		phy_drd->clks[i].id = phy_drd->drv_data->clk_names[i];
1330 
1331 	ret = devm_clk_bulk_get(phy_drd->dev, phy_drd->drv_data->n_clks,
1332 				phy_drd->clks);
1333 	if (ret)
1334 		return dev_err_probe(phy_drd->dev, ret,
1335 				     "failed to get phy clock(s)\n");
1336 
1337 	phy_drd->core_clks = devm_kcalloc(phy_drd->dev,
1338 					  phy_drd->drv_data->n_core_clks,
1339 					  sizeof(*phy_drd->core_clks),
1340 					  GFP_KERNEL);
1341 	if (!phy_drd->core_clks)
1342 		return -ENOMEM;
1343 
1344 	for (int i = 0; i < phy_drd->drv_data->n_core_clks; ++i)
1345 		phy_drd->core_clks[i].id = phy_drd->drv_data->core_clk_names[i];
1346 
1347 	ret = devm_clk_bulk_get(phy_drd->dev, phy_drd->drv_data->n_core_clks,
1348 				phy_drd->core_clks);
1349 	if (ret)
1350 		return dev_err_probe(phy_drd->dev, ret,
1351 				     "failed to get phy core clock(s)\n");
1352 
1353 	ref_clk = NULL;
1354 	for (int i = 0; i < phy_drd->drv_data->n_core_clks; ++i) {
1355 		if (!strcmp(phy_drd->core_clks[i].id, "ref")) {
1356 			ref_clk = phy_drd->core_clks[i].clk;
1357 			break;
1358 		}
1359 	}
1360 	if (!ref_clk)
1361 		return dev_err_probe(phy_drd->dev, -ENODEV,
1362 				     "failed to find phy reference clock\n");
1363 
1364 	ref_rate = clk_get_rate(ref_clk);
1365 	ret = exynos5_rate_to_clk(ref_rate, &phy_drd->extrefclk);
1366 	if (ret)
1367 		return dev_err_probe(phy_drd->dev, ret,
1368 				     "clock rate (%ld) not supported\n",
1369 				     ref_rate);
1370 
1371 	return 0;
1372 }
1373 
1374 static const struct exynos5_usbdrd_phy_config phy_cfg_exynos5[] = {
1375 	{
1376 		.id		= EXYNOS5_DRDPHY_UTMI,
1377 		.phy_isol	= exynos5_usbdrd_phy_isol,
1378 		.phy_init	= exynos5_usbdrd_utmi_init,
1379 		.set_refclk	= exynos5_usbdrd_utmi_set_refclk,
1380 	},
1381 	{
1382 		.id		= EXYNOS5_DRDPHY_PIPE3,
1383 		.phy_isol	= exynos5_usbdrd_phy_isol,
1384 		.phy_init	= exynos5_usbdrd_pipe3_init,
1385 		.set_refclk	= exynos5_usbdrd_pipe3_set_refclk,
1386 	},
1387 };
1388 
1389 static const struct exynos5_usbdrd_phy_config phy_cfg_exynos850[] = {
1390 	{
1391 		.id		= EXYNOS5_DRDPHY_UTMI,
1392 		.phy_isol	= exynos5_usbdrd_phy_isol,
1393 		.phy_init	= exynos850_usbdrd_utmi_init,
1394 	},
1395 };
1396 
1397 static const char * const exynos5_clk_names[] = {
1398 	"phy",
1399 };
1400 
1401 static const char * const exynos5_core_clk_names[] = {
1402 	"ref",
1403 };
1404 
1405 static const char * const exynos5433_core_clk_names[] = {
1406 	"ref", "phy_pipe", "phy_utmi", "itp",
1407 };
1408 
1409 static const char * const exynos5_regulator_names[] = {
1410 	"vbus", "vbus-boost",
1411 };
1412 
1413 static const struct exynos5_usbdrd_phy_drvdata exynos5420_usbdrd_phy = {
1414 	.phy_cfg		= phy_cfg_exynos5,
1415 	.phy_ops		= &exynos5_usbdrd_phy_ops,
1416 	.pmu_offset_usbdrd0_phy	= EXYNOS5_USBDRD_PHY_CONTROL,
1417 	.pmu_offset_usbdrd1_phy	= EXYNOS5420_USBDRD1_PHY_CONTROL,
1418 	.clk_names		= exynos5_clk_names,
1419 	.n_clks			= ARRAY_SIZE(exynos5_clk_names),
1420 	.core_clk_names		= exynos5_core_clk_names,
1421 	.n_core_clks		= ARRAY_SIZE(exynos5_core_clk_names),
1422 	.regulator_names	= exynos5_regulator_names,
1423 	.n_regulators		= ARRAY_SIZE(exynos5_regulator_names),
1424 };
1425 
1426 static const struct exynos5_usbdrd_phy_drvdata exynos5250_usbdrd_phy = {
1427 	.phy_cfg		= phy_cfg_exynos5,
1428 	.phy_ops		= &exynos5_usbdrd_phy_ops,
1429 	.pmu_offset_usbdrd0_phy	= EXYNOS5_USBDRD_PHY_CONTROL,
1430 	.clk_names		= exynos5_clk_names,
1431 	.n_clks			= ARRAY_SIZE(exynos5_clk_names),
1432 	.core_clk_names		= exynos5_core_clk_names,
1433 	.n_core_clks		= ARRAY_SIZE(exynos5_core_clk_names),
1434 	.regulator_names	= exynos5_regulator_names,
1435 	.n_regulators		= ARRAY_SIZE(exynos5_regulator_names),
1436 };
1437 
1438 static const struct exynos5_usbdrd_phy_drvdata exynos5433_usbdrd_phy = {
1439 	.phy_cfg		= phy_cfg_exynos5,
1440 	.phy_ops		= &exynos5_usbdrd_phy_ops,
1441 	.pmu_offset_usbdrd0_phy	= EXYNOS5_USBDRD_PHY_CONTROL,
1442 	.pmu_offset_usbdrd1_phy	= EXYNOS5433_USBHOST30_PHY_CONTROL,
1443 	.clk_names		= exynos5_clk_names,
1444 	.n_clks			= ARRAY_SIZE(exynos5_clk_names),
1445 	.core_clk_names		= exynos5433_core_clk_names,
1446 	.n_core_clks		= ARRAY_SIZE(exynos5433_core_clk_names),
1447 	.regulator_names	= exynos5_regulator_names,
1448 	.n_regulators		= ARRAY_SIZE(exynos5_regulator_names),
1449 };
1450 
1451 static const struct exynos5_usbdrd_phy_drvdata exynos7_usbdrd_phy = {
1452 	.phy_cfg		= phy_cfg_exynos5,
1453 	.phy_ops		= &exynos5_usbdrd_phy_ops,
1454 	.pmu_offset_usbdrd0_phy	= EXYNOS5_USBDRD_PHY_CONTROL,
1455 	.clk_names		= exynos5_clk_names,
1456 	.n_clks			= ARRAY_SIZE(exynos5_clk_names),
1457 	.core_clk_names		= exynos5433_core_clk_names,
1458 	.n_core_clks		= ARRAY_SIZE(exynos5433_core_clk_names),
1459 	.regulator_names	= exynos5_regulator_names,
1460 	.n_regulators		= ARRAY_SIZE(exynos5_regulator_names),
1461 };
1462 
1463 static const struct exynos5_usbdrd_phy_drvdata exynos850_usbdrd_phy = {
1464 	.phy_cfg		= phy_cfg_exynos850,
1465 	.phy_ops		= &exynos850_usbdrd_phy_ops,
1466 	.pmu_offset_usbdrd0_phy	= EXYNOS5_USBDRD_PHY_CONTROL,
1467 	.clk_names		= exynos5_clk_names,
1468 	.n_clks			= ARRAY_SIZE(exynos5_clk_names),
1469 	.core_clk_names		= exynos5_core_clk_names,
1470 	.n_core_clks		= ARRAY_SIZE(exynos5_core_clk_names),
1471 	.regulator_names	= exynos5_regulator_names,
1472 	.n_regulators		= ARRAY_SIZE(exynos5_regulator_names),
1473 };
1474 
1475 static const struct exynos5_usbdrd_phy_config phy_cfg_gs101[] = {
1476 	{
1477 		.id		= EXYNOS5_DRDPHY_UTMI,
1478 		.phy_isol	= exynos5_usbdrd_phy_isol,
1479 		.phy_init	= exynos850_usbdrd_utmi_init,
1480 	},
1481 	{
1482 		.id		= EXYNOS5_DRDPHY_PIPE3,
1483 		.phy_isol	= exynos5_usbdrd_phy_isol,
1484 		.phy_init	= exynos5_usbdrd_gs101_pipe3_init,
1485 	},
1486 };
1487 
1488 static const struct exynos5_usbdrd_phy_tuning gs101_tunes_utmi_postinit[] = {
1489 	PHY_TUNING_ENTRY_PHY(EXYNOS850_DRD_HSPPARACON,
1490 			     (HSPPARACON_TXVREF | HSPPARACON_TXRES |
1491 			      HSPPARACON_TXPREEMPAMP | HSPPARACON_SQRX |
1492 			      HSPPARACON_COMPDIS),
1493 			     (FIELD_PREP_CONST(HSPPARACON_TXVREF, 6) |
1494 			      FIELD_PREP_CONST(HSPPARACON_TXRES, 1) |
1495 			      FIELD_PREP_CONST(HSPPARACON_TXPREEMPAMP, 3) |
1496 			      FIELD_PREP_CONST(HSPPARACON_SQRX, 5) |
1497 			      FIELD_PREP_CONST(HSPPARACON_COMPDIS, 7))),
1498 	PHY_TUNING_ENTRY_LAST
1499 };
1500 
1501 static const struct exynos5_usbdrd_phy_tuning gs101_tunes_pipe3_preinit[] = {
1502 	/* preinit */
1503 	/* CDR data mode exit GEN1 ON / GEN2 OFF */
1504 	PHY_TUNING_ENTRY_PMA(0x0c8c, -1, 0xff),
1505 	PHY_TUNING_ENTRY_PMA(0x1c8c, -1, 0xff),
1506 	PHY_TUNING_ENTRY_PMA(0x0c9c, -1, 0x7d),
1507 	PHY_TUNING_ENTRY_PMA(0x1c9c, -1, 0x7d),
1508 	/* improve EDS distribution */
1509 	PHY_TUNING_ENTRY_PMA(0x0e7c, -1, 0x06),
1510 	PHY_TUNING_ENTRY_PMA(0x09e0, -1, 0x00),
1511 	PHY_TUNING_ENTRY_PMA(0x09e4, -1, 0x36),
1512 	PHY_TUNING_ENTRY_PMA(0x1e7c, -1, 0x06),
1513 	PHY_TUNING_ENTRY_PMA(0x1e90, -1, 0x00),
1514 	PHY_TUNING_ENTRY_PMA(0x1e94, -1, 0x36),
1515 	/* improve LVCC */
1516 	PHY_TUNING_ENTRY_PMA(0x08f0, -1, 0x30),
1517 	PHY_TUNING_ENTRY_PMA(0x18f0, -1, 0x30),
1518 	/* LFPS RX VIH shmoo hole */
1519 	PHY_TUNING_ENTRY_PMA(0x0a08, -1, 0x0c),
1520 	PHY_TUNING_ENTRY_PMA(0x1a08, -1, 0x0c),
1521 	/* remove unrelated option for v4 phy */
1522 	PHY_TUNING_ENTRY_PMA(0x0a0c, -1, 0x05),
1523 	PHY_TUNING_ENTRY_PMA(0x1a0c, -1, 0x05),
1524 	/* improve Gen2 LVCC */
1525 	PHY_TUNING_ENTRY_PMA(0x00f8, -1, 0x1c),
1526 	PHY_TUNING_ENTRY_PMA(0x00fc, -1, 0x54),
1527 	/* Change Vth of RCV_DET because of TD 7.40 Polling Retry Test */
1528 	PHY_TUNING_ENTRY_PMA(0x104c, -1, 0x07),
1529 	PHY_TUNING_ENTRY_PMA(0x204c, -1, 0x07),
1530 	/* reduce Ux Exit time, assuming 26MHz clock */
1531 	/* Gen1 */
1532 	PHY_TUNING_ENTRY_PMA(0x0ca8, -1, 0x00),
1533 	PHY_TUNING_ENTRY_PMA(0x0cac, -1, 0x04),
1534 	PHY_TUNING_ENTRY_PMA(0x1ca8, -1, 0x00),
1535 	PHY_TUNING_ENTRY_PMA(0x1cac, -1, 0x04),
1536 	/* Gen2 */
1537 	PHY_TUNING_ENTRY_PMA(0x0cb8, -1, 0x00),
1538 	PHY_TUNING_ENTRY_PMA(0x0cbc, -1, 0x04),
1539 	PHY_TUNING_ENTRY_PMA(0x1cb8, -1, 0x00),
1540 	PHY_TUNING_ENTRY_PMA(0x1cbc, -1, 0x04),
1541 	/* RX impedance setting */
1542 	PHY_TUNING_ENTRY_PMA(0x0bb0, 0x03, 0x01),
1543 	PHY_TUNING_ENTRY_PMA(0x0bb4, 0xf0, 0xa0),
1544 	PHY_TUNING_ENTRY_PMA(0x1bb0, 0x03, 0x01),
1545 	PHY_TUNING_ENTRY_PMA(0x1bb4, 0xf0, 0xa0),
1546 
1547 	PHY_TUNING_ENTRY_LAST
1548 };
1549 
1550 static const struct exynos5_usbdrd_phy_tuning gs101_tunes_pipe3_init[] = {
1551 	/* init */
1552 	/* abnormal common pattern mask */
1553 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_BACK_END_MODE_VEC,
1554 			     BACK_END_MODE_VEC_DISABLE_DATA_MASK, 0),
1555 	/* de-serializer enabled when U2 */
1556 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_OUT_VEC_2, PCS_OUT_VEC_B4_DYNAMIC,
1557 			     PCS_OUT_VEC_B4_SEL_OUT),
1558 	/* TX Keeper Disable, Squelch on when U3 */
1559 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_OUT_VEC_3, PCS_OUT_VEC_B7_DYNAMIC,
1560 			     PCS_OUT_VEC_B7_SEL_OUT | PCS_OUT_VEC_B2_SEL_OUT),
1561 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_NS_VEC_PS1_N1, -1,
1562 			     (FIELD_PREP_CONST(NS_VEC_NS_REQ, 5) |
1563 			      NS_VEC_ENABLE_TIMER |
1564 			      FIELD_PREP_CONST(NS_VEC_SEL_TIMEOUT, 3))),
1565 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_NS_VEC_PS2_N0, -1,
1566 			     (FIELD_PREP_CONST(NS_VEC_NS_REQ, 1) |
1567 			      NS_VEC_ENABLE_TIMER |
1568 			      FIELD_PREP_CONST(NS_VEC_SEL_TIMEOUT, 3) |
1569 			      FIELD_PREP_CONST(NS_VEC_COND_MASK, 2) |
1570 			      FIELD_PREP_CONST(NS_VEC_EXP_COND, 2))),
1571 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_NS_VEC_PS3_N0, -1,
1572 			     (FIELD_PREP_CONST(NS_VEC_NS_REQ, 1) |
1573 			      NS_VEC_ENABLE_TIMER |
1574 			      FIELD_PREP_CONST(NS_VEC_SEL_TIMEOUT, 3) |
1575 			      FIELD_PREP_CONST(NS_VEC_COND_MASK, 7) |
1576 			      FIELD_PREP_CONST(NS_VEC_EXP_COND, 7))),
1577 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_TIMEOUT_0, -1, 112),
1578 	/* Block Aligner Type B */
1579 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_RX_CONTROL, 0,
1580 			     RX_CONTROL_EN_BLOCK_ALIGNER_TYPE_B),
1581 	/* Block align at TS1/TS2 for Gen2 stability (Gen2 only) */
1582 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_RX_CONTROL_DEBUG,
1583 		RX_CONTROL_DEBUG_NUM_COM_FOUND,
1584 		(RX_CONTROL_DEBUG_EN_TS_CHECK |
1585 		 /*
1586 		  * increase pcs ts1 adding packet-cnt 1 --> 4
1587 		  * lnx_rx_valid_rstn_delay_rise_sp/ssp :
1588 		  * 19.6us(0x200) -> 15.3us(0x4)
1589 		  */
1590 		 FIELD_PREP_CONST(RX_CONTROL_DEBUG_NUM_COM_FOUND, 4))),
1591 	/* Gen1 Tx DRIVER pre-shoot, de-emphasis, level ctrl */
1592 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_HS_TX_COEF_MAP_0,
1593 		(HS_TX_COEF_MAP_0_SSTX_DEEMP | HS_TX_COEF_MAP_0_SSTX_LEVEL |
1594 		 HS_TX_COEF_MAP_0_SSTX_PRE_SHOOT),
1595 		(FIELD_PREP_CONST(HS_TX_COEF_MAP_0_SSTX_DEEMP, 8) |
1596 		 FIELD_PREP_CONST(HS_TX_COEF_MAP_0_SSTX_LEVEL, 0xb) |
1597 		 FIELD_PREP_CONST(HS_TX_COEF_MAP_0_SSTX_PRE_SHOOT, 0))),
1598 	/* Gen2 Tx DRIVER level ctrl */
1599 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_LOCAL_COEF,
1600 		LOCAL_COEF_PMA_CENTER_COEF,
1601 		FIELD_PREP_CONST(LOCAL_COEF_PMA_CENTER_COEF, 0xb)),
1602 	/* Gen2 U1 exit LFPS duration : 900ns ~ 1.2us */
1603 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_TIMEOUT_3, -1, 4096),
1604 	/* set skp_remove_th 0x2 -> 0x7 for avoiding retry problem. */
1605 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_EBUF_PARAM,
1606 		EBUF_PARAM_SKP_REMOVE_TH_EMPTY_MODE,
1607 		FIELD_PREP_CONST(EBUF_PARAM_SKP_REMOVE_TH_EMPTY_MODE, 0x7)),
1608 
1609 	PHY_TUNING_ENTRY_LAST
1610 };
1611 
1612 static const struct exynos5_usbdrd_phy_tuning gs101_tunes_pipe3_postlock[] = {
1613 	/* Squelch off when U3 */
1614 	PHY_TUNING_ENTRY_PCS(EXYNOS9_PCS_OUT_VEC_3, PCS_OUT_VEC_B2_SEL_OUT, 0),
1615 
1616 	PHY_TUNING_ENTRY_LAST
1617 };
1618 
1619 static const struct exynos5_usbdrd_phy_tuning *gs101_tunes[PTS_MAX] = {
1620 	[PTS_UTMI_POSTINIT] = gs101_tunes_utmi_postinit,
1621 	[PTS_PIPE3_PREINIT] = gs101_tunes_pipe3_preinit,
1622 	[PTS_PIPE3_INIT] = gs101_tunes_pipe3_init,
1623 	[PTS_PIPE3_POSTLOCK] = gs101_tunes_pipe3_postlock,
1624 };
1625 
1626 static const char * const gs101_clk_names[] = {
1627 	"phy", "ctrl_aclk", "ctrl_pclk", "scl_pclk",
1628 };
1629 
1630 static const char * const gs101_regulator_names[] = {
1631 	"pll",
1632 	"dvdd-usb20", "vddh-usb20", "vdd33-usb20",
1633 	"vdda-usbdp", "vddh-usbdp",
1634 };
1635 
1636 static const struct exynos5_usbdrd_phy_drvdata gs101_usbd31rd_phy = {
1637 	.phy_cfg			= phy_cfg_gs101,
1638 	.phy_tunes			= gs101_tunes,
1639 	.phy_ops			= &gs101_usbdrd_phy_ops,
1640 	.pmu_offset_usbdrd0_phy		= GS101_PHY_CTRL_USB20,
1641 	.pmu_offset_usbdrd0_phy_ss	= GS101_PHY_CTRL_USBDP,
1642 	.clk_names			= gs101_clk_names,
1643 	.n_clks				= ARRAY_SIZE(gs101_clk_names),
1644 	.core_clk_names			= exynos5_core_clk_names,
1645 	.n_core_clks			= ARRAY_SIZE(exynos5_core_clk_names),
1646 	.regulator_names		= gs101_regulator_names,
1647 	.n_regulators			= ARRAY_SIZE(gs101_regulator_names),
1648 };
1649 
1650 static const struct of_device_id exynos5_usbdrd_phy_of_match[] = {
1651 	{
1652 		.compatible = "google,gs101-usb31drd-phy",
1653 		.data = &gs101_usbd31rd_phy
1654 	}, {
1655 		.compatible = "samsung,exynos5250-usbdrd-phy",
1656 		.data = &exynos5250_usbdrd_phy
1657 	}, {
1658 		.compatible = "samsung,exynos5420-usbdrd-phy",
1659 		.data = &exynos5420_usbdrd_phy
1660 	}, {
1661 		.compatible = "samsung,exynos5433-usbdrd-phy",
1662 		.data = &exynos5433_usbdrd_phy
1663 	}, {
1664 		.compatible = "samsung,exynos7-usbdrd-phy",
1665 		.data = &exynos7_usbdrd_phy
1666 	}, {
1667 		.compatible = "samsung,exynos850-usbdrd-phy",
1668 		.data = &exynos850_usbdrd_phy
1669 	},
1670 	{ },
1671 };
1672 MODULE_DEVICE_TABLE(of, exynos5_usbdrd_phy_of_match);
1673 
1674 static int exynos5_usbdrd_phy_probe(struct platform_device *pdev)
1675 {
1676 	struct device *dev = &pdev->dev;
1677 	struct device_node *node = dev->of_node;
1678 	struct exynos5_usbdrd_phy *phy_drd;
1679 	struct phy_provider *phy_provider;
1680 	const struct exynos5_usbdrd_phy_drvdata *drv_data;
1681 	struct regmap *reg_pmu;
1682 	u32 pmu_offset;
1683 	int i, ret;
1684 	int channel;
1685 
1686 	phy_drd = devm_kzalloc(dev, sizeof(*phy_drd), GFP_KERNEL);
1687 	if (!phy_drd)
1688 		return -ENOMEM;
1689 
1690 	dev_set_drvdata(dev, phy_drd);
1691 	phy_drd->dev = dev;
1692 
1693 	drv_data = of_device_get_match_data(dev);
1694 	if (!drv_data)
1695 		return -EINVAL;
1696 	phy_drd->drv_data = drv_data;
1697 
1698 	if (of_property_present(dev->of_node, "reg-names")) {
1699 		void __iomem *reg;
1700 
1701 		reg = devm_platform_ioremap_resource_byname(pdev, "phy");
1702 		if (IS_ERR(reg))
1703 			return PTR_ERR(reg);
1704 		phy_drd->reg_phy = reg;
1705 
1706 		reg = devm_platform_ioremap_resource_byname(pdev, "pcs");
1707 		if (IS_ERR(reg))
1708 			return PTR_ERR(reg);
1709 		phy_drd->reg_pcs = reg;
1710 
1711 		reg = devm_platform_ioremap_resource_byname(pdev, "pma");
1712 		if (IS_ERR(reg))
1713 			return PTR_ERR(reg);
1714 		phy_drd->reg_pma = reg;
1715 	} else {
1716 		/* DTB with just a single region */
1717 		phy_drd->reg_phy = devm_platform_ioremap_resource(pdev, 0);
1718 		if (IS_ERR(phy_drd->reg_phy))
1719 			return PTR_ERR(phy_drd->reg_phy);
1720 	}
1721 
1722 	ret = exynos5_usbdrd_phy_clk_handle(phy_drd);
1723 	if (ret)
1724 		return ret;
1725 
1726 	reg_pmu = syscon_regmap_lookup_by_phandle(dev->of_node,
1727 						   "samsung,pmu-syscon");
1728 	if (IS_ERR(reg_pmu)) {
1729 		dev_err(dev, "Failed to lookup PMU regmap\n");
1730 		return PTR_ERR(reg_pmu);
1731 	}
1732 
1733 	/*
1734 	 * Exynos5420 SoC has multiple channels for USB 3.0 PHY, with
1735 	 * each having separate power control registers.
1736 	 * 'channel' facilitates to set such registers.
1737 	 */
1738 	channel = of_alias_get_id(node, "usbdrdphy");
1739 	if (channel < 0)
1740 		dev_dbg(dev, "Not a multi-controller usbdrd phy\n");
1741 
1742 	/* Get regulators */
1743 	phy_drd->regulators = devm_kcalloc(dev,
1744 					   drv_data->n_regulators,
1745 					   sizeof(*phy_drd->regulators),
1746 					   GFP_KERNEL);
1747 	if (!phy_drd->regulators)
1748 		return -ENOMEM;
1749 	regulator_bulk_set_supply_names(phy_drd->regulators,
1750 					drv_data->regulator_names,
1751 					drv_data->n_regulators);
1752 	ret = devm_regulator_bulk_get(dev, drv_data->n_regulators,
1753 				      phy_drd->regulators);
1754 	if (ret)
1755 		return dev_err_probe(dev, ret, "failed to get regulators\n");
1756 
1757 	dev_vdbg(dev, "Creating usbdrd_phy phy\n");
1758 
1759 	for (i = 0; i < EXYNOS5_DRDPHYS_NUM; i++) {
1760 		struct phy *phy = devm_phy_create(dev, NULL, drv_data->phy_ops);
1761 
1762 		if (IS_ERR(phy)) {
1763 			dev_err(dev, "Failed to create usbdrd_phy phy\n");
1764 			return PTR_ERR(phy);
1765 		}
1766 
1767 		phy_drd->phys[i].phy = phy;
1768 		phy_drd->phys[i].index = i;
1769 		phy_drd->phys[i].reg_pmu = reg_pmu;
1770 		switch (channel) {
1771 		case 1:
1772 			pmu_offset = drv_data->pmu_offset_usbdrd1_phy;
1773 			break;
1774 		case 0:
1775 		default:
1776 			pmu_offset = drv_data->pmu_offset_usbdrd0_phy;
1777 			if (i == EXYNOS5_DRDPHY_PIPE3 && drv_data
1778 						->pmu_offset_usbdrd0_phy_ss)
1779 				pmu_offset = drv_data->pmu_offset_usbdrd0_phy_ss;
1780 			break;
1781 		}
1782 		phy_drd->phys[i].pmu_offset = pmu_offset;
1783 		phy_drd->phys[i].phy_cfg = &drv_data->phy_cfg[i];
1784 		phy_set_drvdata(phy, &phy_drd->phys[i]);
1785 	}
1786 
1787 	phy_provider = devm_of_phy_provider_register(dev,
1788 						     exynos5_usbdrd_phy_xlate);
1789 	if (IS_ERR(phy_provider)) {
1790 		dev_err(phy_drd->dev, "Failed to register phy provider\n");
1791 		return PTR_ERR(phy_provider);
1792 	}
1793 
1794 	return 0;
1795 }
1796 
1797 static struct platform_driver exynos5_usb3drd_phy = {
1798 	.probe	= exynos5_usbdrd_phy_probe,
1799 	.driver = {
1800 		.of_match_table	= exynos5_usbdrd_phy_of_match,
1801 		.name		= "exynos5_usb3drd_phy",
1802 		.suppress_bind_attrs = true,
1803 	}
1804 };
1805 
1806 module_platform_driver(exynos5_usb3drd_phy);
1807 MODULE_DESCRIPTION("Samsung Exynos5 SoCs USB 3.0 DRD controller PHY driver");
1808 MODULE_AUTHOR("Vivek Gautam <gautam.vivek@samsung.com>");
1809 MODULE_LICENSE("GPL v2");
1810 MODULE_ALIAS("platform:exynos5_usb3drd_phy");
1811