diff options
author | Jyri Sarha <jsarha@ti.com> | 2015-05-26 21:59:05 +0300 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-06-02 21:09:11 +0100 |
commit | 3e0aa8d83bf8e6d414e538cf1046a3a7b48017bc (patch) | |
tree | c85a743cbe8eb09abdd803146e7e5b5bacc49615 /sound/soc | |
parent | d6b6c2ca6a2fbbb39051ec1d2763a947e3283683 (diff) | |
download | linux-3e0aa8d83bf8e6d414e538cf1046a3a7b48017bc.tar.bz2 |
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>
Diffstat (limited to 'sound/soc')
-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( { struct snd_soc_component *component; struct snd_soc_dai *dai; + struct device_node *component_of_node; lockdep_assert_held(&client_mutex); /* Find CPU DAI from registered DAIs*/ list_for_each_entry(component, &component_list, list) { - if (dlc->of_node && component->dev->of_node != dlc->of_node) + component_of_node = component->dev->of_node; + if (!component_of_node && component->dev->parent) + component_of_node = component->dev->parent->of_node; + + if (dlc->of_node && component_of_node != dlc->of_node) continue; if (dlc->name && strcmp(component->name, dlc->name)) continue; @@ -3480,11 +3485,16 @@ static int snd_soc_get_dai_name(struct of_phandle_args *args, const char **dai_name) { struct snd_soc_component *pos; + struct device_node *component_of_node; int ret = -EPROBE_DEFER; mutex_lock(&client_mutex); list_for_each_entry(pos, &component_list, list) { - if (pos->dev->of_node != args->np) + component_of_node = pos->dev->of_node; + if (!component_of_node && pos->dev->parent) + component_of_node = pos->dev->parent->of_node; + + if (component_of_node != args->np) continue; if (pos->driver->of_xlate_dai_name) { |