ASoC: dapm: Move connection of CODEC to CODEC DAIs
authorCharles Keepax <ckeepax@opensource.cirrus.com>
Wed, 5 Sep 2018 14:21:00 +0000 (15:21 +0100)
committerMark Brown <broonie@kernel.org>
Wed, 5 Sep 2018 16:11:25 +0000 (17:11 +0100)
Currently, snd_soc_dapm_connect_dai_link_widgets connects up the routes
representing normal DAIs, however CODEC to CODEC links are hooked up
through separate infrastructure in soc_link_dai_widgets. Improve the
consistency of the code by using snd_soc_dapm_connect_dai_link for both
types of DAIs.

Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/soc-dapm.h
sound/soc/soc-core.c
sound/soc/soc-dapm.c

index fdaaafdc7a0039a0c4a6e93b6d2b7ed88ea5b74a..cb177fa21ce7e03de4c28d4b25b856a4b5def7cb 100644 (file)
@@ -406,12 +406,6 @@ int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
                                 struct snd_soc_dai *dai);
 int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card);
 void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card);
-int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
-                        struct snd_soc_pcm_runtime *rtd,
-                        const struct snd_soc_pcm_stream *params,
-                        unsigned int num_params,
-                        struct snd_soc_dapm_widget *source,
-                        struct snd_soc_dapm_widget *sink);
 
 /* dapm path setup */
 int snd_soc_dapm_new_widgets(struct snd_soc_card *card);
index 390da15c4a8b9d22b4e7c9b9ae98a567358d5a8d..4e9367aacc0c9c259d6c2cd547330cabfe35193f 100644 (file)
@@ -1463,48 +1463,6 @@ static int soc_link_dai_pcm_new(struct snd_soc_dai **dais, int num_dais,
        return 0;
 }
 
-static int soc_link_dai_widgets(struct snd_soc_card *card,
-                               struct snd_soc_dai_link *dai_link,
-                               struct snd_soc_pcm_runtime *rtd)
-{
-       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
-       struct snd_soc_dai *codec_dai = rtd->codec_dai;
-       struct snd_soc_dapm_widget *sink, *source;
-       int ret;
-
-       if (rtd->num_codecs > 1)
-               dev_warn(card->dev, "ASoC: Multiple codecs not supported yet\n");
-
-       /* link the DAI widgets */
-       sink = codec_dai->playback_widget;
-       source = cpu_dai->capture_widget;
-       if (sink && source) {
-               ret = snd_soc_dapm_new_pcm(card, rtd, dai_link->params,
-                                          dai_link->num_params,
-                                          source, sink);
-               if (ret != 0) {
-                       dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n",
-                               sink->name, source->name, ret);
-                       return ret;
-               }
-       }
-
-       sink = cpu_dai->playback_widget;
-       source = codec_dai->capture_widget;
-       if (sink && source) {
-               ret = snd_soc_dapm_new_pcm(card, rtd, dai_link->params,
-                                          dai_link->num_params,
-                                          source, sink);
-               if (ret != 0) {
-                       dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n",
-                               sink->name, source->name, ret);
-                       return ret;
-               }
-       }
-
-       return 0;
-}
-
 static int soc_probe_link_dais(struct snd_soc_card *card,
                struct snd_soc_pcm_runtime *rtd, int order)
 {
@@ -1606,11 +1564,6 @@ static int soc_probe_link_dais(struct snd_soc_card *card,
                } else {
                        INIT_DELAYED_WORK(&rtd->delayed_work,
                                                codec2codec_close_delayed_work);
-
-                       /* link the DAI widgets */
-                       ret = soc_link_dai_widgets(card, dai_link, rtd);
-                       if (ret)
-                               return ret;
                }
        }
 
index c111e69b9a094efdb12925aab8d69999c80e829f..bbfcb7fc05cc6d220e8707b548042bd4dd5ed8e0 100644 (file)
@@ -3860,12 +3860,10 @@ outfree_w_param:
        return NULL;
 }
 
