• Hans de Goede's avatar
    gpiolib-acpi: Only defer request_irq for GpioInt ACPI event handlers · e59f5e08
    Hans de Goede authored
    Commit 78d3a92e ("gpiolib-acpi: Register GpioInt ACPI event handlers
    from a late_initcall") deferred the entire acpi_gpiochip_request_interrupt
    call for each event resource.
    
    This means it also delays the gpiochip_request_own_desc(..., "ACPI:Event")
    call. This is a problem if some AML code reads the GPIO pin before we
    run the deferred acpi_gpiochip_request_interrupt, because in that case
    acpi_gpio_adr_space_handler() will already have called
    gpiochip_request_own_desc(..., "ACPI:OpRegion") causing the call from
    acpi_gpiochip_request_interrupt to fail with -EBUSY and we will fail to
    register an event handler.
    
    acpi_gpio_adr_space_handler is prepared for acpi_gpiochip_request_interrupt
    already having claimed the pin, but the other way around does not work.
    
    One example of a problem this causes, is the event handler for the OTG
    ID pin on a Prowise PT301 tablet not registering, keeping the port stuck
    in whatever mode it was in during boot and e.g. only allowing charging
    after a reboot.
    
    This commit fixes this by only deferring the request_irq call and the
    initial run of edge-triggered IRQs instead of deferring all of
    acpi_gpiochip_request_interrupt.
    
    Cc: stable@vger.kernel.org
    Fixes: 78d3a92e ("gpiolib-acpi: Register GpioInt ACPI event ...")
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Acked-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    e59f5e08
gpiolib-acpi.c 31.6 KB