[PATCH v2 2/3] pinctrl: scmi: Replace pinctrl ops get group info with generics
HOTtoday
From: Alex Tran <hidden>
Date: 2026-09-17 22:56:52
Also in:
arm-scmi, linux-gpio, lkml
Subsystem:
pin control subsystem, system control & power/management interface (scpi/scmi) message protocol drivers, the rest · Maintainers:
Linus Walleij, Sudeep Holla, Linus Torvalds
During probe, populate the pinctrl device with group info so that the generic callbacks can be used to fetch group count, name, and pins. Signed-off-by: Alex Tran <redacted> --- drivers/pinctrl/pinctrl-scmi.c | 81 +++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 36 deletions(-)
diff --git a/drivers/pinctrl/pinctrl-scmi.c b/drivers/pinctrl/pinctrl-scmi.c
index 1d85a16f300d..c93d61dfa282 100644
--- a/drivers/pinctrl/pinctrl-scmi.c
+++ b/drivers/pinctrl/pinctrl-scmi.c@@ -40,43 +40,10 @@ struct scmi_pinctrl { struct pinctrl_desc pctl_desc; }; -static int pinctrl_scmi_get_groups_count(struct pinctrl_dev *pctldev) -{ - struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev); - - return pinctrl_ops->count_get(pmx->ph, GROUP_TYPE); -} - -static const char *pinctrl_scmi_get_group_name(struct pinctrl_dev *pctldev, - unsigned int selector) -{ - int ret; - const char *name; - struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev); - - ret = pinctrl_ops->name_get(pmx->ph, selector, GROUP_TYPE, &name); - if (ret) { - dev_err(pmx->dev, "get name failed with err %d", ret); - return NULL; - } - - return name; -} - -static int pinctrl_scmi_get_group_pins(struct pinctrl_dev *pctldev, - unsigned int selector, - const unsigned int **pins, - unsigned int *num_pins) -{ - struct scmi_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev); - - return pinctrl_ops->group_pins_get(pmx->ph, selector, pins, num_pins); -} - static const struct pinctrl_ops pinctrl_scmi_pinctrl_ops = { - .get_groups_count = pinctrl_scmi_get_groups_count, - .get_group_name = pinctrl_scmi_get_group_name, - .get_group_pins = pinctrl_scmi_get_group_pins, + .get_groups_count = pinctrl_generic_get_group_count, + .get_group_name = pinctrl_generic_get_group_name, + .get_group_pins = pinctrl_generic_get_group_pins, #ifdef CONFIG_OF .dt_node_to_map = pinconf_generic_dt_node_to_map_all, .dt_free_map = pinconf_generic_dt_free_map,
@@ -460,6 +427,44 @@ static int pinctrl_scmi_get_functions(struct scmi_pinctrl *pmx) return 0; } +static int pinctrl_scmi_get_groups(struct scmi_pinctrl *pmx) +{ + unsigned int nr_groups, nr_pins, i; + const unsigned int *pins; + const char *gname; + int ret; + + nr_groups = pinctrl_ops->count_get(pmx->ph, GROUP_TYPE); + + for (i = 0; i < nr_groups; i++) { + ret = pinctrl_ops->name_get(pmx->ph, i, GROUP_TYPE, &gname); + if (ret) + return ret; + + ret = pinctrl_ops->group_pins_get(pmx->ph, i, &pins, + &nr_pins); + if (ret) + return ret; + + if (!nr_pins) + dev_warn(pmx->dev, + "Group %s contains no pins\n", gname); + + ret = pinctrl_generic_add_group(pmx->pctldev, gname, pins, + nr_pins, NULL); + if (ret < 0) + return ret; + if (ret != i) { + dev_err(pmx->dev, + "Duplicate group name: %s index: %u selector: %d\n", + gname, i, ret); + return -EINVAL; + } + } + + return 0; +} + static int pinctrl_scmi_get_pins(struct scmi_pinctrl *pmx, struct pinctrl_desc *desc) {
@@ -544,6 +549,10 @@ static int scmi_pinctrl_probe(struct scmi_device *sdev) if (ret) return dev_err_probe(dev, ret, "Failed to register pinctrl\n"); + ret = pinctrl_scmi_get_groups(pmx); + if (ret) + return dev_err_probe(dev, ret, "Failed to register groups\n"); + ret = pinctrl_scmi_get_functions(pmx); if (ret) return dev_err_probe(dev, ret, "Failed to register functions\n");
--
2.43.0