Re: [PATCH] pinctrl: pinctrl-generic-mux: Fix provider resource leak on re-parse
From: Frank Li
Date: Thu Sep 17 2026 - 17:30:15 EST
On Wed, Sep 16, 2026 at 12:04:35PM +0900, Chancel Liu wrote:
> From: Chancel Liu <chancel.liu@xxxxxxx>
>
...
>
> +static int mux_pinctrl_probe_dt(struct pinctrl_dev *pctldev,
> + struct device_node *np)
> +{
> + struct device *dev = pctldev->dev;
> +
> + for_each_available_child_of_node_scoped(np, grp) {
> + struct mux_pin_function *function;
> + const char **group_names;
> + int ret;
> +
> + function = devm_kzalloc(dev, sizeof(*function), GFP_KERNEL);
> + if (!function)
> + return -ENOMEM;
> +
> + group_names = devm_kcalloc(dev, 1, sizeof(*group_names), GFP_KERNEL);
> + if (!group_names)
> + return -ENOMEM;
> +
> + group_names[0] = grp->name;
> +
> + function->mux_state = devm_mux_state_get_from_np(dev, NULL, grp);
> + if (IS_ERR(function->mux_state))
> + return dev_err_probe(dev, PTR_ERR(function->mux_state),
> + "failed to get mux-state for %pOFn\n",
> + grp);
> +
> + ret = pinctrl_generic_add_group(pctldev, grp->name, NULL, 0, NULL);
> + if (ret < 0)
> + return dev_err_probe(dev, ret,
> + "failed to add group %pOFn\n", grp);
> +
> + ret = pinmux_generic_add_function(pctldev, grp->name, group_names,
> + 1, function);
> + if (ret < 0)
> + return dev_err_probe(dev, ret,
> + "failed to add function %pOFn\n", grp);
> + }
> +
> + return 0;
> +}
This method also works, slice difference, if some pin have not used by
consumer, old method may save some memory.
leave to linus to decide which is better way, this one or add free() at
.dt_free_map()
Frank
> +
> static const struct pinctrl_ops mux_pinctrl_ops = {
> .get_groups_count = pinctrl_generic_get_group_count,
> .get_group_name = pinctrl_generic_get_group_name,
> @@ -157,6 +189,10 @@ static int mux_pinctrl_probe(struct platform_device *pdev)
> if (ret)
> return dev_err_probe(dev, ret, "Failed to register pinctrl.\n");
>
> + ret = mux_pinctrl_probe_dt(mpctl->pctl, dev->of_node);
> + if (ret)
> + return ret;
> +
> ret = pinctrl_enable(mpctl->pctl);
> if (ret)
> return dev_err_probe(dev, ret, "Failed to enable pinctrl.\n");
> --
> 2.50.1
>