]> Git Repo - linux.git/commitdiff
ALSA: hda/tegra: Add 100us dma stop delay
authorMohan Kumar <[email protected]>
Wed, 5 Aug 2020 09:52:21 +0000 (15:22 +0530)
committerTakashi Iwai <[email protected]>
Wed, 5 Aug 2020 10:28:14 +0000 (12:28 +0200)
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: Mohan Kumar <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Takashi Iwai <[email protected]>
sound/pci/hda/hda_tegra.c

index ecf98eb9df360865fe3a38eba09d6e3789bd32a6..c94553bcca888fd445acbe0916299925adaf97d2 100644 (file)
@@ -308,6 +308,7 @@ static int hda_tegra_first_init(struct azx *chip, struct platform_device *pdev)
                return err;
        }
        bus->irq = irq_id;
+       bus->dma_stop_delay = 100;
        card->sync_irq = bus->irq;
 
        /*
This page took 0.058498 seconds and 4 git commands to generate.