[PATCH v2 03/22] pinctrl: pinctrl-generic: Make the "function" property optional
Changhuang Liang
changhuang.liang at starfivetech.com
Thu May 14 04:11:59 PDT 2026
Some pinctrl subnodes only need to configure pin properties (e.g.,
power-source, bias, drive strength) without assigning any mux function.
Currently, the driver requires a valid "function" property for all
pinctrl subnodes. This forces the addition of dummy or redundant
"function" entries when only pin configuration is needed.
Example use case:
gpios-configs {
config {
pins = <0 1 2 3>;
power-source = <0>;
};
};
Make the "function" property optional. If it is missing, skip adding
the mux map and only process the pin configuration.
Signed-off-by: Changhuang Liang <changhuang.liang at starfivetech.com>
---
drivers/pinctrl/pinctrl-generic.c | 37 ++++++++++++++++++++++---------
1 file changed, 27 insertions(+), 10 deletions(-)
diff --git a/drivers/pinctrl/pinctrl-generic.c b/drivers/pinctrl/pinctrl-generic.c
index efb39c6a6703..c7dd0924aa0e 100644
--- a/drivers/pinctrl/pinctrl-generic.c
+++ b/drivers/pinctrl/pinctrl-generic.c
@@ -62,19 +62,36 @@ static int pinctrl_generic_pins_function_dt_subnode_to_map(struct pinctrl_dev *p
pins[i] = pin;
- ret = of_property_read_string(np, "function", &functions[i]);
- if (ret)
- return ret;
+ if (functions) {
+ ret = of_property_read_string(np, "function", &functions[i]);
+ if (ret < 0) {
+ /* EINVAL = missing, which is fine since it's optional */
+ if (ret != -EINVAL) {
+ dev_err(dev, "%pOF: could not parse property function\n",
+ np);
+ return ret;
+ }
+
+ devm_kfree(dev, functions);
+ functions = NULL;
+
+ /* Continue parsing all pins */
+ continue;
+ }
+ }
}
- ret = pinctrl_utils_reserve_map(pctldev, maps, num_reserved_maps, num_maps, reserve);
- if (ret)
- return ret;
+ if (functions) {
+ ret = pinctrl_utils_reserve_map(pctldev, maps, num_reserved_maps,
+ num_maps, reserve);
+ if (ret)
+ return ret;
- ret = pinctrl_utils_add_map_mux(pctldev, maps, num_reserved_maps, num_maps, group_name,
- parent->name);
- if (ret < 0)
- return ret;
+ ret = pinctrl_utils_add_map_mux(pctldev, maps, num_reserved_maps,
+ num_maps, group_name, parent->name);
+ if (ret < 0)
+ return ret;
+ }
ret = pinctrl_generic_add_group(pctldev, group_name, pins, npins, functions);
if (ret < 0)
--
2.25.1
More information about the linux-riscv
mailing list