[PATCH] ASoC: amd: renoir: restore two more registers during resume
Hui Wang
hui.wang at canonical.com
Thu Jul 30 14:07:55 CEST 2020
On 2020/7/30 下午8:02, Mukunda,Vijendar wrote:
>
>
> 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().
OK, got it.
thx.
>> 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