]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ASoC: amd: acp-pcm-dma: add .delay support
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tue, 16 Nov 2021 07:45:23 +0000 (16:45 +0900)
committerMark Brown <broonie@kernel.org>
Mon, 29 Nov 2021 12:19:42 +0000 (12:19 +0000)
Now ALSA SoC supports .delay for component.
This patch uses it, and not update runtime->delay on .pointer
directly / secretly.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://lore.kernel.org/r/8735nwy25o.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/amd/acp-pcm-dma.c
sound/soc/amd/acp.h

index 1f322accd9ead3dbde08729ace909639d085bddc..8fa2e2fde4f1f6b47aef79c2de79068a6ce05e1d 100644 (file)
@@ -1003,6 +1003,7 @@ static snd_pcm_uframes_t acp_dma_pointer(struct snd_soc_component *component,
 
        struct snd_pcm_runtime *runtime = substream->runtime;
        struct audio_substream_data *rtd = runtime->private_data;
+       struct audio_drv_data *adata = dev_get_drvdata(component->dev);
 
        if (!rtd)
                return -EINVAL;
@@ -1023,7 +1024,7 @@ static snd_pcm_uframes_t acp_dma_pointer(struct snd_soc_component *component,
                }
                if (bytescount > 0) {
                        delay = do_div(bytescount, period_bytes);
-                       runtime->delay = bytes_to_frames(runtime, delay);
+                       adata->delay += bytes_to_frames(runtime, delay);
                }
        } else {
                buffersize = frames_to_bytes(runtime, runtime->buffer_size);
@@ -1035,6 +1036,17 @@ static snd_pcm_uframes_t acp_dma_pointer(struct snd_soc_component *component,
        return bytes_to_frames(runtime, pos);
 }
 
+static snd_pcm_sframes_t acp_dma_delay(struct snd_soc_component *component,
+                                      struct snd_pcm_substream *substream)
+{
+       struct audio_drv_data *adata = dev_get_drvdata(component->dev);
+       snd_pcm_sframes_t delay = adata->delay;
+
+       adata->delay = 0;
+
+       return delay;
+}
+
 static int acp_dma_prepare(struct snd_soc_component *component,
                           struct snd_pcm_substream *substream)
 {
@@ -1198,6 +1210,7 @@ static const struct snd_soc_component_driver acp_asoc_platform = {
        .hw_params      = acp_dma_hw_params,
        .trigger        = acp_dma_trigger,
        .pointer        = acp_dma_pointer,
+       .delay          = acp_dma_delay,
        .prepare        = acp_dma_prepare,
        .pcm_construct  = acp_dma_new,
 };
index 85529ed7e5f50406d1ec9e0dd8adacb88b11155c..db80a73aa5932df24bb03f2312cb0a6f4c5279ab 100644 (file)
@@ -151,6 +151,7 @@ struct audio_drv_data {
        struct snd_pcm_substream *capture_i2sbt_stream;
        void __iomem *acp_mmio;
        u32 asic_type;
+       snd_pcm_sframes_t delay;
 };
 
 /*