On Thu, Mar 11, 2021 at 07:12:55PM +0100, gregkh@xxxxxxxxxxxxxxxxxxx wrote: > > The patch below does not apply to the 5.10-stable tree. > If someone wants it applied there, or to any other stable or longterm > tree, then please email the backport, including the original git commit > id to <stable@xxxxxxxxxxxxxxx>. I will send an updated version. > From 62d5247d239d4b48762192a251c647d7c997616a Mon Sep 17 00:00:00 2001 > From: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> > Date: Thu, 25 Feb 2021 18:33:18 +0200 > Subject: [PATCH] gpiolib: acpi: Add ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER quirk > > On some systems the ACPI tables has wrong pin number and instead of > having a relative one it provides an absolute one in the global GPIO > number space. > > Add ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER quirk to cope with such cases. > > Fixes: ba8c90c61847 ("gpio: pca953x: Override IRQ for one of the expanders on Galileo Gen 2") > Depends-on: 0ea683931adb ("gpio: dwapb: Convert driver to using the GPIO-lib-based IRQ-chip") > Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> > Acked-by: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx> > Acked-by: Linus Walleij <linus.walleij@xxxxxxxxxx> > > diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c > index 86efa2d9bf7f..0fa0127d50ec 100644 > --- a/drivers/gpio/gpiolib-acpi.c > +++ b/drivers/gpio/gpiolib-acpi.c > @@ -677,6 +677,7 @@ static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) > if (!lookup->desc) { > const struct acpi_resource_gpio *agpio = &ares->data.gpio; > bool gpioint = agpio->connection_type == ACPI_RESOURCE_GPIO_TYPE_INT; > + struct gpio_desc *desc; > u16 pin_index; It's simply old type of this variable in old tree. > > if (lookup->info.quirks & ACPI_GPIO_QUIRK_ONLY_GPIOIO && gpioint) > @@ -689,8 +690,12 @@ static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) > if (pin_index >= agpio->pin_table_length) > return 1; > > - lookup->desc = acpi_get_gpiod(agpio->resource_source.string_ptr, > + if (lookup->info.quirks & ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER) > + desc = gpio_to_desc(agpio->pin_table[pin_index]); > + else > + desc = acpi_get_gpiod(agpio->resource_source.string_ptr, > agpio->pin_table[pin_index]); > + lookup->desc = desc; > lookup->info.pin_config = agpio->pin_config; > lookup->info.debounce = agpio->debounce_timeout; > lookup->info.gpioint = gpioint; > diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h > index ef49307611d2..c73b25bc9213 100644 > --- a/include/linux/gpio/consumer.h > +++ b/include/linux/gpio/consumer.h > @@ -674,6 +674,8 @@ struct acpi_gpio_mapping { > * get GpioIo type explicitly, this quirk may be used. > */ > #define ACPI_GPIO_QUIRK_ONLY_GPIOIO BIT(1) > +/* Use given pin as an absolute GPIO number in the system */ > +#define ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER BIT(2) > > unsigned int quirks; > }; > -- With Best Regards, Andy Shevchenko