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