[PATCH 3/5] pinctrl: add generic board-level pinctrl driver using mux framework
Frank Li
Frank.li at nxp.com
Fri Feb 20 07:54:26 PST 2026
On Fri, Feb 20, 2026 at 10:50:41AM +0200, Daniel Baluta wrote:
> Hi Frank,
>
> Few comments inline:
>
>
> > --- /dev/null
> > +++ b/drivers/pinctrl/pinctrl-generic-mux.c
> > @@ -0,0 +1,222 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +/*
> > + * Generic Pin Control Driver for Board-Level Mux Chips
> > + * Copyright (C) 2026
> >
> Copyright 2026 NXP
>
> <snip>
>
> > +struct mux_pin_function {
> > + struct mux_state *mux_state;
> > +};
> > +
> > +struct mux_pinctrl {
> > + struct device *dev;
> > + struct pinctrl_dev *pctl;
> > +
> > + /* mutex protecting the lists */
>
> what lists?
>
>
> > +static int
> > +mux_pinmux_dt_node_to_map(struct pinctrl_dev *pctldev,
> > + struct device_node *np_config,
> > + struct pinctrl_map **map, unsigned int *num_maps)
> > +{
> > + struct mux_pinctrl *mpctl = pinctrl_dev_get_drvdata(pctldev);
> > + struct mux_pin_function *function;
> > + struct device *dev = mpctl->dev;
> > + const char **pgnames;
> > + int selector;
> > + int group;
> > + int ret;
> > +
> > + *map = devm_kcalloc(dev, 1, sizeof(**map), GFP_KERNEL);
> > + if (!map)
> > + return -ENOMEM;
> >
> if (!*map) ?
>
> > +
> > + *num_maps = 0;
> > +
> > + function = devm_kzalloc(dev, sizeof(*function), GFP_KERNEL);
> > + if (!function) {
> > + ret = -ENOMEM;
> > + goto err_func;
> Do you really need this goto? Previously allocated memory is dev managed .
Yes, dt_node_to_map() may re-entry because some defer. we don't want to
defer free previous allocated memory to module remove and generally
pinctrl driver is never removed.
why use devm_ version is because pinctrl framework assume you use devm_ to
allocate map.
Frank
> > + }
> > +
> > + pgnames = devm_kzalloc(dev, sizeof(*pgnames), GFP_KERNEL);
> > + if (!pgnames) {
> > + ret = -ENOMEM;
> > + goto err_pgnames;
> >
> Same here.
>
> <snip>
>
> > +err_mux_state_get:
> > + pinctrl_generic_remove_group(mpctl->pctl, group);
> > +err_add_group:
> > + pinmux_generic_remove_function(mpctl->pctl, selector);
> > +err_add_func:
> > + devm_kfree(dev, pgnames);
> > +err_pgnames:
> > + devm_kfree(dev, function);
> > +err_func:
> > + devm_kfree(dev, *map);
> > +
> > + return ret;
> > +}
>
>
>
>
More information about the linux-arm-kernel
mailing list