On Mon, Dec 12, 2022 at 2:31 PM Greg Kroah-Hartman gregkh@linuxfoundation.org wrote:
From: Bartosz Golaszewski brgl@bgdev.pl
[ Upstream commit 9dbd1ab20509e85cd3fac9479a00c59e83c08196 ]
Several drivers read the 'ngpios' device property on their own, but since it's defined as a standard GPIO property in the device tree bindings anyway, it's a good candidate for generalization. If the driver didn't set its gc->ngpio, try to read the 'ngpios' property from the GPIO device's firmware node before bailing out.
Signed-off-by: Bartosz Golaszewski brgl@bgdev.pl Suggested-by: Andy Shevchenko andriy.shevchenko@linux.intel.com Reviewed-by: Linus Walleij linus.walleij@linaro.org Reviewed-by: Andy Shevchenko andriy.shevchenko@linux.intel.com Stable-dep-of: ec851b23084b ("gpiolib: fix memory leak in gpiochip_setup_dev()") Signed-off-by: Sasha Levin sashal@kernel.org
drivers/gpio/gpiolib.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index a87c4cd94f7a..b7b5fe151e1a 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -599,6 +599,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, int base = gc->base; unsigned int i; int ret = 0;
u32 ngpios; /* * First: allocate and populate the internal stat container, and@@ -646,6 +647,26 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, goto err_free_dev_name; }
/** Try the device properties if the driver didn't supply the number* of GPIO lines.*/if (gc->ngpio == 0) {ret = device_property_read_u32(&gdev->dev, "ngpios", &ngpios);if (ret == -ENODATA)/** -ENODATA means that there is no property found and* we want to issue the error message to the user.* Besides that, we want to return different error code* to state that supplied value is not valid.*/ngpios = 0;else if (ret)goto err_free_descs;gc->ngpio = ngpios;}if (gc->ngpio == 0) { chip_err(gc, "tried to insert a GPIO chip with zero lines\n"); ret = -EINVAL;-- 2.35.1
This isn't a fix, please drop it from stable.
Bartosz