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++;
        }
        int ret = 0;
        unsigned long flags;
        enum snd_soc_dpcm_state state;
+       bool do_trigger;
 
        for_each_dpcm_be(fe, stream, dpcm) {
                struct snd_pcm_substream *be_substream;
                dev_dbg(be->dev, "ASoC: trigger BE %s cmd %d\n",
                        be->dai_link->name, cmd);
 
+               do_trigger = false;
                switch (cmd) {
                case SNDRV_PCM_TRIGGER_START:
                        spin_lock_irqsave(&fe->card->dpcm_lock, flags);
                                continue;
                        }
                        state = be->dpcm[stream].state;
+                       if (be->dpcm[stream].be_start == 0)
+                               do_trigger = true;
+                       be->dpcm[stream].be_start++;
                        be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
                        spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
 
+                       if (!do_trigger)
+                               continue;
+
                        ret = soc_pcm_trigger(be_substream, cmd);
                        if (ret) {
                                spin_lock_irqsave(&fe->card->dpcm_lock, flags);
                                be->dpcm[stream].state = state;
+                               be->dpcm[stream].be_start--;
                                spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
                                goto end;
                        }
                        }
 
                        state = be->dpcm[stream].state;
+                       if (be->dpcm[stream].be_start == 0)
+                               do_trigger = true;
+                       be->dpcm[stream].be_start++;
                        be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
                        spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
 
+                       if (!do_trigger)
+                               continue;
+
                        ret = soc_pcm_trigger(be_substream, cmd);
                        if (ret) {
                                spin_lock_irqsave(&fe->card->dpcm_lock, flags);
                                be->dpcm[stream].state = state;
+                               be->dpcm[stream].be_start--;
                                spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
                                goto end;
                        }
                        }
 
                        state = be->dpcm[stream].state;
+                       if (be->dpcm[stream].be_start == 0)
+                               do_trigger = true;
+                       be->dpcm[stream].be_start++;
                        be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
                        spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
 
+                       if (!do_trigger)
+                               continue;
+
                        ret = soc_pcm_trigger(be_substream, cmd);
                        if (ret) {
                                spin_lock_irqsave(&fe->card->dpcm_lock, flags);
                                be->dpcm[stream].state = state;
+                               be->dpcm[stream].be_start--;
                                spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
                                goto end;
                        }
                                spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
                                continue;
                        }
+                       if ((be->dpcm[stream].state == SND_SOC_DPCM_STATE_START &&
+                            be->dpcm[stream].be_start == 1) ||
+                           (be->dpcm[stream].state == SND_SOC_DPCM_STATE_PAUSED &&
+                            be->dpcm[stream].be_start == 0))
+                               do_trigger = true;
+                       be->dpcm[stream].be_start--;
                        spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
 
-                       if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
+                       if (!do_trigger)
                                continue;
 
                        spin_lock_irqsave(&fe->card->dpcm_lock, flags);
                        if (ret) {
                                spin_lock_irqsave(&fe->card->dpcm_lock, flags);
                                be->dpcm[stream].state = state;
+                               be->dpcm[stream].be_start++;
                                spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
                                goto end;
                        }
                                spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
                                continue;
                        }
+                       if (be->dpcm[stream].be_start == 1)
+                               do_trigger = true;
+                       be->dpcm[stream].be_start--;
                        spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
 
-                       if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
+                       if (!do_trigger)
                                continue;
 
                        spin_lock_irqsave(&fe->card->dpcm_lock, flags);
                        if (ret) {
                                spin_lock_irqsave(&fe->card->dpcm_lock, flags);
                                be->dpcm[stream].state = state;
+                               be->dpcm[stream].be_start++;
                                spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
                                goto end;
                        }
                                spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
                                continue;
                        }
+                       if (be->dpcm[stream].be_start == 1)
+                               do_trigger = true;
+                       be->dpcm[stream].be_start--;
                        spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
 
-                       if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
+                       if (!do_trigger)
                                continue;
 
                        spin_lock_irqsave(&fe->card->dpcm_lock, flags);
                        if (ret) {
                                spin_lock_irqsave(&fe->card->dpcm_lock, flags);
                                be->dpcm[stream].state = state;
+                               be->dpcm[stream].be_start++;
                                spin_unlock_irqrestore(&fe->card->dpcm_lock, flags);
                                goto end;
                        }