projects
/
linux-block.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
851fd87
)
ALSA: dmaengine_pcm: Consider DMA cache caused delay in pointer callback
author
Peter Ujfalusi
<peter.ujfalusi@ti.com>
Mon, 10 Feb 2020 15:14:02 +0000
(17:14 +0200)
committer
Mark 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
patch
|
blob
|
blame
|
history
diff --git
a/sound/core/pcm_dmaengine.c
b/sound/core/pcm_dmaengine.c
index 5749a8a4978481c1575f76a376fa9c859367adc6..d8be7b48816283f45a3be173353fae03b8547bff 100644
(file)
--- a/
sound/core/pcm_dmaengine.c
+++ b/
sound/core/pcm_dmaengine.c
@@
-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);