linux-acpi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] gpiolib: Extend software-node support to support secondary software-nodes
@ 2025-09-20 20:09 Hans de Goede
  2025-09-20 21:27 ` Dmitry Torokhov
  2025-09-22 14:24 ` Bartosz Golaszewski
  0 siblings, 2 replies; 5+ messages in thread
From: Hans de Goede @ 2025-09-20 20:09 UTC (permalink / raw)
  To: Mika Westerberg, Andy Shevchenko, Bartosz Golaszewski,
	Linus Walleij
  Cc: Hans de Goede, Dmitry Torokhov, linux-gpio, linux-acpi, stable

When a software-node gets added to a device which already has another
fwnode as primary node it will become the secondary fwnode for that
device.

Currently if a software-node with GPIO properties ends up as the secondary
fwnode then gpiod_find_by_fwnode() will fail to find the GPIOs.

Add a new gpiod_fwnode_lookup() helper which falls back to calling
gpiod_find_by_fwnode() with the secondary fwnode if the GPIO was not
found in the primary fwnode.

Fixes: e7f9ff5dc90c ("gpiolib: add support for software nodes")
Cc: stable@vger.kernel.org
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Hans de Goede <hansg@kernel.org>
---
Changes in v2:
- Add a new gpiod_fwnode_lookup() helper instead of putting the secondary
  fwnode check inside gpiod_find_by_fwnode()
---
 drivers/gpio/gpiolib.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 0d2b470a252e..74d54513730a 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -4604,6 +4604,23 @@ static struct gpio_desc *gpiod_find_by_fwnode(struct fwnode_handle *fwnode,
 	return desc;
 }
 
