• Mohan Kumar's avatar
    ALSA: hda/tegra: Add 100us dma stop delay · ed4d0a4a
    Mohan Kumar authored
    Tegra HDA has audio data buffer for upto tens of frames, this buffer
    can help to avoid underflow. HW will keep issuing new data fetch
    request when buffers are not full and current BDL is not done. When SW
    disable DMA RUN bit for a stream, HW can't cancel the already issued data
    fetch request and hence it can't stop DMA. HW has to wait for all issued
    data fetch request get data returned before it stops DMA.
    
    This HW behavior is not in sync with HDA spec which says DMA RUN bit
    should be cleared within 1 audio frame. For Tegra, DMA RUN bit was
    active for more than one audio frame, due to this the timeout in
    snd_hdac_stream_sync function is not helping. When Stream reset set
    and clear happens during DMA RUN bit active state it results in Memory
    Decode error.
    
    Unfortunately, there is no way to detect when these data accesses have
    completed, but testing has shown that a 100us delay between Stream reset
    set and clear operation for Tegra avoids the memory decode error.
    Therefore, adding a 100us dma stop delay.
    Signed-off-by: default avatarMohan Kumar <mkumard@nvidia.com>
    Link: https://lore.kernel.org/r/20200805095221.5476-4-mkumard@nvidia.comSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    ed4d0a4a
hda_tegra.c 14 KB