Merge branch 'for-4.9/block-smp' of git://git.kernel.dk/linux-block
[linux-2.6-block.git] / sound / soc / generic / simple-scu-card.c
index 3fa19084e32698c50d7b91e1112b28bae85c9ce0..b9973a56bcb02f896b2a0273eabc7812428e71e3 100644 (file)
 #include <sound/soc-dai.h>
 #include <sound/simple_card_utils.h>
 
-struct asoc_simple_card_of_data {
-       const char *prefix;
-       const struct snd_soc_dapm_route *routes;
-       int num_routes;
-};
-
-static const struct of_device_id asoc_simple_card_of_match[] = {
-       { .compatible = "renesas,rsrc-card", },
-       { .compatible = "simple-scu-audio-card", },
-       {},
-};
-MODULE_DEVICE_TABLE(of, asoc_simple_card_of_match);
-
-#define IDX_CPU                0
-#define IDX_CODEC      1
 struct asoc_simple_card_priv {
        struct snd_soc_card snd_card;
        struct snd_soc_codec_conf codec_conf;
@@ -118,6 +103,7 @@ static int asoc_simple_card_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
 
 static int asoc_simple_card_parse_links(struct device_node *np,
                                        struct asoc_simple_card_priv *priv,
+                                       unsigned int daifmt,
                                        int idx, bool is_fe)
 {
        struct device *dev = simple_priv_to_dev(priv);
@@ -125,15 +111,6 @@ static int asoc_simple_card_parse_links(struct device_node *np,
        struct asoc_simple_dai *dai_props = simple_priv_to_props(priv, idx);
        int ret;
 
-       /* Parse TDM slot */
-       ret = snd_soc_of_parse_tdm_slot(np,
-                                       &dai_props->tx_slot_mask,
-                                       &dai_props->rx_slot_mask,
-                                       &dai_props->slots,
-                                       &dai_props->slot_width);
-       if (ret)
-               return ret;
-
        if (is_fe) {
                int is_single_links = 0;
 
@@ -192,10 +169,19 @@ static int asoc_simple_card_parse_links(struct device_node *np,
                                              PREFIX "prefix");
        }
 
+       ret = snd_soc_of_parse_tdm_slot(np,
+                                       &dai_props->tx_slot_mask,
+                                       &dai_props->rx_slot_mask,
+                                       &dai_props->slots,
+                                       &dai_props->slot_width);
+       if (ret)
+               return ret;
+
        ret = asoc_simple_card_canonicalize_dailink(dai_link);
        if (ret < 0)
                return ret;
 
+       dai_link->dai_fmt               = daifmt;
        dai_link->dpcm_playback         = 1;
        dai_link->dpcm_capture          = 1;
        dai_link->ops                   = &asoc_simple_card_ops;
@@ -213,37 +199,28 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
                                 struct asoc_simple_card_priv *priv)
 {
        struct device *dev = simple_priv_to_dev(priv);
-       struct snd_soc_dai_link *dai_link;
        struct device_node *np;
        unsigned int daifmt = 0;
        int ret, i;
        bool is_fe;
 
        /* find 1st codec */
-       i = 0;
-       for_each_child_of_node(node, np) {
-               dai_link = simple_priv_to_link(priv, i);
-
-               if (strcmp(np->name, PREFIX "codec") == 0) {
-                       ret = asoc_simple_card_parse_daifmt(dev, node, np,
-                                                           PREFIX, &daifmt);
-                       if (ret < 0)
-                               return ret;
-                       break;
-               }
-               i++;
-       }
+       np = of_get_child_by_name(node, PREFIX "codec");
+       if (!np)
+               return -ENODEV;
+
+       ret = asoc_simple_card_parse_daifmt(dev, node, np,
+                                           PREFIX, &daifmt);
+       if (ret < 0)
+               return ret;
 
        i = 0;
        for_each_child_of_node(node, np) {
-               dai_link = simple_priv_to_link(priv, i);
-               dai_link->dai_fmt = daifmt;
-
                is_fe = false;
                if (strcmp(np->name, PREFIX "cpu") == 0)
                        is_fe = true;
 
-               ret = asoc_simple_card_parse_links(np, priv, i, is_fe);
+               ret = asoc_simple_card_parse_links(np, priv, daifmt, i, is_fe);
                if (ret < 0)
                        return ret;
                i++;
@@ -344,10 +321,17 @@ static int asoc_simple_card_remove(struct platform_device *pdev)
        return asoc_simple_card_clean_reference(card);
 }
 
+static const struct of_device_id asoc_simple_of_match[] = {
+       { .compatible = "renesas,rsrc-card", },
+       { .compatible = "simple-scu-audio-card", },
+       {},
+};
+MODULE_DEVICE_TABLE(of, asoc_simple_of_match);
+
 static struct platform_driver asoc_simple_card = {
        .driver = {
                .name = "simple-scu-audio-card",
-               .of_match_table = asoc_simple_card_of_match,
+               .of_match_table = asoc_simple_of_match,
        },
        .probe = asoc_simple_card_probe,
        .remove = asoc_simple_card_remove,
@@ -356,6 +340,6 @@ static struct platform_driver asoc_simple_card = {
 module_platform_driver(asoc_simple_card);
 
 MODULE_ALIAS("platform:asoc-simple-scu-card");
-MODULE_LICENSE("GPL");
+MODULE_LICENSE("GPL v2");
 MODULE_DESCRIPTION("ASoC Simple SCU Sound Card");
 MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");