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-sdca-quirks.h"
12 #include "soc-acpi-intel-sdw-mockup-match.h"
13 
14 struct snd_soc_acpi_mach snd_soc_acpi_intel_lnl_machines[] = {
15 	{},
16 };
17 EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_lnl_machines);
18 
19 static const struct snd_soc_acpi_endpoint single_endpoint = {
20 	.num = 0,
21 	.aggregated = 0,
22 	.group_position = 0,
23 	.group_id = 0,
24 };
25 
26 static const struct snd_soc_acpi_endpoint spk_l_endpoint = {
27 	.num = 0,
28 	.aggregated = 1,
29 	.group_position = 0,
30 	.group_id = 1,
31 };
32 
33 static const struct snd_soc_acpi_endpoint spk_r_endpoint = {
34 	.num = 0,
35 	.aggregated = 1,
36 	.group_position = 1,
37 	.group_id = 1,
38 };
39 
40 static const struct snd_soc_acpi_endpoint spk_2_endpoint = {
41 	.num = 0,
42 	.aggregated = 1,
43 	.group_position = 2,
44 	.group_id = 1,
45 };
46 
47 static const struct snd_soc_acpi_endpoint spk_3_endpoint = {
48 	.num = 0,
49 	.aggregated = 1,
50 	.group_position = 3,
51 	.group_id = 1,
52 };
53 
54 static const struct snd_soc_acpi_endpoint rt712_endpoints[] = {
55 	{
56 		.num = 0,
57 		.aggregated = 0,
58 		.group_position = 0,
59 		.group_id = 0,
60 	},
61 	{
62 		.num = 1,
63 		.aggregated = 0,
64 		.group_position = 0,
65 		.group_id = 0,
66 	},
67 };
68 
69 /*
70  * RT722 is a multi-function codec, three endpoints are created for
71  * its headset, amp and dmic functions.
72  */
73 static const struct snd_soc_acpi_endpoint rt722_endpoints[] = {
74 	{
75 		.num = 0,
76 		.aggregated = 0,
77 		.group_position = 0,
78 		.group_id = 0,
79 	},
80 	{
81 		.num = 1,
82 		.aggregated = 0,
83 		.group_position = 0,
84 		.group_id = 0,
85 	},
86 	{
87 		.num = 2,
88 		.aggregated = 0,
89 		.group_position = 0,
90 		.group_id = 0,
91 	},
92 };
93 
94 static const struct snd_soc_acpi_endpoint jack_dmic_endpoints[] = {
95 	/* Jack Endpoint */
96 	{
97 		.num = 0,
98 		.aggregated = 0,
99 		.group_position = 0,
100 		.group_id = 0,
101 	},
102 	/* DMIC Endpoint */
103 	{
104 		.num = 1,
105 		.aggregated = 0,
106 		.group_position = 0,
107 		.group_id = 0,
108 	},
109 };
110 
111 static const struct snd_soc_acpi_endpoint jack_amp_g1_dmic_endpoints_endpoints[] = {
112 	/* Jack Endpoint */
113 	{
114 		.num = 0,
115 		.aggregated = 0,
116 		.group_position = 0,
117 		.group_id = 0,
118 	},
119 	/* Amp Endpoint, work as spk_l_endpoint */
120 	{
121 		.num = 1,
122 		.aggregated = 1,
123 		.group_position = 0,
124 		.group_id = 1,
125 	},
126 	/* DMIC Endpoint */
127 	{
128 		.num = 2,
129 		.aggregated = 0,
130 		.group_position = 0,
131 		.group_id = 0,
132 	},
133 };
134 
135 static const struct snd_soc_acpi_endpoint cs42l43_endpoints[] = {
136 	{ /* Jack Playback Endpoint */
137 		.num = 0,
138 		.aggregated = 0,
139 		.group_position = 0,
140 		.group_id = 0,
141 	},
142 	{ /* DMIC Capture Endpoint */
143 		.num = 1,
144 		.aggregated = 0,
145 		.group_position = 0,
146 		.group_id = 0,
147 	},
148 	{ /* Jack Capture Endpoint */
149 		.num = 2,
150 		.aggregated = 0,
151 		.group_position = 0,
152 		.group_id = 0,
153 	},
154 	{ /* Speaker Playback Endpoint */
155 		.num = 3,
156 		.aggregated = 0,
157 		.group_position = 0,
158 		.group_id = 0,
159 	},
160 };
161 
162 static const struct snd_soc_acpi_adr_device cs35l56_2_l_adr[] = {
163 	{
164 		.adr = 0x00023001FA355601ull,
165 		.num_endpoints = 1,
166 		.endpoints = &spk_l_endpoint,
167 		.name_prefix = "AMP1"
168 	},
169 	{
170 		.adr = 0x00023101FA355601ull,
171 		.num_endpoints = 1,
172 		.endpoints = &spk_2_endpoint,
173 		.name_prefix = "AMP2"
174 	}
175 };
176 
177 static const struct snd_soc_acpi_adr_device cs35l56_3_r_adr[] = {
178 	{
179 		.adr = 0x00033201fa355601ull,
180 		.num_endpoints = 1,
181 		.endpoints = &spk_r_endpoint,
182 		.name_prefix = "AMP3"
183 	},
184 	{
185 		.adr = 0x00033301fa355601ull,
186 		.num_endpoints = 1,
187 		.endpoints = &spk_3_endpoint,
188 		.name_prefix = "AMP4"
189 	}
190 };
191 
192 static const struct snd_soc_acpi_adr_device cs35l56_3_lr_adr[] = {
193 	{
194 		.adr = 0x00033001fa355601ull,
195 		.num_endpoints = 1,
196 		.endpoints = &spk_l_endpoint,
197 		.name_prefix = "AMP1"
198 	},
199 	{
200 		.adr = 0x00033101fa355601ull,
201 		.num_endpoints = 1,
202 		.endpoints = &spk_r_endpoint,
203 		.name_prefix = "AMP2"
204 	}
205 };
206 
207 static const struct snd_soc_acpi_adr_device cs42l43_0_adr[] = {
208 	{
209 		.adr = 0x00003001FA424301ull,
210 		.num_endpoints = ARRAY_SIZE(cs42l43_endpoints),
211 		.endpoints = cs42l43_endpoints,
212 		.name_prefix = "cs42l43"
213 	}
214 };
215 
216 static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = {
217 	{
218 		.adr = 0x000030025D071101ull,
219 		.num_endpoints = 1,
220 		.endpoints = &single_endpoint,
221 		.name_prefix = "rt711"
222 	}
223 };
224 
225 static const struct snd_soc_acpi_adr_device rt712_2_single_adr[] = {
226 	{
227 		.adr = 0x000230025D071201ull,
228 		.num_endpoints = ARRAY_SIZE(rt712_endpoints),
229 		.endpoints = rt712_endpoints,
230 		.name_prefix = "rt712"
231 	}
232 };
233 
234 static const struct snd_soc_acpi_adr_device rt1712_3_single_adr[] = {
235 	{
236 		.adr = 0x000330025D171201ull,
237 		.num_endpoints = 1,
238 		.endpoints = &single_endpoint,
239 		.name_prefix = "rt712-dmic"
240 	}
241 };
242 
243 static const struct snd_soc_acpi_adr_device rt712_vb_2_group1_adr[] = {
244 	{
245 		.adr = 0x000230025D071201ull,
246 		.num_endpoints = ARRAY_SIZE(jack_amp_g1_dmic_endpoints_endpoints),
247 		.endpoints = jack_amp_g1_dmic_endpoints_endpoints,
248 		.name_prefix = "rt712"
249 	}
250 };
251 
252 static const struct snd_soc_acpi_adr_device rt722_0_single_adr[] = {
253 	{
254 		.adr = 0x000030025d072201ull,
255 		.num_endpoints = ARRAY_SIZE(rt722_endpoints),
256 		.endpoints = rt722_endpoints,
257 		.name_prefix = "rt722"
258 	}
259 };
260 
261 static const struct snd_soc_acpi_adr_device rt1316_2_group1_adr[] = {
262 	{
263 		.adr = 0x000230025D131601ull,
264 		.num_endpoints = 1,
265 		.endpoints = &spk_l_endpoint,
266 		.name_prefix = "rt1316-1"
267 	}
268 };
269 
270 static const struct snd_soc_acpi_adr_device rt1316_3_group1_adr[] = {
271 	{
272 		.adr = 0x000331025D131601ull,
273 		.num_endpoints = 1,
274 		.endpoints = &spk_r_endpoint,
275 		.name_prefix = "rt1316-2"
276 	}
277 };
278 
279 static const struct snd_soc_acpi_adr_device rt1318_1_adr[] = {
280 	{
281 		.adr = 0x000133025D131801ull,
282 		.num_endpoints = 1,
283 		.endpoints = &single_endpoint,
284 		.name_prefix = "rt1318-1"
285 	}
286 };
287 
288 static const struct snd_soc_acpi_adr_device rt1318_1_group1_adr[] = {
289 	{
290 		.adr = 0x000130025D131801ull,
291 		.num_endpoints = 1,
292 		.endpoints = &spk_l_endpoint,
293 		.name_prefix = "rt1318-1"
294 	}
295 };
296 
297 static const struct snd_soc_acpi_adr_device rt1318_2_group1_adr[] = {
298 	{
299 		.adr = 0x000232025D131801ull,
300 		.num_endpoints = 1,
301 		.endpoints = &spk_r_endpoint,
302 		.name_prefix = "rt1318-2"
303 	}
304 };
305 
306 static const struct snd_soc_acpi_adr_device rt1320_1_group1_adr[] = {
307 	{
308 		.adr = 0x000130025D132001ull,
309 		.num_endpoints = 1,
310 		.endpoints = &spk_r_endpoint,
311 		.name_prefix = "rt1320-1"
312 	}
313 };
314 
315 static const struct snd_soc_acpi_adr_device rt1320_1_group2_adr[] = {
316 	{
317 		.adr = 0x000130025D132001ull,
318 		.num_endpoints = 1,
319 		.endpoints = &spk_l_endpoint,
320 		.name_prefix = "rt1320-1"
321 	}
322 };
323 
324 static const struct snd_soc_acpi_adr_device rt1320_3_group2_adr[] = {
325 	{
326 		.adr = 0x000330025D132001ull,
327 		.num_endpoints = 1,
328 		.endpoints = &spk_r_endpoint,
329 		.name_prefix = "rt1320-2"
330 	}
331 };
332 
333 static const struct snd_soc_acpi_adr_device rt713_0_adr[] = {
334 	{
335 		.adr = 0x000031025D071301ull,
336 		.num_endpoints = 1,
337 		.endpoints = &single_endpoint,
338 		.name_prefix = "rt713"
339 	}
340 };
341 
342 static const struct snd_soc_acpi_adr_device rt713_vb_2_adr[] = {
343 	{
344 		.adr = 0x000230025d071301ull,
345 		.num_endpoints = ARRAY_SIZE(jack_dmic_endpoints),
346 		.endpoints = jack_dmic_endpoints,
347 		.name_prefix = "rt713"
348 	}
349 };
350 
351 static const struct snd_soc_acpi_adr_device rt714_0_adr[] = {
352 	{
353 		.adr = 0x000030025D071401ull,
354 		.num_endpoints = 1,
355 		.endpoints = &single_endpoint,
356 		.name_prefix = "rt714"
357 	}
358 };
359 
360 static const struct snd_soc_acpi_adr_device rt714_1_adr[] = {
361 	{
362 		.adr = 0x000130025D071401ull,
363 		.num_endpoints = 1,
364 		.endpoints = &single_endpoint,
365 		.name_prefix = "rt714"
366 	}
367 };
368 
369 static const struct snd_soc_acpi_link_adr lnl_cs42l43_l0[] = {
370 	{
371 		.mask = BIT(0),
372 		.num_adr = ARRAY_SIZE(cs42l43_0_adr),
373 		.adr_d = cs42l43_0_adr,
374 	},
375 	{}
376 };
377 
378 static const struct snd_soc_acpi_link_adr lnl_cs42l43_l0_cs35l56_l3[] = {
379 	{
380 		.mask = BIT(0),
381 		.num_adr = ARRAY_SIZE(cs42l43_0_adr),
382 		.adr_d = cs42l43_0_adr,
383 	},
384 	{
385 		.mask = BIT(3),
386 		.num_adr = ARRAY_SIZE(cs35l56_3_lr_adr),
387 		.adr_d = cs35l56_3_lr_adr,
388 	},
389 	{}
390 };
391 
392 static const struct snd_soc_acpi_link_adr lnl_cs42l43_l0_cs35l56_l23[] = {
393 	{
394 		.mask = BIT(0),
395 		.num_adr = ARRAY_SIZE(cs42l43_0_adr),
396 		.adr_d = cs42l43_0_adr,
397 	},
398 	{
399 		.mask = BIT(2),
400 		.num_adr = ARRAY_SIZE(cs35l56_2_l_adr),
401 		.adr_d = cs35l56_2_l_adr,
402 	},
403 	{
404 		.mask = BIT(3),
405 		.num_adr = ARRAY_SIZE(cs35l56_3_r_adr),
406 		.adr_d = cs35l56_3_r_adr,
407 	},
408 	{}
409 };
410 
411 static const struct snd_soc_acpi_link_adr lnl_rvp[] = {
412 	{
413 		.mask = BIT(0),
414 		.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
415 		.adr_d = rt711_sdca_0_adr,
416 	},
417 	{}
418 };
419 
420 static const struct snd_soc_acpi_link_adr lnl_712_only[] = {
421 	{
422 		.mask = BIT(2),
423 		.num_adr = ARRAY_SIZE(rt712_2_single_adr),
424 		.adr_d = rt712_2_single_adr,
425 	},
426 	{
427 		.mask = BIT(3),
428 		.num_adr = ARRAY_SIZE(rt1712_3_single_adr),
429 		.adr_d = rt1712_3_single_adr,
430 	},
431 	{}
432 };
433 
434 static const struct snd_soc_acpi_link_adr lnl_rt722_only[] = {
435 	{
436 		.mask = BIT(0),
437 		.num_adr = ARRAY_SIZE(rt722_0_single_adr),
438 		.adr_d = rt722_0_single_adr,
439 	},
440 	{}
441 };
442 
443 static const struct snd_soc_acpi_link_adr lnl_3_in_1_sdca[] = {
444 	{
445 		.mask = BIT(0),
446 		.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
447 		.adr_d = rt711_sdca_0_adr,
448 	},
449 	{
450 		.mask = BIT(2),
451 		.num_adr = ARRAY_SIZE(rt1316_2_group1_adr),
452 		.adr_d = rt1316_2_group1_adr,
453 	},
454 	{
455 		.mask = BIT(3),
456 		.num_adr = ARRAY_SIZE(rt1316_3_group1_adr),
457 		.adr_d = rt1316_3_group1_adr,
458 	},
459 	{
460 		.mask = BIT(1),
461 		.num_adr = ARRAY_SIZE(rt714_1_adr),
462 		.adr_d = rt714_1_adr,
463 	},
464 	{}
465 };
466 
467 static const struct snd_soc_acpi_link_adr lnl_sdw_rt1318_l12_rt714_l0[] = {
468 	{
469 		.mask = BIT(1),
470 		.num_adr = ARRAY_SIZE(rt1318_1_group1_adr),
471 		.adr_d = rt1318_1_group1_adr,
472 	},
473 	{
474 		.mask = BIT(2),
475 		.num_adr = ARRAY_SIZE(rt1318_2_group1_adr),
476 		.adr_d = rt1318_2_group1_adr,
477 	},
478 	{
479 		.mask = BIT(0),
480 		.num_adr = ARRAY_SIZE(rt714_0_adr),
481 		.adr_d = rt714_0_adr,
482 	},
483 	{}
484 };
485 
486 static const struct snd_soc_acpi_link_adr lnl_sdw_rt713_l0_rt1318_l1[] = {
487 	{
488 		.mask = BIT(0),
489 		.num_adr = ARRAY_SIZE(rt713_0_adr),
490 		.adr_d = rt713_0_adr,
491 	},
492 	{
493 		.mask = BIT(1),
494 		.num_adr = ARRAY_SIZE(rt1318_1_adr),
495 		.adr_d = rt1318_1_adr,
496 	},
497 	{}
498 };
499 
500 static const struct snd_soc_acpi_link_adr lnl_sdw_rt713_vb_l2_rt1320_l13[] = {
501 	{
502 		.mask = BIT(2),
503 		.num_adr = ARRAY_SIZE(rt713_vb_2_adr),
504 		.adr_d = rt713_vb_2_adr,
505 	},
506 	{
507 		.mask = BIT(1),
508 		.num_adr = ARRAY_SIZE(rt1320_1_group2_adr),
509 		.adr_d = rt1320_1_group2_adr,
510 	},
511 	{
512 		.mask = BIT(3),
513 		.num_adr = ARRAY_SIZE(rt1320_3_group2_adr),
514 		.adr_d = rt1320_3_group2_adr,
515 	},
516 	{}
517 };
518 
519 static const struct snd_soc_acpi_link_adr lnl_sdw_rt712_vb_l2_rt1320_l1[] = {
520 	{
521 		.mask = BIT(2),
522 		.num_adr = ARRAY_SIZE(rt712_vb_2_group1_adr),
523 		.adr_d = rt712_vb_2_group1_adr,
524 	},
525 	{
526 		.mask = BIT(1),
527 		.num_adr = ARRAY_SIZE(rt1320_1_group1_adr),
528 		.adr_d = rt1320_1_group1_adr,
529 	},
530 	{}
531 };
532 
533 /* this table is used when there is no I2S codec present */
534 /* this table is used when there is no I2S codec present */
535 struct snd_soc_acpi_mach snd_soc_acpi_intel_lnl_sdw_machines[] = {
536 	/* mockup tests need to be first */
537 	{
538 		.link_mask = GENMASK(3, 0),
539 		.links = sdw_mockup_headset_2amps_mic,
540 		.drv_name = "sof_sdw",
541 		.sof_tplg_filename = "sof-lnl-rt711-rt1308-rt715.tplg",
542 	},
543 	{
544 		.link_mask = BIT(0) | BIT(1) | BIT(3),
545 		.links = sdw_mockup_headset_1amp_mic,
546 		.drv_name = "sof_sdw",
547 		.sof_tplg_filename = "sof-lnl-rt711-rt1308-mono-rt715.tplg",
548 	},
549 	{
550 		.link_mask = GENMASK(2, 0),
551 		.links = sdw_mockup_mic_headset_1amp,
552 		.drv_name = "sof_sdw",
553 		.sof_tplg_filename = "sof-lnl-rt715-rt711-rt1308-mono.tplg",
554 	},
555 	{
556 		.link_mask = GENMASK(3, 0),
557 		.links = lnl_3_in_1_sdca,
558 		.drv_name = "sof_sdw",
559 		.sof_tplg_filename = "sof-lnl-rt711-l0-rt1316-l23-rt714-l1.tplg",
560 	},
561 	{
562 		.link_mask = BIT(0) | BIT(2) | BIT(3),
563 		.links = lnl_cs42l43_l0_cs35l56_l23,
564 		.drv_name = "sof_sdw",
565 		.sof_tplg_filename = "sof-lnl-cs42l43-l0-cs35l56-l23.tplg",
566 	},
567 	{
568 		.link_mask = BIT(0) | BIT(3),
569 		.links = lnl_cs42l43_l0_cs35l56_l3,
570 		.drv_name = "sof_sdw",
571 		.sof_tplg_filename = "sof-lnl-cs42l43-l0-cs35l56-l3.tplg",
572 	},
573 	{
574 		.link_mask = BIT(0),
575 		.links = lnl_cs42l43_l0,
576 		.drv_name = "sof_sdw",
577 		.sof_tplg_filename = "sof-lnl-cs42l43-l0.tplg",
578 	},
579 	{
580 		.link_mask = BIT(0),
581 		.links = lnl_rvp,
582 		.drv_name = "sof_sdw",
583 		.sof_tplg_filename = "sof-lnl-rt711.tplg",
584 	},
585 	{
586 		.link_mask = BIT(2) | BIT(3),
587 		.links = lnl_712_only,
588 		.drv_name = "sof_sdw",
589 		.sof_tplg_filename = "sof-lnl-rt712-l2-rt1712-l3.tplg",
590 	},
591 	{
592 		.link_mask = BIT(0),
593 		.links = lnl_rt722_only,
594 		.drv_name = "sof_sdw",
595 		.sof_tplg_filename = "sof-lnl-rt722-l0.tplg",
596 	},
597 	{
598 		.link_mask = GENMASK(2, 0),
599 		.links = lnl_sdw_rt1318_l12_rt714_l0,
600 		.drv_name = "sof_sdw",
601 		.sof_tplg_filename = "sof-lnl-rt1318-l12-rt714-l0.tplg"
602 	},
603 	{
604 		.link_mask = BIT(0) | BIT(1),
605 		.links = lnl_sdw_rt713_l0_rt1318_l1,
606 		.drv_name = "sof_sdw",
607 		.sof_tplg_filename = "sof-lnl-rt713-l0-rt1318-l1.tplg"
608 	},
609 	{
610 		.link_mask = BIT(1) | BIT(2),
611 		.links = lnl_sdw_rt712_vb_l2_rt1320_l1,
612 		.drv_name = "sof_sdw",
613 		.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,
614 		.sof_tplg_filename = "sof-lnl-rt712-l2-rt1320-l1.tplg"
615 	},
616 	{
617 		.link_mask = BIT(1) | BIT(2) | BIT(3),
618 		.links = lnl_sdw_rt713_vb_l2_rt1320_l13,
619 		.drv_name = "sof_sdw",
620 		.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,
621 		.sof_tplg_filename = "sof-lnl-rt713-l2-rt1320-l13.tplg"
622 	},
623 	{},
624 };
625 EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_lnl_sdw_machines);
626