-int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
-                        struct snd_soc_pcm_runtime *rtd,
-                        const struct snd_soc_pcm_stream *params,
-                        unsigned int num_params,
-                        struct snd_soc_dapm_widget *source,
-                        struct snd_soc_dapm_widget *sink)
+static struct snd_soc_dapm_widget *
+snd_soc_dapm_new_dai(struct snd_soc_card *card, struct snd_soc_pcm_runtime *rtd,
+                    struct snd_soc_dapm_widget *source,
+                    struct snd_soc_dapm_widget *sink)
 {
        struct snd_soc_dapm_widget template;
        struct snd_soc_dapm_widget *w;
@@ -3877,7 +3875,7 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
        link_name = devm_kasprintf(card->dev, GFP_KERNEL, "%s-%s",
                                   source->name, sink->name);
        if (!link_name)
-               return -ENOMEM;
+               return ERR_PTR(-ENOMEM);
 
        memset(&template, 0, sizeof(template));
        template.reg = SND_SOC_NOPM;
@@ -3889,9 +3887,10 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
        template.kcontrol_news = NULL;
 
        /* allocate memory for control, only in case of multiple configs */
-       if (num_params > 1) {
-               w_param_text = devm_kcalloc(card->dev, num_params,
-                                       sizeof(char *), GFP_KERNEL);
+       if (rtd->dai_link->num_params > 1) {
+               w_param_text = devm_kcalloc(card->dev,
+                                           rtd->dai_link->num_params,
+                                           sizeof(char *), GFP_KERNEL);
                if (!w_param_text) {
                        ret = -ENOMEM;
                        goto param_fail;
@@ -3900,7 +3899,9 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
                template.num_kcontrols = 1;
                template.kcontrol_news =
                                        snd_soc_dapm_alloc_kcontrol(card,
-                                               link_name, params, num_params,
+                                               link_name,
+                                               rtd->dai_link->params,
+                                               rtd->dai_link->num_params,
                                                w_param_text, &private_value);
                if (!template.kcontrol_news) {
                        ret = -ENOMEM;
@@ -3915,23 +3916,19 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
        if (IS_ERR(w))
                goto outfree_kcontrol_news;
 
-       w->params = params;
-       w->num_params = num_params;
+       w->params = rtd->dai_link->params;
+       w->num_params = rtd->dai_link->num_params;
        w->priv = rtd;
 
-       ret = snd_soc_dapm_add_path(&card->dapm, source, w, NULL, NULL);
-       if (ret)
-               goto outfree_w;
-       return snd_soc_dapm_add_path(&card->dapm, w, sink, NULL, NULL);
+       return w;
 
-outfree_w:
-       devm_kfree(card->dev, w);
 outfree_kcontrol_news:
        devm_kfree(card->dev, (void *)template.kcontrol_news);
-       snd_soc_dapm_free_kcontrol(card, &private_value, num_params, w_param_text);
+       snd_soc_dapm_free_kcontrol(card, &private_value,
+                                  rtd->dai_link->num_params, w_param_text);
 param_fail:
        devm_kfree(card->dev, link_name);
-       return ret;
+       return ERR_PTR(ret);
 }
 
 int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
@@ -4041,33 +4038,65 @@ static void dapm_connect_dai_link_widgets(struct snd_soc_card *card,
 {
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        struct snd_soc_dai *codec_dai;
-       struct snd_soc_dapm_widget *sink, *source;
+       struct snd_soc_dapm_widget *playback = NULL, *capture = NULL;
+       struct snd_soc_dapm_widget *codec, *playback_cpu, *capture_cpu;
        int i;
 
+       if (rtd->dai_link->params) {
+               if (rtd->num_codecs > 1)
+                       dev_warn(card->dev, "ASoC: Multiple codecs not supported yet\n");
+
+               playback_cpu = cpu_dai->capture_widget;
+               capture_cpu = cpu_dai->playback_widget;
+       } else {
+               playback = cpu_dai->playback_widget;
+               capture = cpu_dai->capture_widget;
+               playback_cpu = playback;
+               capture_cpu = capture;
+       }
+
        for_each_rtd_codec_dai(rtd, i, codec_dai) {
 
                /* connect BE DAI playback if widgets are valid */
-               if (codec_dai->playback_widget && cpu_dai->playback_widget) {
-                       source = cpu_dai->playback_widget;
-                       sink = codec_dai->playback_widget;
+               codec = codec_dai->playback_widget;
+
+               if (playback_cpu && codec) {
+                       if (!playback) {
+                               playback = snd_soc_dapm_new_dai(card, rtd,
+                                                               playback_cpu,
+                                                               codec);
+
+                               snd_soc_dapm_add_path(&card->dapm, playback_cpu,
+                                                     playback, NULL, NULL);
+                       }
+
                        dev_dbg(rtd->dev, "connected DAI link %s:%s -> %s:%s\n",
-                               cpu_dai->component->name, source->name,
-                               codec_dai->component->name, sink->name);
+                               cpu_dai->component->name, playback_cpu->name,
+                               codec_dai->component->name, codec->name);
 
-                       snd_soc_dapm_add_path(&card->dapm, source, sink,
-                               NULL, NULL);
+                       snd_soc_dapm_add_path(&card->dapm, playback, codec,
+                                             NULL, NULL);
                }
 
                /* connect BE DAI capture if widgets are valid */
-               if (codec_dai->capture_widget && cpu_dai->capture_widget) {
-                       source = codec_dai->capture_widget;
-                       sink = cpu_dai->capture_widget;
+               codec = codec_dai->capture_widget;
+
+               if (codec && capture_cpu) {
+                       if (!capture) {
+                               capture = snd_soc_dapm_new_dai(card, rtd,
+                                                              codec,
+                                                              capture_cpu);
+
+                               snd_soc_dapm_add_path(&card->dapm, capture,
+                                                     capture_cpu, NULL, NULL);
+                       }
+
                        dev_dbg(rtd->dev, "connected DAI link %s:%s -> %s:%s\n",
-                               codec_dai->component->name, source->name,
-                               cpu_dai->component->name, sink->name);
+                               codec_dai->component->name, codec->name,
+                               cpu_dai->component->name, capture_cpu->name);
 
-                       snd_soc_dapm_add_path(&card->dapm, source, sink,
-                               NULL, NULL);
+                       snd_soc_dapm_add_path(&card->dapm, codec, capture,
+                                             NULL, NULL);
                }
        }
 }
@@ -4122,7 +4151,7 @@ void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card)
                 * dynamic FE links have no fixed DAI mapping.
                 * CODEC<->CODEC links have no direct connection.
                 */
-               if (rtd->dai_link->dynamic || rtd->dai_link->params)
+               if (rtd->dai_link->dynamic)
                        continue;
 
                dapm_connect_dai_link_widgets(card, rtd);