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>
This commit is contained in:
Jyri Sarha 2015-05-26 21:59:05 +03:00 committed by Mark Brown
parent d6b6c2ca6a
commit 3e0aa8d83b

View File

@ -895,12 +895,17 @@ static struct snd_soc_dai *snd_soc_find_dai(
{ {
struct snd_soc_component *component; struct snd_soc_component *component;
struct snd_soc_dai *dai; struct snd_soc_dai *dai;
struct device_node *component_of_node;
lockdep_assert_held(&client_mutex); lockdep_assert_held(&client_mutex);
/* Find CPU DAI from registered DAIs*/ /* Find CPU DAI from registered DAIs*/
list_for_each_entry(component, &component_list, list) { 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; continue;
if (dlc->name && strcmp(component->name, dlc->name)) if (dlc->name && strcmp(component->name, dlc->name))
continue; continue;
@ -3480,11 +3485,16 @@ static int snd_soc_get_dai_name(struct of_phandle_args *args,
const char **dai_name) const char **dai_name)
{ {
struct snd_soc_component *pos; struct snd_soc_component *pos;
struct device_node *component_of_node;
int ret = -EPROBE_DEFER; int ret = -EPROBE_DEFER;
mutex_lock(&client_mutex); mutex_lock(&client_mutex);
list_for_each_entry(pos, &component_list, list) { 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; continue;
if (pos->driver->of_xlate_dai_name) { if (pos->driver->of_xlate_dai_name) {