ALSA: dmaengine_pcm: Consider DMA cache caused delay in pointer callback
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Mon, 10 Feb 2020 15:14:02 +0000 (17:14 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 11 Feb 2020 11:52:34 +0000 (11:52 +0000)
Some DMA engines can have big FIFOs which adds to the latency.
The DMAengine framework can report the FIFO utilization in bytes. Use this
information for the delay reporting.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Reviewed-by: Takashi Iwai <tiwai@suse.de>
Link: https://lore.kernel.org/r/20200210151402.29634-1-peter.ujfalusi@ti.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/core/pcm_dmaengine.c

index 5749a8a4978481c1575f76a376fa9c859367adc6..d8be7b48816283f45a3be173353fae03b8547bff 100644 (file)
@@ -247,9 +247,14 @@ snd_pcm_uframes_t snd_dmaengine_pcm_pointer(struct snd_pcm_substream *substream)
 
        status = dmaengine_tx_status(prtd->dma_chan, prtd->cookie, &state);
        if (status == DMA_IN_PROGRESS || status == DMA_PAUSED) {
+               struct snd_pcm_runtime *runtime = substream->runtime;
+
                buf_size = snd_pcm_lib_buffer_bytes(substream);
                if (state.residue > 0 && state.residue <= buf_size)
                        pos = buf_size - state.residue;
+
+               runtime->delay = bytes_to_frames(runtime,
+                                                state.in_flight_bytes);
        }
 
        return bytes_to_frames(substream->runtime, pos);