Skip to content

Commit 66d77cc

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 3156c85 commit 66d77cc

1 file changed

Lines changed: 58 additions & 0 deletions

File tree

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

Lines changed: 58 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,51 @@ 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, "Invalid SSP port %d\n", ssp_port);
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+
165+
return 0;
166+
}
167+
115168
int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_mach *mach,
116169
const char *prefix, const char ***tplg_files, bool best_effort)
117170
{
@@ -124,6 +177,7 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
124177
struct snd_soc_dai_link *dai_link;
125178
char platform[SOF_INTEL_PLATFORM_NAME_MAX];
126179
unsigned long tplg_mask = 0;
180+
u16 hdmi_in_mask = 0;
127181
int tplg_num = 0;
128182
int tplg_dev;
129183
int ret;
@@ -156,6 +210,10 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
156210
} else if (strstr(dai_link->name, "iDisp")) {
157211
tplg_dev = TPLG_DEVICE_HDMI;
158212
tplg_dev_name = "hdmi-pcm5";
213+
} else if (strstr(dai_link->name, "SSP")) {
214+
if (get_ssp_tplg_dev(card->dev, dai_link, &hdmi_in_mask,
215+
&tplg_dev, &tplg_dev_name) < 0)
216+
continue;
159217
} else if (strstr(dai_link->name, "Loopback_Virtual")) {
160218
tplg_dev = TPLG_DEVICE_LOOPBACK_VIRTUAL;
161219
/*

0 commit comments

Comments
 (0)