@@ -19,6 +19,7 @@ enum tplg_device_id {
1919 TPLG_DEVICE_SDCA_MIC ,
2020 TPLG_DEVICE_INTEL_PCH_DMIC ,
2121 TPLG_DEVICE_HDMI ,
22+ TPLG_DEVICE_LOOPBACK_VIRTUAL ,
2223 TPLG_DEVICE_MAX
2324};
2425
@@ -54,6 +55,7 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
5455 if (strstr (dai_link -> name , "SimpleJack" )) {
5556 tplg_dev = TPLG_DEVICE_SDCA_JACK ;
5657 tplg_dev_name = "sdca-jack" ;
58+
5759 } else if (strstr (dai_link -> name , "SmartAmp" )) {
5860 tplg_dev = TPLG_DEVICE_SDCA_AMP ;
5961 tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
@@ -81,7 +83,29 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
8183 } else if (strstr (dai_link -> name , "iDisp" )) {
8284 tplg_dev = TPLG_DEVICE_HDMI ;
8385 tplg_dev_name = "hdmi-pcm5" ;
84-
86+ } else if (strstr (dai_link -> name , "Loopback_Virtual" )) {
87+ /*
88+ * Loopback_Virtual is always the last DAI link, that's why we can check
89+ * tplg_mask to know whether the jack or amp DAI link exists, and select
90+ * the echo reference topology accordingly.
91+ */
92+ switch (tplg_mask & (BIT (TPLG_DEVICE_SDCA_JACK ) | BIT (TPLG_DEVICE_SDCA_AMP ))) {
93+ case BIT (TPLG_DEVICE_SDCA_JACK ):
94+ tplg_dev_name = "sdca-jack-ref" ;
95+ break ;
96+ case BIT (TPLG_DEVICE_SDCA_AMP ):
97+ tplg_dev_name = "sdca-amp-ref" ;
98+ break ;
99+ case (BIT (TPLG_DEVICE_SDCA_JACK ) | BIT (TPLG_DEVICE_SDCA_AMP )):
100+ tplg_dev_name = "sdca-jack-amp-ref" ;
101+ break ;
102+ default : /* No jack or amp */
103+ dev_dbg (card -> dev ,
104+ "tplg_mask %#lx, No echo referrence is required\n" ,
105+ tplg_mask );
106+ continue ;
107+ }
108+ tplg_dev = TPLG_DEVICE_LOOPBACK_VIRTUAL ;
85109 } else {
86110 /* The dai link is not supported by separated tplg yet */
87111 dev_dbg (card -> dev ,
@@ -109,6 +133,11 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
109133 prefix , platform ,
110134 tplg_dev_name , dai_link -> id );
111135 break ;
136+ case TPLG_DEVICE_LOOPBACK_VIRTUAL :
137+ (* tplg_files )[tplg_num ] = devm_kasprintf (card -> dev , GFP_KERNEL ,
138+ "%s/sof-%s.tplg" ,
139+ prefix , tplg_dev_name );
140+ break ;
112141 default :
113142 (* tplg_files )[tplg_num ] = devm_kasprintf (card -> dev , GFP_KERNEL ,
114143 "%s/sof-%s-id%d.tplg" ,
0 commit comments