From: Kuninori Morimoto <kuninori.morimoto...@renesas.com>

simple-card already has asoc_simple_card_parse_dai(),
but graph base parsing needs graph specific version of it.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto...@renesas.com>
---
v3 -> v4

 - no change

 include/sound/simple_card_utils.h     | 10 +++++++
 sound/soc/generic/simple-card-utils.c | 50 +++++++++++++++++++++++++++++++++++
 2 files changed, 60 insertions(+)

diff --git a/include/sound/simple_card_utils.h 
b/include/sound/simple_card_utils.h
index fd641255..4b58954 100644
--- a/include/sound/simple_card_utils.h
+++ b/include/sound/simple_card_utils.h
@@ -59,6 +59,16 @@ int asoc_simple_card_parse_dai(struct device_node *node,
                                  const char *cells_name,
                                  int *is_single_links);
 
+#define asoc_simple_card_parse_graph_cpu(ep, dai_link)                 \
+       asoc_simple_card_parse_graph_dai(ep, &dai_link->cpu_of_node,    \
+                                        &dai_link->cpu_dai_name)
+#define asoc_simple_card_parse_graph_codec(ep, dai_link)               \
+       asoc_simple_card_parse_graph_dai(ep, &dai_link->codec_of_node,  \
+                                        &dai_link->codec_dai_name)
+int asoc_simple_card_parse_graph_dai(struct device_node *ep,
+                                    struct device_node **endpoint_np,
+                                    const char **dai_name);
+
 int asoc_simple_card_init_dai(struct snd_soc_dai *dai,
                              struct asoc_simple_dai *simple_dai);
 
diff --git a/sound/soc/generic/simple-card-utils.c 
b/sound/soc/generic/simple-card-utils.c
index e5b80f5..373ada3 100644
--- a/sound/soc/generic/simple-card-utils.c
+++ b/sound/soc/generic/simple-card-utils.c
@@ -10,6 +10,7 @@
 #include <linux/clk.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/of_graph.h>
 #include <sound/simple_card_utils.h>
 
 int asoc_simple_card_parse_daifmt(struct device *dev,
@@ -164,6 +165,55 @@ int asoc_simple_card_parse_dai(struct device_node *node,
 }
 EXPORT_SYMBOL_GPL(asoc_simple_card_parse_dai);
 
+int asoc_simple_card_parse_graph_dai(struct device_node *ep,
+                                    struct device_node **dai_of_node,
+                                    const char **dai_name)
+{
+       struct device_node *node, *port, *endpoint;
+       int i, id;
+
+       if (!ep)
+               return 0;
+
+       /*
+        * of_graph_get_port_parent() will call
+        * of_node_put(). So, call of_node_get() here
+        */
+       of_node_get(ep);
+       node = of_graph_get_port_parent(ep);
+
+       i = 0;
+       id = -1;
+       for_each_of_port(node, port) {
+               for_each_of_endpoint_in_port(port, endpoint) {
+                       if (endpoint == ep)
+                               id = i;
+                       i++;
+               }
+       }
+       if (id < 0)
+               return -ENODEV;
+
+       /* Get dai->name */
+       if (dai_name) {
+               struct of_phandle_args args;
+               int ret;
+
+               args.np         = node;
+               args.args[0]    = id;
+               args.args_count = (i > 1);
+
+               ret = snd_soc_get_dai_name(&args, dai_name);
+               if (ret < 0)
+                       return ret;
+       }
+
+       *dai_of_node = node;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(asoc_simple_card_parse_graph_dai);
+
 int asoc_simple_card_init_dai(struct snd_soc_dai *dai,
                              struct asoc_simple_dai *simple_dai)
 {
-- 
1.9.1

Reply via email to