GNU Linux-libre 6.9.1-gnu
[releases.git] / drivers / pinctrl / tegra / pinctrl-tegra-xusb.c
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                                            const 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);