]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: qcom: sdw: Add get and set channel maps support from codec to cpu dais
authorMohammad Rafi Shaik <quic_mohs@quicinc.com>
Thu, 6 Feb 2025 11:22:25 +0000 (16:52 +0530)
committerMark Brown <broonie@kernel.org>
Thu, 6 Feb 2025 11:49:23 +0000 (11:49 +0000)
Add get and set channel maps support from codec to cpu dais.

Implemented logic to get the channel map in case of only sdw stream and
set channel map only for specific cpu dais.

Signed-off-by: Mohammad Rafi Shaik <quic_mohs@quicinc.com>
Link: https://patch.msgid.link/20250206112225.3270400-5-quic_mohs@quicinc.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/qcom/sdw.c

index f2eda2ff46c04f47b0a992cb42aa7837eb2fd382..1d01b9329e08c581bbe611e867aa16ba76227ebf 100644 (file)
@@ -23,9 +23,11 @@ int qcom_snd_sdw_startup(struct snd_pcm_substream *substream)
 {
        struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
        struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
+       u32 rx_ch[SDW_MAX_PORTS], tx_ch[SDW_MAX_PORTS];
        struct sdw_stream_runtime *sruntime;
        struct snd_soc_dai *codec_dai;
-       int ret, i;
+       u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
+       int ret, i, j;
 
        sruntime = sdw_alloc_stream(cpu_dai->name);
        if (!sruntime)
@@ -35,9 +37,35 @@ int qcom_snd_sdw_startup(struct snd_pcm_substream *substream)
                ret = snd_soc_dai_set_stream(codec_dai, sruntime,
                                             substream->stream);
                if (ret < 0 && ret != -ENOTSUPP) {
-                       dev_err(rtd->dev, "Failed to set sdw stream on %s\n",
-                               codec_dai->name);
+                       dev_err(rtd->dev, "Failed to set sdw stream on %s\n", codec_dai->name);
                        goto err_set_stream;
+               } else if (ret == -ENOTSUPP) {
+                       /* Ignore unsupported */
+                       continue;
+               }
+
+               ret = snd_soc_dai_get_channel_map(codec_dai, &tx_ch_cnt, tx_ch,
+                                                 &rx_ch_cnt, rx_ch);
+               if (ret != 0 && ret != -ENOTSUPP) {
+                       dev_err(rtd->dev, "Failed to get codec chan map %s\n", codec_dai->name);
+                       goto err_set_stream;
+               } else if (ret == -ENOTSUPP) {
+                       /* Ignore unsupported */
+                       continue;
+               }
+       }
+
+       switch (cpu_dai->id) {
+       case RX_CODEC_DMA_RX_0:
+       case TX_CODEC_DMA_TX_3:
+               if (tx_ch_cnt || rx_ch_cnt) {
+                       for_each_rtd_codec_dais(rtd, j, codec_dai) {
+                               ret = snd_soc_dai_set_channel_map(codec_dai,
+                                                                 tx_ch_cnt, tx_ch,
+                                                                 rx_ch_cnt, rx_ch);
+                               if (ret != 0 && ret != -ENOTSUPP)
+                                       goto err_set_stream;
+                       }
                }
        }