int snd_soc_dai_compress_new(struct snd_soc_dai *dai,
                             struct snd_soc_pcm_runtime *rtd, int num);
 bool snd_soc_dai_stream_valid(struct snd_soc_dai *dai, int stream);
+void snd_soc_dai_link_set_capabilities(struct snd_soc_dai_link *dai_link);
 void snd_soc_dai_action(struct snd_soc_dai *dai,
                        int stream, int action);
 static inline void snd_soc_dai_activate(struct snd_soc_dai *dai,
 
        if (ret < 0)
                goto out_put_node;
 
-       dai_link->dpcm_playback         = 1;
-       dai_link->dpcm_capture          = 1;
+       snd_soc_dai_link_set_capabilities(dai_link);
+
        dai_link->ops                   = &simple_ops;
        dai_link->init                  = asoc_simple_dai_init;
 
 
        return stream->channels_min;
 }
 
+/*
+ * snd_soc_dai_link_set_capabilities() - set dai_link properties based on its DAIs
+ */
+void snd_soc_dai_link_set_capabilities(struct snd_soc_dai_link *dai_link)
+{
+       struct snd_soc_dai_link_component *cpu;
+       struct snd_soc_dai_link_component *codec;
+       struct snd_soc_dai *dai;
+       bool supported[SNDRV_PCM_STREAM_LAST + 1];
+       int direction;
+       int i;
+
+       for_each_pcm_streams(direction) {
+               supported[direction] = true;
+
+               for_each_link_cpus(dai_link, i, cpu) {
+                       dai = snd_soc_find_dai(cpu);
+                       if (!dai || !snd_soc_dai_stream_valid(dai, direction)) {
+                               supported[direction] = false;
+                               break;
+                       }
+               }
+               if (!supported[direction])
+                       continue;
+               for_each_link_codecs(dai_link, i, codec) {
+                       dai = snd_soc_find_dai(codec);
+                       if (!dai || !snd_soc_dai_stream_valid(dai, direction)) {
+                               supported[direction] = false;
+                               break;
+                       }
+               }
+       }
+
+       dai_link->dpcm_playback = supported[SNDRV_PCM_STREAM_PLAYBACK];
+       dai_link->dpcm_capture  = supported[SNDRV_PCM_STREAM_CAPTURE];
+}
+EXPORT_SYMBOL_GPL(snd_soc_dai_link_set_capabilities);
+
 void snd_soc_dai_action(struct snd_soc_dai *dai,
                        int stream, int action)
 {