diff options
author | Jyri Sarha <jsarha@ti.com> | 2015-05-26 14:59:05 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-06-02 16:09:11 -0400 |
commit | 3e0aa8d83bf8e6d414e538cf1046a3a7b48017bc (patch) | |
tree | c85a743cbe8eb09abdd803146e7e5b5bacc49615 | |
parent | d6b6c2ca6a2fbbb39051ec1d2763a947e3283683 (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.c | 14 |
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) { |