ASoC: simple_card_utils: support snd_soc_dai_link_component style for codec
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Fri, 31 Aug 2018 03:08:09 +0000 (03:08 +0000)
committerMark Brown <broonie@kernel.org>
Fri, 31 Aug 2018 14:58:07 +0000 (15:58 +0100)
Current ASoC is supporting snd_soc_dai_link_component for binding,
it is more useful than current legacy style.
Currently only codec is supporting it as multicodec (= codecs).
CPU will support multi style in the future.
We want to have it on Platform too in the future.

If all Codec/CPU/Platform are replaced into snd_soc_dai_link_component
style, we can remove legacy complex style.
This patch supports snd_soc_dai_link_component style
for simple_card_utils for codec.

[current]
struct snd_soc_dai_link {
...
*cpu_name;
*cpu_of_node;
*cpu_dai_name;

*codec_name;
*codec_of_node;
*codec_dai_name;
*codecs;
num_codecs;

*platform_name;
*platform_of_node;
...
}

[in the future]
struct snd_soc_dai_link {
...
*cpus
num_cpus;

*codecs;
num_codecs;

*platform;
...
}

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/simple_card_utils.h
sound/soc/generic/simple-card-utils.c

index 8bc5e2d8b13c47e0512cc42fe8637735d06ef315..3b5bd6e76f888b8707c13da912fa0d3029278f6a 100644 (file)
@@ -51,29 +51,35 @@ int asoc_simple_card_parse_card_name(struct snd_soc_card *card,
 
 #define asoc_simple_card_parse_clk_cpu(dev, node, dai_link, simple_dai)                \
        asoc_simple_card_parse_clk(dev, node, dai_link->cpu_of_node, simple_dai, \
-                                  dai_link->cpu_dai_name)
+                                  dai_link->cpu_dai_name, NULL)
 #define asoc_simple_card_parse_clk_codec(dev, node, dai_link, simple_dai)      \
        asoc_simple_card_parse_clk(dev, node, dai_link->codec_of_node, simple_dai,\
-                                  dai_link->codec_dai_name)
+                                  dai_link->codec_dai_name, dai_link->codecs)
 int asoc_simple_card_parse_clk(struct device *dev,
                               struct device_node *node,
                               struct device_node *dai_of_node,
                               struct asoc_simple_dai *simple_dai,
-                              const char *name);
+                              const char *dai_name,
+                              struct snd_soc_dai_link_component *dlc);
 int asoc_simple_card_clk_enable(struct asoc_simple_dai *dai);
 void asoc_simple_card_clk_disable(struct asoc_simple_dai *dai);
 
 #define asoc_simple_card_parse_cpu(node, dai_link,                             \
                                   list_name, cells_name, is_single_link)       \
