@@ -84,6 +84,7 @@ static char *get_tplg_filename(struct device *dev, const char *prefix,
8484 case TPLG_DEVICE_SSP_JACK :
8585 case TPLG_DEVICE_SSP_AMP :
8686 case TPLG_DEVICE_SSP_BT :
87+ case TPLG_DEVICE_SSP_HDMI_IN :
8788 filename = devm_kasprintf (dev , GFP_KERNEL , "%s/sof-%s-%s-id%d.tplg" ,
8889 prefix , platform , tplg_dev_name , dai_link_id );
8990 break ;
@@ -219,3 +220,115 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
219220 return 0 ;
220221}
221222EXPORT_SYMBOL_GPL (sof_sdw_get_tplg_files );
223+
224+ int sof_i2s_get_tplg_files (struct snd_soc_card * card , const struct snd_soc_acpi_mach * mach ,
225+ const char * prefix , const char * * * tplg_files , bool best_effort )
226+ {
227+ struct snd_soc_acpi_mach_params mach_params = mach -> mach_params ;
228+ struct snd_soc_dai_link * dai_link ;
229+ char platform [SOF_INTEL_PLATFORM_NAME_MAX ];
230+ unsigned long tplg_mask = 0 ;
231+ u16 hdmi_in_mask = 0 ;
232+ int tplg_num = 0 ;
233+ int tplg_dev ;
234+ int ret ;
235+ int i ;
236+
237+ ret = get_platform_name (card , mach , platform );
238+ if (ret < 0 )
239+ return ret ;
240+
241+ for_each_card_prelinks (card , i , dai_link ) {
242+ char * tplg_dev_name ;
243+
244+ dev_dbg (card -> dev , "dai_link %s id %d\n" , dai_link -> name , dai_link -> id );
245+ if (strstr (dai_link -> name , "SSP" )) {
246+ unsigned int ssp_port ;
247+
248+ if (sscanf (dai_link -> name , "SSP%d" , & ssp_port ) != 1 ) {
249+ dev_err (card -> dev , "Invalid SSP port %d\n" , ssp_port );
250+ return - EINVAL ;
251+ }
252+ if (strstr (dai_link -> name , "Codec" )) {
253+ /*
254+ * Assume DAI link 0 is jack which is true in all existing
255+ * machine driver
256+ */
257+ if (dai_link -> id == 0 ) {
258+ tplg_dev = TPLG_DEVICE_SSP_JACK ;
259+ tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
260+ "ssp%d-jack" , ssp_port );
261+ } else {
262+ tplg_dev = TPLG_DEVICE_SSP_AMP ;
263+ tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
264+ "ssp%d-amp" , ssp_port );
265+ }
266+ } else if (strstr (dai_link -> name , "BT" )) {
267+ tplg_dev = TPLG_DEVICE_SSP_BT ;
268+ tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
269+ "ssp%d-bt" , ssp_port );
270+ } else if (strstr (dai_link -> name , "HDMI" )) {
271+ hdmi_in_mask |= BIT (ssp_port );
272+ /* The number of HDMI in dai link is always 2 right now */
273+ if (hweight16 (hdmi_in_mask ) != 2 )
274+ continue ;
275+
276+ tplg_dev = TPLG_DEVICE_SSP_HDMI_IN ;
277+ tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
278+ "ssp%x-hdmiin" , hdmi_in_mask );
279+ } else {
280+ dev_warn (card -> dev ,
281+ "unsupported SSP link %s\n" , dai_link -> name );
282+ continue ;
283+ }
284+ } else if (strstr (dai_link -> name , "dmic" )) {
285+ switch (mach_params .dmic_num ) {
286+ case 2 :
287+ tplg_dev_name = "dmic-2ch" ;
288+ break ;
289+ case 4 :
290+ tplg_dev_name = "dmic-4ch" ;
291+ break ;
292+ default :
293+ dev_warn (card -> dev ,
294+ "unsupported number of dmics: %d\n" ,
295+ mach_params .dmic_num );
296+ continue ;
297+ }
298+ tplg_dev = TPLG_DEVICE_INTEL_PCH_DMIC ;
299+ } else if (strstr (dai_link -> name , "iDisp" )) {
300+ tplg_dev = TPLG_DEVICE_HDMI ;
301+ tplg_dev_name = "hdmi-pcm5" ;
302+ } else {
303+ /* The dai link is not supported by separated tplg yet */
304+ dev_dbg (card -> dev ,
305+ "dai_link %s is not supported by separated tplg yet\n" ,
306+ dai_link -> name );
307+ if (best_effort )
308+ continue ;
309+
310+ return 0 ;
311+ }
312+ if (tplg_mask & BIT (tplg_dev ))
313+ continue ;
314+
315+ tplg_mask |= BIT (tplg_dev );
316+
317+ (* tplg_files )[tplg_num ] = get_tplg_filename (card -> dev , prefix , platform ,
318+ tplg_dev_name , dai_link -> id ,
319+ tplg_dev );
320+ if (!(* tplg_files )[tplg_num ])
321+ return - ENOMEM ;
322+ tplg_num ++ ;
323+ }
324+
325+ dev_dbg (card -> dev , "tplg_mask %#lx tplg_num %d\n" , tplg_mask , tplg_num );
326+
327+ /* Check presence of sub-topologies */
328+ if (all_tplg_files_exist (card -> dev , tplg_files , tplg_num ))
329+ return tplg_num ;
330+
331+ /* return 0 to use monolithic topology */
332+ return 0 ;
333+ }
334+ EXPORT_SYMBOL_GPL (sof_i2s_get_tplg_files );
0 commit comments