+static struct gpio_desc *gpiod_fwnode_lookup(struct fwnode_handle *fwnode,
+					     struct device *consumer,
+					     const char *con_id,
+					     unsigned int idx,
+					     enum gpiod_flags *flags,
+					     unsigned long *lookupflags)
+{
+	struct gpio_desc *desc;
+
+	desc = gpiod_find_by_fwnode(fwnode, consumer, con_id, idx, flags, lookupflags);
+	if (gpiod_not_found(desc) && !IS_ERR_OR_NULL(fwnode))
+		desc = gpiod_find_by_fwnode(fwnode->secondary, consumer, con_id,
+					    idx, flags, lookupflags);
+
+	return desc;
+}
+
 struct gpio_desc *gpiod_find_and_request(struct device *consumer,
 					 struct fwnode_handle *fwnode,
 					 const char *con_id,
@@ -4622,8 +4639,8 @@ struct gpio_desc *gpiod_find_and_request(struct device *consumer,
 	int ret = 0;
 
 	scoped_guard(srcu, &gpio_devices_srcu) {
-		desc = gpiod_find_by_fwnode(fwnode, consumer, con_id, idx,
-					    &flags, &lookupflags);
+		desc = gpiod_fwnode_lookup(fwnode, consumer, con_id, idx,
+					   &flags, &lookupflags);
 		if (gpiod_not_found(desc) && platform_lookup_allowed) {
 			/*
 			 * Either we are not using DT or ACPI, or their lookup
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2] gpiolib: Extend software-node support to support secondary software-nodes
  2025-09-20 20:09 [PATCH v2] gpiolib: Extend software-node support to support secondary software-nodes Hans de Goede
@ 2025-09-20 21:27 ` Dmitry Torokhov
  2025-09-21 13:00   ` Hans de Goede
  2025-09-22 14:24 ` Bartosz Golaszewski
  1 sibling, 1 reply; 5+ messages in thread
From: Dmitry Torokhov @ 2025-09-20 21:27 UTC (permalink / raw)
  To: Hans de Goede
  Cc: Mika Westerberg, Andy Shevchenko, Bartosz Golaszewski,
	Linus Walleij, linux-gpio, linux-acpi, stable

On Sat, Sep 20, 2025 at 10:09:55PM +0200, Hans de Goede wrote:
> When a software-node gets added to a device which already has another
> fwnode as primary node it will become the secondary fwnode for that
> device.
> 
> Currently if a software-node with GPIO properties ends up as the secondary
> fwnode then gpiod_find_by_fwnode() will fail to find the GPIOs.
> 
> Add a new gpiod_fwnode_lookup() helper which falls back to calling
> gpiod_find_by_fwnode() with the secondary fwnode if the GPIO was not
> found in the primary fwnode.
> 
> Fixes: e7f9ff5dc90c ("gpiolib: add support for software nodes")
> Cc: stable@vger.kernel.org
> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
> Signed-off-by: Hans de Goede <hansg@kernel.org>

Reviewed-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

> ---
> Changes in v2:
> - Add a new gpiod_fwnode_lookup() helper instead of putting the secondary
>   fwnode check inside gpiod_find_by_fwnode()
> ---
>  drivers/gpio/gpiolib.c | 21 +++++++++++++++++++--
>  1 file changed, 19 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
> index 0d2b470a252e..74d54513730a 100644
> --- a/drivers/gpio/gpiolib.c
> +++ b/drivers/gpio/gpiolib.c
> @@ -4604,6 +4604,23 @@ static struct gpio_desc *gpiod_find_by_fwnode(struct fwnode_handle *fwnode,
>  	return desc;
>  }
>  
> +static struct gpio_desc *gpiod_fwnode_lookup(struct fwnode_handle *fwnode,
> +					     struct device *consumer,
> +					     const char *con_id,
> +					     unsigned int idx,
> +					     enum gpiod_flags *flags,
> +					     unsigned long *lookupflags)
> +{
> +	struct gpio_desc *desc;
> +
> +	desc = gpiod_find_by_fwnode(fwnode, consumer, con_id, idx, flags, lookupflags);
> +	if (gpiod_not_found(desc) && !IS_ERR_OR_NULL(fwnode))
> +		desc = gpiod_find_by_fwnode(fwnode->secondary, consumer, con_id,
> +					    idx, flags, lookupflags);
> +
> +	return desc;

Bikeshedding for later. Maybe do it like this in case we can have more
than 2 nodes at some point?

        do {
		desc = gpiod_find_by_fwnode(fwnode, consumer, con_id, idx, flags, lookupflags);
		if (!gpiod_not_found(desc))
			return desc;

		fwnode = fwnode->secondary;
	} while (!IS_ERR_OR_NULL(fwnode));

	return ERR_PTR(-ENOENT);

> +}
> +
>  struct gpio_desc *gpiod_find_and_request(struct device *consumer,
>  					 struct fwnode_handle *fwnode,
>  					 const char *con_id,
> @@ -4622,8 +4639,8 @@ struct gpio_desc *gpiod_find_and_request(struct device *consumer,
>  	int ret = 0;
>  
>  	scoped_guard(srcu, &gpio_devices_srcu) {
> -		desc = gpiod_find_by_fwnode(fwnode, consumer, con_id, idx,
> -					    &flags, &lookupflags);
> +		desc = gpiod_fwnode_lookup(fwnode, consumer, con_id, idx,
> +					   &flags, &lookupflags);
>  		if (gpiod_not_found(desc) && platform_lookup_allowed) {
>  			/*
>  			 * Either we are not using DT or ACPI, or their lookup

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2] gpiolib: Extend software-node support to support secondary software-nodes
  2025-09-20 21:27 ` Dmitry Torokhov
@ 2025-09-21 13:00   ` Hans de Goede
  2025-09-21 18:45     ` Andy Shevchenko
  0 siblings, 1 reply; 5+ messages in thread
From: Hans de Goede @ 2025-09-21 13:00 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Mika Westerberg, Andy Shevchenko, Bartosz Golaszewski,
	Linus Walleij, linux-gpio, linux-acpi, stable

On 20-Sep-25 11:27 PM, Dmitry Torokhov wrote:
> On Sat, Sep 20, 2025 at 10:09:55PM +0200, Hans de Goede wrote:
>> When a software-node gets added to a device which already has another
>> fwnode as primary node it will become the secondary fwnode for that
>> device.
>>
>> Currently if a software-node with GPIO properties ends up as the secondary
>> fwnode then gpiod_find_by_fwnode() will fail to find the GPIOs.
>>
>> Add a new gpiod_fwnode_lookup() helper which falls back to calling
>> gpiod_find_by_fwnode() with the secondary fwnode if the GPIO was not
>> found in the primary fwnode.
>>
>> Fixes: e7f9ff5dc90c ("gpiolib: add support for software nodes")
>> Cc: stable@vger.kernel.org
>> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
>> Signed-off-by: Hans de Goede <hansg@kernel.org>
> 
> Reviewed-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
> 
>> ---
>> Changes in v2:
>> - Add a new gpiod_fwnode_lookup() helper instead of putting the secondary
>>   fwnode check inside gpiod_find_by_fwnode()
>> ---
>>  drivers/gpio/gpiolib.c | 21 +++++++++++++++++++--
>>  1 file changed, 19 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
>> index 0d2b470a252e..74d54513730a 100644
>> --- a/drivers/gpio/gpiolib.c
>> +++ b/drivers/gpio/gpiolib.c
>> @@ -4604,6 +4604,23 @@ static struct gpio_desc *gpiod_find_by_fwnode(struct fwnode_handle *fwnode,
>>  	return desc;
>>  }
>>  
>> +static struct gpio_desc *gpiod_fwnode_lookup(struct fwnode_handle *fwnode,
>> +					     struct device *consumer,
>> +					     const char *con_id,
>> +					     unsigned int idx,
>> +					     enum gpiod_flags *flags,
>> +					     unsigned long *lookupflags)
>> +{
>> +	struct gpio_desc *desc;
>> +
>> +	desc = gpiod_find_by_fwnode(fwnode, consumer, con_id, idx, flags, lookupflags);
>> +	if (gpiod_not_found(desc) && !IS_ERR_OR_NULL(fwnode))
>> +		desc = gpiod_find_by_fwnode(fwnode->secondary, consumer, con_id,
>> +					    idx, flags, lookupflags);
>> +
>> +	return desc;
> 
> Bikeshedding for later. Maybe do it like this in case we can have more
> than 2 nodes at some point?
> 
>         do {
> 		desc = gpiod_find_by_fwnode(fwnode, consumer, con_id, idx, flags, lookupflags);
> 		if (!gpiod_not_found(desc))
> 			return desc;
> 
> 		fwnode = fwnode->secondary;
> 	} while (!IS_ERR_OR_NULL(fwnode));
> 
> 	return ERR_PTR(-ENOENT);

At a minimum this would need to a regular while () {} loop then,
the initial fwnode may also be NULL and we don't want to deref that.

Andy did mention turning the fwnode-s into a regular linked-list
in the future, but I think that would be using <linux/list.h> then,
replacing the secondary pointer with a list head ?

Regards,

Hans






> 
>> +}
>> +
>>  struct gpio_desc *gpiod_find_and_request(struct device *consumer,
>>  					 struct fwnode_handle *fwnode,
>>  					 const char *con_id,
>> @@ -4622,8 +4639,8 @@ struct gpio_desc *gpiod_find_and_request(struct device *consumer,
>>  	int ret = 0;
>>  
>>  	scoped_guard(srcu, &gpio_devices_srcu) {
>> -		desc = gpiod_find_by_fwnode(fwnode, consumer, con_id, idx,
>> -					    &flags, &lookupflags);
>> +		desc = gpiod_fwnode_lookup(fwnode, consumer, con_id, idx,
>> +					   &flags, &lookupflags);
>>  		if (gpiod_not_found(desc) && platform_lookup_allowed) {
>>  			/*
>>  			 * Either we are not using DT or ACPI, or their lookup
> 
> Thanks.
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2] gpiolib: Extend software-node support to support secondary software-nodes
  2025-09-21 13:00   ` Hans de Goede
@ 2025-09-21 18:45     ` Andy Shevchenko
  0 siblings, 0 replies; 5+ messages in thread
From: Andy Shevchenko @ 2025-09-21 18:45 UTC (permalink / raw)
  To: Hans de Goede
  Cc: Dmitry Torokhov, Mika Westerberg, Andy Shevchenko,
	Bartosz Golaszewski, Linus Walleij, linux-gpio, linux-acpi,
	stable

On Sun, Sep 21, 2025 at 4:00 PM Hans de Goede <hansg@kernel.org> wrote:
> On 20-Sep-25 11:27 PM, Dmitry Torokhov wrote:
> > On Sat, Sep 20, 2025 at 10:09:55PM +0200, Hans de Goede wrote:

...

> > Bikeshedding for later. Maybe do it like this in case we can have more
> > than 2 nodes at some point?
> >
> >         do {
> >               desc = gpiod_find_by_fwnode(fwnode, consumer, con_id, idx, flags, lookupflags);
> >               if (!gpiod_not_found(desc))
> >                       return desc;
> >
> >               fwnode = fwnode->secondary;
> >       } while (!IS_ERR_OR_NULL(fwnode));
> >
> >       return ERR_PTR(-ENOENT);
>
> At a minimum this would need to a regular while () {} loop then,
> the initial fwnode may also be NULL and we don't want to deref that.
>
> Andy did mention turning the fwnode-s into a regular linked-list
> in the future, but I think that would be using <linux/list.h> then,
> replacing the secondary pointer with a list head ?

Dropping secondary in the struct fwnode_handle and use struct
list_head somewhere else, e.g., struct device.

> >> +}


-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2] gpiolib: Extend software-node support to support secondary software-nodes
  2025-09-20 20:09 [PATCH v2] gpiolib: Extend software-node support to support secondary software-nodes Hans de Goede
  2025-09-20 21:27 ` Dmitry Torokhov
@ 2025-09-22 14:24 ` Bartosz Golaszewski
  1 sibling, 0 replies; 5+ messages in thread
From: Bartosz Golaszewski @ 2025-09-22 14:24 UTC (permalink / raw)
  To: Mika Westerberg, Andy Shevchenko, Bartosz Golaszewski,
	Linus Walleij, Hans de Goede
  Cc: Bartosz Golaszewski, Dmitry Torokhov, linux-gpio, linux-acpi,
	stable

From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>


On Sat, 20 Sep 2025 22:09:55 +0200, Hans de Goede wrote:
> When a software-node gets added to a device which already has another
> fwnode as primary node it will become the secondary fwnode for that
> device.
> 
> Currently if a software-node with GPIO properties ends up as the secondary
> fwnode then gpiod_find_by_fwnode() will fail to find the GPIOs.
> 
> [...]

Applied, thanks!

[1/1] gpiolib: Extend software-node support to support secondary software-nodes
      https://git.kernel.org/brgl/linux/c/c6ccc4dde17676dfe617b9a37bd9ba19a8fc87ee

Best regards,
-- 
Bartosz Golaszewski <bartosz.golaszewski@linaro.org>

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-09-22 14:24 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-20 20:09 [PATCH v2] gpiolib: Extend software-node support to support secondary software-nodes Hans de Goede
2025-09-20 21:27 ` Dmitry Torokhov
2025-09-21 13:00   ` Hans de Goede
2025-09-21 18:45     ` Andy Shevchenko
2025-09-22 14:24 ` Bartosz Golaszewski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).