Commit feea640a authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Mark Brown

ASoC: amd: acp-pcm-dma: add .delay support

Now ALSA SoC supports .delay for component.
This patch uses it, and not update runtime->delay on .pointer
directly / secretly.
Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://lore.kernel.org/r/8735nwy25o.wl-kuninori.morimoto.gx@renesas.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 403f830e
...@@ -1003,6 +1003,7 @@ static snd_pcm_uframes_t acp_dma_pointer(struct snd_soc_component *component, ...@@ -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 snd_pcm_runtime *runtime = substream->runtime;
struct audio_substream_data *rtd = runtime->private_data; struct audio_substream_data *rtd = runtime->private_data;
struct audio_drv_data *adata = dev_get_drvdata(component->dev);
if (!rtd) if (!rtd)
return -EINVAL; return -EINVAL;
...@@ -1023,7 +1024,7 @@ static snd_pcm_uframes_t acp_dma_pointer(struct snd_soc_component *component, ...@@ -1023,7 +1024,7 @@ static snd_pcm_uframes_t acp_dma_pointer(struct snd_soc_component *component,
} }
if (bytescount > 0) { if (bytescount > 0) {
delay = do_div(bytescount, period_bytes); delay = do_div(bytescount, period_bytes);
runtime->delay = bytes_to_frames(runtime, delay); adata->delay += bytes_to_frames(runtime, delay);
} }
} else { } else {
buffersize = frames_to_bytes(runtime, runtime->buffer_size); 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, ...@@ -1035,6 +1036,17 @@ static snd_pcm_uframes_t acp_dma_pointer(struct snd_soc_component *component,
return bytes_to_frames(runtime, pos); 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, static int acp_dma_prepare(struct snd_soc_component *component,
struct snd_pcm_substream *substream) struct snd_pcm_substream *substream)
{ {
...@@ -1198,6 +1210,7 @@ static const struct snd_soc_component_driver acp_asoc_platform = { ...@@ -1198,6 +1210,7 @@ static const struct snd_soc_component_driver acp_asoc_platform = {
.hw_params = acp_dma_hw_params, .hw_params = acp_dma_hw_params,
.trigger = acp_dma_trigger, .trigger = acp_dma_trigger,
.pointer = acp_dma_pointer, .pointer = acp_dma_pointer,
.delay = acp_dma_delay,
.prepare = acp_dma_prepare, .prepare = acp_dma_prepare,
.pcm_construct = acp_dma_new, .pcm_construct = acp_dma_new,
}; };
......
...@@ -151,6 +151,7 @@ struct audio_drv_data { ...@@ -151,6 +151,7 @@ struct audio_drv_data {
struct snd_pcm_substream *capture_i2sbt_stream; struct snd_pcm_substream *capture_i2sbt_stream;
void __iomem *acp_mmio; void __iomem *acp_mmio;
u32 asic_type; u32 asic_type;
snd_pcm_sframes_t delay;
}; };
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment