From 93787d1406f660a02b3982c42e6d37d41353afe6 Mon Sep 17 00:00:00 2001 From: Sugar Zhang Date: Wed, 22 Aug 2018 19:53:18 +0800 Subject: [PATCH] ASoC: rockchip: vad: refine buffer time This patch fix hw_params fail if the buffer time is too large, anyway, we use the smaller one between vad->buffer_time and the max buffer time. Change-Id: I111bb835f281d717d0b5a4be7bc6b321387f31d5 Signed-off-by: Sugar Zhang --- sound/soc/rockchip/rockchip_vad.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/sound/soc/rockchip/rockchip_vad.c b/sound/soc/rockchip/rockchip_vad.c index dae05c9ddf24..f28de21aa325 100644 --- a/sound/soc/rockchip/rockchip_vad.c +++ b/sound/soc/rockchip/rockchip_vad.c @@ -490,7 +490,7 @@ static int rockchip_vad_hw_params(struct snd_pcm_substream *substream, { struct snd_soc_codec *codec = dai->codec; struct rockchip_vad *vad = snd_soc_codec_get_drvdata(codec); - unsigned int val = 0, mask = 0, frame_bytes; + unsigned int val = 0, mask = 0, frame_bytes, buf_time; if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) return 0; @@ -535,7 +535,15 @@ static int rockchip_vad_hw_params(struct snd_pcm_substream *substream, if (vad->buffer_time) { frame_bytes = snd_pcm_format_size(params_format(params), params_channels(params)); - val = params_rate(params) * vad->buffer_time / 1000; + + buf_time = VAD_SRAM_BUFFER_END - vad->memphy + 0x8; + buf_time *= 1000; + buf_time /= (frame_bytes * params_rate(params)); + if (buf_time < vad->buffer_time) + dev_info(vad->dev, "max buffer time: %u ms.\n", buf_time); + buf_time = min(buf_time, vad->buffer_time); + + val = params_rate(params) * buf_time / 1000; val *= frame_bytes; val += vad->memphy; val -= 0x8;