Skip to content

Commit b7764cf

Browse files
committed
ASoC: sof-function-topology-lib: add echo reference topology support
The Loopback_Virtual DAI link is for echo reference. We can load the corresponding echo reference topology if the Loopback_Virtual DAI link is created. Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
1 parent fedfcf1 commit b7764cf

1 file changed

Lines changed: 30 additions & 1 deletion

File tree

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

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ enum tplg_device_id {
1919
TPLG_DEVICE_SDCA_MIC,
2020
TPLG_DEVICE_INTEL_PCH_DMIC,
2121
TPLG_DEVICE_HDMI,
22+
TPLG_DEVICE_LOOPBACK_VIRTUAL,
2223
TPLG_DEVICE_MAX
2324
};
2425

@@ -54,6 +55,7 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
5455
if (strstr(dai_link->name, "SimpleJack")) {
5556
tplg_dev = TPLG_DEVICE_SDCA_JACK;
5657
tplg_dev_name = "sdca-jack";
58+
5759
} else if (strstr(dai_link->name, "SmartAmp")) {
5860
tplg_dev = TPLG_DEVICE_SDCA_AMP;
5961
tplg_dev_name = devm_kasprintf(card->dev, GFP_KERNEL,
@@ -81,7 +83,29 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
8183
} else if (strstr(dai_link->name, "iDisp")) {
8284
tplg_dev = TPLG_DEVICE_HDMI;
8385
tplg_dev_name = "hdmi-pcm5";
84-
86+
} else if (strstr(dai_link->name, "Loopback_Virtual")) {
87+
/*
88+
* Loopback_Virtual is always the last DAI link, that's why we can check
89+
* tplg_mask to know whether the jack or amp DAI link exists, and select
90+
* the echo reference topology accordingly.
91+
*/
92+
switch (tplg_mask & (BIT(TPLG_DEVICE_SDCA_JACK) | BIT(TPLG_DEVICE_SDCA_AMP))) {
93+
case BIT(TPLG_DEVICE_SDCA_JACK):
94+
tplg_dev_name = "sdca-jack-ref";
95+
break;
96+
case BIT(TPLG_DEVICE_SDCA_AMP):
97+
tplg_dev_name = "sdca-amp-ref";
98+
break;
99+
case (BIT(TPLG_DEVICE_SDCA_JACK) | BIT(TPLG_DEVICE_SDCA_AMP)):
100+
tplg_dev_name = "sdca-jack-amp-ref";
101+
break;
102+
default: /* No jack or amp */
103+
dev_dbg(card->dev,
104+
"tplg_mask %#lx, No echo referrence is required\n",
105+
tplg_mask);
106+
continue;
107+
}
108+
tplg_dev = TPLG_DEVICE_LOOPBACK_VIRTUAL;
85109
} else {
86110
/* The dai link is not supported by separated tplg yet */
87111
dev_dbg(card->dev,
@@ -109,6 +133,11 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
109133
prefix, platform,
110134
tplg_dev_name, dai_link->id);
111135
break;
136+
case TPLG_DEVICE_LOOPBACK_VIRTUAL:
137+
(*tplg_files)[tplg_num] = devm_kasprintf(card->dev, GFP_KERNEL,
138+
"%s/sof-%s.tplg",
139+
prefix, tplg_dev_name);
140+
break;
112141
default:
113142
(*tplg_files)[tplg_num] = devm_kasprintf(card->dev, GFP_KERNEL,
114143
"%s/sof-%s-id%d.tplg",

0 commit comments

Comments
 (0)