ASoc: Another series to convert to struct
[linux-block.git] / drivers / pinctrl / tegra / pinctrl-tegra.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Driver for the NVIDIA Tegra pinmux
4  *
5  * Copyright (c) 2011-2012, NVIDIA CORPORATION.  All rights reserved.
6  *
7  * Derived from code:
8  * Copyright (C) 2010 Google, Inc.
9  * Copyright (C) 2010 NVIDIA Corporation
10  * Copyright (C) 2009-2011 ST-Ericsson AB
11  */
12
13 #include <linux/err.h>
14 #include <linux/init.h>
15 #include <linux/io.h>
16 #include <linux/of.h>
17 #include <linux/platform_device.h>
18 #include <linux/seq_file.h>
19 #include <linux/slab.h>
20
21 #include <linux/pinctrl/machine.h>
22 #include <linux/pinctrl/pinconf.h>
23 #include <linux/pinctrl/pinctrl.h>
24 #include <linux/pinctrl/pinmux.h>
25
26 #include "../core.h"
27 #include "../pinctrl-utils.h"
28 #include "pinctrl-tegra.h"
29
30 static inline u32 pmx_readl(struct tegra_pmx *pmx, u32 bank, u32 reg)
31 {
32         return readl(pmx->regs[bank] + reg);
33 }
34
35 static inline void pmx_writel(struct tegra_pmx *pmx, u32 val, u32 bank, u32 reg)
36 {
37         writel_relaxed(val, pmx->regs[bank] + reg);
38         /* make sure pinmux register write completed */
39         pmx_readl(pmx, bank, reg);
40 }
41
42 static int tegra_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
43 {
44         struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
45
46         return pmx->soc->ngroups;
47 }
48
49 static const char *tegra_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
50                                                 unsigned group)
51 {
52         struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
53
54         return pmx->soc->groups[group].name;
55 }
56
57 static int tegra_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
58                                         unsigned group,
59                                         const unsigned **pins,
60                                         unsigned *num_pins)
61 {
62         struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
63
64         *pins = pmx->soc->groups[group].pins;
65         *num_pins = pmx->soc->groups[group].npins;
66
67         return 0;
68 }
69
70 #ifdef CONFIG_DEBUG_FS
71 static void tegra_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev,
72                                        struct seq_file *s,
73                                        unsigned offset)
74 {
75         seq_printf(s, " %s", dev_name(pctldev->dev));
76 }
77 #endif
78
79 static const struct cfg_param {
80         const char *property;
81         enum tegra_pinconf_param param;
82 } cfg_params[] = {
83         {"nvidia,pull",                 TEGRA_PINCONF_PARAM_PULL},
84         {"nvidia,tristate",             TEGRA_PINCONF_PARAM_TRISTATE},
85         {"nvidia,enable-input",         TEGRA_PINCONF_PARAM_ENABLE_INPUT},
86         {"nvidia,open-drain",           TEGRA_PINCONF_PARAM_OPEN_DRAIN},
87         {"nvidia,lock",                 TEGRA_PINCONF_PARAM_LOCK},
88         {"nvidia,io-reset",             TEGRA_PINCONF_PARAM_IORESET},
89         {"nvidia,rcv-sel",              TEGRA_PINCONF_PARAM_RCV_SEL},
90         {"nvidia,io-hv",                TEGRA_PINCONF_PARAM_RCV_SEL},
91         {"nvidia,high-speed-mode",      TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE},
92         {"nvidia,schmitt",              TEGRA_PINCONF_PARAM_SCHMITT},
93         {"nvidia,low-power-mode",       TEGRA_PINCONF_PARAM_LOW_POWER_MODE},
94         {"nvidia,pull-down-strength",   TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH},
95         {"nvidia,pull-up-strength",     TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH},
96         {"nvidia,slew-rate-falling",    TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING},
97         {"nvidia,slew-rate-rising",     TEGRA_PINCONF_PARAM_SLEW_RATE_RISING},
98         {"nvidia,drive-type",           TEGRA_PINCONF_PARAM_DRIVE_TYPE},
99         {"nvidia,function",             TEGRA_PINCONF_PARAM_FUNCTION},
100 };
101
102 static int tegra_pinctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
103                                            struct device_node *np,
104                                            struct pinctrl_map **map,
105                                            unsigned *reserved_maps,
106                                            unsigned *num_maps)
107 {
108         struct device *dev = pctldev->dev;
109         int ret, i;
110         const char *function;
111         u32 val;
112         unsigned long config;
113         unsigned long *configs = NULL;
114         unsigned num_configs = 0;
115         unsigned reserve;
116         struct property *prop;
117         const char *group;
118
119         ret = of_property_read_string(np, "nvidia,function", &function);
120         if (ret < 0) {
121                 /* EINVAL=missing, which is fine since it's optional */
122                 if (ret != -EINVAL)
123                         dev_err(dev,
124                                 "could not parse property nvidia,function\n");
125                 function = NULL;
126         }
127
128         for (i = 0; i < ARRAY_SIZE(cfg_params); i++) {
129                 ret = of_property_read_u32(np, cfg_params[i].property, &val);
130                 if (!ret) {
131                         config = TEGRA_PINCONF_PACK(cfg_params[i].param, val);
132                         ret = pinctrl_utils_add_config(pctldev, &configs,
133                                         &num_configs, config);
134                         if (ret < 0)
135                                 goto exit;
136                 /* EINVAL=missing, which is fine since it's optional */
137                 } else if (ret != -EINVAL) {
138                         dev_err(dev, "could not parse property %s\n",
139                                 cfg_params[i].property);
140                 }
141         }
142
143         reserve = 0;
144         if (function != NULL)
145                 reserve++;
146         if (num_configs)
147                 reserve++;
148         ret = of_property_count_strings(np, "nvidia,pins");
149         if (ret < 0) {
150                 dev_err(dev, "could not parse property nvidia,pins\n");
151                 goto exit;
152         }
153         reserve *= ret;
154
155         ret = pinctrl_utils_reserve_map(pctldev, map, reserved_maps,
156                                         num_maps, reserve);
157         if (ret < 0)
158                 goto exit;
159
160         of_property_for_each_string(np, "nvidia,pins", prop, group) {
161                 if (function) {
162                         ret = pinctrl_utils_add_map_mux(pctldev, map,
163                                         reserved_maps, num_maps, group,
164                                         function);
165                         if (ret < 0)
166                                 goto exit;
167                 }
168
169                 if (num_configs) {
170                         ret = pinctrl_utils_add_map_configs(pctldev, map,
171                                         reserved_maps, num_maps, group,
172                                         configs, num_configs,
173                                         PIN_MAP_TYPE_CONFIGS_GROUP);
174                         if (ret < 0)
175                                 goto exit;
176                 }
177         }
178
179         ret = 0;
180
181 exit:
182         kfree(configs);
183         return ret;
184 }
185
186 static int tegra_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
187                                         struct device_node *np_config,
188                                         struct pinctrl_map **map,
189                                         unsigned *num_maps)
190 {
191         unsigned reserved_maps;
192         struct device_node *np;
193         int ret;
194
195         reserved_maps = 0;
196         *map = NULL;
197         *num_maps = 0;
198
199         for_each_child_of_node(np_config, np) {
200                 ret = tegra_pinctrl_dt_subnode_to_map(pctldev, np, map,
201                                                       &reserved_maps, num_maps);
202                 if (ret < 0) {
203                         pinctrl_utils_free_map(pctldev, *map,
204                                 *num_maps);
205                         of_node_put(np);
206                         return ret;
207                 }
208         }
209
210         return 0;
211 }
212
213 static const struct pinctrl_ops tegra_pinctrl_ops = {
214         .get_groups_count = tegra_pinctrl_get_groups_count,
215         .get_group_name = tegra_pinctrl_get_group_name,
216         .get_group_pins = tegra_pinctrl_get_group_pins,
217 #ifdef CONFIG_DEBUG_FS
218         .pin_dbg_show = tegra_pinctrl_pin_dbg_show,
219 #endif
220         .dt_node_to_map = tegra_pinctrl_dt_node_to_map,
221         .dt_free_map = pinctrl_utils_free_map,
222 };
223
224 static int tegra_pinctrl_get_funcs_count(struct pinctrl_dev *pctldev)
225 {
226         struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
227
228         return pmx->soc->nfunctions;
229 }
230
231 static const char *tegra_pinctrl_get_func_name(struct pinctrl_dev *pctldev,
232                                                unsigned function)
233 {
234         struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
235
236         return pmx->functions[function].name;
237 }
238
239 static int tegra_pinctrl_get_func_groups(struct pinctrl_dev *pctldev,
240                                          unsigned function,
241                                          const char * const **groups,
242                                          unsigned * const num_groups)
243 {
244         struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
245
246         *groups = pmx->functions[function].groups;
247         *num_groups = pmx->functions[function].ngroups;
248
249         return 0;
250 }
251
252 static int tegra_pinctrl_set_mux(struct pinctrl_dev *pctldev,
253                                  unsigned function,
254                                  unsigned group)
255 {
256         struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
257         const struct tegra_pingroup *g;
258         int i;
259         u32 val;
260
261         g = &pmx->soc->groups[group];
262
263         if (WARN_ON(g->mux_reg < 0))
264                 return -EINVAL;
265
266         for (i = 0; i < ARRAY_SIZE(g->funcs); i++) {
267                 if (g->funcs[i] == function)
268                         break;
269         }
270         if (WARN_ON(i == ARRAY_SIZE(g->funcs)))
271                 return -EINVAL;
272
273         val = pmx_readl(pmx, g->mux_bank, g->mux_reg);
274         val &= ~(0x3 << g->mux_bit);
275         val |= i << g->mux_bit;
276         pmx_writel(pmx, val, g->mux_bank, g->mux_reg);
277
278         return 0;
279 }
280
281 static const struct tegra_pingroup *tegra_pinctrl_get_group(struct pinctrl_dev *pctldev,
282                                         unsigned int offset)
283 {
284         struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
285         unsigned int group, num_pins, j;
286         const unsigned int *pins;
287         int ret;
288
289         for (group = 0; group < pmx->soc->ngroups; ++group) {
290                 ret = tegra_pinctrl_get_group_pins(pctldev, group, &pins, &num_pins);
291                 if (ret < 0)
292                         continue;
293                 for (j = 0; j < num_pins; j++) {
294                         if (offset == pins[j])
295                                 return &pmx->soc->groups[group];
296                 }
297         }
298
299         dev_err(pctldev->dev, "Pingroup not found for pin %u\n", offset);
300         return NULL;
301 }
302
303 static int tegra_pinctrl_gpio_request_enable(struct pinctrl_dev *pctldev,
304                                              struct pinctrl_gpio_range *range,
305                                              unsigned int offset)
306 {
307         struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
308         const struct tegra_pingroup *group;
309         u32 value;
310
311         if (!pmx->soc->sfsel_in_mux)
312                 return 0;
313
314         group = tegra_pinctrl_get_group(pctldev, offset);
315
316         if (!group)
317                 return -EINVAL;
318
319         if (group->mux_reg < 0 || group->sfsel_bit < 0)
320                 return -EINVAL;
321
322         value = pmx_readl(pmx, group->mux_bank, group->mux_reg);
323         value &= ~BIT(group->sfsel_bit);
324         pmx_writel(pmx, value, group->mux_bank, group->mux_reg);
325
326         return 0;
327 }
328
329 static void tegra_pinctrl_gpio_disable_free(struct pinctrl_dev *pctldev,
330                                             struct pinctrl_gpio_range *range,
331                                             unsigned int offset)
332 {
333         struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
334         const struct tegra_pingroup *group;
335         u32 value;
336
337         if (!pmx->soc->sfsel_in_mux)
338                 return;
339
340         group = tegra_pinctrl_get_group(pctldev, offset);
341
342         if (!group)
343                 return;
344
345         if (group->mux_reg < 0 || group->sfsel_bit < 0)
346                 return;
347
348         value = pmx_readl(pmx, group->mux_bank, group->mux_reg);
349         value |= BIT(group->sfsel_bit);
350         pmx_writel(pmx, value, group->mux_bank, group->mux_reg);
351 }
352
353 static const struct pinmux_ops tegra_pinmux_ops = {
354         .get_functions_count = tegra_pinctrl_get_funcs_count,
355         .get_function_name = tegra_pinctrl_get_func_name,
356         .get_function_groups = tegra_pinctrl_get_func_groups,
357         .set_mux = tegra_pinctrl_set_mux,
358         .gpio_request_enable = tegra_pinctrl_gpio_request_enable,
359         .gpio_disable_free = tegra_pinctrl_gpio_disable_free,
360 };
361
362 static int tegra_pinconf_reg(struct tegra_pmx *pmx,
363                              const struct tegra_pingroup *g,
364                              enum tegra_pinconf_param param,
365                              bool report_err,
366                              s8 *bank, s32 *reg, s8 *bit, s8 *width)
367 {
368         switch (param) {
369         case TEGRA_PINCONF_PARAM_PULL:
370                 *bank = g->pupd_bank;
371                 *reg = g->pupd_reg;
372                 *bit = g->pupd_bit;
373                 *width = 2;
374                 break;
375         case TEGRA_PINCONF_PARAM_TRISTATE:
376                 *bank = g->tri_bank;
377                 *reg = g->tri_reg;
378                 *bit = g->tri_bit;
379                 *width = 1;
380                 break;
381         case TEGRA_PINCONF_PARAM_ENABLE_INPUT:
382                 *bank = g->mux_bank;
383                 *reg = g->mux_reg;
384                 *bit = g->einput_bit;
385                 *width = 1;
386                 break;
387         case TEGRA_PINCONF_PARAM_OPEN_DRAIN:
388                 *bank = g->mux_bank;
389                 *reg = g->mux_reg;
390                 *bit = g->odrain_bit;
391                 *width = 1;
392                 break;
393         case TEGRA_PINCONF_PARAM_LOCK:
394                 *bank = g->mux_bank;
395                 *reg = g->mux_reg;
396                 *bit = g->lock_bit;
397                 *width = 1;
398                 break;
399         case TEGRA_PINCONF_PARAM_IORESET:
400                 *bank = g->mux_bank;
401                 *reg = g->mux_reg;
402                 *bit = g->ioreset_bit;
403                 *width = 1;
404                 break;
405         case TEGRA_PINCONF_PARAM_RCV_SEL:
406                 *bank = g->mux_bank;
407                 *reg = g->mux_reg;
408                 *bit = g->rcv_sel_bit;
409                 *width = 1;
410                 break;
411         case TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE:
412                 if (pmx->soc->hsm_in_mux) {
413                         *bank = g->mux_bank;
414                         *reg = g->mux_reg;
415                 } else {
416                         *bank = g->drv_bank;
417                         *reg = g->drv_reg;
418                 }
419                 *bit = g->hsm_bit;
420                 *width = 1;
421                 break;
422         case TEGRA_PINCONF_PARAM_SCHMITT:
423                 if (pmx->soc->schmitt_in_mux) {
424                         *bank = g->mux_bank;
425                         *reg = g->mux_reg;
426                 } else {
427                         *bank = g->drv_bank;
428                         *reg = g->drv_reg;
429                 }
430                 *bit = g->schmitt_bit;
431                 *width = 1;
432                 break;
433         case TEGRA_PINCONF_PARAM_LOW_POWER_MODE:
434                 *bank = g->drv_bank;
435                 *reg = g->drv_reg;
436                 *bit = g->lpmd_bit;
437                 *width = 2;
438                 break;
439         case TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH:
440                 *bank = g->drv_bank;
441                 *reg = g->drv_reg;
442                 *bit = g->drvdn_bit;
443                 *width = g->drvdn_width;
444                 break;
445         case TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH:
446                 *bank = g->drv_bank;
447                 *reg = g->drv_reg;
448                 *bit = g->drvup_bit;
449                 *width = g->drvup_width;
450                 break;
451         case TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING:
452                 *bank = g->drv_bank;
453                 *reg = g->drv_reg;
454                 *bit = g->slwf_bit;
455                 *width = g->slwf_width;
456                 break;
457         case TEGRA_PINCONF_PARAM_SLEW_RATE_RISING:
458                 *bank = g->drv_bank;
459                 *reg = g->drv_reg;
460                 *bit = g->slwr_bit;
461                 *width = g->slwr_width;
462                 break;
463         case TEGRA_PINCONF_PARAM_DRIVE_TYPE:
464                 if (pmx->soc->drvtype_in_mux) {
465                         *bank = g->mux_bank;
466                         *reg = g->mux_reg;
467                 } else {
468                         *bank = g->drv_bank;
469                         *reg = g->drv_reg;
470                 }
471                 *bit = g->drvtype_bit;
472                 *width = 2;
473                 break;
474         case TEGRA_PINCONF_PARAM_FUNCTION:
475                 *bank = g->mux_bank;
476                 *reg = g->mux_reg;
477                 *bit = g->mux_bit;
478                 *width = 2;
479                 break;
480         default:
481                 dev_err(pmx->dev, "Invalid config param %04x\n", param);
482                 return -ENOTSUPP;
483         }
484
485         if (*reg < 0 || *bit < 0)  {
486                 if (report_err) {
487                         const char *prop = "unknown";
488                         int i;
489
490                         for (i = 0; i < ARRAY_SIZE(cfg_params); i++) {
491                                 if (cfg_params[i].param == param) {
492                                         prop = cfg_params[i].property;
493                                         break;
494                                 }
495                         }
496
497                         dev_err(pmx->dev,
498                                 "Config param %04x (%s) not supported on group %s\n",
499                                 param, prop, g->name);
500                 }
501                 return -ENOTSUPP;
502         }
503
504         return 0;
505 }
506
507 static int tegra_pinconf_get(struct pinctrl_dev *pctldev,
508                              unsigned pin, unsigned long *config)
509 {
510         dev_err(pctldev->dev, "pin_config_get op not supported\n");
511         return -ENOTSUPP;
512 }
513
514 static int tegra_pinconf_set(struct pinctrl_dev *pctldev,
515                              unsigned pin, unsigned long *configs,
516                              unsigned num_configs)
517 {
518         dev_err(pctldev->dev, "pin_config_set op not supported\n");
519         return -ENOTSUPP;
520 }
521
522 static int tegra_pinconf_group_get(struct pinctrl_dev *pctldev,
523                                    unsigned group, unsigned long *config)
524 {
525         struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
526         enum tegra_pinconf_param param = TEGRA_PINCONF_UNPACK_PARAM(*config);
527         u16 arg;
528         const struct tegra_pingroup *g;
529         int ret;
530         s8 bank, bit, width;
531         s32 reg;
532         u32 val, mask;
533
534         g = &pmx->soc->groups[group];
535
536         ret = tegra_pinconf_reg(pmx, g, param, true, &bank, &reg, &bit,
537                                 &width);
538         if (ret < 0)
539                 return ret;
540
541         val = pmx_readl(pmx, bank, reg);
542         mask = (1 << width) - 1;
543         arg = (val >> bit) & mask;
544
545         *config = TEGRA_PINCONF_PACK(param, arg);
546
547         return 0;
548 }
549
550 static int tegra_pinconf_group_set(struct pinctrl_dev *pctldev,
551                                    unsigned group, unsigned long *configs,
552                                    unsigned num_configs)
553 {
554         struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
555         enum tegra_pinconf_param param;
556         u16 arg;
557         const struct tegra_pingroup *g;
558         int ret, i;
559         s8 bank, bit, width;
560         s32 reg;
561         u32 val, mask;
562
563         g = &pmx->soc->groups[group];
564
565         for (i = 0; i < num_configs; i++) {
566                 param = TEGRA_PINCONF_UNPACK_PARAM(configs[i]);
567                 arg = TEGRA_PINCONF_UNPACK_ARG(configs[i]);
568
569                 ret = tegra_pinconf_reg(pmx, g, param, true, &bank, &reg, &bit,
570                                         &width);
571                 if (ret < 0)
572                         return ret;
573
574                 val = pmx_readl(pmx, bank, reg);
575
576                 /* LOCK can't be cleared */
577                 if (param == TEGRA_PINCONF_PARAM_LOCK) {
578                         if ((val & BIT(bit)) && !arg) {
579                                 dev_err(pctldev->dev, "LOCK bit cannot be cleared\n");
580                                 return -EINVAL;
581                         }
582                 }
583
584                 /* Special-case Boolean values; allow any non-zero as true */
585                 if (width == 1)
586                         arg = !!arg;
587
588                 /* Range-check user-supplied value */
589                 mask = (1 << width) - 1;
590                 if (arg & ~mask) {
591                         dev_err(pctldev->dev,
592                                 "config %lx: %x too big for %d bit register\n",
593                                 configs[i], arg, width);
594                         return -EINVAL;
595                 }
596
597                 /* Update register */
598                 val &= ~(mask << bit);
599                 val |= arg << bit;
600                 pmx_writel(pmx, val, bank, reg);
601         } /* for each config */
602
603         return 0;
604 }
605
606 #ifdef CONFIG_DEBUG_FS
607 static void tegra_pinconf_dbg_show(struct pinctrl_dev *pctldev,
608                                    struct seq_file *s, unsigned offset)
609 {
610 }
611
612 static const char *strip_prefix(const char *s)
613 {
614         const char *comma = strchr(s, ',');
615         if (!comma)
616                 return s;
617
618         return comma + 1;
619 }
620
621 static void tegra_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
622                                          struct seq_file *s, unsigned group)
623 {
624         struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
625         const struct tegra_pingroup *g;
626         int i, ret;
627         s8 bank, bit, width;
628         s32 reg;
629         u32 val;
630
631         g = &pmx->soc->groups[group];
632
633         for (i = 0; i < ARRAY_SIZE(cfg_params); i++) {
634                 ret = tegra_pinconf_reg(pmx, g, cfg_params[i].param, false,
635                                         &bank, &reg, &bit, &width);
636                 if (ret < 0)
637                         continue;
638
639                 val = pmx_readl(pmx, bank, reg);
640                 val >>= bit;
641                 val &= (1 << width) - 1;
642
643                 if (cfg_params[i].param == TEGRA_PINCONF_PARAM_FUNCTION) {
644                         u8 idx = pmx->soc->groups[group].funcs[val];
645
646                         seq_printf(s, "\n\t%s=%s",
647                                    strip_prefix(cfg_params[i].property),
648                                          pmx->functions[idx].name);
649                 } else {
650                         seq_printf(s, "\n\t%s=%u",
651                                    strip_prefix(cfg_params[i].property), val);
652                 }
653         }
654 }
655
656 static void tegra_pinconf_config_dbg_show(struct pinctrl_dev *pctldev,
657                                           struct seq_file *s,
658                                           unsigned long config)
659 {
660         enum tegra_pinconf_param param = TEGRA_PINCONF_UNPACK_PARAM(config);
661         u16 arg = TEGRA_PINCONF_UNPACK_ARG(config);
662         const char *pname = "unknown";
663         int i;
664
665         for (i = 0; i < ARRAY_SIZE(cfg_params); i++) {
666                 if (cfg_params[i].param == param) {
667                         pname = cfg_params[i].property;
668                         break;
669                 }
670         }
671
672         seq_printf(s, "%s=%d", strip_prefix(pname), arg);
673 }
674 #endif
675
676 static const struct pinconf_ops tegra_pinconf_ops = {
677         .pin_config_get = tegra_pinconf_get,
678         .pin_config_set = tegra_pinconf_set,
679         .pin_config_group_get = tegra_pinconf_group_get,
680         .pin_config_group_set = tegra_pinconf_group_set,
681 #ifdef CONFIG_DEBUG_FS
682         .pin_config_dbg_show = tegra_pinconf_dbg_show,
683         .pin_config_group_dbg_show = tegra_pinconf_group_dbg_show,
684         .pin_config_config_dbg_show = tegra_pinconf_config_dbg_show,
685 #endif
686 };
687
688 static void tegra_pinctrl_clear_parked_bits(struct tegra_pmx *pmx)
689 {
690         int i = 0;
691         const struct tegra_pingroup *g;
692         u32 val;
693
694         for (i = 0; i < pmx->soc->ngroups; ++i) {
695                 g = &pmx->soc->groups[i];
696                 if (g->parked_bitmask > 0) {
697                         unsigned int bank, reg;
698
699                         if (g->mux_reg != -1) {
700                                 bank = g->mux_bank;
701                                 reg = g->mux_reg;
702                         } else {
703                                 bank = g->drv_bank;
704                                 reg = g->drv_reg;
705                         }
706
707                         val = pmx_readl(pmx, bank, reg);
708                         val &= ~g->parked_bitmask;
709                         pmx_writel(pmx, val, bank, reg);
710                 }
711         }
712 }
713
714 static size_t tegra_pinctrl_get_bank_size(struct device *dev,
715                                           unsigned int bank_id)
716 {
717         struct platform_device *pdev = to_platform_device(dev);
718         struct resource *res;
719
720         res = platform_get_resource(pdev, IORESOURCE_MEM, bank_id);
721
722         return resource_size(res) / 4;
723 }
724
725 static int tegra_pinctrl_suspend(struct device *dev)
726 {
727         struct tegra_pmx *pmx = dev_get_drvdata(dev);
728         u32 *backup_regs = pmx->backup_regs;
729         u32 __iomem *regs;
730         size_t bank_size;
731         unsigned int i, k;
732
733         for (i = 0; i < pmx->nbanks; i++) {
734                 bank_size = tegra_pinctrl_get_bank_size(dev, i);
735                 regs = pmx->regs[i];
736                 for (k = 0; k < bank_size; k++)
737                         *backup_regs++ = readl_relaxed(regs++);
738         }
739
740         return pinctrl_force_sleep(pmx->pctl);
741 }
742
743 static int tegra_pinctrl_resume(struct device *dev)
744 {
745         struct tegra_pmx *pmx = dev_get_drvdata(dev);
746         u32 *backup_regs = pmx->backup_regs;
747         u32 __iomem *regs;
748         size_t bank_size;
749         unsigned int i, k;
750
751         for (i = 0; i < pmx->nbanks; i++) {
752                 bank_size = tegra_pinctrl_get_bank_size(dev, i);
753                 regs = pmx->regs[i];
754                 for (k = 0; k < bank_size; k++)
755                         writel_relaxed(*backup_regs++, regs++);
756         }
757
758         /* flush all the prior writes */
759         readl_relaxed(pmx->regs[0]);
760         /* wait for pinctrl register read to complete */
761         rmb();
762         return 0;
763 }
764
765 DEFINE_NOIRQ_DEV_PM_OPS(tegra_pinctrl_pm, tegra_pinctrl_suspend, tegra_pinctrl_resume);
766
767 static bool tegra_pinctrl_gpio_node_has_range(struct tegra_pmx *pmx)
768 {
769         struct device_node *np;
770         bool has_prop = false;
771
772         np = of_find_compatible_node(NULL, NULL, pmx->soc->gpio_compatible);
773         if (!np)
774                 return has_prop;
775
776         has_prop = of_find_property(np, "gpio-ranges", NULL);
777
778         of_node_put(np);
779
780         return has_prop;
781 }
782
783 int tegra_pinctrl_probe(struct platform_device *pdev,
784                         const struct tegra_pinctrl_soc_data *soc_data)
785 {
786         struct tegra_pmx *pmx;
787         struct resource *res;
788         int i;
789         const char **group_pins;
790         int fn, gn, gfn;
791         unsigned long backup_regs_size = 0;
792
793         pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL);
794         if (!pmx)
795                 return -ENOMEM;
796
797         pmx->dev = &pdev->dev;
798         pmx->soc = soc_data;
799
800         /*
801          * Each mux group will appear in 4 functions' list of groups.
802          * This over-allocates slightly, since not all groups are mux groups.
803          */
804         pmx->group_pins = devm_kcalloc(&pdev->dev, pmx->soc->ngroups * 4,
805                                        sizeof(*pmx->group_pins), GFP_KERNEL);
806         if (!pmx->group_pins)
807                 return -ENOMEM;
808
809         pmx->functions = devm_kcalloc(&pdev->dev, pmx->soc->nfunctions,
810                                       sizeof(*pmx->functions), GFP_KERNEL);
811         if (!pmx->functions)
812                 return -ENOMEM;
813
814         group_pins = pmx->group_pins;
815
816         for (fn = 0; fn < pmx->soc->nfunctions; fn++) {
817                 struct tegra_function *func = &pmx->functions[fn];
818
819                 func->name = pmx->soc->functions[fn];
820                 func->groups = group_pins;
821
822                 for (gn = 0; gn < pmx->soc->ngroups; gn++) {
823                         const struct tegra_pingroup *g = &pmx->soc->groups[gn];
824
825                         if (g->mux_reg == -1)
826                                 continue;
827
828                         for (gfn = 0; gfn < 4; gfn++)
829                                 if (g->funcs[gfn] == fn)
830                                         break;
831                         if (gfn == 4)
832                                 continue;
833
834                         BUG_ON(group_pins - pmx->group_pins >=
835                                 pmx->soc->ngroups * 4);
836                         *group_pins++ = g->name;
837                         func->ngroups++;
838                 }
839         }
840
841         pmx->gpio_range.name = "Tegra GPIOs";
842         pmx->gpio_range.id = 0;
843         pmx->gpio_range.base = 0;
844         pmx->gpio_range.npins = pmx->soc->ngpios;
845
846         pmx->desc.pctlops = &tegra_pinctrl_ops;
847         pmx->desc.pmxops = &tegra_pinmux_ops;
848         pmx->desc.confops = &tegra_pinconf_ops;
849         pmx->desc.owner = THIS_MODULE;
850         pmx->desc.name = dev_name(&pdev->dev);
851         pmx->desc.pins = pmx->soc->pins;
852         pmx->desc.npins = pmx->soc->npins;
853
854         for (i = 0; ; i++) {
855                 res = platform_get_resource(pdev, IORESOURCE_MEM, i);
856                 if (!res)
857                         break;
858                 backup_regs_size += resource_size(res);
859         }
860         pmx->nbanks = i;
861
862         pmx->regs = devm_kcalloc(&pdev->dev, pmx->nbanks, sizeof(*pmx->regs),
863                                  GFP_KERNEL);
864         if (!pmx->regs)
865                 return -ENOMEM;
866
867         pmx->backup_regs = devm_kzalloc(&pdev->dev, backup_regs_size,
868                                         GFP_KERNEL);
869         if (!pmx->backup_regs)
870                 return -ENOMEM;
871
872         for (i = 0; i < pmx->nbanks; i++) {
873                 pmx->regs[i] = devm_platform_ioremap_resource(pdev, i);
874                 if (IS_ERR(pmx->regs[i]))
875                         return PTR_ERR(pmx->regs[i]);
876         }
877
878         pmx->pctl = devm_pinctrl_register(&pdev->dev, &pmx->desc, pmx);
879         if (IS_ERR(pmx->pctl)) {
880                 dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
881                 return PTR_ERR(pmx->pctl);
882         }
883
884         tegra_pinctrl_clear_parked_bits(pmx);
885
886         if (pmx->soc->ngpios > 0 && !tegra_pinctrl_gpio_node_has_range(pmx))
887                 pinctrl_add_gpio_range(pmx->pctl, &pmx->gpio_range);
888
889         platform_set_drvdata(pdev, pmx);
890
891         dev_dbg(&pdev->dev, "Probed Tegra pinctrl driver\n");
892
893         return 0;
894 }