gpio_delay_probe() requests each wrapped real GPIO in a loop and
returns immediately if gpio_request_by_name_nodev() fails partway
through, without freeing the GPIOs it already successfully requested.
gpio_delay_remove() does not cover this either, since .remove is only
called for devices that finished probing.
Free what was already requested via the same gpio_delay_free_wrapped()
helper gpio_delay_remove() uses, bounded by the number of GPIOs
actually requested so far rather than the full gpio_count.
Fixes: c866f2f197e2 ("gpio: Add GPIO delay driver")
Suggested-by: Simon Glass <[email protected]>
Signed-off-by: Pranav Sanwal <[email protected]>
---
drivers/gpio/gpio-delay.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/gpio/gpio-delay.c b/drivers/gpio/gpio-delay.c
index 27fc59b5ee4..747c520fb46 100644
--- a/drivers/gpio/gpio-delay.c
+++ b/drivers/gpio/gpio-delay.c
@@ -150,8 +150,10 @@ static int gpio_delay_probe(struct udevice *dev)
d = &priv->descs[i];
ret = gpio_request_by_name_nodev(node, "gpios", i,
&d->real_gpio, 0);
- if (ret)
+ if (ret) {
+ gpio_delay_free_wrapped(dev, i);
return ret;
+ }
}
return 0;
--
2.43.7