void snd_soc_dai_resume(struct snd_soc_dai *dai);
 int snd_soc_dai_probe(struct snd_soc_dai *dai);
 int snd_soc_dai_remove(struct snd_soc_dai *dai);
+int snd_soc_dai_compress_new(struct snd_soc_dai *dai,
+                            struct snd_soc_pcm_runtime *rtd, int num);
 
 struct snd_soc_dai_ops {
        /*
 
                        num = rtd->dai_link->id;
        }
 
-       if (cpu_dai->driver->compress_new) {
-               /* create compress_device" */
-               ret = cpu_dai->driver->compress_new(rtd, num);
-               if (ret < 0) {
+       /* create compress_device if possible */
+       ret = snd_soc_dai_compress_new(cpu_dai, rtd, num);
+       if (ret != -ENOTSUPP) {
+               if (ret < 0)
                        dev_err(card->dev, "ASoC: can't create compress %s\n",
                                         dai_link->stream_name);
-                       return ret;
-               }
-       } else if (!dai_link->params) {
+               return ret;
+       }
+
+       if (!dai_link->params) {
                /* create the pcm */
                ret = soc_new_pcm(rtd, num);
                if (ret < 0) {
 
                return dai->driver->remove(dai);
        return 0;
 }
+
+int snd_soc_dai_compress_new(struct snd_soc_dai *dai,
+                            struct snd_soc_pcm_runtime *rtd, int num)
+{
+       if (dai->driver->compress_new)
+               return dai->driver->compress_new(rtd, num);
+       return -ENOTSUPP;
+}