stream.hdr.cmd |= SOF_IPC_STREAM_TRIG_RELEASE;
                break;
        case SNDRV_PCM_TRIGGER_RESUME:
+               if (spcm->stream[substream->stream].suspend_ignored) {
+                       /*
+                        * this case will be triggered when INFO_RESUME is
+                        * supported, no need to resume streams that remained
+                        * enabled in D0ix.
+                        */
+                       spcm->stream[substream->stream].suspend_ignored = false;
+                       return 0;
+               }
+
                /* set up hw_params */
                ret = sof_pcm_prepare(component, substream);
                if (ret < 0) {
 
                /* fallthrough */
        case SNDRV_PCM_TRIGGER_START:
+               if (spcm->stream[substream->stream].suspend_ignored) {
+                       /*
+                        * This case will be triggered when INFO_RESUME is
+                        * not supported, no need to re-start streams that
+                        * remained enabled in D0ix.
+                        */
+                       spcm->stream[substream->stream].suspend_ignored = false;
+                       return 0;
+               }
                stream.hdr.cmd |= SOF_IPC_STREAM_TRIG_START;
                break;
        case SNDRV_PCM_TRIGGER_SUSPEND:
+               if (sdev->s0_suspend &&
+                   spcm->stream[substream->stream].d0i3_compatible) {
+                       /*
+                        * trap the event, not sending trigger stop to
+                        * prevent the FW pipelines from being stopped,
+                        * and mark the flag to ignore the upcoming DAPM
+                        * PM events.
+                        */
+                       spcm->stream[substream->stream].suspend_ignored = true;
+                       return 0;
+               }
+               /* fallthrough */
        case SNDRV_PCM_TRIGGER_STOP:
                stream.hdr.cmd |= SOF_IPC_STREAM_TRIG_STOP;
                ipc_first = true;
 
                                  struct snd_kcontrol *k, int event)
 {
        struct snd_sof_widget *swidget = w->dobj.private;
+       int stream = SNDRV_PCM_STREAM_CAPTURE;
        struct snd_sof_dev *sdev;
+       struct snd_sof_pcm *spcm;
        int ret = 0;
 
        if (!swidget)
        dev_dbg(sdev->dev, "received event %d for widget %s\n",
                event, w->name);
 
+       /* get runtime PCM params using widget's stream name */
+       spcm = snd_sof_find_spcm_name(sdev, swidget->widget->sname);
+
        /* process events */
        switch (event) {
        case SND_SOC_DAPM_PRE_PMU:
+               if (spcm->stream[stream].suspend_ignored) {
+                       dev_dbg(sdev->dev, "PRE_PMU event ignored, KWD pipeline is already RUNNING\n");
+                       return 0;
+               }
+
                /* set pcm params */
-               ret = ipc_pcm_params(swidget, SOF_IPC_STREAM_CAPTURE);
+               ret = ipc_pcm_params(swidget, stream);
                if (ret < 0) {
                        dev_err(sdev->dev,
                                "error: failed to set pcm params for widget %s\n",
                                swidget->widget->name);
                break;
        case SND_SOC_DAPM_POST_PMD:
+               if (spcm->stream[stream].suspend_ignored) {
+                       dev_dbg(sdev->dev, "POST_PMD even ignored, KWD pipeline will remain RUNNING\n");
+                       return 0;
+               }
+
                /* stop trigger */
                ret = ipc_trigger(swidget, SOF_IPC_STREAM_TRIG_STOP);
                if (ret < 0)