xref: /linux/drivers/pinctrl/tegra/pinctrl-tegra-xusb.c (revision 9cbd5a8abca904441e36861e3a92961bec41d13f)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2014, NVIDIA CORPORATION.  All rights reserved.
4  */
5 
6 #include <linux/delay.h>
7 #include <linux/io.h>
8 #include <linux/module.h>
9 #include <linux/of.h>
10 #include <linux/phy/phy.h>
11 #include <linux/platform_device.h>
12 #include <linux/reset.h>
13 #include <linux/seq_file.h>
14 #include <linux/slab.h>
15 
16 #include <linux/pinctrl/pinconf.h>
17 #include <linux/pinctrl/pinctrl.h>
18 #include <linux/pinctrl/pinmux.h>
19 
20 #include <dt-bindings/pinctrl/pinctrl-tegra-xusb.h>
21 
22 #include "../core.h"
23 #include "../pinctrl-utils.h"
24 
25 #define XUSB_PADCTL_ELPG_PROGRAM 0x01c
26 #define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN (1 << 26)
27 #define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY (1 << 25)
28 #define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN (1 << 24)
29 
30 #define XUSB_PADCTL_IOPHY_PLL_P0_CTL1 0x040
31 #define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL0_LOCKDET (1 << 19)
32 #define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_REFCLK_SEL_MASK (0xf << 12)
33 #define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST (1 << 1)
34 
35 #define XUSB_PADCTL_IOPHY_PLL_P0_CTL2 0x044
36 #define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_REFCLKBUF_EN (1 << 6)
37 #define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_EN (1 << 5)
38 #define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_SEL (1 << 4)
39 
40 #define XUSB_PADCTL_IOPHY_PLL_S0_CTL1 0x138
41 #define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_LOCKDET (1 << 27)
42 #define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE (1 << 24)
43 #define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD (1 << 3)
44 #define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST (1 << 1)
45 #define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ (1 << 0)
46 
47 #define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1 0x148
48 #define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD (1 << 1)
49 #define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ (1 << 0)
50 
51 struct tegra_xusb_padctl_function {
52 	const char *name;
53 	const char * const *groups;
54 	unsigned int num_groups;
55 };
56 
57 struct tegra_xusb_padctl_soc {
58 	const struct pinctrl_pin_desc *pins;
59 	unsigned int num_pins;
60 
61 	const struct tegra_xusb_padctl_function *functions;
62 	unsigned int num_functions;
63 
64 	const struct tegra_xusb_padctl_lane *lanes;
65 	unsigned int num_lanes;
66 };
67 
68 struct tegra_xusb_padctl_lane {
69 	const char *name;
70 
71 	unsigned int offset;
72 	unsigned int shift;
73 	unsigned int mask;
74 	unsigned int iddq;
75 
76 	const unsigned int *funcs;
77 	unsigned int num_funcs;
78 };
79 
80 struct tegra_xusb_padctl {
81 	struct device *dev;
82 	void __iomem *regs;
83 	struct mutex lock;
84 	struct reset_control *rst;
85 
86 	const struct tegra_xusb_padctl_soc *soc;
87 	struct pinctrl_dev *pinctrl;
88 	struct pinctrl_desc desc;
89 
90 	struct phy_provider *provider;
91 	struct phy *phys[2];
92 
93 	unsigned int enable;
94 };
95 
96 static inline void padctl_writel(struct tegra_xusb_padctl *padctl, u32 value,
97 				 unsigned long offset)
98 {
99 	writel(value, padctl->regs + offset);
100 }
101 
102 static inline u32 padctl_readl(struct tegra_xusb_padctl *padctl,
103 			       unsigned long offset)
104 {
105 	return readl(padctl->regs + offset);
106 }
107 
108 static int tegra_xusb_padctl_get_groups_count(struct pinctrl_dev *pinctrl)
109 {
110 	struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
111 
112 	return padctl->soc->num_pins;
113 }
114 
115 static const char *tegra_xusb_padctl_get_group_name(struct pinctrl_dev *pinctrl,
116 						    unsigned int group)
117 {
118 	struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
119 
120 	return padctl->soc->pins[group].name;
121 }
122 
123 static int tegra_xusb_padctl_get_group_pins(struct pinctrl_dev *pinctrl,
124 					    unsigned group,
125 					    const unsigned **pins,
126 					    unsigned *num_pins)
127 {
128 	/*
129 	 * For the tegra-xusb pad controller groups are synonymous
130 	 * with lanes/pins and there is always one lane/pin per group.
131 	 */
132 	*pins = &pinctrl->desc->pins[group].number;
133 	*num_pins = 1;
134 
135 	return 0;
136 }
137 
138 enum tegra_xusb_padctl_param {
139 	TEGRA_XUSB_PADCTL_IDDQ,
140 };
141 
142 static const struct tegra_xusb_padctl_property {
143 	const char *name;
144 	enum tegra_xusb_padctl_param param;
145 } properties[] = {
146 	{ "nvidia,iddq", TEGRA_XUSB_PADCTL_IDDQ },
147 };
148 
149 #define TEGRA_XUSB_PADCTL_PACK(param, value) ((param) << 16 | (value))
150 #define TEGRA_XUSB_PADCTL_UNPACK_PARAM(config) ((config) >> 16)
151 #define TEGRA_XUSB_PADCTL_UNPACK_VALUE(config) ((config) & 0xffff)
152 
153 static int tegra_xusb_padctl_parse_subnode(struct tegra_xusb_padctl *padctl,
154 					   struct device_node *np,
155 					   struct pinctrl_map **maps,
156 					   unsigned int *reserved_maps,
157 					   unsigned int *num_maps)
158 {
159 	unsigned int i, reserve = 0, num_configs = 0;
160 	unsigned long config, *configs = NULL;
161 	const char *function, *group;
162 	struct property *prop;
163 	int err = 0;
164 	u32 value;
165 
166 	err = of_property_read_string(np, "nvidia,function", &function);
167 	if (err < 0) {
168 		if (err != -EINVAL)
169 			return err;
170 
171 		function = NULL;
172 	}
173 
174 	for (i = 0; i < ARRAY_SIZE(properties); i++) {
175 		err = of_property_read_u32(np, properties[i].name, &value);
176 		if (err < 0) {
177 			if (err == -EINVAL)
178 				continue;
179 
180 			goto out;
181 		}
182 
183 		config = TEGRA_XUSB_PADCTL_PACK(properties[i].param, value);
184 
185 		err = pinctrl_utils_add_config(padctl->pinctrl, &configs,
186 					       &num_configs, config);
187 		if (err < 0)
188 			goto out;
189 	}
190 
191 	if (function)
192 		reserve++;
193 
194 	if (num_configs)
195 		reserve++;
196 
197 	err = of_property_count_strings(np, "nvidia,lanes");
198 	if (err < 0)
199 		goto out;
200 
201 	reserve *= err;
202 
203 	err = pinctrl_utils_reserve_map(padctl->pinctrl, maps, reserved_maps,
204 					num_maps, reserve);
205 	if (err < 0)
206 		goto out;
207 
208 	of_property_for_each_string(np, "nvidia,lanes", prop, group) {
209 		if (function) {
210 			err = pinctrl_utils_add_map_mux(padctl->pinctrl, maps,
211 					reserved_maps, num_maps, group,
212 					function);
213 			if (err < 0)
214 				goto out;
215 		}
216 
217 		if (num_configs) {
218 			err = pinctrl_utils_add_map_configs(padctl->pinctrl,
219 					maps, reserved_maps, num_maps, group,
220 					configs, num_configs,
221 					PIN_MAP_TYPE_CONFIGS_GROUP);
222 			if (err < 0)
223 				goto out;
224 		}
225 	}
226 
227 	err = 0;
228 
229 out:
230 	kfree(configs);
231 	return err;
232 }
233 
234 static int tegra_xusb_padctl_dt_node_to_map(struct pinctrl_dev *pinctrl,
235 					    struct device_node *parent,
236 					    struct pinctrl_map **maps,
237 					    unsigned int *num_maps)
238 {
239 	struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
240 	unsigned int reserved_maps = 0;
241 	struct device_node *np;
242 	int err;
243 
244 	*num_maps = 0;
245 	*maps = NULL;
246 
247 	for_each_child_of_node(parent, np) {
248 		err = tegra_xusb_padctl_parse_subnode(padctl, np, maps,
249 						      &reserved_maps,
250 						      num_maps);
251 		if (err < 0) {
252 			of_node_put(np);
253 			return err;
254 		}
255 	}
256 
257 	return 0;
258 }
259 
260 static const struct pinctrl_ops tegra_xusb_padctl_pinctrl_ops = {
261 	.get_groups_count = tegra_xusb_padctl_get_groups_count,
262 	.get_group_name = tegra_xusb_padctl_get_group_name,
263 	.get_group_pins = tegra_xusb_padctl_get_group_pins,
264 	.dt_node_to_map = tegra_xusb_padctl_dt_node_to_map,
265 	.dt_free_map = pinctrl_utils_free_map,
266 };
267 
268 static int tegra_xusb_padctl_get_functions_count(struct pinctrl_dev *pinctrl)
269 {
270 	struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
271 
272 	return padctl->soc->num_functions;
273 }
274 
275 static const char *
276 tegra_xusb_padctl_get_function_name(struct pinctrl_dev *pinctrl,
277 				    unsigned int function)
278 {
279 	struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
280 
281 	return padctl->soc->functions[function].name;
282 }
283 
284 static int tegra_xusb_padctl_get_function_groups(struct pinctrl_dev *pinctrl,
285 						 unsigned int function,
286 						 const char * const **groups,
287 						 unsigned * const num_groups)
288 {
289 	struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
290 
291 	*num_groups = padctl->soc->functions[function].num_groups;
292 	*groups = padctl->soc->functions[function].groups;
293 
294 	return 0;
295 }
296 
297 static int tegra_xusb_padctl_pinmux_set(struct pinctrl_dev *pinctrl,
298 					unsigned int function,
299 					unsigned int group)
300 {
301 	struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
302 	const struct tegra_xusb_padctl_lane *lane;
303 	unsigned int i;
304 	u32 value;
305 
306 	lane = &padctl->soc->lanes[group];
307 
308 	for (i = 0; i < lane->num_funcs; i++)
309 		if (lane->funcs[i] == function)
310 			break;
311 
312 	if (i >= lane->num_funcs)
313 		return -EINVAL;
314 
315 	value = padctl_readl(padctl, lane->offset);
316 	value &= ~(lane->mask << lane->shift);
317 	value |= i << lane->shift;
318 	padctl_writel(padctl, value, lane->offset);
319 
320 	return 0;
321 }
322 
323 static const struct pinmux_ops tegra_xusb_padctl_pinmux_ops = {
324 	.get_functions_count = tegra_xusb_padctl_get_functions_count,
325 	.get_function_name = tegra_xusb_padctl_get_function_name,
326 	.get_function_groups = tegra_xusb_padctl_get_function_groups,
327 	.set_mux = tegra_xusb_padctl_pinmux_set,
328 };
329 
330 static int tegra_xusb_padctl_pinconf_group_get(struct pinctrl_dev *pinctrl,
331 					       unsigned int group,
332 					       unsigned long *config)
333 {
334 	struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
335 	const struct tegra_xusb_padctl_lane *lane;
336 	enum tegra_xusb_padctl_param param;
337 	u32 value;
338 
339 	param = TEGRA_XUSB_PADCTL_UNPACK_PARAM(*config);
340 	lane = &padctl->soc->lanes[group];
341 
342 	switch (param) {
343 	case TEGRA_XUSB_PADCTL_IDDQ:
344 		/* lanes with iddq == 0 don't support this parameter */
345 		if (lane->iddq == 0)
346 			return -EINVAL;
347 
348 		value = padctl_readl(padctl, lane->offset);
349 
350 		if (value & BIT(lane->iddq))
351 			value = 0;
352 		else
353 			value = 1;
354 
355 		*config = TEGRA_XUSB_PADCTL_PACK(param, value);
356 		break;
357 
358 	default:
359 		dev_err(padctl->dev, "invalid configuration parameter: %04x\n",
360 			param);
361 		return -ENOTSUPP;
362 	}
363 
364 	return 0;
365 }
366 
367 static int tegra_xusb_padctl_pinconf_group_set(struct pinctrl_dev *pinctrl,
368 					       unsigned int group,
369 					       unsigned long *configs,
370 					       unsigned int num_configs)
371 {
372 	struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
373 	const struct tegra_xusb_padctl_lane *lane;
374 	enum tegra_xusb_padctl_param param;
375 	unsigned long value;
376 	unsigned int i;
377 	u32 regval;
378 
379 	lane = &padctl->soc->lanes[group];
380 
381 	for (i = 0; i < num_configs; i++) {
382 		param = TEGRA_XUSB_PADCTL_UNPACK_PARAM(configs[i]);
383 		value = TEGRA_XUSB_PADCTL_UNPACK_VALUE(configs[i]);
384 
385 		switch (param) {
386 		case TEGRA_XUSB_PADCTL_IDDQ:
387 			/* lanes with iddq == 0 don't support this parameter */
388 			if (lane->iddq == 0)
389 				return -EINVAL;
390 
391 			regval = padctl_readl(padctl, lane->offset);
392 
393 			if (value)
394 				regval &= ~BIT(lane->iddq);
395 			else
396 				regval |= BIT(lane->iddq);
397 
398 			padctl_writel(padctl, regval, lane->offset);
399 			break;
400 
401 		default:
402 			dev_err(padctl->dev,
403 				"invalid configuration parameter: %04x\n",
404 				param);
405 			return -ENOTSUPP;
406 		}
407 	}
408 
409 	return 0;
410 }
411 
412 #ifdef CONFIG_DEBUG_FS
413 static const char *strip_prefix(const char *s)
414 {
415 	const char *comma = strchr(s, ',');
416 	if (!comma)
417 		return s;
418 
419 	return comma + 1;
420 }
421 
422 static void
423 tegra_xusb_padctl_pinconf_group_dbg_show(struct pinctrl_dev *pinctrl,
424 					 struct seq_file *s,
425 					 unsigned int group)
426 {
427 	unsigned int i;
428 
429 	for (i = 0; i < ARRAY_SIZE(properties); i++) {
430 		unsigned long config, value;
431 		int err;
432 
433 		config = TEGRA_XUSB_PADCTL_PACK(properties[i].param, 0);
434 
435 		err = tegra_xusb_padctl_pinconf_group_get(pinctrl, group,
436 							  &config);
437 		if (err < 0)
438 			continue;
439 
440 		value = TEGRA_XUSB_PADCTL_UNPACK_VALUE(config);
441 
442 		seq_printf(s, "\n\t%s=%lu\n", strip_prefix(properties[i].name),
443 			   value);
444 	}
445 }
446 
447 static void
448 tegra_xusb_padctl_pinconf_config_dbg_show(struct pinctrl_dev *pinctrl,
449 					  struct seq_file *s,
450 					  unsigned long config)
451 {
452 	enum tegra_xusb_padctl_param param;
453 	const char *name = "unknown";
454 	unsigned long value;
455 	unsigned int i;
456 
457 	param = TEGRA_XUSB_PADCTL_UNPACK_PARAM(config);
458 	value = TEGRA_XUSB_PADCTL_UNPACK_VALUE(config);
459 
460 	for (i = 0; i < ARRAY_SIZE(properties); i++) {
461 		if (properties[i].param == param) {
462 			name = properties[i].name;
463 			break;
464 		}
465 	}
466 
467 	seq_printf(s, "%s=%lu", strip_prefix(name), value);
468 }
469 #endif
470 
471 static const struct pinconf_ops tegra_xusb_padctl_pinconf_ops = {
472 	.pin_config_group_get = tegra_xusb_padctl_pinconf_group_get,
473 	.pin_config_group_set = tegra_xusb_padctl_pinconf_group_set,
474 #ifdef CONFIG_DEBUG_FS
475 	.pin_config_group_dbg_show = tegra_xusb_padctl_pinconf_group_dbg_show,
476 	.pin_config_config_dbg_show = tegra_xusb_padctl_pinconf_config_dbg_show,
477 #endif
478 };
479 
480 static int tegra_xusb_padctl_enable(struct tegra_xusb_padctl *padctl)
481 {
482 	u32 value;
483 
484 	mutex_lock(&padctl->lock);
485 
486 	if (padctl->enable++ > 0)
487 		goto out;
488 
489 	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
490 	value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN;
491 	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
492 
493 	usleep_range(100, 200);
494 
495 	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
496 	value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY;
497 	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
498 
499 	usleep_range(100, 200);
500 
501 	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
502 	value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN;
503 	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
504 
505 out:
506 	mutex_unlock(&padctl->lock);
507 	return 0;
508 }
509 
510 static int tegra_xusb_padctl_disable(struct tegra_xusb_padctl *padctl)
511 {
512 	u32 value;
513 
514 	mutex_lock(&padctl->lock);
515 
516 	if (WARN_ON(padctl->enable == 0))
517 		goto out;
518 
519 	if (--padctl->enable > 0)
520 		goto out;
521 
522 	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
523 	value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN;
524 	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
525 
526 	usleep_range(100, 200);
527 
528 	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
529 	value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY;
530 	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
531 
532 	usleep_range(100, 200);
533 
534 	value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
535 	value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN;
536 	padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
537 
538 out:
539 	mutex_unlock(&padctl->lock);
540 	return 0;
541 }
542 
543 static int tegra_xusb_phy_init(struct phy *phy)
544 {
545 	struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
546 
547 	return tegra_xusb_padctl_enable(padctl);
548 }
549 
550 static int tegra_xusb_phy_exit(struct phy *phy)
551 {
552 	struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
553 
554 	return tegra_xusb_padctl_disable(padctl);
555 }
556 
557 static int pcie_phy_power_on(struct phy *phy)
558 {
559 	struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
560 	unsigned long timeout;
561 	int err = -ETIMEDOUT;
562 	u32 value;
563 
564 	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
565 	value &= ~XUSB_PADCTL_IOPHY_PLL_P0_CTL1_REFCLK_SEL_MASK;
566 	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
567 
568 	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL2);
569 	value |= XUSB_PADCTL_IOPHY_PLL_P0_CTL2_REFCLKBUF_EN |
570 		 XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_EN |
571 		 XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_SEL;
572 	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL2);
573 
574 	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
575 	value |= XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST;
576 	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
577 
578 	timeout = jiffies + msecs_to_jiffies(50);
579 
580 	while (time_before(jiffies, timeout)) {
581 		value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
582 		if (value & XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL0_LOCKDET) {
583 			err = 0;
584 			break;
585 		}
586 
587 		usleep_range(100, 200);
588 	}
589 
590 	return err;
591 }
592 
593 static int pcie_phy_power_off(struct phy *phy)
594 {
595 	struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
596 	u32 value;
597 
598 	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
599 	value &= ~XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST;
600 	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
601 
602 	return 0;
603 }
604 
605 static const struct phy_ops pcie_phy_ops = {
606 	.init = tegra_xusb_phy_init,
607 	.exit = tegra_xusb_phy_exit,
608 	.power_on = pcie_phy_power_on,
609 	.power_off = pcie_phy_power_off,
610 	.owner = THIS_MODULE,
611 };
612 
613 static int sata_phy_power_on(struct phy *phy)
614 {
615 	struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
616 	unsigned long timeout;
617 	int err = -ETIMEDOUT;
618 	u32 value;
619 
620 	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
621 	value &= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD;
622 	value &= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ;
623 	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
624 
625 	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
626 	value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD;
627 	value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ;
628 	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
629 
630 	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
631 	value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE;
632 	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
633 
634 	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
635 	value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST;
636 	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
637 
638 	timeout = jiffies + msecs_to_jiffies(50);
639 
640 	while (time_before(jiffies, timeout)) {
641 		value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
642 		if (value & XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_LOCKDET) {
643 			err = 0;
644 			break;
645 		}
646 
647 		usleep_range(100, 200);
648 	}
649 
650 	return err;
651 }
652 
653 static int sata_phy_power_off(struct phy *phy)
654 {
655 	struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
656 	u32 value;
657 
658 	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
659 	value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST;
660 	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
661 
662 	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
663 	value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE;
664 	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
665 
666 	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
667 	value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD;
668 	value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ;
669 	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
670 
671 	value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
672 	value |= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD;
673 	value |= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ;
674 	padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
675 
676 	return 0;
677 }
678 
679 static const struct phy_ops sata_phy_ops = {
680 	.init = tegra_xusb_phy_init,
681 	.exit = tegra_xusb_phy_exit,
682 	.power_on = sata_phy_power_on,
683 	.power_off = sata_phy_power_off,
684 	.owner = THIS_MODULE,
685 };
686 
687 static struct phy *tegra_xusb_padctl_xlate(struct device *dev,
688 					   struct of_phandle_args *args)
689 {
690 	struct tegra_xusb_padctl *padctl = dev_get_drvdata(dev);
691 	unsigned int index = args->args[0];
692 
693 	if (args->args_count <= 0)
694 		return ERR_PTR(-EINVAL);
695 
696 	if (index >= ARRAY_SIZE(padctl->phys))
697 		return ERR_PTR(-EINVAL);
698 
699 	return padctl->phys[index];
700 }
701 
702 #define PIN_OTG_0   0
703 #define PIN_OTG_1   1
704 #define PIN_OTG_2   2
705 #define PIN_ULPI_0  3
706 #define PIN_HSIC_0  4
707 #define PIN_HSIC_1  5
708 #define PIN_PCIE_0  6
709 #define PIN_PCIE_1  7
710 #define PIN_PCIE_2  8
711 #define PIN_PCIE_3  9
712 #define PIN_PCIE_4 10
713 #define PIN_SATA_0 11
714 
715 static const struct pinctrl_pin_desc tegra124_pins[] = {
716 	PINCTRL_PIN(PIN_OTG_0,  "otg-0"),
717 	PINCTRL_PIN(PIN_OTG_1,  "otg-1"),
718 	PINCTRL_PIN(PIN_OTG_2,  "otg-2"),
719 	PINCTRL_PIN(PIN_ULPI_0, "ulpi-0"),
720 	PINCTRL_PIN(PIN_HSIC_0, "hsic-0"),
721 	PINCTRL_PIN(PIN_HSIC_1, "hsic-1"),
722 	PINCTRL_PIN(PIN_PCIE_0, "pcie-0"),
723 	PINCTRL_PIN(PIN_PCIE_1, "pcie-1"),
724 	PINCTRL_PIN(PIN_PCIE_2, "pcie-2"),
725 	PINCTRL_PIN(PIN_PCIE_3, "pcie-3"),
726 	PINCTRL_PIN(PIN_PCIE_4, "pcie-4"),
727 	PINCTRL_PIN(PIN_SATA_0, "sata-0"),
728 };
729 
730 static const char * const tegra124_snps_groups[] = {
731 	"otg-0",
732 	"otg-1",
733 	"otg-2",
734 	"ulpi-0",
735 	"hsic-0",
736 	"hsic-1",
737 };
738 
739 static const char * const tegra124_xusb_groups[] = {
740 	"otg-0",
741 	"otg-1",
742 	"otg-2",
743 	"ulpi-0",
744 	"hsic-0",
745 	"hsic-1",
746 };
747 
748 static const char * const tegra124_uart_groups[] = {
749 	"otg-0",
750 	"otg-1",
751 	"otg-2",
752 };
753 
754 static const char * const tegra124_pcie_groups[] = {
755 	"pcie-0",
756 	"pcie-1",
757 	"pcie-2",
758 	"pcie-3",
759 	"pcie-4",
760 };
761 
762 static const char * const tegra124_usb3_groups[] = {
763 	"pcie-0",
764 	"pcie-1",
765 	"sata-0",
766 };
767 
768 static const char * const tegra124_sata_groups[] = {
769 	"sata-0",
770 };
771 
772 static const char * const tegra124_rsvd_groups[] = {
773 	"otg-0",
774 	"otg-1",
775 	"otg-2",
776 	"pcie-0",
777 	"pcie-1",
778 	"pcie-2",
779 	"pcie-3",
780 	"pcie-4",
781 	"sata-0",
782 };
783 
784 #define TEGRA124_FUNCTION(_name)					\
785 	{								\
786 		.name = #_name,						\
787 		.num_groups = ARRAY_SIZE(tegra124_##_name##_groups),	\
788 		.groups = tegra124_##_name##_groups,			\
789 	}
790 
791 static struct tegra_xusb_padctl_function tegra124_functions[] = {
792 	TEGRA124_FUNCTION(snps),
793 	TEGRA124_FUNCTION(xusb),
794 	TEGRA124_FUNCTION(uart),
795 	TEGRA124_FUNCTION(pcie),
796 	TEGRA124_FUNCTION(usb3),
797 	TEGRA124_FUNCTION(sata),
798 	TEGRA124_FUNCTION(rsvd),
799 };
800 
801 enum tegra124_function {
802 	TEGRA124_FUNC_SNPS,
803 	TEGRA124_FUNC_XUSB,
804 	TEGRA124_FUNC_UART,
805 	TEGRA124_FUNC_PCIE,
806 	TEGRA124_FUNC_USB3,
807 	TEGRA124_FUNC_SATA,
808 	TEGRA124_FUNC_RSVD,
809 };
810 
811 static const unsigned int tegra124_otg_functions[] = {
812 	TEGRA124_FUNC_SNPS,
813 	TEGRA124_FUNC_XUSB,
814 	TEGRA124_FUNC_UART,
815 	TEGRA124_FUNC_RSVD,
816 };
817 
818 static const unsigned int tegra124_usb_functions[] = {
819 	TEGRA124_FUNC_SNPS,
820 	TEGRA124_FUNC_XUSB,
821 };
822 
823 static const unsigned int tegra124_pci_functions[] = {
824 	TEGRA124_FUNC_PCIE,
825 	TEGRA124_FUNC_USB3,
826 	TEGRA124_FUNC_SATA,
827 	TEGRA124_FUNC_RSVD,
828 };
829 
830 #define TEGRA124_LANE(_name, _offset, _shift, _mask, _iddq, _funcs)	\
831 	{								\
832 		.name = _name,						\
833 		.offset = _offset,					\
834 		.shift = _shift,					\
835 		.mask = _mask,						\
836 		.iddq = _iddq,						\
837 		.num_funcs = ARRAY_SIZE(tegra124_##_funcs##_functions),	\
838 		.funcs = tegra124_##_funcs##_functions,			\
839 	}
840 
841 static const struct tegra_xusb_padctl_lane tegra124_lanes[] = {
842 	TEGRA124_LANE("otg-0",  0x004,  0, 0x3, 0, otg),
843 	TEGRA124_LANE("otg-1",  0x004,  2, 0x3, 0, otg),
844 	TEGRA124_LANE("otg-2",  0x004,  4, 0x3, 0, otg),
845 	TEGRA124_LANE("ulpi-0", 0x004, 12, 0x1, 0, usb),
846 	TEGRA124_LANE("hsic-0", 0x004, 14, 0x1, 0, usb),
847 	TEGRA124_LANE("hsic-1", 0x004, 15, 0x1, 0, usb),
848 	TEGRA124_LANE("pcie-0", 0x134, 16, 0x3, 1, pci),
849 	TEGRA124_LANE("pcie-1", 0x134, 18, 0x3, 2, pci),
850 	TEGRA124_LANE("pcie-2", 0x134, 20, 0x3, 3, pci),
851 	TEGRA124_LANE("pcie-3", 0x134, 22, 0x3, 4, pci),
852 	TEGRA124_LANE("pcie-4", 0x134, 24, 0x3, 5, pci),
853 	TEGRA124_LANE("sata-0", 0x134, 26, 0x3, 6, pci),
854 };
855 
856 static const struct tegra_xusb_padctl_soc tegra124_soc = {
857 	.num_pins = ARRAY_SIZE(tegra124_pins),
858 	.pins = tegra124_pins,
859 	.num_functions = ARRAY_SIZE(tegra124_functions),
860 	.functions = tegra124_functions,
861 	.num_lanes = ARRAY_SIZE(tegra124_lanes),
862 	.lanes = tegra124_lanes,
863 };
864 
865 static const struct of_device_id tegra_xusb_padctl_of_match[] = {
866 	{ .compatible = "nvidia,tegra124-xusb-padctl", .data = &tegra124_soc },
867 	{ }
868 };
869 MODULE_DEVICE_TABLE(of, tegra_xusb_padctl_of_match);
870 
871 /* predeclare these in order to silence sparse */
872 int tegra_xusb_padctl_legacy_probe(struct platform_device *pdev);
873 int tegra_xusb_padctl_legacy_remove(struct platform_device *pdev);
874 
875 int tegra_xusb_padctl_legacy_probe(struct platform_device *pdev)
876 {
877 	struct tegra_xusb_padctl *padctl;
878 	const struct of_device_id *match;
879 	struct phy *phy;
880 	int err;
881 
882 	padctl = devm_kzalloc(&pdev->dev, sizeof(*padctl), GFP_KERNEL);
883 	if (!padctl)
884 		return -ENOMEM;
885 
886 	platform_set_drvdata(pdev, padctl);
887 	mutex_init(&padctl->lock);
888 	padctl->dev = &pdev->dev;
889 
890 	/*
891 	 * Note that we can't replace this by of_device_get_match_data()
892 	 * because we need the separate matching table for this legacy code on
893 	 * Tegra124. of_device_get_match_data() would attempt to use the table
894 	 * from the updated driver and fail.
895 	 */
896 	match = of_match_node(tegra_xusb_padctl_of_match, pdev->dev.of_node);
897 	padctl->soc = match->data;
898 
899 	padctl->regs = devm_platform_ioremap_resource(pdev, 0);
900 	if (IS_ERR(padctl->regs))
901 		return PTR_ERR(padctl->regs);
902 
903 	padctl->rst = devm_reset_control_get_exclusive(&pdev->dev, NULL);
904 	if (IS_ERR(padctl->rst))
905 		return PTR_ERR(padctl->rst);
906 
907 	err = reset_control_deassert(padctl->rst);
908 	if (err < 0)
909 		return err;
910 
911 	memset(&padctl->desc, 0, sizeof(padctl->desc));
912 	padctl->desc.name = dev_name(padctl->dev);
913 	padctl->desc.pins = tegra124_pins;
914 	padctl->desc.npins = ARRAY_SIZE(tegra124_pins);
915 	padctl->desc.pctlops = &tegra_xusb_padctl_pinctrl_ops;
916 	padctl->desc.pmxops = &tegra_xusb_padctl_pinmux_ops;
917 	padctl->desc.confops = &tegra_xusb_padctl_pinconf_ops;
918 	padctl->desc.owner = THIS_MODULE;
919 
920 	padctl->pinctrl = devm_pinctrl_register(&pdev->dev, &padctl->desc,
921 						padctl);
922 	if (IS_ERR(padctl->pinctrl)) {
923 		dev_err(&pdev->dev, "failed to register pincontrol\n");
924 		err = PTR_ERR(padctl->pinctrl);
925 		goto reset;
926 	}
927 
928 	phy = devm_phy_create(&pdev->dev, NULL, &pcie_phy_ops);
929 	if (IS_ERR(phy)) {
930 		err = PTR_ERR(phy);
931 		goto reset;
932 	}
933 
934 	padctl->phys[TEGRA_XUSB_PADCTL_PCIE] = phy;
935 	phy_set_drvdata(phy, padctl);
936 
937 	phy = devm_phy_create(&pdev->dev, NULL, &sata_phy_ops);
938 	if (IS_ERR(phy)) {
939 		err = PTR_ERR(phy);
940 		goto reset;
941 	}
942 
943 	padctl->phys[TEGRA_XUSB_PADCTL_SATA] = phy;
944 	phy_set_drvdata(phy, padctl);
945 
946 	padctl->provider = devm_of_phy_provider_register(&pdev->dev,
947 							 tegra_xusb_padctl_xlate);
948 	if (IS_ERR(padctl->provider)) {
949 		err = PTR_ERR(padctl->provider);
950 		dev_err(&pdev->dev, "failed to register PHYs: %d\n", err);
951 		goto reset;
952 	}
953 
954 	return 0;
955 
956 reset:
957 	reset_control_assert(padctl->rst);
958 	return err;
959 }
960 EXPORT_SYMBOL_GPL(tegra_xusb_padctl_legacy_probe);
961 
962 int tegra_xusb_padctl_legacy_remove(struct platform_device *pdev)
963 {
964 	struct tegra_xusb_padctl *padctl = platform_get_drvdata(pdev);
965 	int err;
966 
967 	err = reset_control_assert(padctl->rst);
968 	if (err < 0)
969 		dev_err(&pdev->dev, "failed to assert reset: %d\n", err);
970 
971 	return err;
972 }
973 EXPORT_SYMBOL_GPL(tegra_xusb_padctl_legacy_remove);
974