This commit exposes following functions which can be used by a sound
card driver based on generic audio graph driver. Idea is vendors can
have a thin driver and re-use common stuff from audio graph driver.

 - graph_card_probe()
 - graph_parse_of()

In doing so a new header file is added for above. The graph_probe()
function is simplified by moving more common stuff to graph_parse_of().

Signed-off-by: Sameer Pujar <spu...@nvidia.com>
Cc: Kuninori Morimoto <kuninori.morimoto...@renesas.com>
---
 include/sound/graph_card.h           | 16 ++++++
 sound/soc/generic/audio-graph-card.c | 95 +++++++++++++++++++-----------------
 2 files changed, 66 insertions(+), 45 deletions(-)
 create mode 100644 include/sound/graph_card.h

diff --git a/include/sound/graph_card.h b/include/sound/graph_card.h
new file mode 100644
index 0000000..bbb5a13
--- /dev/null
+++ b/include/sound/graph_card.h
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: GPL-2.0
+ *
+ * ASoC audio graph card support
+ *
+ */
+
+#ifndef __GRAPH_CARD_H
+#define __GRAPH_CARD_H
+
+#include <sound/simple_card_utils.h>
+
+int graph_card_probe(struct snd_soc_card *card);
+
+int graph_parse_of(struct asoc_simple_priv *priv, struct device *dev);
+
+#endif /* __GRAPH_CARD_H */
diff --git a/sound/soc/generic/audio-graph-card.c 
b/sound/soc/generic/audio-graph-card.c
index 4db9c0e..16a04a6 100644
--- a/sound/soc/generic/audio-graph-card.c
+++ b/sound/soc/generic/audio-graph-card.c
@@ -18,7 +18,7 @@
 #include <linux/of_graph.h>
 #include <linux/platform_device.h>
 #include <linux/string.h>
-#include <sound/simple_card_utils.h>
+#include <sound/graph_card.h>
 
 #define DPCM_SELECTABLE 1
 
@@ -529,12 +529,34 @@ static int graph_for_each_link(struct asoc_simple_priv 
*priv,
        return 0;
 }
 
-static int graph_parse_of(struct asoc_simple_priv *priv)
+static void graph_get_dais_count(struct asoc_simple_priv *priv,
+                                struct link_info *li);
+
+int graph_parse_of(struct asoc_simple_priv *priv, struct device *dev)
 {
        struct snd_soc_card *card = simple_priv_to_card(priv);
        struct link_info li;
        int ret;
 
+       card->owner = THIS_MODULE;
+       card->dev = dev;
+
+       memset(&li, 0, sizeof(li));
+       graph_get_dais_count(priv, &li);
+       if (!li.link || !li.dais)
+               return -EINVAL;
+
+       ret = asoc_simple_init_priv(priv, &li);
+       if (ret < 0)
+               return ret;
+
+       priv->pa_gpio = devm_gpiod_get_optional(dev, "pa", GPIOD_OUT_LOW);
+       if (IS_ERR(priv->pa_gpio)) {
+               ret = PTR_ERR(priv->pa_gpio);
+               dev_err(dev, "failed to get amplifier gpio: %d\n", ret);
+               return ret;
+       }
+
        ret = asoc_simple_parse_widgets(card, NULL);
        if (ret < 0)
                return ret;
@@ -561,11 +583,32 @@ static int graph_parse_of(struct asoc_simple_priv *priv)
                                          graph_dai_link_of,
                                          graph_dai_link_of_dpcm);
                if (ret < 0)
-                       return ret;
+                       goto err;
        }
 
-       return asoc_simple_parse_card_name(card, NULL);
+       ret = asoc_simple_parse_card_name(card, NULL);
+       if (ret < 0)
+               goto err;
+
+       snd_soc_card_set_drvdata(card, priv);
+
+       asoc_simple_debug_info(priv);
+
+       ret = devm_snd_soc_register_card(dev, card);
+       if (ret < 0)
+               goto err;
+
+       return 0;
+
+err:
+       asoc_simple_clean_reference(card);
+
+       if (ret != -EPROBE_DEFER)
+               dev_err(dev, "parse error %d\n", ret);
+
+       return ret;
 }
+EXPORT_SYMBOL_GPL(graph_parse_of);
 
 static int graph_count_noml(struct asoc_simple_priv *priv,
                            struct device_node *cpu_ep,
@@ -662,7 +705,7 @@ static void graph_get_dais_count(struct asoc_simple_priv 
*priv,
                li->link, li->dais, li->conf);
 }
 
-static int graph_card_probe(struct snd_soc_card *card)
+int graph_card_probe(struct snd_soc_card *card)
 {
        struct asoc_simple_priv *priv = snd_soc_card_get_drvdata(card);
        int ret;
@@ -677,14 +720,13 @@ static int graph_card_probe(struct snd_soc_card *card)
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(graph_card_probe);
 
 static int graph_probe(struct platform_device *pdev)
 {
        struct asoc_simple_priv *priv;
        struct device *dev = &pdev->dev;
        struct snd_soc_card *card;
-       struct link_info li;
-       int ret;
 
        /* Allocate the private data and the DAI link array */
        priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
@@ -692,8 +734,6 @@ static int graph_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        card = simple_priv_to_card(priv);
-       card->owner             = THIS_MODULE;
-       card->dev               = dev;
        card->dapm_widgets      = graph_dapm_widgets;
        card->num_dapm_widgets  = ARRAY_SIZE(graph_dapm_widgets);
        card->probe             = graph_card_probe;
@@ -701,42 +741,7 @@ static int graph_probe(struct platform_device *pdev)
        if (of_device_get_match_data(dev))
                priv->dpcm_selectable = 1;
 
-       memset(&li, 0, sizeof(li));
-       graph_get_dais_count(priv, &li);
-       if (!li.link || !li.dais)
-               return -EINVAL;
-
-       ret = asoc_simple_init_priv(priv, &li);
-       if (ret < 0)
-               return ret;
-
-       priv->pa_gpio = devm_gpiod_get_optional(dev, "pa", GPIOD_OUT_LOW);
-       if (IS_ERR(priv->pa_gpio)) {
-               ret = PTR_ERR(priv->pa_gpio);
-               dev_err(dev, "failed to get amplifier gpio: %d\n", ret);
-               return ret;
-       }
-
-       ret = graph_parse_of(priv);
-       if (ret < 0) {
-               if (ret != -EPROBE_DEFER)
-                       dev_err(dev, "parse error %d\n", ret);
-               goto err;
-       }
-
-       snd_soc_card_set_drvdata(card, priv);
-
-       asoc_simple_debug_info(priv);
-
-       ret = devm_snd_soc_register_card(dev, card);
-       if (ret < 0)
-               goto err;
-
-       return 0;
-err:
-       asoc_simple_clean_reference(card);
-
-       return ret;
+       return graph_parse_of(priv, dev);
 }
 
 static int graph_remove(struct platform_device *pdev)
-- 
2.7.4

Reply via email to