ASoC: SOF: Intel: hda: Do not stop/start DMA during pause/release
authorRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Thu, 20 Apr 2023 11:41:36 +0000 (14:41 +0300)
committerMark Brown <broonie@kernel.org>
Thu, 20 Apr 2023 11:51:58 +0000 (12:51 +0100)
The FW does not pause/stop the host DMA during pause and stopping the
host DMA from the driver could result in an unknown behaviour. So, skip
triggering the HD-Audio host DMA during pause/release.

Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://lore.kernel.org/r/20230420114137.27613-2-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/hda-stream.c

index 79d818e..8de4226 100644 (file)
@@ -337,7 +337,13 @@ int hda_dsp_stream_trigger(struct snd_sof_dev *sdev,
        /* cmd must be for audio stream */
        switch (cmd) {
        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+               if (!sdev->dspless_mode_selected)
+                       break;
+               fallthrough;
        case SNDRV_PCM_TRIGGER_START:
+               if (hstream->running)
+                       break;
+
                snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, SOF_HDA_INTCTL,
                                        1 << hstream->index,
                                        1 << hstream->index);
@@ -360,8 +366,11 @@ int hda_dsp_stream_trigger(struct snd_sof_dev *sdev,
                        hstream->running = true;
 
                break;
-       case SNDRV_PCM_TRIGGER_SUSPEND:
        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+               if (!sdev->dspless_mode_selected)
+                       break;
+               fallthrough;
+       case SNDRV_PCM_TRIGGER_SUSPEND:
        case SNDRV_PCM_TRIGGER_STOP:
                snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
                                        sd_offset,