On Mon, Dec 12, 2022 at 2:31 PM Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> wrote: > > From: Bartosz Golaszewski <brgl@xxxxxxxx> > > [ 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@xxxxxxxx> > Suggested-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> > Reviewed-by: Linus Walleij <linus.walleij@xxxxxxxxxx> > Reviewed-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> > Stable-dep-of: ec851b23084b ("gpiolib: fix memory leak in gpiochip_setup_dev()") > Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx> > --- > 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