#define SOF_CS42L42_DAILINK_MASK               (GENMASK(24, 10))
 #define SOF_CS42L42_DAILINK(link1, link2, link3, link4, link5) \
        ((((link1) | ((link2) << 3) | ((link3) << 6) | ((link4) << 9) | ((link5) << 12)) << SOF_CS42L42_DAILINK_SHIFT) & SOF_CS42L42_DAILINK_MASK)
-#define SOF_MAX98357A_SPEAKER_AMP_PRESENT      BIT(25)
-#define SOF_MAX98360A_SPEAKER_AMP_PRESENT      BIT(26)
+#define SOF_BT_OFFLOAD_PRESENT                 BIT(25)
+#define SOF_CS42L42_SSP_BT_SHIFT               26
+#define SOF_CS42L42_SSP_BT_MASK                        (GENMASK(28, 26))
+#define SOF_CS42L42_SSP_BT(quirk)      \
+       (((quirk) << SOF_CS42L42_SSP_BT_SHIFT) & SOF_CS42L42_SSP_BT_MASK)
+#define SOF_MAX98357A_SPEAKER_AMP_PRESENT      BIT(29)
+#define SOF_MAX98360A_SPEAKER_AMP_PRESENT      BIT(30)
 
 enum {
        LINK_NONE = 0,
        LINK_SPK = 2,
        LINK_DMIC = 3,
        LINK_HDMI = 4,
+       LINK_BT = 5,
 };
 
 static struct snd_soc_jack_pin jack_pins[] = {
        }
 };
 
+static struct snd_soc_dai_link_component dummy_component[] = {
+       {
+               .name = "snd-soc-dummy",
+               .dai_name = "snd-soc-dummy-dai",
+       }
+};
+
 static int create_spk_amp_dai_links(struct device *dev,
                                    struct snd_soc_dai_link *links,
                                    struct snd_soc_dai_link_component *cpus,
        return -ENOMEM;
 }
 
+static int create_bt_offload_dai_links(struct device *dev,
+                                      struct snd_soc_dai_link *links,
+                                      struct snd_soc_dai_link_component *cpus,
+                                      int *id, int ssp_bt)
+{
+       /* bt offload */
+       if (!(sof_cs42l42_quirk & SOF_BT_OFFLOAD_PRESENT))
+               return 0;
+
+       links[*id].name = devm_kasprintf(dev, GFP_KERNEL, "SSP%d-BT",
+                                        ssp_bt);
+       if (!links[*id].name)
+               goto devm_err;
+
+       links[*id].id = *id;
+       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].cpus = &cpus[*id];
+       links[*id].num_cpus = 1;
+
+       links[*id].cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL,
+                                                  "SSP%d Pin",
+                                                  ssp_bt);
+       if (!links[*id].cpus->dai_name)
+               goto devm_err;
+
+       (*id)++;
+
+       return 0;
+
+devm_err:
+       return -ENOMEM;
+}
+
 static struct snd_soc_dai_link *sof_card_dai_links_create(struct device *dev,
                                                          int ssp_codec,
                                                          int ssp_amp,
+                                                         int ssp_bt,
                                                          int dmic_be_num,
                                                          int hdmi_num)
 {
                                goto devm_err;
                        }
                        break;
+               case LINK_BT:
+                       ret = create_bt_offload_dai_links(dev, links, cpus, &id, ssp_bt);
+                       if (ret < 0) {
+                               dev_err(dev, "fail to create bt offload dai links, ret %d\n",
+                                       ret);
+                               goto devm_err;
+                       }
+                       break;
                case LINK_NONE:
                        /* caught here if it's not used as terminator in macro */
                default:
        struct snd_soc_acpi_mach *mach;
        struct sof_card_private *ctx;
        int dmic_be_num, hdmi_num;
-       int ret, ssp_amp, ssp_codec;
+       int ret, ssp_bt, ssp_amp, ssp_codec;
 
        ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
        if (!ctx)
 
        dev_dbg(&pdev->dev, "sof_cs42l42_quirk = %lx\n", sof_cs42l42_quirk);
 
+       ssp_bt = (sof_cs42l42_quirk & SOF_CS42L42_SSP_BT_MASK) >>
+                       SOF_CS42L42_SSP_BT_SHIFT;
+
        ssp_amp = (sof_cs42l42_quirk & SOF_CS42L42_SSP_AMP_MASK) >>
                        SOF_CS42L42_SSP_AMP_SHIFT;
 
 
        if (sof_cs42l42_quirk & SOF_SPEAKER_AMP_PRESENT)
                sof_audio_card_cs42l42.num_links++;
+       if (sof_cs42l42_quirk & SOF_BT_OFFLOAD_PRESENT)
+               sof_audio_card_cs42l42.num_links++;
 
        dai_links = sof_card_dai_links_create(&pdev->dev, ssp_codec, ssp_amp,
-                                             dmic_be_num, hdmi_num);
+                                             ssp_bt, dmic_be_num, hdmi_num);
        if (!dai_links)
                return -ENOMEM;