The simple-card driver supports multiple CPU and single Codec entries
for DPCM DAI links. In some cases it is required to have multiple
CPU/Codecs. Currently parsing logic for DPCM link loops over all
children of DAI link but assumes that there is a single Codec entry.
When DAI link has multiple Codecs it considers only the first Codec
entry and remaining Codecs are wrongly treated as CPU. This happens
because first Codec is used as reference for parsing all other child
nodes.

This is fixed by using string comparisons of child node names instead
of node pointer reference in simple_dai_link_of_dpcm(). So All CPU
get parsed in first run and all Codecs in subsequent run. After this
simple_dai_link_of_dpcm() does not required 'codec' argument and hence
is removed.

Signed-off-by: Sameer Pujar <spu...@nvidia.com>
---
 sound/soc/generic/simple-card.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c
index 02d6295..15c4388 100644
--- a/sound/soc/generic/simple-card.c
+++ b/sound/soc/generic/simple-card.c
@@ -116,7 +116,6 @@ static void simple_parse_mclk_fs(struct device_node *top,
 
 static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
                                   struct device_node *np,
-                                  struct device_node *codec,
                                   struct link_info *li,
                                   bool is_top)
 {
@@ -137,8 +136,13 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv 
*priv,
         * Codec |return|Pass
         * np
         */
-       if (li->cpu == (np == codec))
-               return 0;
+       if (li->cpu) {
+               if (!strcmp(np->name, "codec"))
+                       return 0;
+       } else {
+               if (!strcmp(np->name, "cpu"))
+                       return 0;
+       }
 
        dev_dbg(dev, "link_of DPCM (%pOF)\n", np);
 
@@ -354,7 +358,6 @@ static int simple_for_each_link(struct asoc_simple_priv 
*priv,
                                         struct link_info *li, bool is_top),
                        int (*func_dpcm)(struct asoc_simple_priv *priv,
                                         struct device_node *np,
-                                        struct device_node *codec,
                                         struct link_info *li, bool is_top))
 {
        struct device *dev = simple_priv_to_dev(priv);
@@ -407,7 +410,7 @@ static int simple_for_each_link(struct asoc_simple_priv 
*priv,
                        if (dpcm_selectable &&
                            (num > 2 ||
                             adata.convert_rate || adata.convert_channels))
-                               ret = func_dpcm(priv, np, codec, li, is_top);
+                               ret = func_dpcm(priv, np, li, is_top);
                        /* else normal sound */
                        else
                                ret = func_noml(priv, np, codec, li, is_top);
@@ -527,12 +530,11 @@ static int simple_count_noml(struct asoc_simple_priv 
*priv,
 
 static int simple_count_dpcm(struct asoc_simple_priv *priv,
                             struct device_node *np,
-                            struct device_node *codec,
                             struct link_info *li, bool is_top)
 {
        li->dais++; /* CPU or Codec */
        li->link++; /* CPU-dummy or dummy-Codec */
-       if (np == codec)
+       if (!strcmp(np->name, "codec"))
                li->conf++;
 
        return 0;
-- 
2.7.4

Reply via email to