return -ENOMEM;
 
        if (rtd->dai_link->dynamic) {
+               int playback = 1;
+               int capture  = 1;
+
+               if (rtd->dai_link->capture_only)
+                       playback = 0;
+               if (rtd->dai_link->playback_only)
+                       capture = 0;
+
                snprintf(new_name, sizeof(new_name), "(%s)",
                        rtd->dai_link->stream_name);
 
                ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num,
-                               rtd->dai_link->dpcm_playback,
-                               rtd->dai_link->dpcm_capture, &be_pcm);
+                               playback, capture, &be_pcm);
                if (ret < 0) {
                        dev_err(rtd->card->dev,
                                "Compress ASoC: can't create compressed for %s: %d\n",
 
                rtd->pcm = be_pcm;
                rtd->fe_compr = 1;
-               if (rtd->dai_link->dpcm_playback)
+               if (playback)
                        be_pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd;
-               if (rtd->dai_link->dpcm_capture)
+               if (capture)
                        be_pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd;
                memcpy(compr->ops, &soc_compr_dyn_ops, sizeof(soc_compr_dyn_ops));
        } else {