diff options
author | Ravulapati Vishnu vardhan rao <Vishnuvardhanrao.Ravulapati@amd.com> | 2020-06-18 12:56:52 +0530 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2020-06-18 12:51:57 +0100 |
commit | 9f7041b71a2f5defc1629368e7dbe83a9c6ea388 (patch) | |
tree | 51aec82200a17fc301c98a14dc27a5a97c004c8f /sound/soc/amd | |
parent | dcb231e86a237a21305fb838e8140898fb140bcf (diff) | |
download | linux-9f7041b71a2f5defc1629368e7dbe83a9c6ea388.tar.bz2 |
ASoC: amd: closing specific instance.
The steps to reproduce:
Record from the internal mic :
(arecord -D hw:1,2 -f dat /dev/null -V stereos)
Record from the headphone mic:
(arecord -D hw:1,0 -f dat /dev/null -V stereos)
Kill the recording from internal mic.
We can see the recording from the headphone mic is broken.
This patch rectifies the issue reported.
Signed-off-by: Ravulapati Vishnu vardhan rao <Vishnuvardhanrao.Ravulapati@amd.com>
Link: https://lore.kernel.org/r/20200618072653.27103-1-Vishnuvardhanrao.Ravulapati@amd.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound/soc/amd')
-rw-r--r-- | sound/soc/amd/raven/acp3x-pcm-dma.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/sound/soc/amd/raven/acp3x-pcm-dma.c b/sound/soc/amd/raven/acp3x-pcm-dma.c index d8f554f369a8..e6386de20ac7 100644 --- a/sound/soc/amd/raven/acp3x-pcm-dma.c +++ b/sound/soc/amd/raven/acp3x-pcm-dma.c @@ -342,11 +342,34 @@ static int acp3x_dma_close(struct snd_soc_component *component, { struct snd_soc_pcm_runtime *prtd; struct i2s_dev_data *adata; + struct i2s_stream_instance *ins; prtd = substream->private_data; component = snd_soc_rtdcom_lookup(prtd, DRV_NAME); adata = dev_get_drvdata(component->dev); + ins = substream->runtime->private_data; + if (!ins) + return -EINVAL; + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + switch (ins->i2s_instance) { + case I2S_BT_INSTANCE: + adata->play_stream = NULL; + break; + case I2S_SP_INSTANCE: + default: + adata->i2ssp_play_stream = NULL; + } + } else { + switch (ins->i2s_instance) { + case I2S_BT_INSTANCE: + adata->capture_stream = NULL; + break; + case I2S_SP_INSTANCE: + default: + adata->i2ssp_capture_stream = NULL; + } + } /* Disable ACP irq, when the current stream is being closed and * another stream is also not active. @@ -354,13 +377,6 @@ static int acp3x_dma_close(struct snd_soc_component *component, if (!adata->play_stream && !adata->capture_stream && !adata->i2ssp_play_stream && !adata->i2ssp_capture_stream) rv_writel(0, adata->acp3x_base + mmACP_EXTERNAL_INTR_ENB); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - adata->play_stream = NULL; - adata->i2ssp_play_stream = NULL; - } else { - adata->capture_stream = NULL; - adata->i2ssp_capture_stream = NULL; - } return 0; } |