Skip to content

Commit 4e064c4

Browse files
committed
ASoC: Intel: sof-function-topology-lib: add I2S support for sof_sdw_get_tplg_files
The Intel SOF SDW machine drive also supports I2S interface. Add related supports for the sof_sdw_get_tplg_files() callback. Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
1 parent 7106f8e commit 4e064c4

1 file changed

Lines changed: 60 additions & 0 deletions

File tree

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

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ enum tplg_device_id {
1919
TPLG_DEVICE_SDCA_MIC,
2020
TPLG_DEVICE_INTEL_PCH_DMIC,
2121
TPLG_DEVICE_HDMI,
22+
TPLG_DEVICE_SSP_JACK,
23+
TPLG_DEVICE_SSP_AMP,
24+
TPLG_DEVICE_SSP_BT,
25+
TPLG_DEVICE_SSP_HDMI_IN,
2226
TPLG_DEVICE_LOOPBACK_VIRTUAL,
2327
TPLG_DEVICE_MAX
2428
};
@@ -79,6 +83,10 @@ static char *get_tplg_filename(struct device *dev, const char *prefix,
7983
*/
8084
switch (tplg_dev) {
8185
case TPLG_DEVICE_INTEL_PCH_DMIC:
86+
case TPLG_DEVICE_SSP_JACK:
87+
case TPLG_DEVICE_SSP_AMP:
88+
case TPLG_DEVICE_SSP_BT:
89+
case TPLG_DEVICE_SSP_HDMI_IN:
8290
filename = devm_kasprintf(dev, GFP_KERNEL, "%s/sof-%s-%s-id%d.tplg",
8391
prefix, platform, tplg_dev_name, dai_link_id);
8492
break;
@@ -112,6 +120,53 @@ static int get_dmic_tplg_dev(struct device *dev, int dmic_num,
112120
return 0;
113121
}
114122

123+
static int get_ssp_tplg_dev(struct device *dev, struct snd_soc_dai_link *dai_link,
124+
u16 *hdmi_in_mask, int *tplg_dev, char **tplg_dev_name)
125+
{
126+
unsigned int ssp_port;
127+
128+
if (sscanf(dai_link->name, "SSP%d", &ssp_port) != 1) {
129+
dev_err(dev, "Can't get SSP port from dai_link->name %s\n", dai_link->name);
130+
return -EINVAL;
131+
}
132+
if (strstr(dai_link->name, "Codec")) {
133+
/*
134+
* Assume DAI link 0 is jack which is true in all existing
135+
* machine drivers
136+
*/
137+
if (dai_link->id == 0) {
138+
*tplg_dev = TPLG_DEVICE_SSP_JACK;
139+
*tplg_dev_name = devm_kasprintf(dev, GFP_KERNEL,
140+
"ssp%d-jack", ssp_port);
141+
} else {
142+
*tplg_dev = TPLG_DEVICE_SSP_AMP;
143+
*tplg_dev_name = devm_kasprintf(dev, GFP_KERNEL,
144+
"ssp%d-amp", ssp_port);
145+
}
146+
} else if (strstr(dai_link->name, "BT")) {
147+
*tplg_dev = TPLG_DEVICE_SSP_BT;
148+
*tplg_dev_name = devm_kasprintf(dev, GFP_KERNEL,
149+
"ssp%d-bt", ssp_port);
150+
} else if (strstr(dai_link->name, "HDMI")) {
151+
*hdmi_in_mask |= BIT(ssp_port);
152+
/* The number of HDMI in dai link is always 2 right now */
153+
if (hweight16(*hdmi_in_mask) != 2)
154+
return -EINVAL;
155+
156+
*tplg_dev = TPLG_DEVICE_SSP_HDMI_IN;
157+
*tplg_dev_name = devm_kasprintf(dev, GFP_KERNEL,
158+
"ssp%x-hdmiin", *hdmi_in_mask);
159+
} else {
160+
dev_warn(dev,
161+
"unsupported SSP link %s\n", dai_link->name);
162+
return -EINVAL;
163+
}
164+
if (!*tplg_dev_name)
165+
return -ENOMEM;
166+
167+
return 0;
168+
}
169+
115170
int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_mach *mach,
116171
const char *prefix, const char ***tplg_files, bool best_effort)
117172
{
@@ -124,6 +179,7 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
124179
struct snd_soc_dai_link *dai_link;
125180
char platform[SOF_INTEL_PLATFORM_NAME_MAX];
126181
unsigned long tplg_mask = 0;
182+
u16 hdmi_in_mask = 0;
127183
int tplg_num = 0;
128184
int tplg_dev;
129185
int ret;
@@ -156,6 +212,10 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
156212
} else if (strstr(dai_link->name, "iDisp")) {
157213
tplg_dev = TPLG_DEVICE_HDMI;
158214
tplg_dev_name = "hdmi-pcm5";
215+
} else if (strstr(dai_link->name, "SSP")) {
216+
if (get_ssp_tplg_dev(card->dev, dai_link, &hdmi_in_mask,
217+
&tplg_dev, &tplg_dev_name) < 0)
218+
continue;
159219
} else if (strstr(dai_link->name, "Loopback_Virtual")) {
160220
tplg_dev = TPLG_DEVICE_LOOPBACK_VIRTUAL;
161221
/*

0 commit comments

Comments
 (0)