• Daniel Drake's avatar
    pinctrl: amd: disable spurious-firing GPIO IRQs · d21b8adb
    Daniel Drake authored
    When cold-booting Asus X434DA, GPIO 7 is found to be already configured
    as an interrupt, and the GPIO level is found to be in a state that
    causes the interrupt to fire.
    
    As soon as pinctrl-amd probes, this interrupt fires and invokes
    amd_gpio_irq_handler(). The IRQ is acked, but no GPIO-IRQ handler was
    invoked, so the GPIO level being unchanged just causes another interrupt
    to fire again immediately after.
    
    This results in an interrupt storm causing this platform to hang
    during boot, right after pinctrl-amd is probed.
    
    Detect this situation and disable the GPIO interrupt when this happens.
    This enables the affected platform to boot as normal. GPIO 7 actually is
    the I2C touchpad interrupt line, and later on, i2c-multitouch loads and
    re-enables this interrupt when it is ready to handle it.
    
    Instead of this approach, I considered disabling all GPIO interrupts at
    probe time, however that seems a little risky, and I also confirmed that
    Windows does not seem to have this behaviour: the same 41 GPIO IRQs are
    enabled under both Linux and Windows, which is a far larger collection
    than the GPIOs referenced by the DSDT on this platform.
    Signed-off-by: default avatarDaniel Drake <drake@endlessm.com>
    Link: https://lore.kernel.org/r/20190814090540.7152-1-drake@endlessm.comSigned-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    d21b8adb
pinctrl-amd.c 25.8 KB