aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJyri Sarha <jsarha@ti.com>2015-05-26 14:59:05 -0400
committerMark Brown <broonie@kernel.org>2015-06-02 16:09:11 -0400
commit3e0aa8d83bf8e6d414e538cf1046a3a7b48017bc (patch)
treec85a743cbe8eb09abdd803146e7e5b5bacc49615
parentd6b6c2ca6a2fbbb39051ec1d2763a947e3283683 (diff)
ASoC: core: If component doesn't have of_node use parent's node instead
If an ASoC component device does not have a device tree node, use its parent's node instead, when looking for a matching DAI based on a device tree reference. This allows video device drivers to register a separate child device for their ASoC side audio functionality. [And MFDs in general -- broonie] Signed-off-by: Jyri Sarha <jsarha@ti.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/soc-core.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 95414a2cec1b..80b7cf5ef69a 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -895,12 +895,17 @@ static struct snd_soc_dai *snd_soc_find_dai(
895{ 895{
896 struct snd_soc_component *component; 896 struct snd_soc_component *component;
897 struct snd_soc_dai *dai; 897 struct snd_soc_dai *dai;
898 struct device_node *component_of_node;
898 899
899 lockdep_assert_held(&client_mutex); 900 lockdep_assert_held(&client_mutex);
900 901
901 /* Find CPU DAI from registered DAIs*/ 902 /* Find CPU DAI from registered DAIs*/
902 list_for_each_entry(component, &component_list, list) { 903 list_for_each_entry(component, &component_list, list) {
903 if (dlc->of_node && component->dev->of_node != dlc->of_node) 904 component_of_node = component->dev->of_node;
905 if (!component_of_node && component->dev->parent)
906 component_of_node = component->dev->parent->of_node;
907
908 if (dlc->of_node && component_of_node != dlc->of_node)
904 continue; 909 continue;
905 if (dlc->name && strcmp(component->name, dlc->name)) 910 if (dlc->name && strcmp(component->name, dlc->name))
906 continue; 911 continue;
@@ -3480,11 +3485,16 @@ static int snd_soc_get_dai_name(struct of_phandle_args *args,
3480 const char **dai_name) 3485 const char **dai_name)
3481{ 3486{
3482 struct snd_soc_component *pos; 3487 struct snd_soc_component *pos;
3488 struct device_node *component_of_node;
3483 int ret = -EPROBE_DEFER; 3489 int ret = -EPROBE_DEFER;
3484 3490
3485 mutex_lock(&client_mutex); 3491 mutex_lock(&client_mutex);
3486 list_for_each_entry(pos, &component_list, list) { 3492 list_for_each_entry(pos, &component_list, list) {
3487 if (pos->dev->of_node != args->np) 3493 component_of_node = pos->dev->of_node;
3494 if (!component_of_node && pos->dev->parent)
3495 component_of_node = pos->dev->parent->of_node;
3496
3497 if (component_of_node != args->np)
3488 continue; 3498 continue;
3489 3499
3490 if (pos->driver->of_xlate_dai_name) { 3500 if (pos->driver->of_xlate_dai_name) {