[alsa-devel] [PATCH] ASoC: AMD: Add delay before starting to capture
On capture through dmic we observe a glitch at the start of record. This is because we start capturing even before dmic is ready to send out data. The glitch seen last for ~20msec.
Signed-off-by: Akshu Agrawal akshu.agrawal@amd.com Signed-off-by: Daniel Kurtz djkurtz@chromium.org --- sound/soc/amd/acp-da7219-max98357a.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/sound/soc/amd/acp-da7219-max98357a.c b/sound/soc/amd/acp-da7219-max98357a.c index a5daad9..72b1cf4 100644 --- a/sound/soc/amd/acp-da7219-max98357a.c +++ b/sound/soc/amd/acp-da7219-max98357a.c @@ -44,6 +44,8 @@
#define CZ_PLAT_CLK 48000000 #define DUAL_CHANNEL 2 +#define ADAU7002_DELAY_MS 20 +
static struct snd_soc_jack cz_jack; static struct clk *da7219_dai_clk; @@ -213,6 +215,7 @@ static int cz_dmic0_startup(struct snd_pcm_substream *substream) struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_card *card = rtd->card; struct acp_platform_info *machine = snd_soc_card_get_drvdata(card); + int ret;
/* * On this platform for PCM device we support stereo @@ -225,7 +228,17 @@ static int cz_dmic0_startup(struct snd_pcm_substream *substream) &constraints_rates);
machine->cap_i2s_instance = I2S_BT_INSTANCE; - return da7219_clk_enable(substream); + ret = da7219_clk_enable(substream); + if (ret) + return ret; + /* + * On some platforms, it takes ~20 msec for PDM DMICs and ADAU7002 + * to settle and start producing proper audio data. + */ + msleep(ADAU7002_DELAY_MS); + /* Delay in frames for 48Khz, 16bit, 2 channel */ + runtime->delay = ADAU7002_DELAY_MS * 48; + return 0; }
static int cz_dmic1_startup(struct snd_pcm_substream *substream) @@ -234,6 +247,7 @@ static int cz_dmic1_startup(struct snd_pcm_substream *substream) struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_card *card = rtd->card; struct acp_platform_info *machine = snd_soc_card_get_drvdata(card); + int ret;
/* * On this platform for PCM device we support stereo @@ -247,7 +261,17 @@ static int cz_dmic1_startup(struct snd_pcm_substream *substream)
machine->cap_i2s_instance = I2S_SP_INSTANCE; machine->capture_channel = CAP_CHANNEL0; - return da7219_clk_enable(substream); + ret = da7219_clk_enable(substream); + if (ret) + return ret; + /* + * On some platforms, it takes ~20 msec for PDM DMICs and ADAU7002 + * to settle and start producing proper audio data. + */ + msleep(ADAU7002_DELAY_MS); + /* Delay in frames for 48Khz, 16bit, 2 channel */ + runtime->delay = ADAU7002_DELAY_MS * 48; + return 0; }
static void cz_dmic_shutdown(struct snd_pcm_substream *substream)
On Thu, Jan 03, 2019 at 10:18:13AM +0000, Agrawal, Akshu wrote:
On capture through dmic we observe a glitch at the start of record. This is because we start capturing even before dmic is ready to send out data. The glitch seen last for ~20msec.
- /*
* On some platforms, it takes ~20 msec for PDM DMICs and ADAU7002
* to settle and start producing proper audio data.
*/
- msleep(ADAU7002_DELAY_MS);
If the delay is required for external components to start up the delay should be going in the drivers for those components rather than in the driver for the CPU side, that way other systems using those components get the benefit and non-affected boards don't pay the cost. There's already some support for this in the DMIC driver at least.
On 1/4/2019 5:57 PM, Mark Brown wrote:
On Thu, Jan 03, 2019 at 10:18:13AM +0000, Agrawal, Akshu wrote:
On capture through dmic we observe a glitch at the start of record. This is because we start capturing even before dmic is ready to send out data. The glitch seen last for ~20msec.
- /*
* On some platforms, it takes ~20 msec for PDM DMICs and ADAU7002
* to settle and start producing proper audio data.
*/
- msleep(ADAU7002_DELAY_MS);
If the delay is required for external components to start up the delay should be going in the drivers for those components rather than in the driver for the CPU side, that way other systems using those components get the benefit and non-affected boards don't pay the cost. There's already some support for this in the DMIC driver at least.
Agreed, we can use the similar to wakeup_delay in dmic driver in our codec driver. Will post the patch on same lines.
Thanks, Akshu
participants (2)
-
Agrawal, Akshu
-
Mark Brown