Message ID | 20210705193620.1144-1-vijendar.mukunda@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] ASoC: add stop_dma_first flag to reverse the stop sequence | expand |
On Tue, Jul 06, 2021 at 01:06:17AM +0530, Vijendar Mukunda wrote: > @@ -982,6 +982,7 @@ struct snd_soc_card { > unsigned int disable_route_checks:1; > unsigned int probed:1; > unsigned int component_chaining:1; > + unsigned int stop_dma_first:1; > > void *drvdata; > }; This still doesn't seem like something which should be controlled at the card level, I'd expect it to be configured at the dai_link level.
On 7/6/21 5:58 PM, Mark Brown wrote: > On Tue, Jul 06, 2021 at 01:06:17AM +0530, Vijendar Mukunda wrote: > >> @@ -982,6 +982,7 @@ struct snd_soc_card { >> unsigned int disable_route_checks:1; >> unsigned int probed:1; >> unsigned int component_chaining:1; >> + unsigned int stop_dma_first:1; >> >> void *drvdata; >> }; > > This still doesn't seem like something which should be controlled at the > card level, I'd expect it to be configured at the dai_link level. > will make changes by adding flag in dai_link and will post the new version
diff --git a/include/sound/soc.h b/include/sound/soc.h index 675849d07284..aa63282aac2c 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -982,6 +982,7 @@ struct snd_soc_card { unsigned int disable_route_checks:1; unsigned int probed:1; unsigned int component_chaining:1; + unsigned int stop_dma_first:1; void *drvdata; }; diff --git a/sound/soc/amd/acp-da7219-max98357a.c b/sound/soc/amd/acp-da7219-max98357a.c index 84e3906abd4f..a2bf49f81a80 100644 --- a/sound/soc/amd/acp-da7219-max98357a.c +++ b/sound/soc/amd/acp-da7219-max98357a.c @@ -742,6 +742,7 @@ static int cz_probe(struct platform_device *pdev) if (!machine) return -ENOMEM; card->dev = &pdev->dev; + cz_card.stop_dma_first = true; platform_set_drvdata(pdev, card); snd_soc_card_set_drvdata(card, machine); ret = devm_snd_soc_register_card(&pdev->dev, card); diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 46513bb97904..062fb6fcc03f 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -1015,6 +1015,8 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream, static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd) { + struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); + struct snd_soc_card *card = rtd->card; int ret = -EINVAL, _ret = 0; int rollback = 0; @@ -1055,14 +1057,23 @@ static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd) case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - ret = snd_soc_pcm_dai_trigger(substream, cmd, rollback); - if (ret < 0) - break; + if (card->stop_dma_first) { + ret = snd_soc_pcm_component_trigger(substream, cmd, rollback); + if (ret < 0) + break; - ret = snd_soc_pcm_component_trigger(substream, cmd, rollback); - if (ret < 0) - break; + ret = snd_soc_pcm_dai_trigger(substream, cmd, rollback); + if (ret < 0) + break; + } else { + ret = snd_soc_pcm_dai_trigger(substream, cmd, rollback); + if (ret < 0) + break; + ret = snd_soc_pcm_component_trigger(substream, cmd, rollback); + if (ret < 0) + break; + } ret = snd_soc_link_trigger(substream, cmd, rollback); break; }