1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * soc-acpi-intel-lnl-match.c - tables and support for LNL ACPI enumeration.
4  *
5  * Copyright (c) 2023, Intel Corporation
6  *
7  */
8 
9 #include <sound/soc-acpi.h>
10 #include <sound/soc-acpi-intel-match.h>
11 #include "soc-acpi-intel-sdw-mockup-match.h"
12 
13 struct snd_soc_acpi_mach snd_soc_acpi_intel_lnl_machines[] = {
14 	{},
15 };
16 EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_lnl_machines);
17 
18 static const struct snd_soc_acpi_endpoint single_endpoint = {
19 	.num = 0,
20 	.aggregated = 0,
21 	.group_position = 0,
22 	.group_id = 0,
23 };
24 
25 static const struct snd_soc_acpi_endpoint spk_l_endpoint = {
26 	.num = 0,
27 	.aggregated = 1,
28 	.group_position = 0,
29 	.group_id = 1,
30 };
31 
32 static const struct snd_soc_acpi_endpoint spk_r_endpoint = {
33 	.num = 0,
34 	.aggregated = 1,
35 	.group_position = 1,
36 	.group_id = 1,
37 };
38 
39 static const struct snd_soc_acpi_endpoint spk_2_endpoint = {
40 	.num = 0,
41 	.aggregated = 1,
42 	.group_position = 2,
43 	.group_id = 1,
44 };
45 
46 static const struct snd_soc_acpi_endpoint spk_3_endpoint = {
47 	.num = 0,
48 	.aggregated = 1,
49 	.group_position = 3,
50 	.group_id = 1,
51 };
52 
53 static const struct snd_soc_acpi_endpoint rt712_endpoints[] = {
54 	{
55 		.num = 0,
56 		.aggregated = 0,
57 		.group_position = 0,
58 		.group_id = 0,
59 	},
60 	{
61 		.num = 1,
62 		.aggregated = 0,
63 		.group_position = 0,
64 		.group_id = 0,
65 	},
66 };
67 
68 /*
69  * RT722 is a multi-function codec, three endpoints are created for
70  * its headset, amp and dmic functions.
71  */
72 static const struct snd_soc_acpi_endpoint rt722_endpoints[] = {
73 	{
74 		.num = 0,
75 		.aggregated = 0,
76 		.group_position = 0,
77 		.group_id = 0,
78 	},
79 	{
80 		.num = 1,
81 		.aggregated = 0,
82 		.group_position = 0,
83 		.group_id = 0,
84 	},
85 	{
86 		.num = 2,
87 		.aggregated = 0,
88 		.group_position = 0,
89 		.group_id = 0,
90 	},
91 };
92 
93 static const struct snd_soc_acpi_endpoint cs42l43_endpoints[] = {
94 	{ /* Jack Playback Endpoint */
95 		.num = 0,
96 		.aggregated = 0,
97 		.group_position = 0,
98 		.group_id = 0,
99 	},
100 	{ /* DMIC Capture Endpoint */
101 		.num = 1,
102 		.aggregated = 0,
103 		.group_position = 0,
104 		.group_id = 0,
105 	},
106 	{ /* Jack Capture Endpoint */
107 		.num = 2,
108 		.aggregated = 0,
109 		.group_position = 0,
110 		.group_id = 0,
111 	},
112 	{ /* Speaker Playback Endpoint */
113 		.num = 3,
114 		.aggregated = 0,
115 		.group_position = 0,
116 		.group_id = 0,
117 	},
118 };
119 
120 static const struct snd_soc_acpi_adr_device cs35l56_2_l_adr[] = {
121 	{
122 		.adr = 0x00023001FA355601ull,
123 		.num_endpoints = 1,
124 		.endpoints = &spk_l_endpoint,
125 		.name_prefix = "AMP1"
126 	},
127 	{
128 		.adr = 0x00023101FA355601ull,
129 		.num_endpoints = 1,
130 		.endpoints = &spk_2_endpoint,
131 		.name_prefix = "AMP2"
132 	}
133 };
134 
135 static const struct snd_soc_acpi_adr_device cs35l56_3_r_adr[] = {
136 	{
137 		.adr = 0x00033201fa355601ull,
138 		.num_endpoints = 1,
139 		.endpoints = &spk_r_endpoint,
140 		.name_prefix = "AMP3"
141 	},
142 	{
143 		.adr = 0x00033301fa355601ull,
144 		.num_endpoints = 1,
145 		.endpoints = &spk_3_endpoint,
146 		.name_prefix = "AMP4"
147 	}
148 };
149 
150 static const struct snd_soc_acpi_adr_device cs35l56_3_lr_adr[] = {
151 	{
152 		.adr = 0x00033001fa355601ull,
153 		.num_endpoints = 1,
154 		.endpoints = &spk_l_endpoint,
155 		.name_prefix = "AMP1"
156 	},
157 	{
158 		.adr = 0x00033101fa355601ull,
159 		.num_endpoints = 1,
160 		.endpoints = &spk_r_endpoint,
161 		.name_prefix = "AMP2"
162 	}
163 };
164 
165 static const struct snd_soc_acpi_adr_device cs42l43_0_adr[] = {
166 	{
167 		.adr = 0x00003001FA424301ull,
168 		.num_endpoints = ARRAY_SIZE(cs42l43_endpoints),
169 		.endpoints = cs42l43_endpoints,
170 		.name_prefix = "cs42l43"
171 	}
172 };
173 
174 static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = {
175 	{
176 		.adr = 0x000030025D071101ull,
177 		.num_endpoints = 1,
178 		.endpoints = &single_endpoint,
179 		.name_prefix = "rt711"
180 	}
181 };
182 
183 static const struct snd_soc_acpi_adr_device rt712_2_single_adr[] = {
184 	{
185 		.adr = 0x000230025D071201ull,
186 		.num_endpoints = ARRAY_SIZE(rt712_endpoints),
187 		.endpoints = rt712_endpoints,
188 		.name_prefix = "rt712"
189 	}
190 };
191 
192 static const struct snd_soc_acpi_adr_device rt1712_3_single_adr[] = {
193 	{
194 		.adr = 0x000330025D171201ull,
195 		.num_endpoints = 1,
196 		.endpoints = &single_endpoint,
197 		.name_prefix = "rt712-dmic"
198 	}
199 };
200 
201 static const struct snd_soc_acpi_adr_device rt722_0_single_adr[] = {
202 	{
203 		.adr = 0x000030025d072201ull,
204 		.num_endpoints = ARRAY_SIZE(rt722_endpoints),
205 		.endpoints = rt722_endpoints,
206 		.name_prefix = "rt722"
207 	}
208 };
209 
210 static const struct snd_soc_acpi_adr_device rt1316_2_group1_adr[] = {
211 	{
212 		.adr = 0x000230025D131601ull,
213 		.num_endpoints = 1,
214 		.endpoints = &spk_l_endpoint,
215 		.name_prefix = "rt1316-1"
216 	}
217 };
218 
219 static const struct snd_soc_acpi_adr_device rt1316_3_group1_adr[] = {
220 	{
221 		.adr = 0x000331025D131601ull,
222 		.num_endpoints = 1,
223 		.endpoints = &spk_r_endpoint,
224 		.name_prefix = "rt1316-2"
225 	}
226 };
227 
228 static const struct snd_soc_acpi_adr_device rt1318_1_adr[] = {
229 	{
230 		.adr = 0x000133025D131801ull,
231 		.num_endpoints = 1,
232 		.endpoints = &single_endpoint,
233 		.name_prefix = "rt1318-1"
234 	}
235 };
236 
237 static const struct snd_soc_acpi_adr_device rt1318_1_group1_adr[] = {
238 	{
239 		.adr = 0x000130025D131801ull,
240 		.num_endpoints = 1,
241 		.endpoints = &spk_l_endpoint,
242 		.name_prefix = "rt1318-1"
243 	}
244 };
245 
246 static const struct snd_soc_acpi_adr_device rt1318_2_group1_adr[] = {
247 	{
248 		.adr = 0x000232025D131801ull,
249 		.num_endpoints = 1,
250 		.endpoints = &spk_r_endpoint,
251 		.name_prefix = "rt1318-2"
252 	}
253 };
254 
255 static const struct snd_soc_acpi_adr_device rt713_0_adr[] = {
256 	{
257 		.adr = 0x000031025D071301ull,
258 		.num_endpoints = 1,
259 		.endpoints = &single_endpoint,
260 		.name_prefix = "rt713"
261 	}
262 };
263 
264 static const struct snd_soc_acpi_adr_device rt714_0_adr[] = {
265 	{
266 		.adr = 0x000030025D071401ull,
267 		.num_endpoints = 1,
268 		.endpoints = &single_endpoint,
269 		.name_prefix = "rt714"
270 	}
271 };
272 
273 static const struct snd_soc_acpi_adr_device rt714_1_adr[] = {
274 	{
275 		.adr = 0x000130025D071401ull,
276 		.num_endpoints = 1,
277 		.endpoints = &single_endpoint,
278 		.name_prefix = "rt714"
279 	}
280 };
281 
282 static const struct snd_soc_acpi_link_adr lnl_cs42l43_l0[] = {
283 	{
284 		.mask = BIT(0),
285 		.num_adr = ARRAY_SIZE(cs42l43_0_adr),
286 		.adr_d = cs42l43_0_adr,
287 	},
288 	{}
289 };
290 
291 static const struct snd_soc_acpi_link_adr lnl_cs42l43_l0_cs35l56_l3[] = {
292 	{
293 		.mask = BIT(0),
294 		.num_adr = ARRAY_SIZE(cs42l43_0_adr),
295 		.adr_d = cs42l43_0_adr,
296 	},
297 	{
298 		.mask = BIT(3),
299 		.num_adr = ARRAY_SIZE(cs35l56_3_lr_adr),
300 		.adr_d = cs35l56_3_lr_adr,
301 	},
302 	{}
303 };
304 
305 static const struct snd_soc_acpi_link_adr lnl_cs42l43_l0_cs35l56_l23[] = {
306 	{
307 		.mask = BIT(0),
308 		.num_adr = ARRAY_SIZE(cs42l43_0_adr),
309 		.adr_d = cs42l43_0_adr,
310 	},
311 	{
312 		.mask = BIT(2),
313 		.num_adr = ARRAY_SIZE(cs35l56_2_l_adr),
314 		.adr_d = cs35l56_2_l_adr,
315 	},
316 	{
317 		.mask = BIT(3),
318 		.num_adr = ARRAY_SIZE(cs35l56_3_r_adr),
319 		.adr_d = cs35l56_3_r_adr,
320 	},
321 	{}
322 };
323 
324 static const struct snd_soc_acpi_link_adr lnl_rvp[] = {
325 	{
326 		.mask = BIT(0),
327 		.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
328 		.adr_d = rt711_sdca_0_adr,
329 	},
330 	{}
331 };
332 
333 static const struct snd_soc_acpi_link_adr lnl_712_only[] = {
334 	{
335 		.mask = BIT(2),
336 		.num_adr = ARRAY_SIZE(rt712_2_single_adr),
337 		.adr_d = rt712_2_single_adr,
338 	},
339 	{
340 		.mask = BIT(3),
341 		.num_adr = ARRAY_SIZE(rt1712_3_single_adr),
342 		.adr_d = rt1712_3_single_adr,
343 	},
344 	{}
345 };
346 
347 static const struct snd_soc_acpi_link_adr lnl_rt722_only[] = {
348 	{
349 		.mask = BIT(0),
350 		.num_adr = ARRAY_SIZE(rt722_0_single_adr),
351 		.adr_d = rt722_0_single_adr,
352 	},
353 	{}
354 };
355 
356 static const struct snd_soc_acpi_link_adr lnl_3_in_1_sdca[] = {
357 	{
358 		.mask = BIT(0),
359 		.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
360 		.adr_d = rt711_sdca_0_adr,
361 	},
362 	{
363 		.mask = BIT(2),
364 		.num_adr = ARRAY_SIZE(rt1316_2_group1_adr),
365 		.adr_d = rt1316_2_group1_adr,
366 	},
367 	{
368 		.mask = BIT(3),
369 		.num_adr = ARRAY_SIZE(rt1316_3_group1_adr),
370 		.adr_d = rt1316_3_group1_adr,
371 	},
372 	{
373 		.mask = BIT(1),
374 		.num_adr = ARRAY_SIZE(rt714_1_adr),
375 		.adr_d = rt714_1_adr,
376 	},
377 	{}
378 };
379 
380 static const struct snd_soc_acpi_link_adr lnl_sdw_rt1318_l12_rt714_l0[] = {
381 	{
382 		.mask = BIT(1),
383 		.num_adr = ARRAY_SIZE(rt1318_1_group1_adr),
384 		.adr_d = rt1318_1_group1_adr,
385 	},
386 	{
387 		.mask = BIT(2),
388 		.num_adr = ARRAY_SIZE(rt1318_2_group1_adr),
389 		.adr_d = rt1318_2_group1_adr,
390 	},
391 	{
392 		.mask = BIT(0),
393 		.num_adr = ARRAY_SIZE(rt714_0_adr),
394 		.adr_d = rt714_0_adr,
395 	},
396 	{}
397 };
398 
399 static const struct snd_soc_acpi_link_adr lnl_sdw_rt713_l0_rt1318_l1[] = {
400 	{
401 		.mask = BIT(0),
402 		.num_adr = ARRAY_SIZE(rt713_0_adr),
403 		.adr_d = rt713_0_adr,
404 	},
405 	{
406 		.mask = BIT(1),
407 		.num_adr = ARRAY_SIZE(rt1318_1_adr),
408 		.adr_d = rt1318_1_adr,
409 	},
410 	{}
411 };
412 
413 /* this table is used when there is no I2S codec present */
414 struct snd_soc_acpi_mach snd_soc_acpi_intel_lnl_sdw_machines[] = {
415 	/* mockup tests need to be first */
416 	{
417 		.link_mask = GENMASK(3, 0),
418 		.links = sdw_mockup_headset_2amps_mic,
419 		.drv_name = "sof_sdw",
420 		.sof_tplg_filename = "sof-lnl-rt711-rt1308-rt715.tplg",
421 	},
422 	{
423 		.link_mask = BIT(0) | BIT(1) | BIT(3),
424 		.links = sdw_mockup_headset_1amp_mic,
425 		.drv_name = "sof_sdw",
426 		.sof_tplg_filename = "sof-lnl-rt711-rt1308-mono-rt715.tplg",
427 	},
428 	{
429 		.link_mask = GENMASK(2, 0),
430 		.links = sdw_mockup_mic_headset_1amp,
431 		.drv_name = "sof_sdw",
432 		.sof_tplg_filename = "sof-lnl-rt715-rt711-rt1308-mono.tplg",
433 	},
434 	{
435 		.link_mask = GENMASK(3, 0),
436 		.links = lnl_3_in_1_sdca,
437 		.drv_name = "sof_sdw",
438 		.sof_tplg_filename = "sof-lnl-rt711-l0-rt1316-l23-rt714-l1.tplg",
439 	},
440 	{
441 		.link_mask = BIT(0) | BIT(2) | BIT(3),
442 		.links = lnl_cs42l43_l0_cs35l56_l23,
443 		.drv_name = "sof_sdw",
444 		.sof_tplg_filename = "sof-lnl-cs42l43-l0-cs35l56-l23.tplg",
445 	},
446 	{
447 		.link_mask = BIT(0) | BIT(3),
448 		.links = lnl_cs42l43_l0_cs35l56_l3,
449 		.drv_name = "sof_sdw",
450 		.sof_tplg_filename = "sof-lnl-cs42l43-l0-cs35l56-l3.tplg",
451 	},
452 	{
453 		.link_mask = BIT(0),
454 		.links = lnl_cs42l43_l0,
455 		.drv_name = "sof_sdw",
456 		.sof_tplg_filename = "sof-lnl-cs42l43-l0.tplg",
457 	},
458 	{
459 		.link_mask = BIT(0),
460 		.links = lnl_rvp,
461 		.drv_name = "sof_sdw",
462 		.sof_tplg_filename = "sof-lnl-rt711.tplg",
463 	},
464 	{
465 		.link_mask = BIT(2) | BIT(3),
466 		.links = lnl_712_only,
467 		.drv_name = "sof_sdw",
468 		.sof_tplg_filename = "sof-lnl-rt712-l2-rt1712-l3.tplg",
469 	},
470 	{
471 		.link_mask = BIT(0),
472 		.links = lnl_rt722_only,
473 		.drv_name = "sof_sdw",
474 		.sof_tplg_filename = "sof-lnl-rt722-l0.tplg",
475 	},
476 	{
477 		.link_mask = GENMASK(2, 0),
478 		.links = lnl_sdw_rt1318_l12_rt714_l0,
479 		.drv_name = "sof_sdw",
480 		.sof_tplg_filename = "sof-lnl-rt1318-l12-rt714-l0.tplg"
481 	},
482 	{
483 		.link_mask = BIT(0) | BIT(1),
484 		.links = lnl_sdw_rt713_l0_rt1318_l1,
485 		.drv_name = "sof_sdw",
486 		.sof_tplg_filename = "sof-lnl-rt713-l0-rt1318-l1.tplg"
487 	},
488 	{},
489 };
490 EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_lnl_sdw_machines);
491