Merge remote-tracking branches 'asoc/topic/rt5641', 'asoc/topic/rt5677' and 'asoc...
[linux-2.6-block.git] / sound / soc / generic / simple-card.c
index f7c6734bd5daee1dafd76ba8b6feafa05b2a6c52..33feee9ca8c3a336f9f04ed0940f515dba4ddf64 100644 (file)
@@ -125,14 +125,6 @@ static int __asoc_simple_card_dai_init(struct snd_soc_dai *dai,
 {
        int ret;
 
-       if (set->fmt) {
-               ret = snd_soc_dai_set_fmt(dai, set->fmt);
-               if (ret && ret != -ENOTSUPP) {
-                       dev_err(dai->dev, "simple-card: set_fmt error\n");
-                       goto err;
-               }
-       }
-
        if (set->sysclk) {
                ret = snd_soc_dai_set_sysclk(dai, 0, set->sysclk, 0);
                if (ret && ret != -ENOTSUPP) {
@@ -176,11 +168,11 @@ static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd)
                return ret;
 
        if (gpio_is_valid(priv->gpio_hp_det)) {
-               snd_soc_jack_new(codec->codec, "Headphones", SND_JACK_HEADPHONE,
-                                &simple_card_hp_jack);
-               snd_soc_jack_add_pins(&simple_card_hp_jack,
-                                     ARRAY_SIZE(simple_card_hp_jack_pins),
-                                     simple_card_hp_jack_pins);
+               snd_soc_card_jack_new(rtd->card, "Headphones",
+                                     SND_JACK_HEADPHONE,
+                                     &simple_card_hp_jack,
+                                     simple_card_hp_jack_pins,
+                                     ARRAY_SIZE(simple_card_hp_jack_pins));
 
                simple_card_hp_jack_gpio.gpio = priv->gpio_hp_det;
                simple_card_hp_jack_gpio.invert = priv->gpio_hp_det_invert;
@@ -189,11 +181,11 @@ static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd)
        }
 
        if (gpio_is_valid(priv->gpio_mic_det)) {
-               snd_soc_jack_new(codec->codec, "Mic Jack", SND_JACK_MICROPHONE,
-                                &simple_card_mic_jack);
-               snd_soc_jack_add_pins(&simple_card_mic_jack,
-                                     ARRAY_SIZE(simple_card_mic_jack_pins),
-                                     simple_card_mic_jack_pins);
+               snd_soc_card_jack_new(rtd->card, "Mic Jack",
+                                     SND_JACK_MICROPHONE,
+                                     &simple_card_mic_jack,
+                                     simple_card_mic_jack_pins,
+                                     ARRAY_SIZE(simple_card_mic_jack_pins));
                simple_card_mic_jack_gpio.gpio = priv->gpio_mic_det;
                simple_card_mic_jack_gpio.invert = priv->gpio_mic_det_invert;
                snd_soc_jack_add_gpios(&simple_card_mic_jack, 1,
@@ -269,12 +261,10 @@ static int asoc_simple_card_parse_daifmt(struct device_node *node,
                                         struct device_node *codec,
                                         char *prefix, int idx)
 {
+       struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, idx);
        struct device *dev = simple_priv_to_dev(priv);
        struct device_node *bitclkmaster = NULL;
        struct device_node *framemaster = NULL;
-       struct simple_dai_props *dai_props = simple_priv_to_props(priv, idx);
-       struct asoc_simple_dai *cpu_dai = &dai_props->cpu_dai;
-       struct asoc_simple_dai *codec_dai = &dai_props->codec_dai;
        unsigned int daifmt;
 
        daifmt = snd_soc_of_parse_daifmt(node, prefix,
@@ -289,8 +279,7 @@ static int asoc_simple_card_parse_daifmt(struct device_node *node,
                 */
                dev_dbg(dev, "Revert to legacy daifmt parsing\n");
 
-               cpu_dai->fmt = codec_dai->fmt =
-                       snd_soc_of_parse_daifmt(codec, NULL, NULL, NULL) |
+               daifmt = snd_soc_of_parse_daifmt(codec, NULL, NULL, NULL) |
                        (daifmt & ~SND_SOC_DAIFMT_CLOCK_MASK);
        } else {
                if (codec == bitclkmaster)
@@ -299,11 +288,10 @@ static int asoc_simple_card_parse_daifmt(struct device_node *node,
                else
                        daifmt |= (codec == framemaster) ?
                                SND_SOC_DAIFMT_CBS_CFM : SND_SOC_DAIFMT_CBS_CFS;
-
-               cpu_dai->fmt    = daifmt;
-               codec_dai->fmt  = daifmt;
        }
 
+       dai_link->dai_fmt = daifmt;
+
        of_node_put(bitclkmaster);
        of_node_put(framemaster);
 
@@ -372,6 +360,11 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
                            strlen(dai_link->cpu_dai_name)   +
                            strlen(dai_link->codec_dai_name) + 2,
                            GFP_KERNEL);
+       if (!name) {
+               ret = -ENOMEM;
+               goto dai_link_of_err;
+       }
+
        sprintf(name, "%s-%s", dai_link->cpu_dai_name,
                                dai_link->codec_dai_name);
        dai_link->name = dai_link->stream_name = name;
@@ -379,13 +372,12 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
        dai_link->init = asoc_simple_card_dai_init;
 
        dev_dbg(dev, "\tname : %s\n", dai_link->stream_name);
-       dev_dbg(dev, "\tcpu : %s / %04x / %d\n",
+       dev_dbg(dev, "\tformat : %04x\n", dai_link->dai_fmt);
+       dev_dbg(dev, "\tcpu : %s / %d\n",
                dai_link->cpu_dai_name,
-               dai_props->cpu_dai.fmt,
                dai_props->cpu_dai.sysclk);
-       dev_dbg(dev, "\tcodec : %s / %04x / %d\n",
+       dev_dbg(dev, "\tcodec : %s / %d\n",
                dai_link->codec_dai_name,
-               dai_props->codec_dai.fmt,
                dai_props->codec_dai.sysclk);
 
        /*
@@ -572,14 +564,13 @@ static int asoc_simple_card_probe(struct platform_device *pdev)
                dai_link->codec_name    = cinfo->codec;
                dai_link->cpu_dai_name  = cinfo->cpu_dai.name;
                dai_link->codec_dai_name = cinfo->codec_dai.name;
+               dai_link->dai_fmt       = cinfo->daifmt;
                dai_link->init          = asoc_simple_card_dai_init;
                memcpy(&priv->dai_props->cpu_dai, &cinfo->cpu_dai,
                                        sizeof(priv->dai_props->cpu_dai));
                memcpy(&priv->dai_props->codec_dai, &cinfo->codec_dai,
                                        sizeof(priv->dai_props->codec_dai));
 
-               priv->dai_props->cpu_dai.fmt    |= cinfo->daifmt;
-               priv->dai_props->codec_dai.fmt  |= cinfo->daifmt;
        }
 
        snd_soc_card_set_drvdata(&priv->snd_card, priv);