static int hda_ipc4_pre_trigger(struct snd_sof_dev *sdev, struct snd_soc_dai *cpu_dai,
                                struct snd_pcm_substream *substream, int cmd)
 {
+       struct sof_ipc4_fw_data *ipc4_data = sdev->private;
        struct snd_sof_widget *pipe_widget;
        struct sof_ipc4_pipeline *pipeline;
        struct snd_sof_widget *swidget;
        pipe_widget = swidget->spipe->pipe_widget;
        pipeline = pipe_widget->private;
 
+       mutex_lock(&ipc4_data->pipeline_state_mutex);
+
        switch (cmd) {
        case SNDRV_PCM_TRIGGER_START:
        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
                ret = sof_ipc4_set_pipeline_state(sdev, pipe_widget->instance_id,
                                                  SOF_IPC4_PIPE_PAUSED);
                if (ret < 0)
-                       return ret;
+                       goto out;
 
                pipeline->state = SOF_IPC4_PIPE_PAUSED;
                break;
                dev_err(sdev->dev, "unknown trigger command %d\n", cmd);
                return -EINVAL;
        }
-
+out:
+       mutex_unlock(&ipc4_data->pipeline_state_mutex);
        return 0;
 }
 
 static int hda_ipc4_post_trigger(struct snd_sof_dev *sdev, struct snd_soc_dai *cpu_dai,
                                 struct snd_pcm_substream *substream, int cmd)
 {
+       struct sof_ipc4_fw_data *ipc4_data = sdev->private;
        struct snd_sof_widget *pipe_widget;
        struct sof_ipc4_pipeline *pipeline;
        struct snd_sof_widget *swidget;
        struct snd_soc_dapm_widget *w;
-       int ret;
+       int ret = 0;
 
        w = snd_soc_dai_get_widget(cpu_dai, substream->stream);
        swidget = w->dobj.private;
        pipe_widget = swidget->spipe->pipe_widget;
        pipeline = pipe_widget->private;
 
+       mutex_lock(&ipc4_data->pipeline_state_mutex);
+
        switch (cmd) {
        case SNDRV_PCM_TRIGGER_START:
-       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
                if (pipeline->state != SOF_IPC4_PIPE_PAUSED) {
                        ret = sof_ipc4_set_pipeline_state(sdev, pipe_widget->instance_id,
                                                          SOF_IPC4_PIPE_PAUSED);
                        if (ret < 0)
-                               return ret;
+                               goto out;
                        pipeline->state = SOF_IPC4_PIPE_PAUSED;
                }
 
                ret = sof_ipc4_set_pipeline_state(sdev, pipe_widget->instance_id,
                                                  SOF_IPC4_PIPE_RUNNING);
                if (ret < 0)
-                       return ret;
+                       goto out;
                pipeline->state = SOF_IPC4_PIPE_RUNNING;
+               swidget->spipe->started_count++;
                break;
-       case SNDRV_PCM_TRIGGER_SUSPEND:
-       case SNDRV_PCM_TRIGGER_STOP:
-       {
+       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
                ret = sof_ipc4_set_pipeline_state(sdev, pipe_widget->instance_id,
-                                                 SOF_IPC4_PIPE_RESET);
+                                                 SOF_IPC4_PIPE_RUNNING);
                if (ret < 0)
-                       return ret;
-
-               pipeline->state = SOF_IPC4_PIPE_RESET;
+                       goto out;
+               pipeline->state = SOF_IPC4_PIPE_RUNNING;
+               break;
+       case SNDRV_PCM_TRIGGER_SUSPEND:
+       case SNDRV_PCM_TRIGGER_STOP:
+               /*
+                * STOP/SUSPEND trigger is invoked only once when all users of this pipeline have
+                * been stopped. So, clear the started_count so that the pipeline can be reset
+                */
+               swidget->spipe->started_count = 0;
                break;
-       }
        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
                break;
        default:
                dev_err(sdev->dev, "unknown trigger command %d\n", cmd);
-               return -EINVAL;
+               ret = -EINVAL;
+               break;
        }
-
-       return 0;
+out:
+       mutex_unlock(&ipc4_data->pipeline_state_mutex);
+       return ret;
 }
 
 static const struct hda_dai_widget_dma_ops hda_ipc4_dma_ops = {