[PATCH] ASoC: amd :High hw_level while simultaneous capture
From: Ravulapati Vishnu vardhan rao Vishnuvardhanrao.Ravulapati@amd.com
Simultaneous capture on dmic and headset mic is having issue with high hw_level being reported.
Issue Can be reproduced by: arecord -D hw:2,0 -f dat -d 60 /tmp/test0 & arecord -D hw:2,2 -f dat -d 60 /tmp/test1 & cat /proc/asound/card2/pcm?c/sub0/status
Signed-off-by: Ravulapati Vishnu vardhan rao Vishnuvardhanrao.Ravulapati@amd.com --- sound/soc/amd/raven/acp3x-pcm-dma.c | 37 +++++++++++++++++++---------- 1 file changed, 24 insertions(+), 13 deletions(-)
diff --git a/sound/soc/amd/raven/acp3x-pcm-dma.c b/sound/soc/amd/raven/acp3x-pcm-dma.c index e362f0bc9e46..a36c5cb848cd 100644 --- a/sound/soc/amd/raven/acp3x-pcm-dma.c +++ b/sound/soc/amd/raven/acp3x-pcm-dma.c @@ -241,14 +241,6 @@ static int acp3x_dma_open(struct snd_soc_component *component, adata->i2ssp_play_stream && !adata->i2ssp_capture_stream) rv_writel(1, adata->acp3x_base + mmACP_EXTERNAL_INTR_ENB);
- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - adata->play_stream = substream; - adata->i2ssp_play_stream = substream; - } else { - adata->capture_stream = substream; - adata->i2ssp_capture_stream = substream; - } - i2s_data->acp3x_base = adata->acp3x_base; runtime->private_data = i2s_data; return ret; @@ -263,23 +255,42 @@ static int acp3x_dma_hw_params(struct snd_soc_component *component, struct snd_soc_pcm_runtime *prtd; struct snd_soc_card *card; struct acp3x_platform_info *pinfo; + struct i2s_dev_data *adata; u64 size;
prtd = substream->private_data; card = prtd->card; pinfo = snd_soc_card_get_drvdata(card); + adata = dev_get_drvdata(component->dev); rtd = substream->runtime->private_data; if (!rtd) return -EINVAL;
- if (pinfo) - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + if (pinfo) { + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { rtd->i2s_instance = pinfo->play_i2s_instance; - else + switch (rtd->i2s_instance) { + case I2S_BT_INSTANCE: + adata->play_stream = substream; + break; + case I2S_SP_INSTANCE: + default: + adata->i2ssp_play_stream = substream; + } + } else { rtd->i2s_instance = pinfo->cap_i2s_instance; - else + switch (rtd->i2s_instance) { + case I2S_BT_INSTANCE: + adata->capture_stream = substream; + break; + case I2S_SP_INSTANCE: + default: + adata->i2ssp_capture_stream = substream; + } + } + } else { pr_err("pinfo failed\n"); - + } size = params_buffer_bytes(params); rtd->dma_addr = substream->dma_buffer.addr; rtd->num_pages = (PAGE_ALIGN(size) >> PAGE_SHIFT);
On Tue, May 05, 2020 at 05:10:20PM +0530, Akshu Agrawal wrote:
Simultaneous capture on dmic and headset mic is having issue with high hw_level being reported.
Issue Can be reproduced by: arecord -D hw:2,0 -f dat -d 60 /tmp/test0 & arecord -D hw:2,2 -f dat -d 60 /tmp/test1 & cat /proc/asound/card2/pcm?c/sub0/status
What is a "high hw_level" and how does this patch address it? As far as I can see this patch reorders some of the initialzation but it's not entirely obvious what the issue was or how this fixes it.
[AMD Official Use Only - Internal Distribution Only]
-----Original Message----- From: Mark Brown broonie@kernel.org Sent: Tuesday, May 5, 2020 5:21 PM To: Agrawal, Akshu Akshu.Agrawal@amd.com Cc: RAVULAPATI, VISHNU VARDHAN RAO Vishnuvardhanrao.Ravulapati@amd.com; Liam Girdwood lgirdwood@gmail.com; Jaroslav Kysela perex@perex.cz; Takashi Iwai tiwai@suse.com; Mukunda, Vijendar Vijendar.Mukunda@amd.com; Colin Ian King colin.king@canonical.com; Kuninori Morimoto kuninori.morimoto.gx@renesas.com; moderated list:SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEM... alsa-devel@alsa-project.org; open list linux-kernel@vger.kernel.org Subject: Re: [PATCH] ASoC: amd :High hw_level while simultaneous capture
On Tue, May 05, 2020 at 05:10:20PM +0530, Akshu Agrawal wrote:
Simultaneous capture on dmic and headset mic is having issue with high hw_level being reported.
Issue Can be reproduced by: arecord -D hw:2,0 -f dat -d 60 /tmp/test0 & arecord -D hw:2,2 -f dat -d 60 /tmp/test1 & cat /proc/asound/card2/pcm?c/sub0/status
What is a "high hw_level" and how does this patch address it? As far as I can see this patch reorders some of the initialzation but it's not entirely obvious what the issue was or how this fixes it.
Actual issue is : When we open one capture stream on one instance lets say I2S_SP and then once again if we open other capture on other instance lets say I2S_BT while first capture is in progress and when we try to read the status of both running instances by below command cat /proc/asound/card2/pcm?c/sub0/status we observe that avail_max is being doubled on first opened capture(I2S_SP in the example).
This is because our previous implementation was like when any instance is opened it gets initialized in dma_open irrespective of on what instance it called open. For example: First I2S_SP called opened it initializes both SP/BT capture streams irrespective of on which instance the stream opened.next time I2S_BT called opened and it initializes both SP/BT this corrupts the behaviour .
So with this patch the stream gets initialized only on specific instance when ever it gets opened calls hw_params.
This rectifies the issue.
Thanks, Vishnu
On Tue, May 05, 2020 at 12:18:45PM +0000, RAVULAPATI, VISHNU VARDHAN RAO wrote:
Simultaneous capture on dmic and headset mic is having issue with high hw_level being reported.
Actual issue is :
OK, this is information that should be in the changelog so someone looking at git history in future can understand what the change was doing.
On Tue, May 05, 2020 at 05:10:20PM +0530, Akshu Agrawal wrote:
cat /proc/asound/card2/pcm?c/sub0/status
Signed-off-by: Ravulapati Vishnu vardhan rao Vishnuvardhanrao.Ravulapati@amd.com
Also if you're sending a patch for someone else you need to add your Signed-off-by - see submitting-patches.rst for details on what that is and why it's important.
participants (3)
-
Akshu Agrawal
-
Mark Brown
-
RAVULAPATI, VISHNU VARDHAN RAO