be->dpcm[stream].state = SND_SOC_DPCM_STATE_CLOSE;
                        goto unwind;
                }
-
+               be->dpcm[stream].be_start = 0;
                be->dpcm[stream].state = SND_SOC_DPCM_STATE_OPEN;
                count++;
        }
 
                switch (cmd) {
                case SNDRV_PCM_TRIGGER_START:
-                       if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
+                       if (!be->dpcm[stream].be_start &&
+                           (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
                            (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
                            (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
                                goto next;
 
+                       be->dpcm[stream].be_start++;
+                       if (be->dpcm[stream].be_start != 1)
+                               goto next;
+
                        ret = soc_pcm_trigger(be_substream, cmd);
-                       if (ret)
+                       if (ret) {
+                               be->dpcm[stream].be_start--;
                                goto next;
+                       }
 
                        be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
                        break;
                        if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND))
                                goto next;
 
+                       be->dpcm[stream].be_start++;
+                       if (be->dpcm[stream].be_start != 1)
+                               goto next;
+
                        ret = soc_pcm_trigger(be_substream, cmd);
-                       if (ret)
+                       if (ret) {
+                               be->dpcm[stream].be_start--;
                                goto next;
+                       }
 
                        be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
                        break;
                        if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
                                goto next;
 
+                       be->dpcm[stream].be_start++;
+                       if (be->dpcm[stream].be_start != 1)
+                               goto next;
+
                        ret = soc_pcm_trigger(be_substream, cmd);
-                       if (ret)
+                       if (ret) {
+                               be->dpcm[stream].be_start--;
                                goto next;
+                       }
 
                        be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
                        break;
                            (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
                                goto next;
 
-                       if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
+                       if (be->dpcm[stream].state == SND_SOC_DPCM_STATE_START)
+                               be->dpcm[stream].be_start--;
+
+                       if (be->dpcm[stream].be_start != 0)
                                goto next;
 
                        ret = soc_pcm_trigger(be_substream, cmd);
-                       if (ret)
+                       if (ret) {
+                               if (be->dpcm[stream].state == SND_SOC_DPCM_STATE_START)
+                                       be->dpcm[stream].be_start++;
                                goto next;
+                       }
 
                        be->dpcm[stream].state = SND_SOC_DPCM_STATE_STOP;
                        break;
                        if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
                                goto next;
 
-                       if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
+                       be->dpcm[stream].be_start--;
+                       if (be->dpcm[stream].be_start != 0)
                                goto next;
 
                        ret = soc_pcm_trigger(be_substream, cmd);
-                       if (ret)
+                       if (ret) {
+                               be->dpcm[stream].be_start++;
                                goto next;
+                       }
 
                        be->dpcm[stream].state = SND_SOC_DPCM_STATE_SUSPEND;
                        break;
                        if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
                                goto next;
 
-                       if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
+                       be->dpcm[stream].be_start--;
+                       if (be->dpcm[stream].be_start != 0)
                                goto next;
 
                        ret = soc_pcm_trigger(be_substream, cmd);
-                       if (ret)
+                       if (ret) {
+                               be->dpcm[stream].be_start++;
                                goto next;
+                       }
 
                        be->dpcm[stream].state = SND_SOC_DPCM_STATE_PAUSED;
                        break;