{
        struct snd_soc_dpcm *dpcm;
 
-       list_for_each_entry(dpcm, &fe->dpcm[dir].be_clients, list_be) {
+       for_each_dpcm_be(fe, dir, dpcm) {
 
                struct snd_soc_pcm_runtime *be = dpcm->be;
 
        struct snd_soc_dpcm *dpcm;
 
        /* only add new dpcms */
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be(fe, stream, dpcm) {
                if (dpcm->be == be && dpcm->fe == fe)
                        return 0;
        }
 {
        struct snd_soc_dpcm *dpcm, *d;
 
-       list_for_each_entry_safe(dpcm, d, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be_safe(fe, stream, dpcm, d) {
                dev_dbg(fe->dev, "ASoC: BE %s disconnect check for %s\n",
                                stream ? "capture" : "playback",
                                dpcm->be->dai_link->name);
        int prune = 0;
 
        /* Destroy any old FE <--> BE connections */
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be(fe, stream, dpcm) {
                unsigned int i;
 
                /* is there a valid CPU DAI widget for this BE */
 {
        struct snd_soc_dpcm *dpcm;
 
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be)
+       for_each_dpcm_be(fe, stream, dpcm)
                dpcm->be->dpcm[stream].runtime_update =
                                                SND_SOC_DPCM_UPDATE_NO;
 }
        struct snd_soc_dpcm *dpcm;
 
        /* disable any enabled and non active backends */
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be(fe, stream, dpcm) {
 
                struct snd_soc_pcm_runtime *be = dpcm->be;
                struct snd_pcm_substream *be_substream =
        int err, count = 0;
 
        /* only startup BE DAIs that are either sinks or sources to this FE DAI */
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be(fe, stream, dpcm) {
 
                struct snd_soc_pcm_runtime *be = dpcm->be;
                struct snd_pcm_substream *be_substream =
 
 unwind:
        /* disable any enabled and non active backends */
-       list_for_each_entry_continue_reverse(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be_rollback(fe, stream, dpcm) {
                struct snd_soc_pcm_runtime *be = dpcm->be;
                struct snd_pcm_substream *be_substream =
                        snd_soc_dpcm_get_substream(be, stream);
         * if FE want to use it (= dpcm_merged_format)
         */
 
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be(fe, stream, dpcm) {
                struct snd_soc_pcm_runtime *be = dpcm->be;
                struct snd_soc_dai_driver *codec_dai_drv;
                struct snd_soc_pcm_stream *codec_stream;
         * if FE want to use it (= dpcm_merged_chan)
         */
 
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be(fe, stream, dpcm) {
                struct snd_soc_pcm_runtime *be = dpcm->be;
                struct snd_soc_dai_driver *cpu_dai_drv =  be->cpu_dai->driver;
                struct snd_soc_dai_driver *codec_dai_drv;
         * if FE want to use it (= dpcm_merged_chan)
         */
 
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be(fe, stream, dpcm) {
                struct snd_soc_pcm_runtime *be = dpcm->be;
                struct snd_soc_dai_driver *cpu_dai_drv =  be->cpu_dai->driver;
                struct snd_soc_dai_driver *codec_dai_drv;
        }
 
        /* apply symmetry for BE */
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be(fe, stream, dpcm) {
                struct snd_soc_pcm_runtime *be = dpcm->be;
                struct snd_pcm_substream *be_substream =
                        snd_soc_dpcm_get_substream(be, stream);
        struct snd_soc_dpcm *dpcm;
 
        /* only shutdown BEs that are either sinks or sources to this FE DAI */
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be(fe, stream, dpcm) {
 
                struct snd_soc_pcm_runtime *be = dpcm->be;
                struct snd_pcm_substream *be_substream =
 
        /* only hw_params backends that are either sinks or sources
         * to this frontend DAI */
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be(fe, stream, dpcm) {
 
                struct snd_soc_pcm_runtime *be = dpcm->be;
                struct snd_pcm_substream *be_substream =
        struct snd_soc_dpcm *dpcm;
        int ret;
 
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be(fe, stream, dpcm) {
 
                struct snd_soc_pcm_runtime *be = dpcm->be;
                struct snd_pcm_substream *be_substream =
 
 unwind:
        /* disable any enabled and non active backends */
-       list_for_each_entry_continue_reverse(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be_rollback(fe, stream, dpcm) {
                struct snd_soc_pcm_runtime *be = dpcm->be;
                struct snd_pcm_substream *be_substream =
                        snd_soc_dpcm_get_substream(be, stream);
        struct snd_soc_dpcm *dpcm;
        int ret = 0;
 
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be(fe, stream, dpcm) {
 
                struct snd_soc_pcm_runtime *be = dpcm->be;
                struct snd_pcm_substream *be_substream =
        struct snd_soc_dpcm *dpcm;
        int ret = 0;
 
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be(fe, stream, dpcm) {
 
                struct snd_soc_pcm_runtime *be = dpcm->be;
                struct snd_pcm_substream *be_substream =
        dpcm_be_dai_shutdown(fe, stream);
 disconnect:
        /* disconnect any non started BEs */
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       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;
 int soc_dpcm_be_digital_mute(struct snd_soc_pcm_runtime *fe, int mute)
 {
        struct snd_soc_dpcm *dpcm;
-       struct list_head *clients =
-               &fe->dpcm[SNDRV_PCM_STREAM_PLAYBACK].be_clients;
        struct snd_soc_dai *dai;
 
-       list_for_each_entry(dpcm, clients, list_be) {
+       for_each_dpcm_be(fe, SNDRV_PCM_STREAM_PLAYBACK, dpcm) {
 
                struct snd_soc_pcm_runtime *be = dpcm->be;
                int i;
        ret = dpcm_fe_dai_startup(fe_substream);
        if (ret < 0) {
                /* clean up all links */
-               list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be)
+               for_each_dpcm_be(fe, stream, dpcm)
                        dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
 
                dpcm_be_disconnect(fe, stream);
        ret = dpcm_fe_dai_shutdown(fe_substream);
 
        /* mark FE's links ready to prune */
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be)
+       for_each_dpcm_be(fe, stream, dpcm)
                dpcm->state = SND_SOC_DPCM_LINK_STATE_FREE;
 
        dpcm_be_disconnect(fe, stream);
                goto out;
        }
 
-       list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+       for_each_dpcm_be(fe, stream, dpcm) {
                struct snd_soc_pcm_runtime *be = dpcm->be;
                params = &dpcm->hw_params;