• Thomas Gleixner's avatar
    genirq: Add flag to force mask in disable_irq[_nosync]() · e9849777
    Thomas Gleixner authored
    If an irq chip does not implement the irq_disable callback, then we
    use a lazy approach for disabling the interrupt. That means that the
    interrupt is marked disabled, but the interrupt line is not
    immediately masked in the interrupt chip. It only becomes masked if
    the interrupt is raised while it's marked disabled. We use this to avoid
    possibly expensive mask/unmask operations for common case operations.
    
    Unfortunately there are devices which do not allow the interrupt to be
    disabled easily at the device level. They are forced to use
    disable_irq_nosync(). This can result in taking each interrupt twice.
    
    Instead of enforcing the non lazy mode on all interrupts of a irq
    chip, provide a settings flag, which can be set by the driver for that
    particular interrupt line.
    Reported-and-tested-by: default avatarDuc Dang <dhdang@apm.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Marc Zyngier <marc.zyngier@arm.com>
    Cc: Jason Cooper <jason@lakedaemon.net>
    Link: http://lkml.kernel.org/r/alpine.DEB.2.11.1510092348370.6097@nanos
    e9849777
chip.c 27.1 KB