@@ -27,16 +27,22 @@ enum tplg_device_id {
2727
2828#define SOF_INTEL_PLATFORM_NAME_MAX 4
2929
30+ struct tplg_device {
31+ enum tplg_device_id id ;
32+ int dai_link_id ;
33+ const char * name ;
34+ };
35+
3036int sof_sdw_get_tplg_files (struct snd_soc_card * card , const struct snd_soc_acpi_mach * mach ,
3137 const char * prefix , const char * * * tplg_files , bool best_effort )
3238{
3339 struct snd_soc_acpi_mach_params mach_params = mach -> mach_params ;
3440 struct snd_soc_dai_link * dai_link ;
41+ struct tplg_device * tplg_devs ;
3542 const struct firmware * fw ;
3643 char platform [SOF_INTEL_PLATFORM_NAME_MAX ];
3744 unsigned long tplg_mask = 0 ;
3845 int tplg_num = 0 ;
39- int tplg_dev ;
4046 int ret ;
4147 int i ;
4248
@@ -47,41 +53,44 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
4753 return - EINVAL ;
4854 }
4955
50- for_each_card_prelinks (card , i , dai_link ) {
51- char * tplg_dev_name ;
56+ /* The worst case is that each dai link uses a topology */
57+ tplg_devs = devm_kcalloc (card -> dev , card -> num_links , sizeof (* tplg_devs ), GFP_KERNEL );
58+ if (!tplg_devs )
59+ return - ENOMEM ;
5260
61+ for_each_card_prelinks (card , i , dai_link ) {
5362 dev_dbg (card -> dev , "dai_link %s id %d\n" , dai_link -> name , dai_link -> id );
5463 if (strstr (dai_link -> name , "SimpleJack" )) {
55- tplg_dev = TPLG_DEVICE_SDCA_JACK ;
56- tplg_dev_name = "sdca-jack" ;
64+ tplg_devs [tplg_num ].id = TPLG_DEVICE_SDCA_JACK ;
65+ tplg_devs [tplg_num ].name = "sdca-jack" ;
66+
5767 } else if (strstr (dai_link -> name , "SmartAmp" )) {
58- tplg_dev = TPLG_DEVICE_SDCA_AMP ;
59- tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
68+ tplg_devs [ tplg_num ]. id = TPLG_DEVICE_SDCA_AMP ;
69+ tplg_devs [ tplg_num ]. name = devm_kasprintf (card -> dev , GFP_KERNEL ,
6070 "sdca-%damp" , dai_link -> num_cpus );
61- if (!tplg_dev_name )
71+ if (!tplg_devs [ tplg_num ]. name )
6272 return - ENOMEM ;
6373 } else if (strstr (dai_link -> name , "SmartMic" )) {
64- tplg_dev = TPLG_DEVICE_SDCA_MIC ;
65- tplg_dev_name = "sdca-mic" ;
74+ tplg_devs [ tplg_num ]. id = TPLG_DEVICE_SDCA_MIC ;
75+ tplg_devs [ tplg_num ]. name = "sdca-mic" ;
6676 } else if (strstr (dai_link -> name , "dmic" )) {
6777 switch (mach_params .dmic_num ) {
6878 case 2 :
69- tplg_dev_name = "dmic-2ch" ;
79+ tplg_devs [ tplg_num ]. name = "dmic-2ch" ;
7080 break ;
7181 case 4 :
72- tplg_dev_name = "dmic-4ch" ;
82+ tplg_devs [ tplg_num ]. name = "dmic-4ch" ;
7383 break ;
7484 default :
7585 dev_warn (card -> dev ,
7686 "unsupported number of dmics: %d\n" ,
7787 mach_params .dmic_num );
7888 continue ;
7989 }
80- tplg_dev = TPLG_DEVICE_INTEL_PCH_DMIC ;
90+ tplg_devs [ tplg_num ]. id = TPLG_DEVICE_INTEL_PCH_DMIC ;
8191 } else if (strstr (dai_link -> name , "iDisp" )) {
82- tplg_dev = TPLG_DEVICE_HDMI ;
83- tplg_dev_name = "hdmi-pcm5" ;
84-
92+ tplg_devs [tplg_num ].id = TPLG_DEVICE_HDMI ;
93+ tplg_devs [tplg_num ].name = "hdmi-pcm5" ;
8594 } else {
8695 /* The dai link is not supported by separated tplg yet */
8796 dev_dbg (card -> dev ,
@@ -92,39 +101,40 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
92101
93102 return 0 ;
94103 }
95- if (tplg_mask & BIT (tplg_dev ))
104+ if (tplg_mask & BIT (tplg_devs [ tplg_num ]. id ))
96105 continue ;
97106
98- tplg_mask |= BIT (tplg_dev );
107+ tplg_devs [tplg_num ].dai_link_id = dai_link -> id ;
108+ tplg_mask |= BIT (tplg_devs [tplg_num ].id );
109+ tplg_num ++ ;
110+ }
111+
112+ dev_dbg (card -> dev , "tplg_mask %#lx tplg_num %d\n" , tplg_mask , tplg_num );
99113
114+ /* Check presence of sub-topologies */
115+ for (i = 0 ; i < tplg_num ; i ++ ) {
100116 /*
101117 * The tplg file naming rule is sof-<platform>-<function>-id<BE id number>.tplg
102118 * where <platform> is only required for the DMIC function as the nhlt blob
103119 * is platform dependent.
104120 */
105- switch (tplg_dev ) {
121+ switch (tplg_devs [ i ]. id ) {
106122 case TPLG_DEVICE_INTEL_PCH_DMIC :
107- (* tplg_files )[tplg_num ] = devm_kasprintf (card -> dev , GFP_KERNEL ,
123+ (* tplg_files )[i ] = devm_kasprintf (card -> dev , GFP_KERNEL ,
108124 "%s/sof-%s-%s-id%d.tplg" ,
109125 prefix , platform ,
110- tplg_dev_name , dai_link -> id );
126+ tplg_devs [i ].name ,
127+ tplg_devs [i ].dai_link_id );
111128 break ;
112129 default :
113- (* tplg_files )[tplg_num ] = devm_kasprintf (card -> dev , GFP_KERNEL ,
130+ (* tplg_files )[i ] = devm_kasprintf (card -> dev , GFP_KERNEL ,
114131 "%s/sof-%s-id%d.tplg" ,
115- prefix , tplg_dev_name ,
116- dai_link -> id );
132+ prefix , tplg_devs [ i ]. name ,
133+ tplg_devs [ i ]. dai_link_id );
117134 break ;
118135 }
119- if (!(* tplg_files )[tplg_num ])
136+ if (!(* tplg_files )[i ])
120137 return - ENOMEM ;
121- tplg_num ++ ;
122- }
123-
124- dev_dbg (card -> dev , "tplg_mask %#lx tplg_num %d\n" , tplg_mask , tplg_num );
125-
126- /* Check presence of sub-topologies */
127- for (i = 0 ; i < tplg_num ; i ++ ) {
128138 ret = firmware_request_nowarn (& fw , (* tplg_files )[i ], card -> dev );
129139 if (!ret ) {
130140 release_firmware (fw );
0 commit comments