Skip to content
  • Janek Kotas's avatar
    spi: cadence: Change usleep_range() to udelay(), for atomic context · e27421b3
    Janek Kotas authored
    commit 931c4e9a
    
     upstream.
    
    The path "spi: cadence: Add usleep_range() for
    cdns_spi_fill_tx_fifo()" added a usleep_range() function call,
    which cannot be used in atomic context.
    However the cdns_spi_fill_tx_fifo() function can be called during
    an interrupt which may result in a kernel panic:
    
    BUG: scheduling while atomic: grep/561/0x00010002
    Modules linked in:
    Preemption disabled at:
    [<ffffff800858ea28>] wait_for_common+0x48/0x178
    CPU: 0 PID: 561 Comm: grep Not tainted 4.17.0 #1
    Hardware name: Cadence CSP (DT)
    Call trace:
     dump_backtrace+0x0/0x198
     show_stack+0x14/0x20
     dump_stack+0x8c/0xac
     __schedule_bug+0x6c/0xb8
     __schedule+0x570/0x5d8
     schedule+0x34/0x98
     schedule_hrtimeout_range_clock+0x98/0x110
     schedule_hrtimeout_range+0x10/0x18
     usleep_range+0x64/0x98
     cdns_spi_fill_tx_fifo+0x70/0xb0
     cdns_spi_irq+0xd0/0xe0
     __handle_irq_event_percpu+0x9c/0x128
     handle_irq_event_percpu+0x34/0x88
     handle_irq_event+0x48/0x78
     handle_fasteoi_irq+0xbc/0x1b0
     generic_handle_irq+0x24/0x38
     __handle_domain_irq+0x84/0xf8
     gic_handle_irq+0xc4/0x180
    
    This patch replaces the function call with udelay() which can be
    used in an atomic context, like an interrupt.
    
    Signed-off-by: default avatarJan Kotas <jank@cadence.com>
    Signed-off-by: default avatarMark Brown <broonie@kernel.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    e27421b3