• Peter Ujfalusi's avatar
    OMAP3: DMA: Errata i541: sDMA FIFO draining does not finish · 0e4905c0
    Peter Ujfalusi authored
    Implement the suggested workaround for OMAP3 regarding to sDMA draining
    issue, when the channel is disabled on the fly.
    This errata affects the following configuration:
    sDMA transfer is source synchronized
    Buffering is enabled
    SmartStandby is selected.
    
    The issue can be easily reproduced by creating overrun situation while
    recording audio.
    Either introduce load to the CPU:
    nice -19 arecord -D hw:0 -M -B 10000 -F 5000 -f dat > /dev/null & \
    dd if=/dev/urandom of=/dev/null
    
    or suspending the arecord, and resuming it:
    arecord -D hw:0 -M -B 10000 -F 5000 -f dat > /dev/null
    CTRL+Z; fg; CTRL+Z; fg; ...
    
    In case of overrun audio stops DMA, and restarts it (without reseting
    the sDMA channel). When we hit this errata in stop case (sDMA drain did
    not complete), at the coming start the sDMA will not going to be
    operational (it is still draining).
    This leads to DMA stall condition.
    On OMAP3 we can recover with sDMA channel reset, it has been observed
    that by introducing unrelated sDMA activity might also help (reading
    from MMC for example).
    
    The same errata exists for OMAP2, where the suggestion is to disable the
    buffering to avoid this type of error.
    On OMAP3 the suggestion is to set sDMA to NoStandby before disabling
    the channel, and wait for the drain to finish, than configure sDMA to
    SmartStandby again.
    Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@nokia.com>
    Acked-by: default avatarJarkko Nikula <jhnikula@gmail.com>
    Acked-by : Santosh Shilimkar <santosh.shilimkar@ti.com>
    Acked-by : Manjunath Kondaiah G <manjugk@ti.com>
    Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
    0e4905c0
dma.c 53.1 KB