-       asoc_simple_card_parse_dai(node, &dai_link->cpu_of_node,                \
+       asoc_simple_card_parse_dai(node, NULL,                                  \
+               &dai_link->cpu_of_node,                                         \
                &dai_link->cpu_dai_name, list_name, cells_name, is_single_link)
 #define asoc_simple_card_parse_codec(node, dai_link, list_name, cells_name)    \
-       asoc_simple_card_parse_dai(node, &dai_link->codec_of_node,              \
-               &dai_link->codec_dai_name, list_name, cells_name, NULL)
+       asoc_simple_card_parse_dai(node, dai_link->codecs,                      \
+                                  &dai_link->codec_of_node,                    \
+                                  &dai_link->codec_dai_name,                   \
+                                  list_name, cells_name, NULL)
 #define asoc_simple_card_parse_platform(node, dai_link, list_name, cells_name) \
-       asoc_simple_card_parse_dai(node, &dai_link->platform_of_node,           \
+       asoc_simple_card_parse_dai(node, NULL,                                  \
+               &dai_link->platform_of_node,                                    \
                NULL, list_name, cells_name, NULL)
 int asoc_simple_card_parse_dai(struct device_node *node,
+                                 struct snd_soc_dai_link_component *dlc,
                                  struct device_node **endpoint_np,
                                  const char **dai_name,
                                  const char *list_name,
@@ -81,12 +87,15 @@ int asoc_simple_card_parse_dai(struct device_node *node,
                                  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,    \
+       asoc_simple_card_parse_graph_dai(ep, NULL,                      \
+                                        &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,  \
+       asoc_simple_card_parse_graph_dai(ep, dai_link->codecs,          \
+                                        &dai_link->codec_of_node,      \
                                         &dai_link->codec_dai_name)
 int asoc_simple_card_parse_graph_dai(struct device_node *ep,
+                                    struct snd_soc_dai_link_component *dlc,
                                     struct device_node **endpoint_np,
                                     const char **dai_name);
 
index d3f3f0fec74c09377adadcda097de5efc3c38991..73c0a904f32ebe29a3a7e82daaf45ad45238cd30 100644 (file)
@@ -173,11 +173,23 @@ int asoc_simple_card_parse_clk(struct device *dev,
                               struct device_node *node,
                               struct device_node *dai_of_node,
                               struct asoc_simple_dai *simple_dai,
-                              const char *name)
+                              const char *dai_name,
+                              struct snd_soc_dai_link_component *dlc)
 {
        struct clk *clk;
        u32 val;
 
+       /*
+        * Use snd_soc_dai_link_component instead of legacy style.
+        * It is only for codec, but cpu will be supported in the future.
+        * see
+        *      soc-core.c :: snd_soc_init_multicodec()
+        */
+       if (dlc) {
+               dai_of_node     = dlc->of_node;
+               dai_name        = dlc->dai_name;
+       }
+
        /*
         * Parse dai->sysclk come from "clocks = <&xxx>"
         * (if system has common clock)
@@ -200,7 +212,7 @@ int asoc_simple_card_parse_clk(struct device *dev,
        if (of_property_read_bool(node, "system-clock-direction-out"))
                simple_dai->clk_direction = SND_SOC_CLOCK_OUT;
 
-       dev_dbg(dev, "%s : sysclk = %d, direction %d\n", name,
+       dev_dbg(dev, "%s : sysclk = %d, direction %d\n", dai_name,
                simple_dai->sysclk, simple_dai->clk_direction);
 
        return 0;
@@ -208,6 +220,7 @@ int asoc_simple_card_parse_clk(struct device *dev,
 EXPORT_SYMBOL_GPL(asoc_simple_card_parse_clk);
 
 int asoc_simple_card_parse_dai(struct device_node *node,
+                                   struct snd_soc_dai_link_component *dlc,
                                    struct device_node **dai_of_node,
                                    const char **dai_name,
                                    const char *list_name,
@@ -220,6 +233,17 @@ int asoc_simple_card_parse_dai(struct device_node *node,
        if (!node)
                return 0;
 
+       /*
+        * Use snd_soc_dai_link_component instead of legacy style.
+        * It is only for codec, but cpu will be supported in the future.
+        * see
+        *      soc-core.c :: snd_soc_init_multicodec()
+        */
+       if (dlc) {
+               dai_name        = &dlc->dai_name;
+               dai_of_node     = &dlc->of_node;
+       }
+
        /*
         * Get node via "sound-dai = <&phandle port>"
         * it will be used as xxx_of_node on soc_bind_dai_link()
@@ -278,6 +302,7 @@ static int asoc_simple_card_get_dai_id(struct device_node *ep)
 }
 
 int asoc_simple_card_parse_graph_dai(struct device_node *ep,
+                                    struct snd_soc_dai_link_component *dlc,
                                     struct device_node **dai_of_node,
                                     const char **dai_name)
 {
@@ -285,6 +310,17 @@ int asoc_simple_card_parse_graph_dai(struct device_node *ep,
        struct of_phandle_args args;
        int ret;
 
+       /*
+        * Use snd_soc_dai_link_component instead of legacy style.
+        * It is only for codec, but cpu will be supported in the future.
+        * see
+        *      soc-core.c :: snd_soc_init_multicodec()
+        */
+       if (dlc) {
+               dai_name        = &dlc->dai_name;
+               dai_of_node     = &dlc->of_node;
+       }
+
        if (!ep)
                return 0;
        if (!dai_name)
@@ -374,6 +410,8 @@ int asoc_simple_card_clean_reference(struct snd_soc_card *card)
             num_links++, dai_link++) {
                of_node_put(dai_link->cpu_of_node);
                of_node_put(dai_link->codec_of_node);
+               if (dai_link->codecs)
+                       of_node_put(dai_link->codecs->of_node);
        }
        return 0;
 }