Message ID | 20230909141816.58358-2-hdegoede@redhat.com (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
Series | x86-android-tablets: Stop using gpiolib private APIs | expand |
On Sat, Sep 9, 2023 at 5:18 PM Hans de Goede <hdegoede@redhat.com> wrote: > > In some cases where a broken AEI is present for a GPIO and the GPIO > is listed in the ignore_interrupt list to avoid the broken event > handler, the kernel may want to use the GPIO for another purpose. > > Before this change trying to use such a GPIO for another purpose would > fail, because the ignore_interrupt list was only checked after > the acpi_request_own_gpiod() call, causing the GPIO to already be > claimed even though it is listed in the ignore_interrupt list. > > Fix this by moving the ignore_interrupt list to above > the acpi_request_own_gpiod() call. Not sure if we need a Fixes tag, either way this makes sense, Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
On Sat, Sep 09, 2023 at 04:18:09PM +0200, Hans de Goede wrote: > In some cases where a broken AEI is present for a GPIO and the GPIO > is listed in the ignore_interrupt list to avoid the broken event > handler, the kernel may want to use the GPIO for another purpose. > > Before this change trying to use such a GPIO for another purpose would > fail, because the ignore_interrupt list was only checked after > the acpi_request_own_gpiod() call, causing the GPIO to already be > claimed even though it is listed in the ignore_interrupt list. > > Fix this by moving the ignore_interrupt list to above > the acpi_request_own_gpiod() call. > > Signed-off-by: Hans de Goede <hdegoede@redhat.com> Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
On Sat, Sep 9, 2023 at 4:18 PM Hans de Goede <hdegoede@redhat.com> wrote: > > In some cases where a broken AEI is present for a GPIO and the GPIO > is listed in the ignore_interrupt list to avoid the broken event > handler, the kernel may want to use the GPIO for another purpose. > > Before this change trying to use such a GPIO for another purpose would > fail, because the ignore_interrupt list was only checked after > the acpi_request_own_gpiod() call, causing the GPIO to already be > claimed even though it is listed in the ignore_interrupt list. > > Fix this by moving the ignore_interrupt list to above > the acpi_request_own_gpiod() call. > > Signed-off-by: Hans de Goede <hdegoede@redhat.com> > --- Acked-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c index 97496c0f9133..80b9650a2424 100644 --- a/drivers/gpio/gpiolib-acpi.c +++ b/drivers/gpio/gpiolib-acpi.c @@ -437,6 +437,11 @@ static acpi_status acpi_gpiochip_alloc_event(struct acpi_resource *ares, if (!handler) return AE_OK; + if (acpi_gpio_in_ignore_list(ignore_interrupt, dev_name(chip->parent), pin)) { + dev_info(chip->parent, "Ignoring interrupt on pin %u\n", pin); + return AE_OK; + } + desc = acpi_request_own_gpiod(chip, agpio, 0, "ACPI:Event"); if (IS_ERR(desc)) { dev_err(chip->parent, @@ -461,11 +466,6 @@ static acpi_status acpi_gpiochip_alloc_event(struct acpi_resource *ares, goto fail_unlock_irq; } - if (acpi_gpio_in_ignore_list(ignore_interrupt, dev_name(chip->parent), pin)) { - dev_info(chip->parent, "Ignoring interrupt on pin %u\n", pin); - return AE_OK; - } - event = kzalloc(sizeof(*event), GFP_KERNEL); if (!event) goto fail_unlock_irq;
In some cases where a broken AEI is present for a GPIO and the GPIO is listed in the ignore_interrupt list to avoid the broken event handler, the kernel may want to use the GPIO for another purpose. Before this change trying to use such a GPIO for another purpose would fail, because the ignore_interrupt list was only checked after the acpi_request_own_gpiod() call, causing the GPIO to already be claimed even though it is listed in the ignore_interrupt list. Fix this by moving the ignore_interrupt list to above the acpi_request_own_gpiod() call. Signed-off-by: Hans de Goede <hdegoede@redhat.com> --- drivers/gpio/gpiolib-acpi.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)