ASoC: simple-card-utils: add codec2codec support
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tue, 12 Oct 2021 04:54:13 +0000 (13:54 +0900)
committerMark Brown <broonie@kernel.org>
Fri, 15 Oct 2021 15:10:37 +0000 (16:10 +0100)
codec2codec needs snd_soc_pcm_stream settings.
This patch adds it.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://lore.kernel.org/r/874k9mn8qy.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/simple_card_utils.h
sound/soc/generic/simple-card-utils.c

index 03d0754..df430f1 100644 (file)
@@ -42,6 +42,7 @@ struct prop_nums {
        int cpus;
        int codecs;
        int platforms;
+       int c2c;
 };
 
 struct asoc_simple_priv {
@@ -54,6 +55,7 @@ struct asoc_simple_priv {
                struct snd_soc_dai_link_component *platforms;
                struct asoc_simple_data adata;
                struct snd_soc_codec_conf *codec_conf;
+               struct snd_soc_pcm_stream *c2c_conf;
                struct prop_nums num;
                unsigned int mclk_fs;
        } *dai_props;
@@ -64,6 +66,7 @@ struct asoc_simple_priv {
        struct snd_soc_dai_link_component *dlcs;
        struct snd_soc_dai_link_component dummy;
        struct snd_soc_codec_conf *codec_conf;
+       struct snd_soc_pcm_stream *c2c_conf;
        struct gpio_desc *pa_gpio;
        const struct snd_soc_ops *ops;
        unsigned int dpcm_selectable:1;
index fd893d2..39ba700 100644 (file)
@@ -619,7 +619,8 @@ int asoc_simple_init_priv(struct asoc_simple_priv *priv,
        struct asoc_simple_dai *dais;
        struct snd_soc_dai_link_component *dlcs;
        struct snd_soc_codec_conf *cconf = NULL;
-       int i, dai_num = 0, dlc_num = 0, cnf_num = 0;
+       struct snd_soc_pcm_stream *c2c_conf = NULL;
+       int i, dai_num = 0, dlc_num = 0, cnf_num = 0, c2c_num = 0;
 
        dai_props = devm_kcalloc(dev, li->link, sizeof(*dai_props), GFP_KERNEL);
        dai_link  = devm_kcalloc(dev, li->link, sizeof(*dai_link),  GFP_KERNEL);
@@ -638,6 +639,8 @@ int asoc_simple_init_priv(struct asoc_simple_priv *priv,
 
                if (!li->num[i].cpus)
                        cnf_num += li->num[i].codecs;
+
+               c2c_num += li->num[i].c2c;
        }
 
        dais = devm_kcalloc(dev, dai_num, sizeof(*dais), GFP_KERNEL);
@@ -651,6 +654,12 @@ int asoc_simple_init_priv(struct asoc_simple_priv *priv,
                        return -ENOMEM;
        }
 
+       if (c2c_num) {
+               c2c_conf = devm_kcalloc(dev, c2c_num, sizeof(*c2c_conf), GFP_KERNEL);
+               if (!c2c_conf)
+                       return -ENOMEM;
+       }
+
        dev_dbg(dev, "link %d, dais %d, ccnf %d\n",
                li->link, dai_num, cnf_num);
 
@@ -664,6 +673,7 @@ int asoc_simple_init_priv(struct asoc_simple_priv *priv,
        priv->dais              = dais;
        priv->dlcs              = dlcs;
        priv->codec_conf        = cconf;
+       priv->c2c_conf          = c2c_conf;
 
        card->dai_link          = priv->dai_link;
        card->num_links         = li->link;
@@ -681,6 +691,12 @@ int asoc_simple_init_priv(struct asoc_simple_priv *priv,
 
                        dlcs += li->num[i].cpus;
                        dais += li->num[i].cpus;
+
+                       if (li->num[i].c2c) {
+                               /* Codec2Codec */
+                               dai_props[i].c2c_conf = c2c_conf;
+                               c2c_conf += li->num[i].c2c;
+                       }
                } else {
                        /* DPCM Be's CPU = dummy */
                        dai_props[i].cpus       =