• Thomas Gleixner's avatar
    gpio: pch9: Use proper flow type handlers · df9541a6
    Thomas Gleixner authored
    Jean-Francois Dagenais reported:
    
     Configuring a gpio pin with the gpio-pch driver with
     "IRQF_TRIGGER_LOW | IRQF_ONESHOT" generates an interrupt storm for
     threaded ISR until the ISR thread actually gets to physically clear
     the interrupt on the triggering chip!! The immediate observable
     symptom is the high CPU usage for my ISR thread task and the
     interrupt count in /proc/interrupts incrementing radically.
    
    The driver is wrong in several ways:
    
    1) Using handle_simple_irq() does not provide proper flow control
       handling. In the case of oneshot threaded handlers for the
       demultiplexed interrupts this results in an interrupt storm because
       the simple handler does not deal with masking/unmasking.  Even
       without threaded oneshot handlers an interrupt storm for level type
       interrupts can easily be triggered when the interrupt is disabled
       and the interrupt line is activated from the device.
    
    2) Acknowlegding the demultiplexed interrupt before calling the
       handler is wrong for level type interrupts.
    
    3) The set_type function unconditionally enables the interrupt. It's
       supposed to set the type and nothing else. The unmasking is done by
       the core code.
    
    Move the acknowledge code into a separate function and add it to the
    demux irqchip callbacks.
    
    Remove the unconditional enabling from the set_type() callback and set
    the proper flow handlers depending on the selected type (level/edge).
    Reported-and-tested-by: default avatarJean-Francois Dagenais <jeff.dagenais@gmail.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
    df9541a6
gpio-pch.c 13.9 KB