ASoC: qcom: common: Support parsing links without DPCM
authorStephan Gerhold <stephan@gerhold.net>
Thu, 23 Jul 2020 18:39:01 +0000 (20:39 +0200)
committerMark Brown <broonie@kernel.org>
Fri, 24 Jul 2020 14:01:18 +0000 (15:01 +0100)
So far qcom_snd_parse_of() was only used to parse the device tree
for boards using the QDSP6 driver together with DPCM. apq8016_sbc
uses an almost identical version (apq8016_sbc_parse_of()) which
parses links without DPCM.

Given the similarity of the two functions it is useful to combine
these two. To allow using qcom_snd_parse_of() in apq8016_sbc we
need to support parsing links without DPCM as well.

This is pretty simple: A DPCM link in the device tree is defined using:

  - DPCM frontend: "cpu"
  - DPCM backend:  "cpu", "platform" and "codec"

... while a link without DPCM has "cpu" and "codec" (but no "platform").

Add a few more if conditions to handle links without DPCM correctly.

Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
Tested-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Link: https://lore.kernel.org/r/20200723183904.321040-5-stephan@gerhold.net
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/qcom/common.c

index 030df60..54f5bc6 100644 (file)
@@ -84,7 +84,7 @@ int qcom_snd_parse_of(struct snd_soc_card *card)
                        goto err;
                }
 
-               if (codec && platform) {
+               if (platform) {
                        link->platforms->of_node = of_parse_phandle(platform,
                                        "sound-dai",
                                        0);
@@ -93,15 +93,24 @@ int qcom_snd_parse_of(struct snd_soc_card *card)
                                ret = -EINVAL;
                                goto err;
                        }
+               } else {
+                       link->platforms->of_node = link->cpus->of_node;
+               }
 
+               if (codec) {
                        ret = snd_soc_of_get_dai_link_codecs(dev, codec, link);
                        if (ret < 0) {
                                dev_err(card->dev, "%s: codec dai not found\n", link->name);
                                goto err;
                        }
-                       link->no_pcm = 1;
-                       link->ignore_pmdown_time = 1;
+
+                       if (platform) {
+                               /* DPCM backend */
+                               link->no_pcm = 1;
+                               link->ignore_pmdown_time = 1;
+                       }
                } else {
+                       /* DPCM frontend */
                        dlc = devm_kzalloc(dev, sizeof(*dlc), GFP_KERNEL);
                        if (!dlc)
                                return -ENOMEM;
@@ -109,15 +118,18 @@ int qcom_snd_parse_of(struct snd_soc_card *card)
                        link->codecs     = dlc;
                        link->num_codecs = 1;
 
-                       link->platforms->of_node = link->cpus->of_node;
                        link->codecs->dai_name = "snd-soc-dummy-dai";
                        link->codecs->name = "snd-soc-dummy";
                        link->dynamic = 1;
                }
 
-               snd_soc_dai_link_set_capabilities(link);
-               link->ignore_suspend = 1;
-               link->nonatomic = 1;
+               if (platform || !codec) {
+                       /* DPCM */
+                       snd_soc_dai_link_set_capabilities(link);
+                       link->ignore_suspend = 1;
+                       link->nonatomic = 1;
+               }
+
                link->stream_name = link->name;
                link++;