Skip to content

Commit a9ac7b9

Browse files
committed
ASoC: Intel: sof-function-topology-lib: add get_function_topology for I2S machines
Add sof_i2s_get_tplg_files() callback for Intel SOF I2S machines. Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
1 parent 66d77cc commit a9ac7b9

2 files changed

Lines changed: 115 additions & 0 deletions

File tree

sound/soc/intel/common/sof-function-topology-lib.c

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,3 +256,115 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
256256
return 0;
257257
}
258258
EXPORT_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);

sound/soc/intel/common/sof-function-topology-lib.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,7 @@
1212
int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_mach *mach,
1313
const char *prefix, const char ***tplg_files, bool best_effort);
1414

15+
int sof_i2s_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_mach *mach,
16+
const char *prefix, const char ***tplg_files, bool best_effort);
17+
1518
#endif

0 commit comments

Comments
 (0)