• Guo Ren's avatar
    irqchip/csky: fixup handle_irq_perbit break irq · dad4502d
    Guo Ren authored
    [ Upstream commit 56752b21 ]
    
    The handle_irq_perbit function loop every bit in hwirq local variable.
    
    handle_irq_perbit(hwirq) {
      for_everyt_bit_in(hwirq) {
    	handle_domain_irq()
    		->irq_exit()
    		->invoke_softirq()
    		->__do_softirq()
    		->local_irq_enable() // Here will cause new interrupt.
      }
    }
    
    When new interrupt coming at local_irq_enable, it will finish another
    interrupt handler and pull down the interrupt source. But hwirq is the
    local variable for handle_irq_perbit(), it can't get new interrupt
    controller pending reg status. So we need update hwirq with pending reg
    in every loop.
    
    Also change write_relax to writel could prevent stw from fast retire.
    When local_irq is enabled, intc regs is really set-in.
    Signed-off-by: Guo Ren's avatarGuo Ren <ren_guo@c-sky.com>
    Cc: Lu Baoquan <lu.baoquan@intellif.com>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    dad4502d
irq-csky-apb-intc.c 6.56 KB