[PATCH] pinctrl: sunxi: dt: do not accumulate npins across probe attempts

Pablo Mazzini pmazzini at gmail.com
Tue Oct 6 22:58:40 PDT 2026


Yes, that's simpler, thanks. Will do that in v2.

On Wed, Oct 7, 2026 at 12:23 AM Andre Przywara <andre.przywara at arm.com> wrote:
>
> On Tue,  6 Oct 2026 22:03:13 +0100
> Pablo Mazzini <pmazzini at gmail.com> wrote:
>
> Hi Pablo,
>
> > init_pins_table() adds to npins in the driver's static descriptor, so
> > after a probe deferral the count doubles and the next probe fails with
> > "pin 0 already registered". Count into a local instead.
>
> Can't we just initialise desc->npins to 0, at the beginning of
> init_pins_table? I think Sashiko suggested that even...
>
> Cheers,
> Andre
>
> >
> > Signed-off-by: Pablo Mazzini <pmazzini at gmail.com>
> > ---
> >  drivers/pinctrl/sunxi/pinctrl-sunxi-dt.c | 10 ++++++----
> >  1 file changed, 6 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi-dt.c b/drivers/pinctrl/sunxi/pinctrl-sunxi-dt.c
> > index 50a16f3bd131..1c1888394cf1 100644
> > --- a/drivers/pinctrl/sunxi/pinctrl-sunxi-dt.c
> > +++ b/drivers/pinctrl/sunxi/pinctrl-sunxi-dt.c
> > @@ -75,7 +75,7 @@ static struct sunxi_desc_pin *init_pins_table(struct device *dev,
> >                                             struct sunxi_pinctrl_desc *desc)
> >  {
> >       struct sunxi_desc_pin *pins, *cur_pin;
> > -     int name_size = 0;
> > +     int name_size = 0, npins = 0;
> >       int port_base = desc->pin_base / PINS_PER_BANK;
> >       char *pin_names, *cur_name;
> >       int i, j;
> > @@ -85,7 +85,7 @@ static struct sunxi_desc_pin *init_pins_table(struct device *dev,
> >        * Also work out how much memory we need to store all the pin names.
> >        */
> >       for (i = 0; i < SUNXI_PINCTRL_MAX_BANKS; i++) {
> > -             desc->npins += pins_per_bank[i];
> > +             npins += pins_per_bank[i];
> >               if (pins_per_bank[i] < 10) {
> >                       /* 4 bytes for "PXy\0" */
> >                       name_size += pins_per_bank[i] * 4;
> > @@ -98,12 +98,14 @@ static struct sunxi_desc_pin *init_pins_table(struct device *dev,
> >               }
> >       }
> >
> > -     if (desc->npins == 0) {
> > +     if (npins == 0) {
> >               dev_err(dev, "no ports defined\n");
> >               return ERR_PTR(-EINVAL);
> >       }
> >
> > -     pins = devm_kcalloc(dev, desc->npins, sizeof(*pins), GFP_KERNEL);
> > +     desc->npins = npins;
> > +
> > +     pins = devm_kcalloc(dev, npins, sizeof(*pins), GFP_KERNEL);
> >       if (!pins)
> >               return ERR_PTR(-ENOMEM);
> >
>



More information about the linux-arm-kernel mailing list