Commit 3e0aa8d8 authored by Jyri Sarha's avatar Jyri Sarha Committed by Mark Brown

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: default avatarJyri Sarha <jsarha@ti.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent d6b6c2ca
...@@ -895,12 +895,17 @@ static struct snd_soc_dai *snd_soc_find_dai( ...@@ -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, ...@@ -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) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment