@@ -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
@@ -77,6 +81,9 @@ static char *get_tplg_filename(struct device *dev, const char *prefix,
7781 */
7882 switch (tplg_dev ) {
7983 case TPLG_DEVICE_INTEL_PCH_DMIC :
84+ case TPLG_DEVICE_SSP_JACK :
85+ case TPLG_DEVICE_SSP_AMP :
86+ case TPLG_DEVICE_SSP_BT :
8087 filename = devm_kasprintf (dev , GFP_KERNEL , "%s/sof-%s-%s-id%d.tplg" ,
8188 prefix , platform , tplg_dev_name , dai_link_id );
8289 break ;
@@ -96,6 +103,7 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
96103 struct snd_soc_dai_link * dai_link ;
97104 char platform [SOF_INTEL_PLATFORM_NAME_MAX ];
98105 unsigned long tplg_mask = 0 ;
106+ u16 hdmi_in_mask = 0 ;
99107 int tplg_num = 0 ;
100108 int tplg_dev ;
101109 int ret ;
@@ -140,6 +148,45 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
140148 tplg_dev = TPLG_DEVICE_HDMI ;
141149 tplg_dev_name = "hdmi-pcm5" ;
142150
151+ } else if (strstr (dai_link -> name , "SSP" )) {
152+ unsigned int ssp_port ;
153+
154+ if (sscanf (dai_link -> name , "SSP%d" , & ssp_port ) != 1 ) {
155+ dev_err (card -> dev , "Invalid SSP port %d\n" , ssp_port );
156+ return - EINVAL ;
157+ }
158+ if (strstr (dai_link -> name , "Codec" )) {
159+ /*
160+ * Assume DAI link 0 is jack which is true in all existing
161+ * machine driver
162+ */
163+ if (dai_link -> id == 0 ) {
164+ tplg_dev = TPLG_DEVICE_SSP_JACK ;
165+ tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
166+ "ssp%d-jack" , ssp_port );
167+ } else {
168+ tplg_dev = TPLG_DEVICE_SSP_AMP ;
169+ tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
170+ "ssp%d-amp" , ssp_port );
171+ }
172+ } else if (strstr (dai_link -> name , "BT" )) {
173+ tplg_dev = TPLG_DEVICE_SSP_BT ;
174+ tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
175+ "ssp%d-bt" , ssp_port );
176+ } else if (strstr (dai_link -> name , "HDMI" )) {
177+ hdmi_in_mask |= BIT (ssp_port );
178+ /* The number of HDMI in dai link is always 2 right now */
179+ if (hweight16 (hdmi_in_mask ) != 2 )
180+ continue ;
181+
182+ tplg_dev = TPLG_DEVICE_SSP_HDMI_IN ;
183+ tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
184+ "ssp%x-hdmiin" , hdmi_in_mask );
185+ } else {
186+ dev_warn (card -> dev ,
187+ "unsupported SSP link %s\n" , dai_link -> name );
188+ continue ;
189+ }
143190 } else {
144191 /* The dai link is not supported by separated tplg yet */
145192 dev_dbg (card -> dev ,
0 commit comments