• Linus Walleij's avatar
    gpio: do not double-check direction on sleeping chips · 60f8339e
    Linus Walleij authored
    When locking a GPIO line as IRQ, we go to lengths to
    double-check that the line is really set as input before
    marking it as used for IRQ. This is not good on GPIO chips
    that can sleep, because this function is called in IRQ-safe
    context. Just skip this if it can't be checked quickly.
    
    Currently this happens on sleeping expanders such as STMPE
    or TC3589x:
    
    BUG: scheduling while atomic: swapper/1/0x00000002
    Modules linked in:
    CPU: 0 PID: 1 Comm: swapper Not tainted 4.9.0-rc1+ #38
    Hardware name: Nomadik STn8815
    [<c000f2e0>] (unwind_backtrace) from [<c000d244>] (show_stack+0x10/0x14)
    [<c000d244>] (show_stack) from [<c0037b78>] (__schedule_bug+0x54/0x80)
    [<c0037b78>] (__schedule_bug) from [<c042df14>] (__schedule+0x3a0/0x460)
    [<c042df14>] (__schedule) from [<c042e028>] (schedule+0x54/0xb8)
    (...)
    
    This patch fixes that problem and relies on the direction
    read from the chip when it was added.
    
    Cc: stable@vger.kernel.org
    Fixes: 9c10280d ("gpio: flush direction status in gpiochip_lock_as_irq()")
    Cc: Patrice Chotard <patrice.chotard@st.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    60f8339e
gpiolib.c 95.9 KB