|
@@ -1593,6 +1593,27 @@ static int soc_probe_dai(struct snd_soc_dai *dai, int order)
|
|
return 0;
|
|
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,
|
|
static int soc_link_dai_widgets(struct snd_soc_card *card,
|
|
struct snd_soc_dai_link *dai_link,
|
|
struct snd_soc_dai_link *dai_link,
|
|
struct snd_soc_pcm_runtime *rtd)
|
|
struct snd_soc_pcm_runtime *rtd)
|
|
@@ -1704,6 +1725,13 @@ static int soc_probe_link_dais(struct snd_soc_card *card,
|
|
dai_link->stream_name, ret);
|
|
dai_link->stream_name, ret);
|
|
return 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 {
|
|
} else {
|
|
INIT_DELAYED_WORK(&rtd->delayed_work,
|
|
INIT_DELAYED_WORK(&rtd->delayed_work,
|
|
codec2codec_close_delayed_work);
|
|
codec2codec_close_delayed_work);
|