[PATCH] ASoC: amd: renoir: restore two more registers during resume

Mukunda,Vijendar vijendar.mukunda at amd.com
Thu Jul 30 14:02:41 CEST 2020



On 30/07/20 1:20 pm, Hui Wang wrote:
> Recently we found an issue about the suspend and resume. If dmic is
> recording the sound, and we run suspend and resume, after the resume,
> the dmic can't work well anymore. we need to close the app and reopen
> the app, then the dmic could record the sound again.
> 
> For example, we run "arecord -D hw:CARD=acp,DEV=0 -f S32_LE -c 2
> -r 48000 test.wav", then suspend and resume, after the system resume
> back, we speak to the dmic. then stop the arecord, use aplay to play
> the test.wav, we could hear the sound recorded after resume is weird,
> it is not what we speak to the dmic.
> 
> I found two registers are set in the dai_hw_params(), if the two
> registers are set in the resume() too, this issue could be fixed.
> 
> Cc: stable at vger.kernel.org
> Signed-off-by: Hui Wang <hui.wang at canonical.com>
> ---
>   sound/soc/amd/renoir/acp3x-pdm-dma.c | 5 +++++
>   1 file changed, 5 insertions(+)
> 
> diff --git a/sound/soc/amd/renoir/acp3x-pdm-dma.c b/sound/soc/amd/renoir/acp3x-pdm-dma.c
> index 623dfd3ea705..8acb0315a169 100644
> --- a/sound/soc/amd/renoir/acp3x-pdm-dma.c
> +++ b/sound/soc/amd/renoir/acp3x-pdm-dma.c
> @@ -474,6 +474,11 @@ static int acp_pdm_resume(struct device *dev)
>   		rtd = runtime->private_data;
>   		period_bytes = frames_to_bytes(runtime, runtime->period_size);
>   		buffer_len = frames_to_bytes(runtime, runtime->buffer_size);
> +		if (runtime->channels == TWO_CH) {
> +			rn_writel(0x0 , rtd->acp_base + ACP_WOV_PDM_NO_OF_CHANNELS);
> +			rn_writel(PDM_DECIMATION_FACTOR, rtd->acp_base +
> +				  ACP_WOV_PDM_DECIMATION_FACTOR);
> +		}


Could you refactor the code.
Remove this logic from resume callback
Add this register sequence in acp_pdm_dai_trigger() callback before 
invoking start_pdm _dma() callback.
Remove acp_pdm_dai_hw_params().
>   		config_acp_dma(rtd, SNDRV_PCM_STREAM_CAPTURE);
>   		init_pdm_ring_buffer(MEM_WINDOW_START, buffer_len, period_bytes,
>   				     adata->acp_base);
> 


More information about the Alsa-devel mailing list