ASoC: SOF: align the hw_free sequence with stop
authorRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Thu, 25 Nov 2021 10:15:18 +0000 (12:15 +0200)
committerMark Brown <broonie@kernel.org>
Fri, 26 Nov 2021 13:24:23 +0000 (13:24 +0000)
Even though the order of stopping the DMA and freeing the widget list is
not important, align the sequence to match with the stop trigger to
avoid confusion.

Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20211125101520.291581-9-kai.vehmanen@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/pcm.c

index c61cd3c..e4446de 100644 (file)
@@ -299,22 +299,26 @@ static int sof_pcm_hw_free(struct snd_soc_component *component,
        dev_dbg(component->dev, "pcm: free stream %d dir %d\n",
                spcm->pcm.pcm_id, substream->stream);
 
+       /* free PCM in the DSP */
        ret = sof_pcm_dsp_pcm_free(substream, sdev, spcm);
        if (ret < 0)
                err = ret;
 
-       ret = sof_widget_list_free(sdev, spcm, substream->stream);
-       if (ret < 0)
-               err = ret;
-
-       cancel_work_sync(&spcm->stream[substream->stream].period_elapsed_work);
 
+       /* stop DMA */
        ret = snd_sof_pcm_platform_hw_free(sdev, substream);
        if (ret < 0) {
                dev_err(component->dev, "error: platform hw free failed\n");
                err = ret;
        }
 
+       /* free the DAPM widget list */
+       ret = sof_widget_list_free(sdev, spcm, substream->stream);
+       if (ret < 0)
+               err = ret;
+
+       cancel_work_sync(&spcm->stream[substream->stream].period_elapsed_work);
+
        return err;
 }