• Sebastian Andrzej Siewior's avatar
    gpio: omap: use raw locks for locking · 4dbada2b
    Sebastian Andrzej Siewior authored
    This patch converts gpio_bank.lock from a spin_lock into a
    raw_spin_lock. The call path is to access this lock is always under a
    raw_spin_lock, for instance
    - __setup_irq() holds &desc->lock with irq off
      + __irq_set_trigger()
       + omap_gpio_irq_type()
    
    - handle_level_irq() (runs with irqs off therefore raw locks)
      + mask_ack_irq()
       + omap_gpio_mask_irq()
    
    This fixes the obvious backtrace on -RT. However the locking vs context
    is not and this is not limited to -RT:
    - omap_gpio_irq_type() is called with IRQ off and has an conditional
      call to pm_runtime_get_sync() which may sleep. Either it may happen or
      it may not happen but pm_runtime_get_sync() should not be called with
      irqs off.
    
    - omap_gpio_debounce() is holding the lock with IRQs off.
      + omap2_set_gpio_debounce()
       + clk_prepare_enable()
        + clk_prepare() this one might sleep.
      The number of users of gpiod_set_debounce() / gpio_set_debounce()
      looks low but still this is not good.
    Acked-by: default avatarJavier Martinez Canillas <javier@dowhile0.org>
    Acked-by: default avatarSantosh Shilimkar <ssantosh@kernel.org>
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    4dbada2b
gpio-omap.c 43.3 KB