* [PATCH] pinctrl: sunxi: dt: do not accumulate npins across probe attempts
@ 2026-10-06 21:03 Pablo Mazzini
2026-10-06 23:23 ` Andre Przywara
0 siblings, 1 reply; 3+ messages in thread
From: Pablo Mazzini @ 2026-10-06 21:03 UTC (permalink / raw)
To: Linus Walleij
Cc: Chen-Yu Tsai, Jernej Skrabec, Samuel Holland, Andre Przywara,
linux-gpio, linux-arm-kernel, linux-sunxi, linux-kernel,
Pablo Mazzini
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.
Signed-off-by: Pablo Mazzini <pmazzini@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);
--
2.52.0
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] pinctrl: sunxi: dt: do not accumulate npins across probe attempts
2026-10-06 21:03 [PATCH] pinctrl: sunxi: dt: do not accumulate npins across probe attempts Pablo Mazzini
@ 2026-10-06 23:23 ` Andre Przywara
2026-10-07 5:58 ` Pablo Mazzini
0 siblings, 1 reply; 3+ messages in thread
From: Andre Przywara @ 2026-10-06 23:23 UTC (permalink / raw)
To: Pablo Mazzini
Cc: Linus Walleij, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland,
linux-gpio, linux-arm-kernel, linux-sunxi, linux-kernel
On Tue, 6 Oct 2026 22:03:13 +0100
Pablo Mazzini <pmazzini@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@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);
>
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] pinctrl: sunxi: dt: do not accumulate npins across probe attempts
2026-10-06 23:23 ` Andre Przywara
@ 2026-10-07 5:58 ` Pablo Mazzini
0 siblings, 0 replies; 3+ messages in thread
From: Pablo Mazzini @ 2026-10-07 5:58 UTC (permalink / raw)
To: Andre Przywara
Cc: Linus Walleij, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland,
linux-gpio, linux-arm-kernel, linux-sunxi, linux-kernel
Yes, that's simpler, thanks. Will do that in v2.
On Wed, Oct 7, 2026 at 12:23 AM Andre Przywara <andre.przywara@arm.com> wrote:
>
> On Tue, 6 Oct 2026 22:03:13 +0100
> Pablo Mazzini <pmazzini@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@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);
> >
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-10-07 5:58 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-06 21:03 [PATCH] pinctrl: sunxi: dt: do not accumulate npins across probe attempts Pablo Mazzini
2026-10-06 23:23 ` Andre Przywara
2026-10-07 5:58 ` Pablo Mazzini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®