Skip to content

Commit 4d665f0

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 5bffc96 commit 4d665f0

1 file changed

Lines changed: 58 additions & 1 deletion

File tree

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

Lines changed: 58 additions & 1 deletion
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_MAX
2327
};
2428

@@ -78,6 +82,10 @@ static char *get_tplg_filename(struct device *dev, const char *prefix,
7882
*/
7983
switch (tplg_dev) {
8084
case TPLG_DEVICE_INTEL_PCH_DMIC:
85+
case TPLG_DEVICE_SSP_JACK:
86+
case TPLG_DEVICE_SSP_AMP:
87+
case TPLG_DEVICE_SSP_BT:
88+
case TPLG_DEVICE_SSP_HDMI_IN:
8189
filename = devm_kasprintf(dev, GFP_KERNEL, "%s/sof-%s-%s-id%d.tplg",
8290
prefix, platform, tplg_dev_name, dai_link_id);
8391
break;
@@ -111,13 +119,59 @@ static int get_dmic_tplg_dev(struct device *dev, int dmic_num,
111119
return 0;
112120
}
113121

122+
static int get_ssp_tplg_dev(struct device *dev, struct snd_soc_dai_link *dai_link,
123+
u16 *hdmi_in_mask, int *tplg_dev, char **tplg_dev_name)
124+
{
125+
unsigned int ssp_port;
126+
127+
if (sscanf(dai_link->name, "SSP%d", &ssp_port) != 1) {
128+
dev_err(dev, "Invalid SSP port %d\n", ssp_port);
129+
return -EINVAL;
130+
}
131+
if (strstr(dai_link->name, "Codec")) {
132+
/*
133+
* Assume DAI link 0 is jack which is true in all existing
134+
* machine drivers
135+
*/
136+
if (dai_link->id == 0) {
137+
*tplg_dev = TPLG_DEVICE_SSP_JACK;
138+
*tplg_dev_name = devm_kasprintf(dev, GFP_KERNEL,
139+
"ssp%d-jack", ssp_port);
140+
} else {
141+
*tplg_dev = TPLG_DEVICE_SSP_AMP;
142+
*tplg_dev_name = devm_kasprintf(dev, GFP_KERNEL,
143+
"ssp%d-amp", ssp_port);
144+
}
145+
} else if (strstr(dai_link->name, "BT")) {
146+
*tplg_dev = TPLG_DEVICE_SSP_BT;
147+
*tplg_dev_name = devm_kasprintf(dev, GFP_KERNEL,
148+
"ssp%d-bt", ssp_port);
149+
} else if (strstr(dai_link->name, "HDMI")) {
150+
*hdmi_in_mask |= BIT(ssp_port);
151+
/* The number of HDMI in dai link is always 2 right now */
152+
if (hweight16(*hdmi_in_mask) != 2)
153+
return -EINVAL;
154+
155+
*tplg_dev = TPLG_DEVICE_SSP_HDMI_IN;
156+
*tplg_dev_name = devm_kasprintf(dev, GFP_KERNEL,
157+
"ssp%x-hdmiin", *hdmi_in_mask);
158+
} else {
159+
dev_warn(dev,
160+
"unsupported SSP link %s\n", dai_link->name);
161+
return -EINVAL;
162+
}
163+
164+
return 0;
165+
}
166+
114167
int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_mach *mach,
115168
const char *prefix, const char ***tplg_files, bool best_effort)
116169
{
117170
struct snd_soc_acpi_mach_params mach_params = mach->mach_params;
118171
struct snd_soc_dai_link *dai_link;
119172
char platform[SOF_INTEL_PLATFORM_NAME_MAX];
120173
unsigned long tplg_mask = 0;
174+
u16 hdmi_in_mask = 0;
121175
int tplg_num = 0;
122176
int tplg_dev;
123177
int ret;
@@ -150,7 +204,10 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
150204
} else if (strstr(dai_link->name, "iDisp")) {
151205
tplg_dev = TPLG_DEVICE_HDMI;
152206
tplg_dev_name = "hdmi-pcm5";
153-
207+
} else if (strstr(dai_link->name, "SSP")) {
208+
if (get_ssp_tplg_dev(card->dev, dai_link, &hdmi_in_mask,
209+
&tplg_dev, &tplg_dev_name) < 0)
210+
continue;
154211
} else {
155212
/* The dai link is not supported by separated tplg yet */
156213
dev_dbg(card->dev,

0 commit comments

Comments
 (0)