#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
 
        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;
                                          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,
                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;
 
        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);
                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;
        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)