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>
---
 include/sound/simple_card_utils.h     | 11 +++++++
 sound/soc/generic/simple-card-utils.c | 57 +++++++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+)

diff --git a/include/sound/simple_card_utils.h 
b/include/sound/simple_card_utils.h
index 09750ac..c79263a 100644
--- a/include/sound/simple_card_utils.h
+++ b/include/sound/simple_card_utils.h
@@ -60,6 +60,17 @@ 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, is_single_link)         
\
+       asoc_simple_card_parse_graph_dai(ep, &dai_link->cpu_of_node,            
\
+                                        &dai_link->cpu_dai_name, 
is_single_link)
+#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, NULL)
+int asoc_simple_card_parse_graph_dai(struct device_node *ep,
+                                    struct device_node **endpoint_np,
+                                    const char **dai_name,
+                                    int *is_single_link);
+
 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 6bc1510..47a73ee 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,
@@ -165,6 +166,62 @@ 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,
+                                    int *is_single_link)
+{
+       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) {
+               if (!of_graph_port_type_is_sound(port))
+                       continue;
+
+               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;
+
+       if (is_single_link)
+               *is_single_link = (of_graph_get_sound_endpoint_count(node) == 
1);
+
+       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