Merge tag 'parisc-for-6.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller...
[platform/kernel/linux-starfive.git] / drivers / pinctrl / aspeed / pinctrl-aspeed.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (C) 2016 IBM Corp.
4  */
5
6 #include <linux/mfd/syscon.h>
7 #include <linux/platform_device.h>
8 #include <linux/slab.h>
9 #include <linux/string.h>
10 #include "../core.h"
11 #include "pinctrl-aspeed.h"
12
13 int aspeed_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
14 {
15         struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
16
17         return pdata->pinmux.ngroups;
18 }
19
20 const char *aspeed_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
21                 unsigned int group)
22 {
23         struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
24
25         return pdata->pinmux.groups[group].name;
26 }
27
28 int aspeed_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
29                                   unsigned int group, const unsigned int **pins,
30                                   unsigned int *npins)
31 {
32         struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
33
34         *pins = &pdata->pinmux.groups[group].pins[0];
35         *npins = pdata->pinmux.groups[group].npins;
36
37         return 0;
38 }
39
40 void aspeed_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev,
41                                  struct seq_file *s, unsigned int offset)
42 {
43         seq_printf(s, " %s", dev_name(pctldev->dev));
44 }
45
46 int aspeed_pinmux_get_fn_count(struct pinctrl_dev *pctldev)
47 {
48         struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
49
50         return pdata->pinmux.nfunctions;
51 }
52
53 const char *aspeed_pinmux_get_fn_name(struct pinctrl_dev *pctldev,
54                                       unsigned int function)
55 {
56         struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
57
58         return pdata->pinmux.functions[function].name;
59 }
60
61 int aspeed_pinmux_get_fn_groups(struct pinctrl_dev *pctldev,
62                                 unsigned int function,
63                                 const char * const **groups,
64                                 unsigned int * const num_groups)
65 {
66         struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
67
68         *groups = pdata->pinmux.functions[function].groups;
69         *num_groups = pdata->pinmux.functions[function].ngroups;
70
71         return 0;
72 }
73
74 static int aspeed_sig_expr_enable(struct aspeed_pinmux_data *ctx,
75                                   const struct aspeed_sig_expr *expr)
76 {
77         int ret;
78
79         pr_debug("Enabling signal %s for %s\n", expr->signal,
80                  expr->function);
81
82         ret = aspeed_sig_expr_eval(ctx, expr, true);
83         if (ret < 0)
84                 return ret;
85
86         if (!ret)
87                 return aspeed_sig_expr_set(ctx, expr, true);
88
89         return 0;
90 }
91
92 static int aspeed_sig_expr_disable(struct aspeed_pinmux_data *ctx,
93                                    const struct aspeed_sig_expr *expr)
94 {
95         pr_debug("Disabling signal %s for %s\n", expr->signal,
96                  expr->function);
97
98         return aspeed_sig_expr_set(ctx, expr, false);
99 }
100
101 /**
102  * aspeed_disable_sig() - Disable a signal on a pin by disabling all provided
103  * signal expressions.
104  *
105  * @ctx: The pinmux context
106  * @exprs: The list of signal expressions (from a priority level on a pin)
107  *
108  * Return: 0 if all expressions are disabled, otherwise a negative error code
109  */
110 static int aspeed_disable_sig(struct aspeed_pinmux_data *ctx,
111                               const struct aspeed_sig_expr **exprs)
112 {
113         int ret = 0;
114
115         if (!exprs)
116                 return true;
117
118         while (*exprs && !ret) {
119                 ret = aspeed_sig_expr_disable(ctx, *exprs);
120                 exprs++;
121         }
122
123         return ret;
124 }
125
126 /**
127  * aspeed_find_expr_by_name - Search for the signal expression needed to
128  * enable the pin's signal for the requested function.
129  *
130  * @exprs: List of signal expressions (haystack)
131  * @name: The name of the requested function (needle)
132  *
133  * Return: A pointer to the signal expression whose function tag matches the
134  * provided name, otherwise NULL.
135  *
136  */
137 static const struct aspeed_sig_expr *aspeed_find_expr_by_name(
138                 const struct aspeed_sig_expr **exprs, const char *name)
139 {
140         while (*exprs) {
141                 if (strcmp((*exprs)->function, name) == 0)
142                         return *exprs;
143                 exprs++;
144         }
145
146         return NULL;
147 }
148
149 static char *get_defined_attribute(const struct aspeed_pin_desc *pdesc,
150                                    const char *(*get)(
151                                            const struct aspeed_sig_expr *))
152 {
153         char *found = NULL;
154         size_t len = 0;
155         const struct aspeed_sig_expr ***prios, **funcs, *expr;
156
157         prios = pdesc->prios;
158
159         while ((funcs = *prios)) {
160                 while ((expr = *funcs)) {
161                         const char *str = get(expr);
162                         size_t delta = strlen(str) + 2;
163                         char *expanded;
164
165                         expanded = krealloc(found, len + delta + 1, GFP_KERNEL);
166                         if (!expanded) {
167                                 kfree(found);
168                                 return expanded;
169                         }
170
171                         found = expanded;
172                         found[len] = '\0';
173                         len += delta;
174
175                         strcat(found, str);
176                         strcat(found, ", ");
177
178                         funcs++;
179                 }
180                 prios++;
181         }
182
183         if (len < 2) {
184                 kfree(found);
185                 return NULL;
186         }
187
188         found[len - 2] = '\0';
189
190         return found;
191 }
192
193 static const char *aspeed_sig_expr_function(const struct aspeed_sig_expr *expr)
194 {
195         return expr->function;
196 }
197
198 static char *get_defined_functions(const struct aspeed_pin_desc *pdesc)
199 {
200         return get_defined_attribute(pdesc, aspeed_sig_expr_function);
201 }
202
203 static const char *aspeed_sig_expr_signal(const struct aspeed_sig_expr *expr)
204 {
205         return expr->signal;
206 }
207
208 static char *get_defined_signals(const struct aspeed_pin_desc *pdesc)
209 {
210         return get_defined_attribute(pdesc, aspeed_sig_expr_signal);
211 }
212
213 int aspeed_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned int function,
214                           unsigned int group)
215 {
216         int i;
217         int ret;
218         struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
219         const struct aspeed_pin_group *pgroup = &pdata->pinmux.groups[group];
220         const struct aspeed_pin_function *pfunc =
221                 &pdata->pinmux.functions[function];
222
223         for (i = 0; i < pgroup->npins; i++) {
224                 int pin = pgroup->pins[i];
225                 const struct aspeed_pin_desc *pdesc = pdata->pins[pin].drv_data;
226                 const struct aspeed_sig_expr *expr = NULL;
227                 const struct aspeed_sig_expr **funcs;
228                 const struct aspeed_sig_expr ***prios;
229
230                 if (!pdesc)
231                         return -EINVAL;
232
233                 pr_debug("Muxing pin %s for %s\n", pdesc->name, pfunc->name);
234
235                 prios = pdesc->prios;
236
237                 if (!prios)
238                         continue;
239
240                 /* Disable functions at a higher priority than that requested */
241                 while ((funcs = *prios)) {
242                         expr = aspeed_find_expr_by_name(funcs, pfunc->name);
243
244                         if (expr)
245                                 break;
246
247                         ret = aspeed_disable_sig(&pdata->pinmux, funcs);
248                         if (ret)
249                                 return ret;
250
251                         prios++;
252                 }
253
254                 if (!expr) {
255                         char *functions = get_defined_functions(pdesc);
256                         char *signals = get_defined_signals(pdesc);
257
258                         pr_warn("No function %s found on pin %s (%d). Found signal(s) %s for function(s) %s\n",
259                                 pfunc->name, pdesc->name, pin, signals,
260                                 functions);
261                         kfree(signals);
262                         kfree(functions);
263
264                         return -ENXIO;
265                 }
266
267                 ret = aspeed_sig_expr_enable(&pdata->pinmux, expr);
268                 if (ret)
269                         return ret;
270
271                 pr_debug("Muxed pin %s as %s for %s\n", pdesc->name, expr->signal,
272                          expr->function);
273         }
274
275         return 0;
276 }
277
278 static bool aspeed_expr_is_gpio(const struct aspeed_sig_expr *expr)
279 {
280         /*
281          * We need to differentiate between GPIO and non-GPIO signals to
282          * implement the gpio_request_enable() interface. For better or worse
283          * the ASPEED pinctrl driver uses the expression names to determine
284          * whether an expression will mux a pin for GPIO.
285          *
286          * Generally we have the following - A GPIO such as B1 has:
287          *
288          *    - expr->signal set to "GPIOB1"
289          *    - expr->function set to "GPIOB1"
290          *
291          * Using this fact we can determine whether the provided expression is
292          * a GPIO expression by testing the signal name for the string prefix
293          * "GPIO".
294          *
295          * However, some GPIOs are input-only, and the ASPEED datasheets name
296          * them differently. An input-only GPIO such as T0 has:
297          *
298          *    - expr->signal set to "GPIT0"
299          *    - expr->function set to "GPIT0"
300          *
301          * It's tempting to generalise the prefix test from "GPIO" to "GPI" to
302          * account for both GPIOs and GPIs, but in doing so we run aground on
303          * another feature:
304          *
305          * Some pins in the ASPEED BMC SoCs have a "pass-through" GPIO
306          * function where the input state of one pin is replicated as the
307          * output state of another (as if they were shorted together - a mux
308          * configuration that is typically enabled by hardware strapping).
309          * This feature allows the BMC to pass e.g. power button state through
310          * to the host while the BMC is yet to boot, but take control of the
311          * button state once the BMC has booted by muxing each pin as a
312          * separate, pin-specific GPIO.
313          *
314          * Conceptually this pass-through mode is a form of GPIO and is named
315          * as such in the datasheets, e.g. "GPID0". This naming similarity
316          * trips us up with the simple GPI-prefixed-signal-name scheme
317          * discussed above, as the pass-through configuration is not what we
318          * want when muxing a pin as GPIO for the GPIO subsystem.
319          *
320          * On e.g. the AST2400, a pass-through function "GPID0" is grouped on
321          * balls A18 and D16, where we have:
322          *
323          *    For ball A18:
324          *    - expr->signal set to "GPID0IN"
325          *    - expr->function set to "GPID0"
326          *
327          *    For ball D16:
328          *    - expr->signal set to "GPID0OUT"
329          *    - expr->function set to "GPID0"
330          *
331          * By contrast, the pin-specific GPIO expressions for the same pins are
332          * as follows:
333          *
334          *    For ball A18:
335          *    - expr->signal looks like "GPIOD0"
336          *    - expr->function looks like "GPIOD0"
337          *
338          *    For ball D16:
339          *    - expr->signal looks like "GPIOD1"
340          *    - expr->function looks like "GPIOD1"
341          *
342          * Testing both the signal _and_ function names gives us the means
343          * differentiate the pass-through GPIO pinmux configuration from the
344          * pin-specific configuration that the GPIO subsystem is after: An
345          * expression is a pin-specific (non-pass-through) GPIO configuration
346          * if the signal prefix is "GPI" and the signal name matches the
347          * function name.
348          */
349         return !strncmp(expr->signal, "GPI", 3) &&
350                         !strcmp(expr->signal, expr->function);
351 }
352
353 static bool aspeed_gpio_in_exprs(const struct aspeed_sig_expr **exprs)
354 {
355         if (!exprs)
356                 return false;
357
358         while (*exprs) {
359                 if (aspeed_expr_is_gpio(*exprs))
360                         return true;
361                 exprs++;
362         }
363
364         return false;
365 }
366
367 int aspeed_gpio_request_enable(struct pinctrl_dev *pctldev,
368                                struct pinctrl_gpio_range *range,
369                                unsigned int offset)
370 {
371         int ret;
372         struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
373         const struct aspeed_pin_desc *pdesc = pdata->pins[offset].drv_data;
374         const struct aspeed_sig_expr ***prios, **funcs, *expr;
375
376         if (!pdesc)
377                 return -EINVAL;
378
379         prios = pdesc->prios;
380
381         if (!prios)
382                 return -ENXIO;
383
384         pr_debug("Muxing pin %s for GPIO\n", pdesc->name);
385
386         /* Disable any functions of higher priority than GPIO */
387         while ((funcs = *prios)) {
388                 if (aspeed_gpio_in_exprs(funcs))
389                         break;
390
391                 ret = aspeed_disable_sig(&pdata->pinmux, funcs);
392                 if (ret)
393                         return ret;
394
395                 prios++;
396         }
397
398         if (!funcs) {
399                 char *signals = get_defined_signals(pdesc);
400
401                 pr_warn("No GPIO signal type found on pin %s (%d). Found: %s\n",
402                         pdesc->name, offset, signals);
403                 kfree(signals);
404
405                 return -ENXIO;
406         }
407
408         expr = *funcs;
409
410         /*
411          * Disabling all higher-priority expressions is enough to enable the
412          * lowest-priority signal type. As such it has no associated
413          * expression.
414          */
415         if (!expr) {
416                 pr_debug("Muxed pin %s as GPIO\n", pdesc->name);
417                 return 0;
418         }
419
420         /*
421          * If GPIO is not the lowest priority signal type, assume there is only
422          * one expression defined to enable the GPIO function
423          */
424         ret = aspeed_sig_expr_enable(&pdata->pinmux, expr);
425         if (ret)
426                 return ret;
427
428         pr_debug("Muxed pin %s as %s\n", pdesc->name, expr->signal);
429
430         return 0;
431 }
432
433 int aspeed_pinctrl_probe(struct platform_device *pdev,
434                          struct pinctrl_desc *pdesc,
435                          struct aspeed_pinctrl_data *pdata)
436 {
437         struct device *parent;
438         struct pinctrl_dev *pctl;
439
440         parent = pdev->dev.parent;
441         if (!parent) {
442                 dev_err(&pdev->dev, "No parent for syscon pincontroller\n");
443                 return -ENODEV;
444         }
445
446         pdata->scu = syscon_node_to_regmap(parent->of_node);
447         if (IS_ERR(pdata->scu)) {
448                 dev_err(&pdev->dev, "No regmap for syscon pincontroller parent\n");
449                 return PTR_ERR(pdata->scu);
450         }
451
452         pdata->pinmux.maps[ASPEED_IP_SCU] = pdata->scu;
453
454         pctl = pinctrl_register(pdesc, &pdev->dev, pdata);
455
456         if (IS_ERR(pctl)) {
457                 dev_err(&pdev->dev, "Failed to register pinctrl\n");
458                 return PTR_ERR(pctl);
459         }
460
461         platform_set_drvdata(pdev, pdata);
462
463         return 0;
464 }
465
466 static inline bool pin_in_config_range(unsigned int offset,
467                 const struct aspeed_pin_config *config)
468 {
469         return offset >= config->pins[0] && offset <= config->pins[1];
470 }
471
472 static inline const struct aspeed_pin_config *find_pinconf_config(
473                 const struct aspeed_pinctrl_data *pdata,
474                 unsigned int offset,
475                 enum pin_config_param param)
476 {
477         unsigned int i;
478
479         for (i = 0; i < pdata->nconfigs; i++) {
480                 if (param == pdata->configs[i].param &&
481                                 pin_in_config_range(offset, &pdata->configs[i]))
482                         return &pdata->configs[i];
483         }
484
485         return NULL;
486 }
487
488 enum aspeed_pin_config_map_type { MAP_TYPE_ARG, MAP_TYPE_VAL };
489
490 static const struct aspeed_pin_config_map *find_pinconf_map(
491                 const struct aspeed_pinctrl_data *pdata,
492                 enum pin_config_param param,
493                 enum aspeed_pin_config_map_type type,
494                 s64 value)
495 {
496         int i;
497
498         for (i = 0; i < pdata->nconfmaps; i++) {
499                 const struct aspeed_pin_config_map *elem;
500                 bool match;
501
502                 elem = &pdata->confmaps[i];
503
504                 switch (type) {
505                 case MAP_TYPE_ARG:
506                         match = (elem->arg == -1 || elem->arg == value);
507                         break;
508                 case MAP_TYPE_VAL:
509                         match = (elem->val == value);
510                         break;
511                 }
512
513                 if (param == elem->param && match)
514                         return elem;
515         }
516
517         return NULL;
518 }
519
520 int aspeed_pin_config_get(struct pinctrl_dev *pctldev, unsigned int offset,
521                 unsigned long *config)
522 {
523         const enum pin_config_param param = pinconf_to_config_param(*config);
524         const struct aspeed_pin_config_map *pmap;
525         const struct aspeed_pinctrl_data *pdata;
526         const struct aspeed_pin_config *pconf;
527         unsigned int val;
528         int rc = 0;
529         u32 arg;
530
531         pdata = pinctrl_dev_get_drvdata(pctldev);
532         pconf = find_pinconf_config(pdata, offset, param);
533         if (!pconf)
534                 return -ENOTSUPP;
535
536         rc = regmap_read(pdata->scu, pconf->reg, &val);
537         if (rc < 0)
538                 return rc;
539
540         pmap = find_pinconf_map(pdata, param, MAP_TYPE_VAL,
541                         (val & pconf->mask) >> __ffs(pconf->mask));
542
543         if (!pmap)
544                 return -EINVAL;
545
546         if (param == PIN_CONFIG_DRIVE_STRENGTH)
547                 arg = (u32) pmap->arg;
548         else if (param == PIN_CONFIG_BIAS_PULL_DOWN)
549                 arg = !!pmap->arg;
550         else
551                 arg = 1;
552
553         if (!arg)
554                 return -EINVAL;
555
556         *config = pinconf_to_config_packed(param, arg);
557
558         return 0;
559 }
560
561 int aspeed_pin_config_set(struct pinctrl_dev *pctldev, unsigned int offset,
562                 unsigned long *configs, unsigned int num_configs)
563 {
564         const struct aspeed_pinctrl_data *pdata;
565         unsigned int i;
566         int rc = 0;
567
568         pdata = pinctrl_dev_get_drvdata(pctldev);
569
570         for (i = 0; i < num_configs; i++) {
571                 const struct aspeed_pin_config_map *pmap;
572                 const struct aspeed_pin_config *pconf;
573                 enum pin_config_param param;
574                 unsigned int val;
575                 u32 arg;
576
577                 param = pinconf_to_config_param(configs[i]);
578                 arg = pinconf_to_config_argument(configs[i]);
579
580                 pconf = find_pinconf_config(pdata, offset, param);
581                 if (!pconf)
582                         return -ENOTSUPP;
583
584                 pmap = find_pinconf_map(pdata, param, MAP_TYPE_ARG, arg);
585
586                 if (WARN_ON(!pmap))
587                         return -EINVAL;
588
589                 val = pmap->val << __ffs(pconf->mask);
590
591                 rc = regmap_update_bits(pdata->scu, pconf->reg,
592                                         pconf->mask, val);
593
594                 if (rc < 0)
595                         return rc;
596
597                 pr_debug("%s: Set SCU%02X[0x%08X]=0x%X for param %d(=%d) on pin %d\n",
598                                 __func__, pconf->reg, pconf->mask,
599                                 val, param, arg, offset);
600         }
601
602         return 0;
603 }
604
605 int aspeed_pin_config_group_get(struct pinctrl_dev *pctldev,
606                 unsigned int selector,
607                 unsigned long *config)
608 {
609         const unsigned int *pins;
610         unsigned int npins;
611         int rc;
612
613         rc = aspeed_pinctrl_get_group_pins(pctldev, selector, &pins, &npins);
614         if (rc < 0)
615                 return rc;
616
617         if (!npins)
618                 return -ENODEV;
619
620         rc = aspeed_pin_config_get(pctldev, pins[0], config);
621
622         return rc;
623 }
624
625 int aspeed_pin_config_group_set(struct pinctrl_dev *pctldev,
626                 unsigned int selector,
627                 unsigned long *configs,
628                 unsigned int num_configs)
629 {
630         const unsigned int *pins;
631         unsigned int npins;
632         int rc;
633         int i;
634
635         pr_debug("%s: Fetching pins for group selector %d\n",
636                         __func__, selector);
637         rc = aspeed_pinctrl_get_group_pins(pctldev, selector, &pins, &npins);
638         if (rc < 0)
639                 return rc;
640
641         for (i = 0; i < npins; i++) {
642                 rc = aspeed_pin_config_set(pctldev, pins[i], configs,
643                                 num_configs);
644                 if (rc < 0)
645                         return rc;
646         }
647
648         return 0;
649 }