|
@@ -764,8 +764,13 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
|
|
|
}
|
|
|
/* no, then find CPU DAI from registered DAIs*/
|
|
|
list_for_each_entry(cpu_dai, &dai_list, list) {
|
|
|
- if (strcmp(cpu_dai->name, dai_link->cpu_dai_name))
|
|
|
- continue;
|
|
|
+ if (dai_link->cpu_dai_of_node) {
|
|
|
+ if (cpu_dai->dev->of_node != dai_link->cpu_dai_of_node)
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+ if (strcmp(cpu_dai->name, dai_link->cpu_dai_name))
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
rtd->cpu_dai = cpu_dai;
|
|
|
goto find_codec;
|
|
@@ -781,8 +786,13 @@ find_codec:
|
|
|
|
|
|
/* no, then find CODEC from registered CODECs*/
|
|
|
list_for_each_entry(codec, &codec_list, list) {
|
|
|
- if (strcmp(codec->name, dai_link->codec_name))
|
|
|
- continue;
|
|
|
+ if (dai_link->codec_of_node) {
|
|
|
+ if (codec->dev->of_node != dai_link->codec_of_node)
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+ if (strcmp(codec->name, dai_link->codec_name))
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
rtd->codec = codec;
|
|
|
|
|
@@ -814,13 +824,19 @@ find_platform:
|
|
|
|
|
|
/* if there's no platform we match on the empty platform */
|
|
|
platform_name = dai_link->platform_name;
|
|
|
- if (!platform_name)
|
|
|
+ if (!platform_name && !dai_link->platform_of_node)
|
|
|
platform_name = "snd-soc-dummy";
|
|
|
|
|
|
/* no, then find one from the set of registered platforms */
|
|
|
list_for_each_entry(platform, &platform_list, list) {
|
|
|
- if (strcmp(platform->name, platform_name))
|
|
|
- continue;
|
|
|
+ if (dai_link->platform_of_node) {
|
|
|
+ if (platform->dev->of_node !=
|
|
|
+ dai_link->platform_of_node)
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+ if (strcmp(platform->name, platform_name))
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
rtd->platform = platform;
|
|
|
goto out;
|
|
@@ -2831,6 +2847,40 @@ int snd_soc_register_card(struct snd_soc_card *card)
|
|
|
if (!card->name || !card->dev)
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ for (i = 0; i < card->num_links; i++) {
|
|
|
+ struct snd_soc_dai_link *link = &card->dai_link[i];
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Codec must be specified by 1 of name or OF node,
|
|
|
+ * not both or neither.
|
|
|
+ */
|
|
|
+ if (!!link->codec_name == !!link->codec_of_node) {
|
|
|
+ dev_err(card->dev,
|
|
|
+ "Neither/both codec name/of_node are set\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Platform may be specified by either name or OF node, but
|
|
|
+ * can be left unspecified, and a dummy platform will be used.
|
|
|
+ */
|
|
|
+ if (link->platform_name && link->platform_of_node) {
|
|
|
+ dev_err(card->dev,
|
|
|
+ "Both platform name/of_node are set\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * CPU DAI must be specified by 1 of name or OF node,
|
|
|
+ * not both or neither.
|
|
|
+ */
|
|
|
+ if (!!link->cpu_dai_name == !!link->cpu_dai_of_node) {
|
|
|
+ dev_err(card->dev,
|
|
|
+ "Neither/both cpu_dai name/of_node are set\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
dev_set_drvdata(card->dev, card);
|
|
|
|
|
|
snd_soc_initialize_card_lists(card);
|