• Geert Uytterhoeven's avatar
    spi: sh-msiof: Fix timeout failures for TX-only DMA transfers · 89434c3c
    Geert Uytterhoeven authored
    When using RX (with or without TX), the DMA interrupt triggers
    completion when the RX FIFO has been emptied, i.e. after the full
    transfer has finished.
    
    However, when using TX without RX, the DMA interrupt triggers completion
    as soon as the DMA engine has filled the TX FIFO, i.e. before the full
    transfer has finished.  Then sh_msiof_modify_ctr_wait() will spin until
    the transfer has really finished and the TFSE bit is cleared, for at
    most 1 ms.  For slow speeds and/or large transfers, this may cause
    timeouts and transfer failures:
    
        spi_sh_msiof e6e10000.spi: failed to shut down hardware
        74x164 spi2.0: SPI transfer failed: -110
        spi_master spi2: failed to transfer one message from queue
        74x164 spi2.0: Failed writing: -110
    
    Fix this by waiting explicitly until the TX FIFO has been emptied.
    
    Based on a patch in the BSP by Hiromitsu Yamasaki.
    Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
    Signed-off-by: default avatarMark Brown <broonie@kernel.org>
    89434c3c
spi-sh-msiof.c 36.3 KB