ASoC: rsnd: add support graph base DT phase 1
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Thu, 18 May 2017 01:27:48 +0000 (01:27 +0000)
committerMark Brown <broonie@kernel.org>
Fri, 19 May 2017 17:36:25 +0000 (18:36 +0100)
To enable OF-graph base DT on rsnd driver, and to keep compatible
previous normal sound card style, it need to support both
"rcar_sound,dai" and "ports" (or "port") on DT.

This patch modify rsnd_dai_of_node() to parse
"rcar_sound,dai" and "ports" (or "port") as phase 1. It can detect
graph base style, but do nothing at this point.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sh/rcar/core.c
sound/soc/sh/rcar/rsnd.h

index 3c47af1990cb2704d1025551ed7e408fbbb34b2e..72a3139b70c3178efd7c94d80040be1fb208fd75 100644 (file)
@@ -774,6 +774,42 @@ void rsnd_parse_connect_common(struct rsnd_dai *rdai,
        of_node_put(node);
 }
 
+static struct device_node *rsnd_dai_of_node(struct rsnd_priv *priv,
+                                           int *is_graph)
+{
+       struct device *dev = rsnd_priv_to_dev(priv);
+       struct device_node *np = dev->of_node;
+       struct device_node *dai_node;
+       struct device_node *ret;
+
+       *is_graph = 0;
+
+       /*
+        * parse both previous dai (= rcar_sound,dai), and
+        * graph dai (= ports/port)
+        */
+       dai_node = of_get_child_by_name(np, RSND_NODE_DAI);
+       if (dai_node) {
+               ret = dai_node;
+               goto of_node_compatible;
+       }
+
+       ret = np;
+
+       dai_node = of_graph_get_next_endpoint(np, NULL);
+       if (dai_node)
+               goto of_node_graph;
+
+       return NULL;
+
+of_node_graph:
+       *is_graph = 1;
+of_node_compatible:
+       of_node_put(dai_node);
+
+       return ret;
+}
+
 static int rsnd_dai_probe(struct rsnd_priv *priv)
 {
        struct device_node *dai_node;
@@ -785,9 +821,10 @@ static int rsnd_dai_probe(struct rsnd_priv *priv)
        struct rsnd_dai *rdai;
        struct device *dev = rsnd_priv_to_dev(priv);
        int nr, dai_i, io_i;
+       int is_graph;
        int ret;
 
-       dai_node = rsnd_dai_of_node(priv);
+       dai_node = rsnd_dai_of_node(priv, &is_graph);
        nr = of_get_child_count(dai_node);
        if (!nr) {
                ret = -EINVAL;
index dbf4163427e808d62dbc37aa62f64b482e65e7c4..4d8e0584b6445d18d2fe49f68a6f8265828c102f 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/list.h>
 #include <linux/module.h>
 #include <linux/of_device.h>
+#include <linux/of_graph.h>
 #include <linux/of_irq.h>
 #include <linux/sh_dma.h>
 #include <linux/workqueue.h>
@@ -475,7 +476,6 @@ int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional);
 int rsnd_dai_connect(struct rsnd_mod *mod,
                     struct rsnd_dai_stream *io,
                     enum rsnd_mod_type type);
-#define rsnd_dai_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_DAI)
 
 /*
  *     R-Car Gen1/Gen2