@@ -27,25 +27,84 @@ enum tplg_device_id {
2727
2828#define SOF_INTEL_PLATFORM_NAME_MAX 4
2929
30+ static int get_platform_name (struct snd_soc_card * card ,
31+ const struct snd_soc_acpi_mach * mach , char * platform )
32+ {
33+ int ret ;
34+
35+ ret = sscanf (mach -> sof_tplg_filename , "sof-%3s-*.tplg" , platform );
36+ if (ret != 1 ) {
37+ dev_err (card -> dev , "Invalid platform name %s of tplg %s\n" ,
38+ platform , mach -> sof_tplg_filename );
39+ return - EINVAL ;
40+ }
41+
42+ return 0 ;
43+ }
44+
45+ static bool all_tplg_files_exist (struct device * dev , const char * * * tplg_files , int tplg_num )
46+ {
47+ const struct firmware * fw ;
48+ int ret ;
49+ int i ;
50+
51+ for (i = 0 ; i < tplg_num ; i ++ ) {
52+ ret = firmware_request_nowarn (& fw , (* tplg_files )[i ], dev );
53+ if (!ret ) {
54+ release_firmware (fw );
55+ } else {
56+ dev_warn (dev ,
57+ "Failed to open topology file: %s, you might need to\n" ,
58+ (* tplg_files )[i ]);
59+ dev_warn (dev ,
60+ "download it from https://github.com/thesofproject/sof-bin/\n" );
61+ return false;
62+ }
63+ }
64+
65+ return true;
66+ }
67+
68+ static char * get_tplg_filename (struct device * dev , const char * prefix ,
69+ const char * platform , const char * tplg_dev_name ,
70+ int dai_link_id , int tplg_dev )
71+ {
72+ char * filename = NULL ;
73+
74+ /*
75+ * The tplg file naming rule is sof-<platform>-<function>-id<BE id number>.tplg
76+ * where <platform> is only required for the devices that need NHLT blob like DMIC
77+ * as the nhlt blob is platform dependent.
78+ */
79+ switch (tplg_dev ) {
80+ case TPLG_DEVICE_INTEL_PCH_DMIC :
81+ filename = devm_kasprintf (dev , GFP_KERNEL , "%s/sof-%s-%s-id%d.tplg" ,
82+ prefix , platform , tplg_dev_name , dai_link_id );
83+ break ;
84+ default :
85+ filename = devm_kasprintf (dev , GFP_KERNEL , "%s/sof-%s-id%d.tplg" ,
86+ prefix , tplg_dev_name , dai_link_id );
87+ break ;
88+ }
89+
90+ return filename ;
91+ }
92+
3093int sof_sdw_get_tplg_files (struct snd_soc_card * card , const struct snd_soc_acpi_mach * mach ,
3194 const char * prefix , const char * * * tplg_files , bool best_effort )
3295{
3396 struct snd_soc_acpi_mach_params mach_params = mach -> mach_params ;
3497 struct snd_soc_dai_link * dai_link ;
35- const struct firmware * fw ;
3698 char platform [SOF_INTEL_PLATFORM_NAME_MAX ];
3799 unsigned long tplg_mask = 0 ;
38100 int tplg_num = 0 ;
39101 int tplg_dev ;
40102 int ret ;
41103 int i ;
42104
43- ret = sscanf (mach -> sof_tplg_filename , "sof-%3s-*.tplg" , platform );
44- if (ret != 1 ) {
45- dev_err (card -> dev , "Invalid platform name %s of tplg %s\n" ,
46- platform , mach -> sof_tplg_filename );
47- return - EINVAL ;
48- }
105+ ret = get_platform_name (card , mach , platform );
106+ if (ret < 0 )
107+ return ret ;
49108
50109 for_each_card_prelinks (card , i , dai_link ) {
51110 char * tplg_dev_name ;
@@ -97,25 +156,9 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
97156
98157 tplg_mask |= BIT (tplg_dev );
99158
100- /*
101- * The tplg file naming rule is sof-<platform>-<function>-id<BE id number>.tplg
102- * where <platform> is only required for the DMIC function as the nhlt blob
103- * is platform dependent.
104- */
105- switch (tplg_dev ) {
106- case TPLG_DEVICE_INTEL_PCH_DMIC :
107- (* tplg_files )[tplg_num ] = devm_kasprintf (card -> dev , GFP_KERNEL ,
108- "%s/sof-%s-%s-id%d.tplg" ,
109- prefix , platform ,
110- tplg_dev_name , dai_link -> id );
111- break ;
112- default :
113- (* tplg_files )[tplg_num ] = devm_kasprintf (card -> dev , GFP_KERNEL ,
114- "%s/sof-%s-id%d.tplg" ,
115- prefix , tplg_dev_name ,
116- dai_link -> id );
117- break ;
118- }
159+ (* tplg_files )[tplg_num ] = get_tplg_filename (card -> dev , prefix , platform ,
160+ tplg_dev_name , dai_link -> id ,
161+ tplg_dev );
119162 if (!(* tplg_files )[tplg_num ])
120163 return - ENOMEM ;
121164 tplg_num ++ ;
@@ -124,20 +167,10 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
124167 dev_dbg (card -> dev , "tplg_mask %#lx tplg_num %d\n" , tplg_mask , tplg_num );
125168
126169 /* Check presence of sub-topologies */
127- for (i = 0 ; i < tplg_num ; i ++ ) {
128- ret = firmware_request_nowarn (& fw , (* tplg_files )[i ], card -> dev );
129- if (!ret ) {
130- release_firmware (fw );
131- } else {
132- dev_warn (card -> dev ,
133- "Failed to open topology file: %s, you might need to\n" ,
134- (* tplg_files )[i ]);
135- dev_warn (card -> dev ,
136- "download it from https://github.com/thesofproject/sof-bin/\n" );
137- return 0 ;
138- }
139- }
170+ if (all_tplg_files_exist (card -> dev , tplg_files , tplg_num ))
171+ return tplg_num ;
140172
141- return tplg_num ;
173+ /* return 0 to use monolithic topology */
174+ return 0 ;
142175}
143176EXPORT_SYMBOL_GPL (sof_sdw_get_tplg_files );
0 commit comments