sdw_cdns_config_stream(cdns, ch, dir, pdi);
 
        /* store pdi and hw_params, may be needed in prepare step */
+       dma->paused = false;
        dma->suspended = false;
        dma->pdi = pdi;
        dma->hw_params = params;
        pm_runtime_put_autosuspend(cdns->dev);
 }
 
-static int intel_component_dais_suspend(struct snd_soc_component *component)
-{
-       struct sdw_cdns_dma_data *dma;
-       struct snd_soc_dai *dai;
-
-       for_each_component_dais(component, dai) {
-               /*
-                * we don't have a .suspend dai_ops, and we don't have access
-                * to the substream, so let's mark both capture and playback
-                * DMA contexts as suspended
-                */
-               dma = dai->playback_dma_data;
-               if (dma)
-                       dma->suspended = true;
-
-               dma = dai->capture_dma_data;
-               if (dma)
-                       dma->suspended = true;
-       }
-
-       return 0;
-}
-
 static int intel_pcm_set_sdw_stream(struct snd_soc_dai *dai,
                                    void *stream, int direction)
 {
        return dma->stream;
 }
 
+static int intel_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai)
+{
+       struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
+       struct sdw_intel *sdw = cdns_to_intel(cdns);
+       struct sdw_cdns_dma_data *dma;
+       int ret = 0;
+
+       dma = snd_soc_dai_get_dma_data(dai, substream);
+       if (!dma) {
+               dev_err(dai->dev, "failed to get dma data in %s\n",
+                       __func__);
+               return -EIO;
+       }
+
+       switch (cmd) {
+       case SNDRV_PCM_TRIGGER_SUSPEND:
+
+               /*
+                * The .prepare callback is used to deal with xruns and resume operations.
+                * In the case of xruns, the DMAs and SHIM registers cannot be touched,
+                * but for resume operations the DMAs and SHIM registers need to be initialized.
+                * the .trigger callback is used to track the suspend case only.
+                */
+
+               dma->suspended = true;
+
+               ret = intel_free_stream(sdw, substream->stream, dai, sdw->instance);
+               break;
+
+       case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+               dma->paused = true;
+               break;
+       case SNDRV_PCM_TRIGGER_STOP:
+       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+               dma->paused = false;
+               break;
+       default:
+               break;
+       }
+
+       return ret;
+}
+
+static int intel_component_dais_suspend(struct snd_soc_component *component)
+{
+       struct snd_soc_dai *dai;
+
+       /*
+        * In the corner case where a SUSPEND happens during a PAUSE, the ALSA core
+        * does not throw the TRIGGER_SUSPEND. This leaves the DAIs in an unbalanced state.
+        * Since the component suspend is called last, we can trap this corner case
+        * and force the DAIs to release their resources.
+        */
+       for_each_component_dais(component, dai) {
+               struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
+               struct sdw_intel *sdw = cdns_to_intel(cdns);
+               struct sdw_cdns_dma_data *dma;
+               int stream;
+               int ret;
+
+               dma = dai->playback_dma_data;
+               stream = SNDRV_PCM_STREAM_PLAYBACK;
+               if (!dma) {
+                       dma = dai->capture_dma_data;
+                       stream = SNDRV_PCM_STREAM_CAPTURE;
+               }
+
+               if (!dma)
+                       continue;
+
+               if (dma->suspended)
+                       continue;
+
+               if (dma->paused) {
+                       dma->suspended = true;
+
+                       ret = intel_free_stream(sdw, stream, dai, sdw->instance);
+                       if (ret < 0)
+                               return ret;
+               }
+       }
+
+       return 0;
+}
+
 static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
        .startup = intel_startup,
        .hw_params = intel_hw_params,
        .prepare = intel_prepare,
        .hw_free = intel_hw_free,
+       .trigger = intel_trigger,
        .shutdown = intel_shutdown,
        .set_sdw_stream = intel_pcm_set_sdw_stream,
        .get_sdw_stream = intel_get_sdw_stream,