Skip to content

Commit 0637a33

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 0cd2c08 commit 0637a33

2 files changed

Lines changed: 116 additions & 0 deletions

File tree

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

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}
221222
EXPORT_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);

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)