@@ -256,3 +256,115 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
256256 return 0 ;
257257}
258258EXPORT_SYMBOL_GPL (sof_sdw_get_tplg_files );
259+
260+ int sof_i2s_get_tplg_files (struct snd_soc_card * card , const struct snd_soc_acpi_mach * mach ,
261+ const char * prefix , const char * * * tplg_files , bool best_effort )
262+ {
263+ struct snd_soc_acpi_mach_params mach_params = mach -> mach_params ;
264+ struct snd_soc_dai_link * dai_link ;
265+ char platform [SOF_INTEL_PLATFORM_NAME_MAX ];
266+ unsigned long tplg_mask = 0 ;
267+ u16 hdmi_in_mask = 0 ;
268+ int tplg_num = 0 ;
269+ int tplg_dev ;
270+ int ret ;
271+ int i ;
272+
273+ ret = get_platform_name (card , mach , platform );
274+ if (ret < 0 )
275+ return ret ;
276+
277+ for_each_card_prelinks (card , i , dai_link ) {
278+ char * tplg_dev_name ;
279+
280+ dev_dbg (card -> dev , "dai_link %s id %d\n" , dai_link -> name , dai_link -> id );
281+ if (strstr (dai_link -> name , "SSP" )) {
282+ unsigned int ssp_port ;
283+
284+ if (sscanf (dai_link -> name , "SSP%d" , & ssp_port ) != 1 ) {
285+ dev_err (card -> dev , "Invalid SSP port %d\n" , ssp_port );
286+ return - EINVAL ;
287+ }
288+ if (strstr (dai_link -> name , "Codec" )) {
289+ /*
290+ * Assume DAI link 0 is jack which is true in all existing
291+ * machine driver
292+ */
293+ if (dai_link -> id == 0 ) {
294+ tplg_dev = TPLG_DEVICE_SSP_JACK ;
295+ tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
296+ "ssp%d-jack" , ssp_port );
297+ } else {
298+ tplg_dev = TPLG_DEVICE_SSP_AMP ;
299+ tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
300+ "ssp%d-amp" , ssp_port );
301+ }
302+ } else if (strstr (dai_link -> name , "BT" )) {
303+ tplg_dev = TPLG_DEVICE_SSP_BT ;
304+ tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
305+ "ssp%d-bt" , ssp_port );
306+ } else if (strstr (dai_link -> name , "HDMI" )) {
307+ hdmi_in_mask |= BIT (ssp_port );
308+ /* The number of HDMI in dai link is always 2 right now */
309+ if (hweight16 (hdmi_in_mask ) != 2 )
310+ continue ;
311+
312+ tplg_dev = TPLG_DEVICE_SSP_HDMI_IN ;
313+ tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
314+ "ssp%x-hdmiin" , hdmi_in_mask );
315+ } else {
316+ dev_warn (card -> dev ,
317+ "unsupported SSP link %s\n" , dai_link -> name );
318+ continue ;
319+ }
320+ } else if (strstr (dai_link -> name , "dmic" )) {
321+ switch (mach_params .dmic_num ) {
322+ case 2 :
323+ tplg_dev_name = "dmic-2ch" ;
324+ break ;
325+ case 4 :
326+ tplg_dev_name = "dmic-4ch" ;
327+ break ;
328+ default :
329+ dev_warn (card -> dev ,
330+ "unsupported number of dmics: %d\n" ,
331+ mach_params .dmic_num );
332+ continue ;
333+ }
334+ tplg_dev = TPLG_DEVICE_INTEL_PCH_DMIC ;
335+ } else if (strstr (dai_link -> name , "iDisp" )) {
336+ tplg_dev = TPLG_DEVICE_HDMI ;
337+ tplg_dev_name = "hdmi-pcm5" ;
338+ } else {
339+ /* The dai link is not supported by separated tplg yet */
340+ dev_dbg (card -> dev ,
341+ "dai_link %s is not supported by separated tplg yet\n" ,
342+ dai_link -> name );
343+ if (best_effort )
344+ continue ;
345+
346+ return 0 ;
347+ }
348+ if (tplg_mask & BIT (tplg_dev ))
349+ continue ;
350+
351+ tplg_mask |= BIT (tplg_dev );
352+
353+ (* tplg_files )[tplg_num ] = get_tplg_filename (card -> dev , prefix , platform ,
354+ tplg_dev_name , dai_link -> id ,
355+ tplg_dev );
356+ if (!(* tplg_files )[tplg_num ])
357+ return - ENOMEM ;
358+ tplg_num ++ ;
359+ }
360+
361+ dev_dbg (card -> dev , "tplg_mask %#lx tplg_num %d\n" , tplg_mask , tplg_num );
362+
363+ /* Check presence of sub-topologies */
364+ if (all_tplg_files_exist (card -> dev , tplg_files , tplg_num ))
365+ return tplg_num ;
366+
367+ /* return 0 to use monolithic topology */
368+ return 0 ;
369+ }
370+ EXPORT_SYMBOL_GPL (sof_i2s_get_tplg_files );
0 commit comments