dpcm->fe = fe;
        be->dpcm[stream].runtime = fe->dpcm[stream].runtime;
        dpcm->state = SND_SOC_DPCM_LINK_STATE_NEW;
+       spin_lock(&fe->card->dpcm_lock);
        list_add(&dpcm->list_be, &fe->dpcm[stream].be_clients);
        list_add(&dpcm->list_fe, &be->dpcm[stream].fe_clients);
+       spin_unlock(&fe->card->dpcm_lock);
 
        dev_dbg(fe->dev, "connected new DPCM %s path %s %s %s\n",
                        stream ? "capture" : "playback",  fe->dai_link->name,
 #ifdef CONFIG_DEBUG_FS
                debugfs_remove(dpcm->debugfs_state);
 #endif
+               spin_lock(&fe->card->dpcm_lock);
                list_del(&dpcm->list_be);
                list_del(&dpcm->list_fe);
+               spin_unlock(&fe->card->dpcm_lock);
                kfree(dpcm);
        }
 }
 {
        struct snd_soc_dpcm *dpcm;
 
+       spin_lock(&fe->card->dpcm_lock);
        for_each_dpcm_be(fe, stream, dpcm)
                dpcm->be->dpcm[stream].runtime_update =
                                                SND_SOC_DPCM_UPDATE_NO;
+       spin_unlock(&fe->card->dpcm_lock);
 }
 
 static void dpcm_be_dai_startup_unwind(struct snd_soc_pcm_runtime *fe,
        dpcm_be_dai_shutdown(fe, stream);
 disconnect:
        /* disconnect any non started BEs */
+       spin_lock(&fe->card->dpcm_lock);
        for_each_dpcm_be(fe, stream, dpcm) {
                struct snd_soc_pcm_runtime *be = dpcm->be;
                if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
                                dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
        }
+       spin_unlock(&fe->card->dpcm_lock);
 
        return ret;
 }
 {
        struct snd_soc_dpcm *dpcm;
        int state;
+       int ret = 1;
 
+       spin_lock(&fe->card->dpcm_lock);
        for_each_dpcm_fe(be, stream, dpcm) {
 
                if (dpcm->fe == fe)
                state = dpcm->fe->dpcm[stream].state;
                if (state == SND_SOC_DPCM_STATE_START ||
                        state == SND_SOC_DPCM_STATE_PAUSED ||
-                       state == SND_SOC_DPCM_STATE_SUSPEND)
-                       return 0;
+                       state == SND_SOC_DPCM_STATE_SUSPEND) {
+                       ret = 0;
+                       break;
+               }
        }
+       spin_unlock(&fe->card->dpcm_lock);
 
        /* it's safe to free/stop this BE DAI */
-       return 1;
+       return ret;
 }
 EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_free_stop);
 
 {
        struct snd_soc_dpcm *dpcm;
        int state;
+       int ret = 1;
 
+       spin_lock(&fe->card->dpcm_lock);
        for_each_dpcm_fe(be, stream, dpcm) {
 
                if (dpcm->fe == fe)
                if (state == SND_SOC_DPCM_STATE_START ||
                        state == SND_SOC_DPCM_STATE_PAUSED ||
                        state == SND_SOC_DPCM_STATE_SUSPEND ||
-                       state == SND_SOC_DPCM_STATE_PREPARE)
-                       return 0;
+                       state == SND_SOC_DPCM_STATE_PREPARE) {
+                       ret = 0;
+                       break;
+               }
        }
+       spin_unlock(&fe->card->dpcm_lock);
 
        /* it's safe to change hw_params */
-       return 1;
+       return ret;
 }
 EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_params);
 
                goto out;
        }
 
+       spin_lock(&fe->card->dpcm_lock);
        for_each_dpcm_be(fe, stream, dpcm) {
                struct snd_soc_pcm_runtime *be = dpcm->be;
                params = &dpcm->hw_params;
                                params_channels(params),
                                params_rate(params));
        }
-
+       spin_unlock(&fe->card->dpcm_lock);
 out:
        return offset;
 }