Merge remote-tracking branches 'asoc/topic/msm8916', 'asoc/topic/mtk', 'asoc/topic...
[muen/linux.git] / sound / soc / generic / simple-card.c
index 2c9dedab5184ff74909caf163f7d0697d8b67949..dfaf48ff88b02b8f23413acc6b22552058cf372b 100644 (file)
@@ -118,13 +118,13 @@ static int asoc_simple_card_startup(struct snd_pcm_substream *substream)
                simple_priv_to_props(priv, rtd->num);
        int ret;
 
-       ret = clk_prepare_enable(dai_props->cpu_dai.clk);
+       ret = asoc_simple_card_clk_enable(&dai_props->cpu_dai);
        if (ret)
                return ret;
 
-       ret = clk_prepare_enable(dai_props->codec_dai.clk);
+       ret = asoc_simple_card_clk_enable(&dai_props->codec_dai);
        if (ret)
-               clk_disable_unprepare(dai_props->cpu_dai.clk);
+               asoc_simple_card_clk_disable(&dai_props->cpu_dai);
 
        return ret;
 }
@@ -136,9 +136,9 @@ static void asoc_simple_card_shutdown(struct snd_pcm_substream *substream)
        struct simple_dai_props *dai_props =
                simple_priv_to_props(priv, rtd->num);
 
-       clk_disable_unprepare(dai_props->cpu_dai.clk);
+       asoc_simple_card_clk_disable(&dai_props->cpu_dai);
 
-       clk_disable_unprepare(dai_props->codec_dai.clk);
+       asoc_simple_card_clk_disable(&dai_props->codec_dai);
 }
 
 static int asoc_simple_card_hw_params(struct snd_pcm_substream *substream,
@@ -202,7 +202,7 @@ static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd)
        if (ret < 0)
                return ret;
 
-       ret = asoc_simple_card_init_mic(rtd->card, &priv->hp_jack, PREFIX);
+       ret = asoc_simple_card_init_mic(rtd->card, &priv->mic_jack, PREFIX);
        if (ret < 0)
                return ret;
 
@@ -233,13 +233,19 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
        snprintf(prop, sizeof(prop), "%scpu", prefix);
        cpu = of_get_child_by_name(node, prop);
 
+       if (!cpu) {
+               ret = -EINVAL;
+               dev_err(dev, "%s: Can't find %s DT node\n", __func__, prop);
+               goto dai_link_of_err;
+       }
+
        snprintf(prop, sizeof(prop), "%splat", prefix);
        plat = of_get_child_by_name(node, prop);
 
        snprintf(prop, sizeof(prop), "%scodec", prefix);
        codec = of_get_child_by_name(node, prop);
 
-       if (!cpu || !codec) {
+       if (!codec) {
                ret = -EINVAL;
                dev_err(dev, "%s: Can't find %s DT node\n", __func__, prop);
                goto dai_link_of_err;
@@ -265,17 +271,11 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
        if (ret < 0)
                goto dai_link_of_err;
 
-       ret = snd_soc_of_parse_tdm_slot(cpu,    &cpu_dai->tx_slot_mask,
-                                               &cpu_dai->rx_slot_mask,
-                                               &cpu_dai->slots,
-                                               &cpu_dai->slot_width);
+       ret = asoc_simple_card_of_parse_tdm(cpu, cpu_dai);
        if (ret < 0)
                goto dai_link_of_err;
 
-       ret = snd_soc_of_parse_tdm_slot(codec,  &codec_dai->tx_slot_mask,
-                                               &codec_dai->rx_slot_mask,
-                                               &codec_dai->slots,
-                                               &codec_dai->slot_width);
+       ret = asoc_simple_card_of_parse_tdm(codec, codec_dai);
        if (ret < 0)
                goto dai_link_of_err;
 
@@ -301,15 +301,6 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
        dai_link->ops = &asoc_simple_card_ops;
        dai_link->init = asoc_simple_card_dai_init;
 
-       dev_dbg(dev, "\tname : %s\n", dai_link->stream_name);
-       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.sysclk);
-       dev_dbg(dev, "\tcodec : %s / %d\n",
-               dai_link->codec_dai_name,
-               dai_props->codec_dai.sysclk);
-
        asoc_simple_card_canonicalize_cpu(dai_link, single_cpu);
 
 dai_link_of_err:
@@ -350,12 +341,12 @@ static int asoc_simple_card_parse_aux_devs(struct device_node *node,
        return 0;
 }
 
-static int asoc_simple_card_parse_of(struct device_node *node,
-                                    struct simple_card_data *priv)
+static int asoc_simple_card_parse_of(struct simple_card_data *priv)
 {
        struct device *dev = simple_priv_to_dev(priv);
        struct snd_soc_card *card = simple_priv_to_card(priv);
        struct device_node *dai_link;
+       struct device_node *node = dev->of_node;
        int ret;
 
        if (!node)
@@ -363,21 +354,13 @@ static int asoc_simple_card_parse_of(struct device_node *node,
 
        dai_link = of_get_child_by_name(node, PREFIX "dai-link");
 
-       /* The off-codec widgets */
-       if (of_property_read_bool(node, PREFIX "widgets")) {
-               ret = snd_soc_of_parse_audio_simple_widgets(card,
-                                       PREFIX "widgets");
-               if (ret)
-                       goto card_parse_end;
-       }
+       ret = asoc_simple_card_of_parse_widgets(card, PREFIX);
+       if (ret < 0)
+               goto card_parse_end;
 
-       /* DAPM routes */
-       if (of_property_read_bool(node, PREFIX "routing")) {
-               ret = snd_soc_of_parse_audio_routing(card,
-                                       PREFIX "routing");
-               if (ret)
-                       goto card_parse_end;
-       }
+       ret = asoc_simple_card_of_parse_routing(card, PREFIX, 1);
+       if (ret < 0)
+               goto card_parse_end;
 
        /* Factor to mclk, used in hw_params() */
        of_property_read_u32(node, PREFIX "mclk-fs", &priv->mclk_fs);
@@ -454,7 +437,7 @@ static int asoc_simple_card_probe(struct platform_device *pdev)
 
        if (np && of_device_is_available(np)) {
 
-               ret = asoc_simple_card_parse_of(np, priv);
+               ret = asoc_simple_card_parse_of(priv);
                if (ret < 0) {
                        if (ret != -EPROBE_DEFER)
                                dev_err(dev, "parse error %d\n", ret);
@@ -497,8 +480,10 @@ static int asoc_simple_card_probe(struct platform_device *pdev)
        snd_soc_card_set_drvdata(card, priv);
 
        ret = devm_snd_soc_register_card(dev, card);
-       if (ret >= 0)
-               return ret;
+       if (ret < 0)
+               goto err;
+
+       return 0;
 err:
        asoc_simple_card_clean_reference(card);