@@ -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+
115170int 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