| From 6dede358179e3026b2e0a6e7f18436136a25a32e Mon Sep 17 00:00:00 2001 |
| From: Olivier Moysan <olivier.moysan@st.com> |
| Date: Wed, 4 Mar 2020 11:24:06 +0100 |
| Subject: [PATCH] ASoC: stm32: sai: manage rebind issue |
| |
| commit 0d6defc7e0e437a9fd53622f7fd85740f38d5693 upstream. |
| |
| The commit e894efef9ac7 ("ASoC: core: add support to card rebind") |
| allows to rebind the sound card after a rebind of one of its component. |
| With this commit, the sound card is actually rebound, |
| but may be no more functional. The following problems have been seen |
| with STM32 SAI driver. |
| |
| 1) DMA channel is not requested: |
| |
| With the sound card rebind the simplified call sequence is: |
| stm32_sai_sub_probe |
| snd_soc_register_component |
| snd_soc_try_rebind_card |
| snd_soc_instantiate_card |
| devm_snd_dmaengine_pcm_register |
| |
| The problem occurs because the pcm must be registered, |
| before snd_soc_instantiate_card() is called. |
| |
| Modify SAI driver, to change the call sequence as follows: |
| stm32_sai_sub_probe |
| devm_snd_dmaengine_pcm_register |
| snd_soc_register_component |
| snd_soc_try_rebind_card |
| |
| 2) DMA channel is not released: |
| |
| dma_release_channel() is not called when |
| devm_dmaengine_pcm_release() is executed. |
| This occurs because SND_DMAENGINE_PCM_DRV_NAME component, |
| has already been released through devm_component_release(). |
| |
| devm_dmaengine_pcm_release() should be called before |
| devm_component_release() to avoid this problem. |
| |
| Call snd_dmaengine_pcm_unregister() and snd_soc_unregister_component() |
| explicitly from SAI driver, to have the right sequence. |
| |
| Signed-off-by: Olivier Moysan <olivier.moysan@st.com> |
| Message-Id: <20200304102406.8093-1-olivier.moysan@st.com> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/sound/soc/stm/stm32_sai_sub.c b/sound/soc/stm/stm32_sai_sub.c |
| index 0174692b288e..b90a046b2bc6 100644 |
| --- a/sound/soc/stm/stm32_sai_sub.c |
| +++ b/sound/soc/stm/stm32_sai_sub.c |
| @@ -1540,20 +1540,20 @@ static int stm32_sai_sub_probe(struct platform_device *pdev) |
| return ret; |
| } |
| |
| - ret = devm_snd_soc_register_component(&pdev->dev, &stm32_component, |
| - &sai->cpu_dai_drv, 1); |
| + ret = snd_dmaengine_pcm_register(&pdev->dev, conf, 0); |
| + if (ret) { |
| + dev_err(&pdev->dev, "Could not register pcm dma\n"); |
| + return ret; |
| + } |
| + |
| + ret = snd_soc_register_component(&pdev->dev, &stm32_component, |
| + &sai->cpu_dai_drv, 1); |
| if (ret) |
| return ret; |
| |
| if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) |
| conf = &stm32_sai_pcm_config_spdif; |
| |
| - ret = devm_snd_dmaengine_pcm_register(&pdev->dev, conf, 0); |
| - if (ret) { |
| - dev_err(&pdev->dev, "Could not register pcm dma\n"); |
| - return ret; |
| - } |
| - |
| return 0; |
| } |
| |
| @@ -1562,6 +1562,8 @@ static int stm32_sai_sub_remove(struct platform_device *pdev) |
| struct stm32_sai_sub_data *sai = dev_get_drvdata(&pdev->dev); |
| |
| clk_unprepare(sai->pdata->pclk); |
| + snd_dmaengine_pcm_unregister(&pdev->dev); |
| + snd_soc_unregister_component(&pdev->dev); |
| |
| return 0; |
| } |
| -- |
| 2.7.4 |
| |