Skip to content

Commit bb49a66

Browse files
committed
ASoC: sof-function-topology-lib: generate tplg name after all DAI links
are checked Some special DAI links will be created after the general DAI links are created. And we need the information to decide which topology should be loaded. Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
1 parent c4c89d5 commit bb49a66

1 file changed

Lines changed: 42 additions & 32 deletions

File tree

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

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
3036
int 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

Comments
 (0)