From 9d0e56dc98cf62b006b14f1004551ae6743a16df Mon Sep 17 00:00:00 2001 From: Stephen Warren Date: Wed, 21 Dec 2011 10:40:59 -0700 Subject: [PATCH] --- yaml --- r: 283997 b: refs/heads/master c: 5a5049637cf08c4c17805be679c19544bb27fb92 h: refs/heads/master i: 283995: 7a33815e8fa3093a02613d88404e2ca87b56bbd9 v: v3 --- [refs] | 2 +- trunk/include/sound/soc.h | 4 +++ trunk/sound/soc/soc-core.c | 64 +++++++++++++++++++++++++++++++++----- 3 files changed, 62 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index 1b0bd7d733a6..df99192c07d5 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 82150101df27c0f3d315b597081b9fa0e23cd002 +refs/heads/master: 5a5049637cf08c4c17805be679c19544bb27fb92 diff --git a/trunk/include/sound/soc.h b/trunk/include/sound/soc.h index db8acd299043..8391b0ec217e 100644 --- a/trunk/include/sound/soc.h +++ b/trunk/include/sound/soc.h @@ -231,6 +231,7 @@ enum snd_soc_bias_level { SND_SOC_BIAS_ON = 3, }; +struct device_node; struct snd_jack; struct snd_soc_card; struct snd_soc_pcm_stream; @@ -703,8 +704,11 @@ struct snd_soc_dai_link { const char *name; /* Codec name */ const char *stream_name; /* Stream name */ const char *codec_name; /* for multi-codec */ + const struct device_node *codec_of_node; const char *platform_name; /* for multi-platform */ + const struct device_node *platform_of_node; const char *cpu_dai_name; + const struct device_node *cpu_dai_of_node; const char *codec_dai_name; unsigned int dai_fmt; /* format to set on init */ diff --git a/trunk/sound/soc/soc-core.c b/trunk/sound/soc/soc-core.c index 42ad2db8f082..a4592cbee49b 100644 --- a/trunk/sound/soc/soc-core.c +++ b/trunk/sound/soc/soc-core.c @@ -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 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num) /* 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 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num) /* 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);