ASoC: simple-card-utils.c: enable multi Component support
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Mon, 10 Jul 2023 01:20:22 +0000 (10:20 +0900)
committerMark Brown <broonie@kernel.org>
Mon, 17 Jul 2023 05:15:47 +0000 (06:15 +0100)
If CPU/Codec driver keeps its DAI node, we can directly identify actual
DAI by using snd_soc_get_dai_via_args().
This means we can use multi Component.

This patch enables multi Component support on Audio Graph Card/Card2.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://lore.kernel.org/r/87a5w4o949.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/simple_card_utils.h
sound/soc/generic/audio-graph-card.c
sound/soc/generic/audio-graph-card2.c
sound/soc/generic/simple-card-utils.c

index b450d58..d1a95bc 100644 (file)
@@ -192,9 +192,8 @@ int asoc_simple_remove(struct platform_device *pdev);
 
 int asoc_graph_card_probe(struct snd_soc_card *card);
 int asoc_graph_is_ports0(struct device_node *port);
-int asoc_graph_parse_dai(struct device_node *ep,
-                        struct snd_soc_dai_link_component *dlc,
-                        int *is_single_link);
+int asoc_graph_parse_dai(struct device *dev, struct device_node *ep,
+                        struct snd_soc_dai_link_component *dlc, int *is_single_link);
 
 #ifdef DEBUG
 static inline void asoc_simple_debug_dai(struct asoc_simple_priv *priv,
index c6e0f91..0b8258b 100644 (file)
@@ -126,7 +126,7 @@ static int graph_parse_node(struct asoc_simple_priv *priv,
 
        graph_parse_mclk_fs(top, ep, dai_props);
 
-       ret = asoc_graph_parse_dai(ep, dlc, cpu);
+       ret = asoc_graph_parse_dai(dev, ep, dlc, cpu);
        if (ret < 0)
                return ret;
 
index 542c4a1..9873246 100644 (file)
@@ -407,7 +407,7 @@ static int __graph_parse_node(struct asoc_simple_priv *priv,
 
        graph_parse_mclk_fs(ep, dai_props);
 
-       ret = asoc_graph_parse_dai(ep, dlc, &is_single_links);
+       ret = asoc_graph_parse_dai(dev, ep, dlc, &is_single_links);
        if (ret < 0)
                return ret;
 
index c142571..5b18a4a 100644 (file)
@@ -1066,12 +1066,12 @@ static int graph_get_dai_id(struct device_node *ep)
        return id;
 }
 
-int asoc_graph_parse_dai(struct device_node *ep,
-                        struct snd_soc_dai_link_component *dlc,
-                        int *is_single_link)
+int asoc_graph_parse_dai(struct device *dev, struct device_node *ep,
+                        struct snd_soc_dai_link_component *dlc, int *is_single_link)
 {
        struct device_node *node;
        struct of_phandle_args args = {};
+       struct snd_soc_dai *dai;
        int ret;
 
        if (!ep)
@@ -1079,6 +1079,20 @@ int asoc_graph_parse_dai(struct device_node *ep,
 
        node = of_graph_get_port_parent(ep);
 
+       /*
+        * Try to find from DAI node
+        */
+       args.np = ep;
+       dai = snd_soc_get_dai_via_args(&args);
+       if (dai) {
+               dlc->dai_name = snd_soc_dai_name_get(dai);
+               dlc->dai_args = snd_soc_copy_dai_args(dev, &args);
+               if (!dlc->dai_args)
+                       return -ENOMEM;
+
+               goto parse_dai_end;
+       }
+
        /* Get dai->name */
        args.np         = node;
        args.args[0]    = graph_get_dai_id(ep);
@@ -1109,6 +1123,7 @@ int asoc_graph_parse_dai(struct device_node *ep,
                return ret;
        }
 
+parse_dai_end:
        if (is_single_link)
                *is_single_link = of_graph_get_endpoint_count(node) == 1;