2 * Copyright (C) 2016 IBM Corp.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
10 #include <linux/mfd/syscon.h>
11 #include <linux/platform_device.h>
12 #include <linux/slab.h>
13 #include <linux/string.h>
15 #include "pinctrl-aspeed.h"
17 static const char *const aspeed_pinmux_ips
[] = {
18 [ASPEED_IP_SCU
] = "SCU",
19 [ASPEED_IP_GFX
] = "GFX",
20 [ASPEED_IP_LPC
] = "LPC",
23 int aspeed_pinctrl_get_groups_count(struct pinctrl_dev
*pctldev
)
25 struct aspeed_pinctrl_data
*pdata
= pinctrl_dev_get_drvdata(pctldev
);
27 return pdata
->ngroups
;
30 const char *aspeed_pinctrl_get_group_name(struct pinctrl_dev
*pctldev
,
33 struct aspeed_pinctrl_data
*pdata
= pinctrl_dev_get_drvdata(pctldev
);
35 return pdata
->groups
[group
].name
;
38 int aspeed_pinctrl_get_group_pins(struct pinctrl_dev
*pctldev
,
39 unsigned int group
, const unsigned int **pins
,
42 struct aspeed_pinctrl_data
*pdata
= pinctrl_dev_get_drvdata(pctldev
);
44 *pins
= &pdata
->groups
[group
].pins
[0];
45 *npins
= pdata
->groups
[group
].npins
;
50 void aspeed_pinctrl_pin_dbg_show(struct pinctrl_dev
*pctldev
,
51 struct seq_file
*s
, unsigned int offset
)
53 seq_printf(s
, " %s", dev_name(pctldev
->dev
));
56 int aspeed_pinmux_get_fn_count(struct pinctrl_dev
*pctldev
)
58 struct aspeed_pinctrl_data
*pdata
= pinctrl_dev_get_drvdata(pctldev
);
60 return pdata
->nfunctions
;
63 const char *aspeed_pinmux_get_fn_name(struct pinctrl_dev
*pctldev
,
64 unsigned int function
)
66 struct aspeed_pinctrl_data
*pdata
= pinctrl_dev_get_drvdata(pctldev
);
68 return pdata
->functions
[function
].name
;
71 int aspeed_pinmux_get_fn_groups(struct pinctrl_dev
*pctldev
,
72 unsigned int function
,
73 const char * const **groups
,
74 unsigned int * const num_groups
)
76 struct aspeed_pinctrl_data
*pdata
= pinctrl_dev_get_drvdata(pctldev
);
78 *groups
= pdata
->functions
[function
].groups
;
79 *num_groups
= pdata
->functions
[function
].ngroups
;
84 static inline void aspeed_sig_desc_print_val(
85 const struct aspeed_sig_desc
*desc
, bool enable
, u32 rv
)
87 pr_debug("Want %s%X[0x%08X]=0x%X, got 0x%X from 0x%08X\n",
88 aspeed_pinmux_ips
[desc
->ip
], desc
->reg
,
89 desc
->mask
, enable
? desc
->enable
: desc
->disable
,
90 (rv
& desc
->mask
) >> __ffs(desc
->mask
), rv
);
94 * Query the enabled or disabled state of a signal descriptor
96 * @desc: The signal descriptor of interest
97 * @enabled: True to query the enabled state, false to query disabled state
98 * @regmap: The IP block's regmap instance
100 * Return: 1 if the descriptor's bitfield is configured to the state
101 * selected by @enabled, 0 if not, and less than zero if an unrecoverable
104 * Evaluation of descriptor state is non-trivial in that it is not a binary
105 * outcome: The bitfields can be greater than one bit in size and thus can take
106 * a value that is neither the enabled nor disabled state recorded in the
107 * descriptor (typically this means a different function to the one of interest
108 * is enabled). Thus we must explicitly test for either condition as required.
110 static int aspeed_sig_desc_eval(const struct aspeed_sig_desc
*desc
,
111 bool enabled
, struct regmap
*map
)
120 ret
= regmap_read(map
, desc
->reg
, &raw
);
124 aspeed_sig_desc_print_val(desc
, enabled
, raw
);
125 want
= enabled
? desc
->enable
: desc
->disable
;
127 return ((raw
& desc
->mask
) >> __ffs(desc
->mask
)) == want
;
131 * Query the enabled or disabled state for a mux function's signal on a pin
133 * @expr: An expression controlling the signal for a mux function on a pin
134 * @enabled: True to query the enabled state, false to query disabled state
135 * @maps: The list of regmap instances
137 * Return: 1 if the expression composed by @enabled evaluates true, 0 if not,
138 * and less than zero if an unrecoverable failure occurred.
140 * A mux function is enabled or disabled if the function's signal expression
141 * for each pin in the function's pin group evaluates true for the desired
142 * state. An signal expression evaluates true if all of its associated signal
143 * descriptors evaluate true for the desired state.
145 * If an expression's state is described by more than one bit, either through
146 * multi-bit bitfields in a single signal descriptor or through multiple signal
147 * descriptors of a single bit then it is possible for the expression to be in
148 * neither the enabled nor disabled state. Thus we must explicitly test for
149 * either condition as required.
151 static int aspeed_sig_expr_eval(const struct aspeed_sig_expr
*expr
,
152 bool enabled
, struct regmap
* const *maps
)
157 for (i
= 0; i
< expr
->ndescs
; i
++) {
158 const struct aspeed_sig_desc
*desc
= &expr
->descs
[i
];
160 ret
= aspeed_sig_desc_eval(desc
, enabled
, maps
[desc
->ip
]);
169 * Configure a pin's signal by applying an expression's descriptor state for
170 * all descriptors in the expression.
172 * @expr: The expression associated with the function whose signal is to be
174 * @enable: true to enable an function's signal through a pin's signal
175 * expression, false to disable the function's signal
176 * @maps: The list of regmap instances for pinmux register access.
178 * Return: 0 if the expression is configured as requested and a negative error
181 static int aspeed_sig_expr_set(const struct aspeed_sig_expr
*expr
,
182 bool enable
, struct regmap
* const *maps
)
187 for (i
= 0; i
< expr
->ndescs
; i
++) {
188 const struct aspeed_sig_desc
*desc
= &expr
->descs
[i
];
189 u32 pattern
= enable
? desc
->enable
: desc
->disable
;
190 u32 val
= (pattern
<< __ffs(desc
->mask
));
196 * Strap registers are configured in hardware or by early-boot
197 * firmware. Treat them as read-only despite that we can write
198 * them. This may mean that certain functions cannot be
199 * deconfigured and is the reason we re-evaluate after writing
200 * all descriptor bits.
202 * Port D and port E GPIO loopback modes are the only exception
203 * as those are commonly used with front-panel buttons to allow
204 * normal operation of the host when the BMC is powered off or
205 * fails to boot. Once the BMC has booted, the loopback mode
206 * must be disabled for the BMC to control host power-on and
209 if (desc
->ip
== ASPEED_IP_SCU
&& desc
->reg
== HW_STRAP1
&&
210 !(desc
->mask
& (BIT(21) | BIT(22))))
213 if (desc
->ip
== ASPEED_IP_SCU
&& desc
->reg
== HW_STRAP2
)
216 /* On AST2500, Set bits in SCU7C are cleared from SCU70 */
217 if (desc
->ip
== ASPEED_IP_SCU
&& desc
->reg
== HW_STRAP1
) {
220 ret
= regmap_read(maps
[ASPEED_IP_SCU
],
221 HW_REVISION_ID
, &rev_id
);
225 if (0x04 == (rev_id
>> 24)) {
226 u32 value
= ~val
& desc
->mask
;
229 ret
= regmap_write(maps
[desc
->ip
],
230 HW_REVISION_ID
, value
);
237 ret
= regmap_update_bits(maps
[desc
->ip
], desc
->reg
,
244 ret
= aspeed_sig_expr_eval(expr
, enable
, maps
);
254 static int aspeed_sig_expr_enable(const struct aspeed_sig_expr
*expr
,
255 struct regmap
* const *maps
)
259 ret
= aspeed_sig_expr_eval(expr
, true, maps
);
264 return aspeed_sig_expr_set(expr
, true, maps
);
269 static int aspeed_sig_expr_disable(const struct aspeed_sig_expr
*expr
,
270 struct regmap
* const *maps
)
274 ret
= aspeed_sig_expr_eval(expr
, true, maps
);
279 return aspeed_sig_expr_set(expr
, false, maps
);
285 * Disable a signal on a pin by disabling all provided signal expressions.
287 * @exprs: The list of signal expressions (from a priority level on a pin)
288 * @maps: The list of regmap instances for pinmux register access.
290 * Return: 0 if all expressions are disabled, otherwise a negative error code
292 static int aspeed_disable_sig(const struct aspeed_sig_expr
**exprs
,
293 struct regmap
* const *maps
)
300 while (*exprs
&& !ret
) {
301 ret
= aspeed_sig_expr_disable(*exprs
, maps
);
309 * Search for the signal expression needed to enable the pin's signal for the
310 * requested function.
312 * @exprs: List of signal expressions (haystack)
313 * @name: The name of the requested function (needle)
315 * Return: A pointer to the signal expression whose function tag matches the
316 * provided name, otherwise NULL.
319 static const struct aspeed_sig_expr
*aspeed_find_expr_by_name(
320 const struct aspeed_sig_expr
**exprs
, const char *name
)
323 if (strcmp((*exprs
)->function
, name
) == 0)
331 static char *get_defined_attribute(const struct aspeed_pin_desc
*pdesc
,
333 const struct aspeed_sig_expr
*))
337 const struct aspeed_sig_expr
***prios
, **funcs
, *expr
;
339 prios
= pdesc
->prios
;
341 while ((funcs
= *prios
)) {
342 while ((expr
= *funcs
)) {
343 const char *str
= get(expr
);
344 size_t delta
= strlen(str
) + 2;
347 expanded
= krealloc(found
, len
+ delta
+ 1, GFP_KERNEL
);
370 found
[len
- 2] = '\0';
375 static const char *aspeed_sig_expr_function(const struct aspeed_sig_expr
*expr
)
377 return expr
->function
;
380 static char *get_defined_functions(const struct aspeed_pin_desc
*pdesc
)
382 return get_defined_attribute(pdesc
, aspeed_sig_expr_function
);
385 static const char *aspeed_sig_expr_signal(const struct aspeed_sig_expr
*expr
)
390 static char *get_defined_signals(const struct aspeed_pin_desc
*pdesc
)
392 return get_defined_attribute(pdesc
, aspeed_sig_expr_signal
);
395 int aspeed_pinmux_set_mux(struct pinctrl_dev
*pctldev
, unsigned int function
,
400 const struct aspeed_pinctrl_data
*pdata
=
401 pinctrl_dev_get_drvdata(pctldev
);
402 const struct aspeed_pin_group
*pgroup
= &pdata
->groups
[group
];
403 const struct aspeed_pin_function
*pfunc
=
404 &pdata
->functions
[function
];
406 for (i
= 0; i
< pgroup
->npins
; i
++) {
407 int pin
= pgroup
->pins
[i
];
408 const struct aspeed_pin_desc
*pdesc
= pdata
->pins
[pin
].drv_data
;
409 const struct aspeed_sig_expr
*expr
= NULL
;
410 const struct aspeed_sig_expr
**funcs
;
411 const struct aspeed_sig_expr
***prios
;
413 pr_debug("Muxing pin %d for %s\n", pin
, pfunc
->name
);
418 prios
= pdesc
->prios
;
423 /* Disable functions at a higher priority than that requested */
424 while ((funcs
= *prios
)) {
425 expr
= aspeed_find_expr_by_name(funcs
, pfunc
->name
);
430 ret
= aspeed_disable_sig(funcs
, pdata
->maps
);
438 char *functions
= get_defined_functions(pdesc
);
439 char *signals
= get_defined_signals(pdesc
);
441 pr_warn("No function %s found on pin %s (%d). Found signal(s) %s for function(s) %s\n",
442 pfunc
->name
, pdesc
->name
, pin
, signals
,
450 ret
= aspeed_sig_expr_enable(expr
, pdata
->maps
);
458 static bool aspeed_expr_is_gpio(const struct aspeed_sig_expr
*expr
)
461 * The signal type is GPIO if the signal name has "GPIO" as a prefix.
462 * strncmp (rather than strcmp) is used to implement the prefix
465 * expr->signal might look like "GPIOT3" in the GPIO case.
467 return strncmp(expr
->signal
, "GPIO", 4) == 0;
470 static bool aspeed_gpio_in_exprs(const struct aspeed_sig_expr
**exprs
)
476 if (aspeed_expr_is_gpio(*exprs
))
484 int aspeed_gpio_request_enable(struct pinctrl_dev
*pctldev
,
485 struct pinctrl_gpio_range
*range
,
489 const struct aspeed_pinctrl_data
*pdata
=
490 pinctrl_dev_get_drvdata(pctldev
);
491 const struct aspeed_pin_desc
*pdesc
= pdata
->pins
[offset
].drv_data
;
492 const struct aspeed_sig_expr
***prios
, **funcs
, *expr
;
497 prios
= pdesc
->prios
;
502 /* Disable any functions of higher priority than GPIO */
503 while ((funcs
= *prios
)) {
504 if (aspeed_gpio_in_exprs(funcs
))
507 ret
= aspeed_disable_sig(funcs
, pdata
->maps
);
515 char *signals
= get_defined_signals(pdesc
);
517 pr_warn("No GPIO signal type found on pin %s (%d). Found: %s\n",
518 pdesc
->name
, offset
, signals
);
527 * Disabling all higher-priority expressions is enough to enable the
528 * lowest-priority signal type. As such it has no associated
535 * If GPIO is not the lowest priority signal type, assume there is only
536 * one expression defined to enable the GPIO function
538 return aspeed_sig_expr_enable(expr
, pdata
->maps
);
541 int aspeed_pinctrl_probe(struct platform_device
*pdev
,
542 struct pinctrl_desc
*pdesc
,
543 struct aspeed_pinctrl_data
*pdata
)
545 struct device
*parent
;
546 struct pinctrl_dev
*pctl
;
548 parent
= pdev
->dev
.parent
;
550 dev_err(&pdev
->dev
, "No parent for syscon pincontroller\n");
554 pdata
->maps
[ASPEED_IP_SCU
] = syscon_node_to_regmap(parent
->of_node
);
555 if (IS_ERR(pdata
->maps
[ASPEED_IP_SCU
])) {
556 dev_err(&pdev
->dev
, "No regmap for syscon pincontroller parent\n");
557 return PTR_ERR(pdata
->maps
[ASPEED_IP_SCU
]);
560 pctl
= pinctrl_register(pdesc
, &pdev
->dev
, pdata
);
563 dev_err(&pdev
->dev
, "Failed to register pinctrl\n");
564 return PTR_ERR(pctl
);
567 platform_set_drvdata(pdev
, pdata
);
572 static inline bool pin_in_config_range(unsigned int offset
,
573 const struct aspeed_pin_config
*config
)
575 return offset
>= config
->pins
[0] && offset
<= config
->pins
[1];
578 static inline const struct aspeed_pin_config
*find_pinconf_config(
579 const struct aspeed_pinctrl_data
*pdata
,
581 enum pin_config_param param
)
585 for (i
= 0; i
< pdata
->nconfigs
; i
++) {
586 if (param
== pdata
->configs
[i
].param
&&
587 pin_in_config_range(offset
, &pdata
->configs
[i
]))
588 return &pdata
->configs
[i
];
595 * @param: pinconf configuration parameter
596 * @arg: The supported argument for @param, or -1 if any value is supported
597 * @value: The register value to write to configure @arg for @param
599 * The map is to be used in conjunction with the configuration array supplied
600 * by the driver implementation.
602 struct aspeed_pin_config_map
{
603 enum pin_config_param param
;
608 enum aspeed_pin_config_map_type
{ MAP_TYPE_ARG
, MAP_TYPE_VAL
};
610 /* Aspeed consistently both:
612 * 1. Defines "disable bits" for internal pull-downs
613 * 2. Uses 8mA or 16mA drive strengths
615 static const struct aspeed_pin_config_map pin_config_map
[] = {
616 { PIN_CONFIG_BIAS_PULL_DOWN
, 0, 1 },
617 { PIN_CONFIG_BIAS_PULL_DOWN
, -1, 0 },
618 { PIN_CONFIG_BIAS_DISABLE
, -1, 1 },
619 { PIN_CONFIG_DRIVE_STRENGTH
, 8, 0 },
620 { PIN_CONFIG_DRIVE_STRENGTH
, 16, 1 },
623 static const struct aspeed_pin_config_map
*find_pinconf_map(
624 enum pin_config_param param
,
625 enum aspeed_pin_config_map_type type
,
630 for (i
= 0; i
< ARRAY_SIZE(pin_config_map
); i
++) {
631 const struct aspeed_pin_config_map
*elem
;
634 elem
= &pin_config_map
[i
];
638 match
= (elem
->arg
== -1 || elem
->arg
== value
);
641 match
= (elem
->val
== value
);
645 if (param
== elem
->param
&& match
)
652 int aspeed_pin_config_get(struct pinctrl_dev
*pctldev
, unsigned int offset
,
653 unsigned long *config
)
655 const enum pin_config_param param
= pinconf_to_config_param(*config
);
656 const struct aspeed_pin_config_map
*pmap
;
657 const struct aspeed_pinctrl_data
*pdata
;
658 const struct aspeed_pin_config
*pconf
;
663 pdata
= pinctrl_dev_get_drvdata(pctldev
);
664 pconf
= find_pinconf_config(pdata
, offset
, param
);
668 rc
= regmap_read(pdata
->maps
[ASPEED_IP_SCU
], pconf
->reg
, &val
);
672 pmap
= find_pinconf_map(param
, MAP_TYPE_VAL
,
673 (val
& BIT(pconf
->bit
)) >> pconf
->bit
);
678 if (param
== PIN_CONFIG_DRIVE_STRENGTH
)
679 arg
= (u32
) pmap
->arg
;
680 else if (param
== PIN_CONFIG_BIAS_PULL_DOWN
)
688 *config
= pinconf_to_config_packed(param
, arg
);
693 int aspeed_pin_config_set(struct pinctrl_dev
*pctldev
, unsigned int offset
,
694 unsigned long *configs
, unsigned int num_configs
)
696 const struct aspeed_pinctrl_data
*pdata
;
700 pdata
= pinctrl_dev_get_drvdata(pctldev
);
702 for (i
= 0; i
< num_configs
; i
++) {
703 const struct aspeed_pin_config_map
*pmap
;
704 const struct aspeed_pin_config
*pconf
;
705 enum pin_config_param param
;
709 param
= pinconf_to_config_param(configs
[i
]);
710 arg
= pinconf_to_config_argument(configs
[i
]);
712 pconf
= find_pinconf_config(pdata
, offset
, param
);
716 pmap
= find_pinconf_map(param
, MAP_TYPE_ARG
, arg
);
718 if (unlikely(WARN_ON(!pmap
)))
721 val
= pmap
->val
<< pconf
->bit
;
723 rc
= regmap_update_bits(pdata
->maps
[ASPEED_IP_SCU
], pconf
->reg
,
724 BIT(pconf
->bit
), val
);
729 pr_debug("%s: Set SCU%02X[%d]=%d for param %d(=%d) on pin %d\n",
730 __func__
, pconf
->reg
, pconf
->bit
, pmap
->val
,
737 int aspeed_pin_config_group_get(struct pinctrl_dev
*pctldev
,
738 unsigned int selector
,
739 unsigned long *config
)
741 const unsigned int *pins
;
745 rc
= aspeed_pinctrl_get_group_pins(pctldev
, selector
, &pins
, &npins
);
752 rc
= aspeed_pin_config_get(pctldev
, pins
[0], config
);
757 int aspeed_pin_config_group_set(struct pinctrl_dev
*pctldev
,
758 unsigned int selector
,
759 unsigned long *configs
,
760 unsigned int num_configs
)
762 const unsigned int *pins
;
767 pr_debug("%s: Fetching pins for group selector %d\n",
769 rc
= aspeed_pinctrl_get_group_pins(pctldev
, selector
, &pins
, &npins
);
773 for (i
= 0; i
< npins
; i
++) {
774 rc
= aspeed_pin_config_set(pctldev
, pins
[i
], configs
,