[alsa-devel] [PATCH v4 6/9] ASoC: add snd_soc_get_dai_id()

Kuninori Morimoto kuninori.morimoto.gx at renesas.com
Mon Apr 10 02:45:20 CEST 2017


Hi Rob, again

> > >> > +{
> > >> > +       struct device_node *node;
> > >> > +       struct device_node *endpoint;
> > >> > +       int i, id;
> > >> > +
> > >> > +       node = of_graph_get_port_parent(ep);
> > >> > +
> > >> > +       i = 0;
> > >> > +       id = -1;
> > >> > +       for_each_endpoint_of_node(node, endpoint) {
> > >> > +               if (endpoint == ep)
> > >> > +                       id = i;
> > >>
> > >> I don't see how this works when you have 1 DAI controller with
> > >> multiple endpoints versus multiple DAI controllers with a single
> > >> endpoint each. All the IDs will be 0 in the latter case.
> > >
> > > It support 1:1 endpoint pattern only.
> > 
> > Then the endpoint id is always 0 and this function is pointless.
> 
> Sorry, I checked my patch-list, and I noticed that
> this function will be expand to use callback function in next
> patch-set (= HDMI support).
> Thus, inded current function is pointless at this point.
> I will merge this expansion patch in v5

1 correction.

sound graph might have multi ports (= not multi endpoint), like below.
Each endpoints are 1:1.

ports {
	port { endpoint }; /* ID = 0 */
	port { endpoint }; /* ID = 1 */
	port { endpoint }; /* ID = 2 */
};

1 question

It will support HDMI sound feature, thus I separated
it into OF-graph (= this patch-set) and HDMI (= next patch-set).
Should I merge it ?
Below is the expansion patch for HDMI support

----------------------
Subject: [PATCH 14/63] ASoC: add .of_xlate_dai_id() callback

ALSA SoC needs to know connected DAI ID for probing.
It is not a big problem if device/driver was only for sound,
but getting DAI ID will be difficult if device includes both
Video/Sound, like HDMI.
To solve this issue, this patch adds new .of_xlate_dai_id callback
on component driver, and use it from snd_soc_get_dai_id()

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
---
 include/sound/soc.h  |  3 +++
 sound/soc/soc-core.c | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/include/sound/soc.h b/include/sound/soc.h
index 95abbcb..0055fa0 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -14,6 +14,7 @@
 #define __LINUX_SND_SOC_H
 
 #include <linux/of.h>
+#include <linux/of_graph.h>
 #include <linux/platform_device.h>
 #include <linux/types.h>
 #include <linux/notifier.h>
@@ -793,6 +794,8 @@ struct snd_soc_component_driver {
 	int (*of_xlate_dai_name)(struct snd_soc_component *component,
 				 struct of_phandle_args *args,
 				 const char **dai_name);
+	int (*of_xlate_dai_id)(struct snd_soc_component *comment,
+			       struct device_node *endpoint);
 	void (*seq_notifier)(struct snd_soc_component *, enum snd_soc_dapm_type,
 		int subseq);
 	int (*stream_event)(struct snd_soc_component *, int event);
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 7a10522..07e4eec 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -4042,12 +4042,45 @@ unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
 
 int snd_soc_get_dai_id(struct device_node *ep)
 {
+	struct snd_soc_component *pos;
 	struct device_node *node;
 	struct device_node *endpoint;
 	int i, id;
+	int ret;
 
 	node = of_graph_get_port_parent(ep);
 
+	/*
+	 * For example HDMI case, HDMI has video/sound port,
+	 * but ALSA SoC needs sound port number only.
+	 * Thus counting HDMI DT port/endpoint doesn't work.
+	 * Then, it should have .of_xlate_dai_id
+	 */
+	ret = -ENOTSUPP;
+	mutex_lock(&client_mutex);
+	list_for_each_entry(pos, &component_list, list) {
+		struct device_node *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 != node)
+			continue;
+
+		if (pos->driver->of_xlate_dai_id)
+			ret = pos->driver->of_xlate_dai_id(pos, ep);
+
+		break;
+	}
+	mutex_unlock(&client_mutex);
+
+	if (ret != -ENOTSUPP)
+		return ret;
+
+	/*
+	 * Non HDMI sound case, counting port/endpoint on its DT
+	 * is enough. Let's count it.
+	 */
 	i = 0;
 	id = -1;
 	for_each_endpoint_of_node(node, endpoint) {
-- 
1.9.1

----------------------

Best regards
---
Kuninori Morimoto


More information about the Alsa-devel mailing list