• Nicolas Boichat's avatar
    pinctrl: mediatek: Ignore interrupts that are wake only during resume · 35594bc7
    Nicolas Boichat authored
    Before suspending, mtk-eint would set the interrupt mask to the
    one in wake_mask. However, some of these interrupts may not have a
    corresponding interrupt handler, or the interrupt may be disabled.
    
    On resume, the eint irq handler would trigger nevertheless,
    and irq/pm.c:irq_pm_check_wakeup would be called, which would
    try to call irq_disable. However, if the interrupt is not enabled
    (irqd_irq_disabled(&desc->irq_data) is true), the call does nothing,
    and the interrupt is left enabled in the eint driver.
    
    Especially for level-sensitive interrupts, this will lead to an
    interrupt storm on resume.
    
    If we detect that an interrupt is only in wake_mask, but not in
    cur_mask, we can just mask it out immediately (as mtk_eint_resume
    would do anyway at a later stage in the resume sequence, when
    restoring cur_mask).
    
    Fixes: bf22ff45 ("genirq: Avoid unnecessary low level irq function calls")
    Signed-off-by: default avatarNicolas Boichat <drinkcat@chromium.org>
    Acked-by: default avatarSean Wang <sean.wang@kernel.org>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    35594bc7
mtk-eint.c 12.3 KB