• Markus Pargmann's avatar
    dma: mxs-dma: Use semaphores for cyclic DMA · 2dcbdce3
    Markus Pargmann authored
    mxs dma channel hardware reset command is not reliable and can cause
    a channel stall. The only way to fix the channel stall is a DMA engine
    reset.
    
    To avoid channel resets we use the hardware semaphore counter. For each
    transmitted segment, the DMA channel will decrease the counter by one.
    To use this mechanism with cyclic DMA, we need to increase the semaphore
    counter with each completed DMA command in the interrupt handler. To
    avoid any interruptions between the DMA transfers, the semaphore counter
    is initialized with 2. This way the counter can be increased in the
    interrupt handler without an influence on the transfer of the DMA
    engine.
    
    When disabling the channel, we stop increasing the semaphore counter in
    the interrupt handler.
    
    This patch was tested on i.MX28 with the SAIF DMA channel.
    Signed-off-by: default avatarMarkus Pargmann <mpa@pengutronix.de>
    Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
    2dcbdce3
mxs-dma.c 23.5 KB