@@ -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 ;
@@ -97,6 +105,7 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
97105 struct snd_soc_dai_link * dai_link ;
98106 char platform [SOF_INTEL_PLATFORM_NAME_MAX ];
99107 unsigned long tplg_mask = 0 ;
108+ u16 hdmi_in_mask = 0 ;
100109 int tplg_num = 0 ;
101110 int tplg_dev ;
102111 int ret ;
@@ -140,7 +149,45 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
140149 } else if (strstr (dai_link -> name , "iDisp" )) {
141150 tplg_dev = TPLG_DEVICE_HDMI ;
142151 tplg_dev_name = "hdmi-pcm5" ;
152+ } else if (strstr (dai_link -> name , "SSP" )) {
153+ unsigned int ssp_port ;
143154
155+ if (sscanf (dai_link -> name , "SSP%d" , & ssp_port ) != 1 ) {
156+ dev_err (card -> dev , "Invalid SSP port %d\n" , ssp_port );
157+ return - EINVAL ;
158+ }
159+ if (strstr (dai_link -> name , "Codec" )) {
160+ /*
161+ * Assume DAI link 0 is jack which is true in all existing
162+ * machine drivers
163+ */
164+ if (dai_link -> id == 0 ) {
165+ tplg_dev = TPLG_DEVICE_SSP_JACK ;
166+ tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
167+ "ssp%d-jack" , ssp_port );
168+ } else {
169+ tplg_dev = TPLG_DEVICE_SSP_AMP ;
170+ tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
171+ "ssp%d-amp" , ssp_port );
172+ }
173+ } else if (strstr (dai_link -> name , "BT" )) {
174+ tplg_dev = TPLG_DEVICE_SSP_BT ;
175+ tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
176+ "ssp%d-bt" , ssp_port );
177+ } else if (strstr (dai_link -> name , "HDMI" )) {
178+ hdmi_in_mask |= BIT (ssp_port );
179+ /* The number of HDMI in dai link is always 2 right now */
180+ if (hweight16 (hdmi_in_mask ) != 2 )
181+ continue ;
182+
183+ tplg_dev = TPLG_DEVICE_SSP_HDMI_IN ;
184+ tplg_dev_name = devm_kasprintf (card -> dev , GFP_KERNEL ,
185+ "ssp%x-hdmiin" , hdmi_in_mask );
186+ } else {
187+ dev_warn (card -> dev ,
188+ "unsupported SSP link %s\n" , dai_link -> name );
189+ continue ;
190+ }
144191 } else {
145192 /* The dai link is not supported by separated tplg yet */
146193 dev_dbg (card -> dev ,
0 commit comments