ASoC: simple-card: fixup cpu_dai_name clear case
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tue, 2 Sep 2014 11:05:30 +0000 (04:05 -0700)
committerMark Brown <broonie@kernel.org>
Wed, 3 Sep 2014 12:53:44 +0000 (13:53 +0100)
f687d900d30a61dda38db2a99239f5284a86a309
(ASoC: simple-card: cpu_dai_name creates confusion when DT case)
cleared cpu_dai_name for caring fmt_single_name case,
and
179949bc04c7157a4b2279f62a842638b61f78f9
(ASoC: simple-card: remove dai_link->cpu_dai_name when DT)
cared multi dai-link case.
but, cpu_dai_name matching is required when fmt_multiple_name was used

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tested-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/generic/simple-card.c

index fd8b045889488330fc7340498756dfc2bce93b47..b63860ddb4fd0ec12765a030a3938a8fc6402592 100644 (file)
@@ -112,8 +112,10 @@ static int
 asoc_simple_card_sub_parse_of(struct device_node *np,
                              struct asoc_simple_dai *dai,
                              struct device_node **p_node,
-                             const char **name)
+                             const char **name,
+                             int *args_count)
 {
+       struct of_phandle_args args;
        struct device_node *node;
        struct clk *clk;
        u32 val;
@@ -123,10 +125,15 @@ asoc_simple_card_sub_parse_of(struct device_node *np,
         * get node via "sound-dai = <&phandle port>"
         * it will be used as xxx_of_node on soc_bind_dai_link()
         */
-       node = of_parse_phandle(np, "sound-dai", 0);
-       if (!node)
-               return -ENODEV;
-       *p_node = node;
+       ret = of_parse_phandle_with_args(np, "sound-dai",
+                                        "#sound-dai-cells", 0, &args);
+       if (ret)
+               return ret;
+
+       *p_node = args.np;
+
+       if (args_count)
+               *args_count = args.args_count;
 
        /* get dai->name */
        ret = snd_soc_of_get_dai_name(np, name);
@@ -176,7 +183,7 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
        char *name;
        char prop[128];
        char *prefix = "";
-       int ret;
+       int ret, cpu_args;
 
        if (is_top_level_node)
                prefix = "simple-audio-card,";
@@ -195,7 +202,8 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
 
        ret = asoc_simple_card_sub_parse_of(np, &dai_props->cpu_dai,
                                            &dai_link->cpu_of_node,
-                                           &dai_link->cpu_dai_name);
+                                           &dai_link->cpu_dai_name,
+                                           &cpu_args);
        if (ret < 0)
                goto dai_link_of_err;
 
@@ -226,7 +234,7 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
 
        ret = asoc_simple_card_sub_parse_of(np, &dai_props->codec_dai,
                                            &dai_link->codec_of_node,
-                                           &dai_link->codec_dai_name);
+                                           &dai_link->codec_dai_name, NULL);
        if (ret < 0)
                goto dai_link_of_err;
 
@@ -290,12 +298,13 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
         * soc_bind_dai_link() will check cpu name
         * after of_node matching if dai_link has cpu_dai_name.
         * but, it will never match if name was created by fmt_single_name()
-        * remove cpu_dai_name to escape name matching.
+        * remove cpu_dai_name if cpu_args was 0.
         * see
         *      fmt_single_name()
         *      fmt_multiple_name()
         */
-       dai_link->cpu_dai_name = NULL;
+       if (!cpu_args)
+               dai_link->cpu_dai_name = NULL;
 
 dai_link_of_err:
        if (np)