[PATCH] gpiolib: devres: release GPIOs in devm_gpiod_put_array()

André Draszik posted 1 patch 2 months, 3 weeks ago
drivers/gpio/gpiolib-devres.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
[PATCH] gpiolib: devres: release GPIOs in devm_gpiod_put_array()
Posted by André Draszik 2 months, 3 weeks ago
devm_gpiod_put_array() is meant to undo the effects of
devm_gpiod_get_array() - in particular, it should release the GPIOs
contained in the array acquired with the latter. It is meant to be the
resource-managed version of gpiod_put_array(), and it should behave
similar to the non-array version devm_gpiod_put().

Since commit d1d52c6622a6 ("gpiolib: devres: Finish the conversion to
use devm_add_action()") it doesn't do that anymore, it just removes the
devres action and frees associated memory, but it doesn't actually
release the GPIOs.

Fix by switching from devm_remove_action() to devm_release_action(),
which will in addition invoke the action to release the GPIOs.

Fixes: d1d52c6622a6 ("gpiolib: devres: Finish the conversion to use devm_add_action()")
Signed-off-by: André Draszik <andre.draszik@linaro.org>
---
 drivers/gpio/gpiolib-devres.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpio/gpiolib-devres.c b/drivers/gpio/gpiolib-devres.c
index 4d5f83b17624eed04039b94ca6d095fea293e5cc..72422c5db3641e5609759e82ac2ab532fab81783 100644
--- a/drivers/gpio/gpiolib-devres.c
+++ b/drivers/gpio/gpiolib-devres.c
@@ -319,7 +319,7 @@ EXPORT_SYMBOL_GPL(devm_gpiod_unhinge);
  */
 void devm_gpiod_put_array(struct device *dev, struct gpio_descs *descs)
 {
-	devm_remove_action(dev, devm_gpiod_release_array, descs);
+	devm_release_action(dev, devm_gpiod_release_array, descs);
 }
 EXPORT_SYMBOL_GPL(devm_gpiod_put_array);
 

---
base-commit: 58ba80c4740212c29a1cf9b48f588e60a7612209
change-id: 20250715-gpiolib-devres-put-array-fix-d6b365dad018

Best regards,
-- 
André Draszik <andre.draszik@linaro.org>

Re: [PATCH] gpiolib: devres: release GPIOs in devm_gpiod_put_array()
Posted by Bartosz Golaszewski 2 months, 3 weeks ago
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>


On Tue, 15 Jul 2025 17:00:20 +0100, André Draszik wrote:
> devm_gpiod_put_array() is meant to undo the effects of
> devm_gpiod_get_array() - in particular, it should release the GPIOs
> contained in the array acquired with the latter. It is meant to be the
> resource-managed version of gpiod_put_array(), and it should behave
> similar to the non-array version devm_gpiod_put().
> 
> Since commit d1d52c6622a6 ("gpiolib: devres: Finish the conversion to
> use devm_add_action()") it doesn't do that anymore, it just removes the
> devres action and frees associated memory, but it doesn't actually
> release the GPIOs.
> 
> [...]

Thanks for catching it, I queued it for v6.16-rc7.

[1/1] gpiolib: devres: release GPIOs in devm_gpiod_put_array()
      https://git.kernel.org/brgl/linux/c/ff20798820e08af0fe757c756914b4aa51993ccb

Best regards,
-- 
Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Re: [PATCH] gpiolib: devres: release GPIOs in devm_gpiod_put_array()
Posted by Andy Shevchenko 2 months, 3 weeks ago
On Wed, Jul 16, 2025 at 11:09:31AM +0200, Bartosz Golaszewski wrote:
> On Tue, 15 Jul 2025 17:00:20 +0100, André Draszik wrote:
> > devm_gpiod_put_array() is meant to undo the effects of
> > devm_gpiod_get_array() - in particular, it should release the GPIOs
> > contained in the array acquired with the latter. It is meant to be the
> > resource-managed version of gpiod_put_array(), and it should behave
> > similar to the non-array version devm_gpiod_put().
> > 
> > Since commit d1d52c6622a6 ("gpiolib: devres: Finish the conversion to
> > use devm_add_action()") it doesn't do that anymore, it just removes the
> > devres action and frees associated memory, but it doesn't actually
> > release the GPIOs.

[...]

> Thanks for catching it, I queued it for v6.16-rc7.

Yeah, I used the release function in parameter, but not changed the call.
Thanks for a good catch!

-- 
With Best Regards,
Andy Shevchenko
Re: [PATCH] gpiolib: devres: release GPIOs in devm_gpiod_put_array()
Posted by André Draszik 2 months, 3 weeks ago
On Tue, 2025-07-15 at 17:00 +0100, André Draszik wrote:
> devm_gpiod_put_array() is meant to undo the effects of
> devm_gpiod_get_array() - in particular, it should release the GPIOs
> contained in the array acquired with the latter. It is meant to be the
> resource-managed version of gpiod_put_array(), and it should behave
> similar to the non-array version devm_gpiod_put().
> 
> Since commit d1d52c6622a6 ("gpiolib: devres: Finish the conversion to
> use devm_add_action()") it doesn't do that anymore, it just removes the
> devres action and frees associated memory, but it doesn't actually
> release the GPIOs.
> 
> Fix by switching from devm_remove_action() to devm_release_action(),
> which will in addition invoke the action to release the GPIOs.
> 
> Fixes: d1d52c6622a6 ("gpiolib: devres: Finish the conversion to use devm_add_action()")

The culprit only exists in 6.16-rc for now, and it shouldn't be
backported to older kernels, hence I didn't add CC: stable, hoping
the patch can make it into the 6.16 release

Please let me know if that is unlikely and I shall send a v2 with
Cc: stable instead.

Cheers,
Andre'