ASoC: Intel: Boards: tgl_max98373: Add BT offload support
authorYong Zhi <yong.zhi@intel.com>
Wed, 5 May 2021 16:36:53 +0000 (11:36 -0500)
committerMark Brown <broonie@kernel.org>
Mon, 10 May 2021 12:04:14 +0000 (13:04 +0100)
BT audio offload is internally configured with virtual GPIOs,
the port assignment is fixed on SSP2 for TGL/ADL platforms.

Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Signed-off-by: Yong Zhi <yong.zhi@intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20210505163705.305616-2-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/boards/sof_rt5682.c

index 58548ea..5e8f102 100644 (file)
 #define SOF_MAX98373_SPEAKER_AMP_PRESENT       BIT(17)
 #define SOF_MAX98360A_SPEAKER_AMP_PRESENT      BIT(18)
 
+/* BT audio offload: reserve 3 bits for future */
+#define SOF_BT_OFFLOAD_SSP_SHIFT               19
+#define SOF_BT_OFFLOAD_SSP_MASK                (GENMASK(21, 19))
+#define SOF_BT_OFFLOAD_SSP(quirk)      \
+       (((quirk) << SOF_BT_OFFLOAD_SSP_SHIFT) & SOF_BT_OFFLOAD_SSP_MASK)
+#define SOF_SSP_BT_OFFLOAD_PRESENT             BIT(22)
+
 /* Default: MCLK on, MCLK 19.2M, SSP0  */
 static unsigned long sof_rt5682_quirk = SOF_RT5682_MCLK_EN |
                                        SOF_RT5682_SSP_CODEC(0);
@@ -591,6 +598,13 @@ static struct snd_soc_dai_link_component rt1015_components[] = {
        },
 };
 
+static struct snd_soc_dai_link_component dummy_component[] = {
+       {
+               .name = "snd-soc-dummy",
+               .dai_name = "snd-soc-dummy-dai",
+       }
+};
+
 static struct snd_soc_dai_link *sof_card_dai_links_create(struct device *dev,
                                                          int ssp_codec,
                                                          int ssp_amp,
@@ -780,6 +794,31 @@ static struct snd_soc_dai_link *sof_card_dai_links_create(struct device *dev,
                        if (!links[id].cpus->dai_name)
                                goto devm_err;
                }
+               id++;
+       }
+
+       /* BT audio offload */
+       if (sof_rt5682_quirk & SOF_SSP_BT_OFFLOAD_PRESENT) {
+               int port = (sof_rt5682_quirk & SOF_BT_OFFLOAD_SSP_MASK) >>
+                               SOF_BT_OFFLOAD_SSP_SHIFT;
+
+               links[id].id = id;
+               links[id].cpus = &cpus[id];
+               links[id].cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL,
+                                                         "SSP%d Pin", port);
+               if (!links[id].cpus->dai_name)
+                       goto devm_err;
+               links[id].name = devm_kasprintf(dev, GFP_KERNEL, "SSP%d-BT", port);
+               if (!links[id].name)
+                       goto devm_err;
+               links[id].codecs = dummy_component;
+               links[id].num_codecs = ARRAY_SIZE(dummy_component);
+               links[id].platforms = platform_component;
+               links[id].num_platforms = ARRAY_SIZE(platform_component);
+               links[id].dpcm_playback = 1;
+               links[id].dpcm_capture = 1;
+               links[id].no_pcm = 1;
+               links[id].num_cpus = 1;
        }
 
        return links;
@@ -869,6 +908,9 @@ static int sof_audio_probe(struct platform_device *pdev)
        else if (sof_rt5682_quirk & SOF_RT1015P_SPEAKER_AMP_PRESENT)
                sof_rt1015p_codec_conf(&sof_audio_card_rt5682);
 
+       if (sof_rt5682_quirk & SOF_SSP_BT_OFFLOAD_PRESENT)
+               sof_audio_card_rt5682.num_links++;
+
        dai_links = sof_card_dai_links_create(&pdev->dev, ssp_codec, ssp_amp,
                                              dmic_be_num, hdmi_num);
        if (!dai_links)