• Daniel Kurtz's avatar
    pinctrl/amd: poll InterruptEnable bits in amd_gpio_irq_set_type · b85bfa24
    Daniel Kurtz authored
    From the AMD BKDG, if WAKE_INT_MASTER_REG.MaskStsEn is set, a software
    write to the debounce registers of *any* gpio will block wake/interrupt
    status generation for *all* gpios for a length of time that depends on
    WAKE_INT_MASTER_REG.MaskStsLength[11:0].  During this period the Interrupt
    Delivery bit (INTERRUPT_ENABLE) will read as 0.
    
    In commit 4c1de041 ("pinctrl/amd: poll InterruptEnable bits in
    enable_irq") we tried to fix this same "gpio Interrupts are blocked
    immediately after writing debounce registers" problem, but incorrectly
    assumed it only affected the gpio whose debounce was being configured
    and not ALL gpios.
    
    To solve this for all gpios, we move the polling loop from
    amd_gpio_irq_enable() to amd_gpio_irq_set_type(), while holding the gpio
    spinlock.  This ensures that another gpio operation (e.g.
    amd_gpio_irq_unmask()) can read a temporarily disabled IRQ and
    incorrectly disable it while trying to modify some other register bits.
    
    Fixes: 4c1de041 pinctrl/amd: poll InterruptEnable bits in enable_irq
    Signed-off-by: default avatarDaniel Kurtz <djkurtz@chromium.org>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    b85bfa24
pinctrl-amd.c 25.9 KB