• Daniel Thompson's avatar
    irqchip/exiu: Fix acknowledgment of edge triggered interrupts · 4efc851c
    Daniel Thompson authored
    Currently the EXIU uses the fasteoi interrupt flow that is configured by
    it's parent (irq-gic-v3.c). With this flow the only chance to clear the
    interrupt request happens during .irq_eoi() and (obviously) this happens
    after the interrupt handler has run. EXIU requires edge triggered
    interrupts to be acked prior to interrupt handling. Without this we
    risk incorrect interrupt dismissal when a new interrupt is delivered
    after the handler reads and acknowledges the peripheral but before the
    irq_eoi() takes place.
    
    Fix this by clearing the interrupt request from .irq_ack() if we are
    configured for edge triggered interrupts. This requires adopting the
    fasteoi-ack flow instead of the fasteoi to ensure the ack gets called.
    
    These changes have been tested using the power button on a
    Developerbox/SC2A11 combined with some hackery in gpio-keys so I can
    play with the different trigger mode [and an mdelay(500) so I can
    can check what happens on a double click in both modes].
    
    Fixes: 706cffc1 ("irqchip/exiu: Add support for Socionext Synquacer EXIU controller")
    Signed-off-by: default avatarDaniel Thompson <daniel.thompson@linaro.org>
    Reviewed-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20220503134541.2566457-1-daniel.thompson@linaro.org
    4efc851c
irq-sni-exiu.c 7.82 KB