• I
    ARM: OMAP: GPIO IRQ lazy IRQ disable fix · ea6dedd7
    Imre Deak 提交于
    - The current OMAP GPIO IRQ framework doesn't use the do_edge_IRQ,
      do_level_IRQ handlers, but instead calls do_simple_IRQ. This
      doesn't handle disabled interrupts properly, so drivers will
      still get interrupts after calling disable_irq. The patch solves
      this by respecting the irq_desc.disable_depth and irq_desc.running
      counters.  When one of these is non-zero the handler is not called,
      the interrupt is masked and marked as pending. The pending interrupt
      will be serviced when the running handler returns. This is according
      to the same semantics as the standard do_edge_IRQ and do_level_IRQ
      handlers have, so one day we should use them instead of do_simple_IRQ.
    
    - Process only interrupts that are not masked. The ISR may contain
      pending interrupts that are masked these shouldn't be processed.
    
    - Move the bank IRQ unmasking out of the IRQ dispatch loop. If there
      are further iterations we shouldn't unmask it if there are level
      triggered interrupts pending.
    Signed-off-by: NImre Deak <imre.deak@nokia.com>
    Signed-off-by: NJuha Yrjola <juha.yrjola@nokia.com>
    Signed-off-by: NTony Lindgren <tony@atomide.com>
    ea6dedd7
gpio.c 29.7 KB