Merge remote-tracking branches 'asoc/topic/atmel', 'asoc/topic/chmap', 'asoc/topic...
[platform/kernel/linux-exynos.git] / sound / soc / soc-core.c
index 78fa425..4d9fb44 100644 (file)
@@ -1594,6 +1594,27 @@ static int soc_probe_dai(struct snd_soc_dai *dai, int order)
        return 0;
 }
 
+static int soc_link_dai_pcm_new(struct snd_soc_dai **dais, int num_dais,
+                               struct snd_soc_pcm_runtime *rtd)
+{
+       int i, ret = 0;
+
+       for (i = 0; i < num_dais; ++i) {
+               struct snd_soc_dai_driver *drv = dais[i]->driver;
+
+               if (!rtd->dai_link->no_pcm && drv->pcm_new)
+                       ret = drv->pcm_new(rtd, dais[i]);
+               if (ret < 0) {
+                       dev_err(dais[i]->dev,
+                               "ASoC: Failed to bind %s with pcm device\n",
+                               dais[i]->name);
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
 static int soc_link_dai_widgets(struct snd_soc_card *card,
                                struct snd_soc_dai_link *dai_link,
                                struct snd_soc_pcm_runtime *rtd)
@@ -1705,6 +1726,13 @@ static int soc_probe_link_dais(struct snd_soc_card *card,
                                       dai_link->stream_name, ret);
                                return ret;
                        }
+                       ret = soc_link_dai_pcm_new(&cpu_dai, 1, rtd);
+                       if (ret < 0)
+                               return ret;
+                       ret = soc_link_dai_pcm_new(rtd->codec_dais,
+                                                  rtd->num_codecs, rtd);
+                       if (ret < 0)
+                               return ret;
                } else {
                        INIT_DELAYED_WORK(&rtd->delayed_work,
                                                codec2codec_close_delayed_work);