xref: /linux/sound/soc/intel/common/soc-acpi-intel-mtl-match.c (revision a9e6060bb2a6cae6d43a98ec0794844ad01273d3)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * soc-acpi-intel-mtl-match.c - tables and support for MTL ACPI enumeration.
4  *
5  * Copyright (c) 2022, Intel Corporation.
6  *
7  */
8 
9 #include <linux/soundwire/sdw_intel.h>
10 #include <sound/sdca.h>
11 #include <sound/soc-acpi.h>
12 #include <sound/soc-acpi-intel-match.h>
13 #include <sound/soc-acpi-intel-ssp-common.h>
14 #include "sof-function-topology-lib.h"
15 #include "soc-acpi-intel-sdca-quirks.h"
16 #include "soc-acpi-intel-sdw-mockup-match.h"
17 
18 static const struct snd_soc_acpi_codecs mtl_rt5682_rt5682s_hp = {
19 	.num_codecs = 2,
20 	.codecs = {RT5682_ACPI_HID, RT5682S_ACPI_HID},
21 };
22 
23 static const struct snd_soc_acpi_codecs mtl_essx_83x6 = {
24 	.num_codecs = 3,
25 	.codecs = { "ESSX8316", "ESSX8326", "ESSX8336"},
26 };
27 
28 static const struct snd_soc_acpi_codecs mtl_lt6911_hdmi = {
29 	.num_codecs = 1,
30 	.codecs = {"INTC10B0"}
31 };
32 
33 struct snd_soc_acpi_mach snd_soc_acpi_intel_mtl_machines[] = {
34 	{
35 		.comp_ids = &mtl_essx_83x6,
36 		.drv_name = "mtl_es83x6_c1_h02",
37 		.machine_quirk = snd_soc_acpi_codec_list,
38 		.quirk_data = &mtl_lt6911_hdmi,
39 		.sof_tplg_filename = "sof-mtl-es83x6-ssp1-hdmi-ssp02.tplg",
40 	},
41 	{
42 		.comp_ids = &mtl_essx_83x6,
43 		.drv_name = "sof-essx8336",
44 		.sof_tplg_filename = "sof-mtl-es8336", /* the tplg suffix is added at run time */
45 		.tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER |
46 					SND_SOC_ACPI_TPLG_INTEL_SSP_MSB |
47 					SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER,
48 	},
49 	{
50 		.comp_ids = &mtl_rt5682_rt5682s_hp,
51 		.drv_name = "mtl_rt5682_c1_h02",
52 		.machine_quirk = snd_soc_acpi_codec_list,
53 		.quirk_data = &mtl_lt6911_hdmi,
54 		.sof_tplg_filename = "sof-mtl-rt5682-ssp1-hdmi-ssp02.tplg",
55 	},
56 	/* place boards for each headphone codec: sof driver will complete the
57 	 * tplg name and machine driver will detect the amp type
58 	 */
59 	{
60 		.id = CS42L42_ACPI_HID,
61 		.drv_name = "mtl_cs42l42_def",
62 		.sof_tplg_filename = "sof-mtl", /* the tplg suffix is added at run time */
63 		.tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_AMP_NAME |
64 					SND_SOC_ACPI_TPLG_INTEL_CODEC_NAME,
65 	},
66 	{
67 		.id = DA7219_ACPI_HID,
68 		.drv_name = "mtl_da7219_def",
69 		.sof_tplg_filename = "sof-mtl", /* the tplg suffix is added at run time */
70 		.tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_AMP_NAME |
71 					SND_SOC_ACPI_TPLG_INTEL_CODEC_NAME,
72 	},
73 	{
74 		.id = NAU8825_ACPI_HID,
75 		.drv_name = "mtl_nau8825_def",
76 		.sof_tplg_filename = "sof-mtl", /* the tplg suffix is added at run time */
77 		.tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_AMP_NAME |
78 					SND_SOC_ACPI_TPLG_INTEL_CODEC_NAME,
79 	},
80 	{
81 		.id = RT5650_ACPI_HID,
82 		.drv_name = "mtl_rt5682_def",
83 		.sof_tplg_filename = "sof-mtl", /* the tplg suffix is added at run time */
84 		.tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_AMP_NAME |
85 					SND_SOC_ACPI_TPLG_INTEL_CODEC_NAME,
86 	},
87 	{
88 		.comp_ids = &mtl_rt5682_rt5682s_hp,
89 		.drv_name = "mtl_rt5682_def",
90 		.sof_tplg_filename = "sof-mtl", /* the tplg suffix is added at run time */
91 		.tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_AMP_NAME |
92 					SND_SOC_ACPI_TPLG_INTEL_CODEC_NAME,
93 	},
94 	/* place amp-only boards in the end of table */
95 	{
96 		.id = "INTC10B0",
97 		.drv_name = "mtl_lt6911_hdmi_ssp",
98 		.sof_tplg_filename = "sof-mtl-hdmi-ssp02.tplg",
99 	},
100 	{},
101 };
102 EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_mtl_machines);
103 
104 static const struct snd_soc_acpi_endpoint single_endpoint = {
105 	.num = 0,
106 	.aggregated = 0,
107 	.group_position = 0,
108 	.group_id = 0,
109 };
110 
111 static const struct snd_soc_acpi_endpoint spk_l_endpoint = {
112 	.num = 0,
113 	.aggregated = 1,
114 	.group_position = 0,
115 	.group_id = 1,
116 };
117 
118 static const struct snd_soc_acpi_endpoint spk_r_endpoint = {
119 	.num = 0,
120 	.aggregated = 1,
121 	.group_position = 1,
122 	.group_id = 1,
123 };
124 
125 static const struct snd_soc_acpi_endpoint rt712_endpoints[] = {
126 	{
127 		.num = 0,
128 		.aggregated = 0,
129 		.group_position = 0,
130 		.group_id = 0,
131 	},
132 	{
133 		.num = 1,
134 		.aggregated = 0,
135 		.group_position = 0,
136 		.group_id = 0,
137 	},
138 };
139 
140 static const struct snd_soc_acpi_endpoint rt712_vb_endpoints[] = {
141 	{
142 		.num = 0,
143 		.aggregated = 0,
144 		.group_position = 0,
145 		.group_id = 0,
146 	},
147 	{
148 		.num = 1,
149 		.aggregated = 0,
150 		.group_position = 0,
151 		.group_id = 0,
152 	},
153 	{
154 		.num = 2,
155 		.aggregated = 0,
156 		.group_position = 0,
157 		.group_id = 0,
158 	},
159 };
160 
161 /*
162  * RT722 is a multi-function codec, three endpoints are created for
163  * its headset, amp and dmic functions.
164  */
165 static const struct snd_soc_acpi_endpoint rt722_endpoints[] = {
166 	{
167 		.num = 0,
168 		.aggregated = 0,
169 		.group_position = 0,
170 		.group_id = 0,
171 	},
172 	{
173 		.num = 1,
174 		.aggregated = 0,
175 		.group_position = 0,
176 		.group_id = 0,
177 	},
178 	{
179 		.num = 2,
180 		.aggregated = 0,
181 		.group_position = 0,
182 		.group_id = 0,
183 	},
184 };
185 
186 static const struct snd_soc_acpi_endpoint spk_2_endpoint = {
187 	.num = 0,
188 	.aggregated = 1,
189 	.group_position = 2,
190 	.group_id = 1,
191 };
192 
193 static const struct snd_soc_acpi_endpoint spk_3_endpoint = {
194 	.num = 0,
195 	.aggregated = 1,
196 	.group_position = 3,
197 	.group_id = 1,
198 };
199 
200 static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = {
201 	{
202 		.adr = 0x000030025D071101ull,
203 		.num_endpoints = 1,
204 		.endpoints = &single_endpoint,
205 		.name_prefix = "rt711"
206 	}
207 };
208 
209 static const struct snd_soc_acpi_adr_device rt712_0_single_adr[] = {
210 	{
211 		.adr = 0x000030025D071201ull,
212 		.num_endpoints = ARRAY_SIZE(rt712_endpoints),
213 		.endpoints = rt712_endpoints,
214 		.name_prefix = "rt712"
215 	}
216 };
217 
218 static const struct snd_soc_acpi_adr_device rt712_vb_0_single_adr[] = {
219 	{
220 		.adr = 0x000030025D071201ull,
221 		.num_endpoints = ARRAY_SIZE(rt712_vb_endpoints),
222 		.endpoints = rt712_vb_endpoints,
223 		.name_prefix = "rt712"
224 	}
225 };
226 
227 static const struct snd_soc_acpi_adr_device rt1712_3_single_adr[] = {
228 	{
229 		.adr = 0x000330025D171201ull,
230 		.num_endpoints = 1,
231 		.endpoints = &single_endpoint,
232 		.name_prefix = "rt712-dmic"
233 	}
234 };
235 
236 static const struct snd_soc_acpi_adr_device rt722_0_single_adr[] = {
237 	{
238 		.adr = 0x000030025d072201ull,
239 		.num_endpoints = ARRAY_SIZE(rt722_endpoints),
240 		.endpoints = rt722_endpoints,
241 		.name_prefix = "rt722"
242 	}
243 };
244 
245 static const struct snd_soc_acpi_adr_device rt713_0_single_adr[] = {
246 	{
247 		.adr = 0x000031025D071301ull,
248 		.num_endpoints = 1,
249 		.endpoints = &single_endpoint,
250 		.name_prefix = "rt713"
251 	}
252 };
253 
254 static const struct snd_soc_acpi_adr_device rt1713_3_single_adr[] = {
255 	{
256 		.adr = 0x000331025D171301ull,
257 		.num_endpoints = 1,
258 		.endpoints = &single_endpoint,
259 		.name_prefix = "rt713-dmic"
260 	}
261 };
262 
263 static const struct snd_soc_acpi_adr_device mx8373_0_adr[] = {
264 	{
265 		.adr = 0x000023019F837300ull,
266 		.num_endpoints = 1,
267 		.endpoints = &spk_l_endpoint,
268 		.name_prefix = "Left"
269 	},
270 	{
271 		.adr = 0x000027019F837300ull,
272 		.num_endpoints = 1,
273 		.endpoints = &spk_r_endpoint,
274 		.name_prefix = "Right"
275 	}
276 };
277 
278 static const struct snd_soc_acpi_adr_device rt5682_2_adr[] = {
279 	{
280 		.adr = 0x000221025D568200ull,
281 		.num_endpoints = 1,
282 		.endpoints = &single_endpoint,
283 		.name_prefix = "rt5682"
284 	}
285 };
286 
287 static const struct snd_soc_acpi_adr_device rt1316_2_group1_adr[] = {
288 	{
289 		.adr = 0x000230025D131601ull,
290 		.num_endpoints = 1,
291 		.endpoints = &spk_l_endpoint,
292 		.name_prefix = "rt1316-1"
293 	}
294 };
295 
296 static const struct snd_soc_acpi_adr_device rt1316_3_group1_adr[] = {
297 	{
298 		.adr = 0x000331025D131601ull,
299 		.num_endpoints = 1,
300 		.endpoints = &spk_r_endpoint,
301 		.name_prefix = "rt1316-2"
302 	}
303 };
304 
305 static const struct snd_soc_acpi_adr_device rt1316_1_group2_adr[] = {
306 	{
307 		.adr = 0x000131025D131601ull,
308 		.num_endpoints = 1,
309 		.endpoints = &spk_l_endpoint,
310 		.name_prefix = "rt1316-1"
311 	}
312 };
313 
314 static const struct snd_soc_acpi_adr_device rt1316_2_group2_adr[] = {
315 	{
316 		.adr = 0x000230025D131601ull,
317 		.num_endpoints = 1,
318 		.endpoints = &spk_r_endpoint,
319 		.name_prefix = "rt1316-2"
320 	}
321 };
322 
323 static const struct snd_soc_acpi_adr_device rt1316_3_single_adr[] = {
324 	{
325 		.adr = 0x000330025D131601ull,
326 		.num_endpoints = 1,
327 		.endpoints = &single_endpoint,
328 		.name_prefix = "rt1316-1"
329 	}
330 };
331 
332 static const struct snd_soc_acpi_adr_device rt1318_1_single_adr[] = {
333 	{
334 		.adr = 0x000130025D131801ull,
335 		.num_endpoints = 1,
336 		.endpoints = &single_endpoint,
337 		.name_prefix = "rt1318-1"
338 	}
339 };
340 
341 static const struct snd_soc_acpi_adr_device rt1318_1_group1_adr[] = {
342 	{
343 		.adr = 0x000130025D131801ull,
344 		.num_endpoints = 1,
345 		.endpoints = &spk_l_endpoint,
346 		.name_prefix = "rt1318-1"
347 	}
348 };
349 
350 static const struct snd_soc_acpi_adr_device rt1318_2_group1_adr[] = {
351 	{
352 		.adr = 0x000232025D131801ull,
353 		.num_endpoints = 1,
354 		.endpoints = &spk_r_endpoint,
355 		.name_prefix = "rt1318-2"
356 	}
357 };
358 
359 static const struct snd_soc_acpi_adr_device rt714_0_adr[] = {
360 	{
361 		.adr = 0x000030025D071401ull,
362 		.num_endpoints = 1,
363 		.endpoints = &single_endpoint,
364 		.name_prefix = "rt714"
365 	}
366 };
367 
368 static const struct snd_soc_acpi_adr_device rt714_1_adr[] = {
369 	{
370 		.adr = 0x000130025D071401ull,
371 		.num_endpoints = 1,
372 		.endpoints = &single_endpoint,
373 		.name_prefix = "rt714"
374 	}
375 };
376 
377 static const struct snd_soc_acpi_link_adr mtl_712_l0_1712_l3[] = {
378 	{
379 		.mask = BIT(0),
380 		.num_adr = ARRAY_SIZE(rt712_0_single_adr),
381 		.adr_d = rt712_0_single_adr,
382 	},
383 	{
384 		.mask = BIT(3),
385 		.num_adr = ARRAY_SIZE(rt1712_3_single_adr),
386 		.adr_d = rt1712_3_single_adr,
387 	},
388 	{}
389 };
390 
391 static const struct snd_soc_acpi_link_adr mtl_712_l0[] = {
392 	{
393 		.mask = BIT(0),
394 		.num_adr = ARRAY_SIZE(rt712_0_single_adr),
395 		.adr_d = rt712_0_single_adr,
396 	},
397 	{}
398 };
399 
400 static const struct snd_soc_acpi_link_adr mtl_712_vb_l0[] = {
401 	{
402 		.mask = BIT(0),
403 		.num_adr = ARRAY_SIZE(rt712_vb_0_single_adr),
404 		.adr_d = rt712_vb_0_single_adr,
405 	},
406 	{}
407 };
408 
409 static const struct snd_soc_acpi_endpoint cs42l43_endpoints[] = {
410 	{ /* Jack Playback Endpoint */
411 		.num = 0,
412 		.aggregated = 0,
413 		.group_position = 0,
414 		.group_id = 0,
415 	},
416 	{ /* DMIC Capture Endpoint */
417 		.num = 1,
418 		.aggregated = 0,
419 		.group_position = 0,
420 		.group_id = 0,
421 	},
422 	{ /* Jack Capture Endpoint */
423 		.num = 2,
424 		.aggregated = 0,
425 		.group_position = 0,
426 		.group_id = 0,
427 	},
428 	{ /* Speaker Playback Endpoint */
429 		.num = 3,
430 		.aggregated = 0,
431 		.group_position = 0,
432 		.group_id = 0,
433 	},
434 };
435 
436 static const struct snd_soc_acpi_adr_device cs42l43_0_adr[] = {
437 	{
438 		.adr = 0x00003001FA424301ull,
439 		.num_endpoints = ARRAY_SIZE(cs42l43_endpoints),
440 		.endpoints = cs42l43_endpoints,
441 		.name_prefix = "cs42l43"
442 	}
443 };
444 
445 /* CS42L43 - speaker DAI aggregated with 4 amps */
446 static const struct snd_soc_acpi_endpoint cs42l43_4amp_spkagg_endpoints[] = {
447 	{ /* Jack Playback Endpoint */
448 		.num = 0,
449 		.aggregated = 0,
450 		.group_position = 0,
451 		.group_id = 0,
452 	},
453 	{ /* DMIC Capture Endpoint */
454 		.num = 1,
455 		.aggregated = 0,
456 		.group_position = 0,
457 		.group_id = 0,
458 	},
459 	{ /* Jack Capture Endpoint */
460 		.num = 2,
461 		.aggregated = 0,
462 		.group_position = 0,
463 		.group_id = 0,
464 	},
465 	{ /* Speaker Playback Endpoint */
466 		.num = 3,
467 		.aggregated = 1,
468 		.group_position = 4,
469 		.group_id = 1,
470 	},
471 };
472 
473 /* CS42L43 on link3 aggregated with 4 amps */
474 static const struct snd_soc_acpi_adr_device cs42l43_l3_4amp_spkagg_adr[] = {
475 	{
476 		.adr = 0x00033001FA424301ull,
477 		.num_endpoints = ARRAY_SIZE(cs42l43_4amp_spkagg_endpoints),
478 		.endpoints = cs42l43_4amp_spkagg_endpoints,
479 		.name_prefix = "cs42l43"
480 	}
481 };
482 
483 static const struct snd_soc_acpi_endpoint cs35l56_l_fb_endpoints[] = {
484 	{ /* Speaker Playback Endpoint */
485 		.num = 0,
486 		.aggregated = 1,
487 		.group_position = 0,
488 		.group_id = 1,
489 	},
490 	{ /* Feedback Capture Endpoint */
491 		.num = 1,
492 		.aggregated = 1,
493 		.group_position = 0,
494 		.group_id = 2,
495 	},
496 };
497 
498 static const struct snd_soc_acpi_endpoint cs35l56_r_fb_endpoints[] = {
499 	{ /* Speaker Playback Endpoint */
500 		.num = 0,
501 		.aggregated = 1,
502 		.group_position = 1,
503 		.group_id = 1,
504 	},
505 	{ /* Feedback Capture Endpoint */
506 		.num = 1,
507 		.aggregated = 1,
508 		.group_position = 1,
509 		.group_id = 2,
510 	},
511 };
512 
513 static const struct snd_soc_acpi_endpoint cs35l56_2_fb_endpoints[] = {
514 	{ /* Speaker Playback Endpoint */
515 		.num = 0,
516 		.aggregated = 1,
517 		.group_position = 2,
518 		.group_id = 1,
519 	},
520 	{ /* Feedback Capture Endpoint */
521 		.num = 1,
522 		.aggregated = 1,
523 		.group_position = 2,
524 		.group_id = 2,
525 	},
526 };
527 
528 static const struct snd_soc_acpi_endpoint cs35l56_3_fb_endpoints[] = {
529 	{ /* Speaker Playback Endpoint */
530 		.num = 0,
531 		.aggregated = 1,
532 		.group_position = 3,
533 		.group_id = 1,
534 	},
535 	{ /* Feedback Capture Endpoint */
536 		.num = 1,
537 		.aggregated = 1,
538 		.group_position = 3,
539 		.group_id = 2,
540 	},
541 };
542 
543 static const struct snd_soc_acpi_endpoint cs35l56_4_fb_endpoints[] = {
544 	{ /* Speaker Playback Endpoint */
545 		.num = 0,
546 		.aggregated = 1,
547 		.group_position = 4,
548 		.group_id = 1,
549 	},
550 	{ /* Feedback Capture Endpoint */
551 		.num = 1,
552 		.aggregated = 1,
553 		.group_position = 4,
554 		.group_id = 2,
555 	},
556 };
557 
558 static const struct snd_soc_acpi_endpoint cs35l56_5_fb_endpoints[] = {
559 	{ /* Speaker Playback Endpoint */
560 		.num = 0,
561 		.aggregated = 1,
562 		.group_position = 5,
563 		.group_id = 1,
564 	},
565 	{ /* Feedback Capture Endpoint */
566 		.num = 1,
567 		.aggregated = 1,
568 		.group_position = 5,
569 		.group_id = 2,
570 	},
571 };
572 
573 static const struct snd_soc_acpi_endpoint cs35l56_6_fb_endpoints[] = {
574 	{ /* Speaker Playback Endpoint */
575 		.num = 0,
576 		.aggregated = 1,
577 		.group_position = 6,
578 		.group_id = 1,
579 	},
580 	{ /* Feedback Capture Endpoint */
581 		.num = 1,
582 		.aggregated = 1,
583 		.group_position = 6,
584 		.group_id = 2,
585 	},
586 };
587 
588 static const struct snd_soc_acpi_endpoint cs35l56_7_fb_endpoints[] = {
589 	{ /* Speaker Playback Endpoint */
590 		.num = 0,
591 		.aggregated = 1,
592 		.group_position = 7,
593 		.group_id = 1,
594 	},
595 	{ /* Feedback Capture Endpoint */
596 		.num = 1,
597 		.aggregated = 1,
598 		.group_position = 7,
599 		.group_id = 2,
600 	},
601 };
602 
603 static const struct snd_soc_acpi_adr_device cs35l56_0_adr[] = {
604 	{
605 		.adr = 0x00003301FA355601ull,
606 		.num_endpoints = 1,
607 		.endpoints = &spk_l_endpoint,
608 		.name_prefix = "AMP1"
609 	},
610 	{
611 		.adr = 0x00003201FA355601ull,
612 		.num_endpoints = 1,
613 		.endpoints = &spk_2_endpoint,
614 		.name_prefix = "AMP2"
615 	}
616 };
617 
618 static const struct snd_soc_acpi_adr_device cs35l56_1_adr[] = {
619 	{
620 		.adr = 0x00013701FA355601ull,
621 		.num_endpoints = 1,
622 		.endpoints = &spk_r_endpoint,
623 		.name_prefix = "AMP3"
624 	},
625 	{
626 		.adr = 0x00013601FA355601ull,
627 		.num_endpoints = 1,
628 		.endpoints = &spk_3_endpoint,
629 		.name_prefix = "AMP4"
630 	}
631 };
632 
633 static const struct snd_soc_acpi_adr_device cs35l56_2_adr[] = {
634 	{
635 		.adr = 0x00023301FA355601ull,
636 		.num_endpoints = 1,
637 		.endpoints = &spk_l_endpoint,
638 		.name_prefix = "AMP1"
639 	},
640 	{
641 		.adr = 0x00023201FA355601ull,
642 		.num_endpoints = 1,
643 		.endpoints = &spk_2_endpoint,
644 		.name_prefix = "AMP2"
645 	}
646 };
647 
648 static const struct snd_soc_acpi_adr_device cs35l56_0_fb_adr[] = {
649 	{
650 		.adr = 0x00003301FA355601ull,
651 		.num_endpoints = ARRAY_SIZE(cs35l56_l_fb_endpoints),
652 		.endpoints = cs35l56_l_fb_endpoints,
653 		.name_prefix = "AMP1"
654 	},
655 	{
656 		.adr = 0x00003201FA355601ull,
657 		.num_endpoints = ARRAY_SIZE(cs35l56_2_fb_endpoints),
658 		.endpoints = cs35l56_2_fb_endpoints,
659 		.name_prefix = "AMP2"
660 	},
661 	{
662 		.adr = 0x00003101FA355601ull,
663 		.num_endpoints = ARRAY_SIZE(cs35l56_4_fb_endpoints),
664 		.endpoints = cs35l56_4_fb_endpoints,
665 		.name_prefix = "AMP3"
666 	},
667 	{
668 		.adr = 0x00003001FA355601ull,
669 		.num_endpoints = ARRAY_SIZE(cs35l56_6_fb_endpoints),
670 		.endpoints = cs35l56_6_fb_endpoints,
671 		.name_prefix = "AMP4"
672 	},
673 };
674 
675 static const struct snd_soc_acpi_adr_device cs35l56_1_fb_adr[] = {
676 	{
677 		.adr = 0x00013701FA355601ull,
678 		.num_endpoints = ARRAY_SIZE(cs35l56_r_fb_endpoints),
679 		.endpoints = cs35l56_r_fb_endpoints,
680 		.name_prefix = "AMP8"
681 	},
682 	{
683 		.adr = 0x00013601FA355601ull,
684 		.num_endpoints = ARRAY_SIZE(cs35l56_3_fb_endpoints),
685 		.endpoints = cs35l56_3_fb_endpoints,
686 		.name_prefix = "AMP7"
687 	},
688 	{
689 		.adr = 0x00013501FA355601ull,
690 		.num_endpoints = ARRAY_SIZE(cs35l56_5_fb_endpoints),
691 		.endpoints = cs35l56_5_fb_endpoints,
692 		.name_prefix = "AMP6"
693 	},
694 	{
695 		.adr = 0x00013401FA355601ull,
696 		.num_endpoints = ARRAY_SIZE(cs35l56_7_fb_endpoints),
697 		.endpoints = cs35l56_7_fb_endpoints,
698 		.name_prefix = "AMP5"
699 	},
700 };
701 
702 static const struct snd_soc_acpi_adr_device cs35l56_2_r_adr[] = {
703 	{
704 		.adr = 0x00023201FA355601ull,
705 		.num_endpoints = ARRAY_SIZE(cs35l56_r_fb_endpoints),
706 		.endpoints = cs35l56_r_fb_endpoints,
707 		.name_prefix = "AMP3"
708 	},
709 	{
710 		.adr = 0x00023301FA355601ull,
711 		.num_endpoints = ARRAY_SIZE(cs35l56_3_fb_endpoints),
712 		.endpoints = cs35l56_3_fb_endpoints,
713 		.name_prefix = "AMP4"
714 	}
715 
716 };
717 
718 static const struct snd_soc_acpi_adr_device cs35l56_3_l_adr[] = {
719 	{
720 		.adr = 0x00033001fa355601ull,
721 		.num_endpoints = ARRAY_SIZE(cs35l56_l_fb_endpoints),
722 		.endpoints = cs35l56_l_fb_endpoints,
723 		.name_prefix = "AMP1"
724 	},
725 	{
726 		.adr = 0x00033101fa355601ull,
727 		.num_endpoints = ARRAY_SIZE(cs35l56_2_fb_endpoints),
728 		.endpoints = cs35l56_2_fb_endpoints,
729 		.name_prefix = "AMP2"
730 	}
731 };
732 
733 static const struct snd_soc_acpi_adr_device cs35l63_1_fb_adr[] = {
734 	{
735 		.adr = 0x00013001FA356301ull,
736 		.num_endpoints = ARRAY_SIZE(cs35l56_l_fb_endpoints),
737 		.endpoints = cs35l56_l_fb_endpoints,
738 		.name_prefix = "AMP1"
739 	},
740 };
741 
742 static const struct snd_soc_acpi_adr_device cs35l63_3_fb_adr[] = {
743 	{
744 		.adr = 0x00033101FA356301ull,
745 		.num_endpoints = ARRAY_SIZE(cs35l56_r_fb_endpoints),
746 		.endpoints = cs35l56_r_fb_endpoints,
747 		.name_prefix = "AMP2"
748 	},
749 };
750 
751 static const struct snd_soc_acpi_link_adr rt5682_link2_max98373_link0[] = {
752 	/* Expected order: jack -> amp */
753 	{
754 		.mask = BIT(2),
755 		.num_adr = ARRAY_SIZE(rt5682_2_adr),
756 		.adr_d = rt5682_2_adr,
757 	},
758 	{
759 		.mask = BIT(0),
760 		.num_adr = ARRAY_SIZE(mx8373_0_adr),
761 		.adr_d = mx8373_0_adr,
762 	},
763 	{}
764 };
765 
766 static const struct snd_soc_acpi_link_adr mtl_rvp[] = {
767 	{
768 		.mask = BIT(0),
769 		.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
770 		.adr_d = rt711_sdca_0_adr,
771 	},
772 	{}
773 };
774 
775 static const struct snd_soc_acpi_link_adr mtl_rt722_only[] = {
776 	{
777 		.mask = BIT(0),
778 		.num_adr = ARRAY_SIZE(rt722_0_single_adr),
779 		.adr_d = rt722_0_single_adr,
780 	},
781 	{}
782 };
783 
784 static const struct snd_soc_acpi_link_adr mtl_3_in_1_sdca[] = {
785 	{
786 		.mask = BIT(0),
787 		.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
788 		.adr_d = rt711_sdca_0_adr,
789 	},
790 	{
791 		.mask = BIT(2),
792 		.num_adr = ARRAY_SIZE(rt1316_2_group1_adr),
793 		.adr_d = rt1316_2_group1_adr,
794 	},
795 	{
796 		.mask = BIT(3),
797 		.num_adr = ARRAY_SIZE(rt1316_3_group1_adr),
798 		.adr_d = rt1316_3_group1_adr,
799 	},
800 	{
801 		.mask = BIT(1),
802 		.num_adr = ARRAY_SIZE(rt714_1_adr),
803 		.adr_d = rt714_1_adr,
804 	},
805 	{}
806 };
807 
808 static const struct snd_soc_acpi_link_adr mtl_sdw_rt1318_l12_rt714_l0[] = {
809 	{
810 		.mask = BIT(1),
811 		.num_adr = ARRAY_SIZE(rt1318_1_group1_adr),
812 		.adr_d = rt1318_1_group1_adr,
813 	},
814 	{
815 		.mask = BIT(2),
816 		.num_adr = ARRAY_SIZE(rt1318_2_group1_adr),
817 		.adr_d = rt1318_2_group1_adr,
818 	},
819 	{
820 		.mask = BIT(0),
821 		.num_adr = ARRAY_SIZE(rt714_0_adr),
822 		.adr_d = rt714_0_adr,
823 	},
824 	{}
825 };
826 
827 static const struct snd_soc_acpi_link_adr mtl_rt713_l0_rt1316_l12_rt1713_l3[] = {
828 	{
829 		.mask = BIT(0),
830 		.num_adr = ARRAY_SIZE(rt713_0_single_adr),
831 		.adr_d = rt713_0_single_adr,
832 	},
833 	{
834 		.mask = BIT(1),
835 		.num_adr = ARRAY_SIZE(rt1316_1_group2_adr),
836 		.adr_d = rt1316_1_group2_adr,
837 	},
838 	{
839 		.mask = BIT(2),
840 		.num_adr = ARRAY_SIZE(rt1316_2_group2_adr),
841 		.adr_d = rt1316_2_group2_adr,
842 	},
843 	{
844 		.mask = BIT(3),
845 		.num_adr = ARRAY_SIZE(rt1713_3_single_adr),
846 		.adr_d = rt1713_3_single_adr,
847 	},
848 	{}
849 };
850 
851 static const struct snd_soc_acpi_link_adr mtl_rt713_l0_rt1318_l1_rt1713_l3[] = {
852 	{
853 		.mask = BIT(0),
854 		.num_adr = ARRAY_SIZE(rt713_0_single_adr),
855 		.adr_d = rt713_0_single_adr,
856 	},
857 	{
858 		.mask = BIT(1),
859 		.num_adr = ARRAY_SIZE(rt1318_1_single_adr),
860 		.adr_d = rt1318_1_single_adr,
861 	},
862 	{
863 		.mask = BIT(3),
864 		.num_adr = ARRAY_SIZE(rt1713_3_single_adr),
865 		.adr_d = rt1713_3_single_adr,
866 	},
867 	{}
868 };
869 
870 static const struct snd_soc_acpi_link_adr mtl_rt713_l0_rt1318_l12_rt1713_l3[] = {
871 	{
872 		.mask = BIT(0),
873 		.num_adr = ARRAY_SIZE(rt713_0_single_adr),
874 		.adr_d = rt713_0_single_adr,
875 	},
876 	{
877 		.mask = BIT(1),
878 		.num_adr = ARRAY_SIZE(rt1318_1_group1_adr),
879 		.adr_d = rt1318_1_group1_adr,
880 	},
881 	{
882 		.mask = BIT(2),
883 		.num_adr = ARRAY_SIZE(rt1318_2_group1_adr),
884 		.adr_d = rt1318_2_group1_adr,
885 	},
886 	{
887 		.mask = BIT(3),
888 		.num_adr = ARRAY_SIZE(rt1713_3_single_adr),
889 		.adr_d = rt1713_3_single_adr,
890 	},
891 	{}
892 };
893 
894 static const struct snd_soc_acpi_link_adr mtl_rt713_l0_rt1316_l12[] = {
895 	{
896 		.mask = BIT(0),
897 		.num_adr = ARRAY_SIZE(rt713_0_single_adr),
898 		.adr_d = rt713_0_single_adr,
899 	},
900 	{
901 		.mask = BIT(1),
902 		.num_adr = ARRAY_SIZE(rt1316_1_group2_adr),
903 		.adr_d = rt1316_1_group2_adr,
904 	},
905 	{
906 		.mask = BIT(2),
907 		.num_adr = ARRAY_SIZE(rt1316_2_group2_adr),
908 		.adr_d = rt1316_2_group2_adr,
909 	},
910 	{}
911 };
912 
913 static const struct snd_soc_acpi_link_adr mtl_rt711_l0_rt1316_l3[] = {
914 	{
915 		.mask = BIT(0),
916 		.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
917 		.adr_d = rt711_sdca_0_adr,
918 	},
919 	{
920 		.mask = BIT(3),
921 		.num_adr = ARRAY_SIZE(rt1316_3_single_adr),
922 		.adr_d = rt1316_3_single_adr,
923 	},
924 	{}
925 };
926 
927 static const struct snd_soc_acpi_adr_device mx8363_2_adr[] = {
928 	{
929 		.adr = 0x000230019F836300ull,
930 		.num_endpoints = 1,
931 		.endpoints = &spk_l_endpoint,
932 		.name_prefix = "Left"
933 	},
934 	{
935 		.adr = 0x000231019F836300ull,
936 		.num_endpoints = 1,
937 		.endpoints = &spk_r_endpoint,
938 		.name_prefix = "Right"
939 	}
940 };
941 
942 static const struct snd_soc_acpi_adr_device cs42l42_0_adr[] = {
943 	{
944 		.adr = 0x00001001FA424200ull,
945 		.num_endpoints = 1,
946 		.endpoints = &single_endpoint,
947 		.name_prefix = "cs42l42"
948 	}
949 };
950 
951 static const struct snd_soc_acpi_link_adr cs42l42_link0_max98363_link2[] = {
952 	/* Expected order: jack -> amp */
953 	{
954 		.mask = BIT(0),
955 		.num_adr = ARRAY_SIZE(cs42l42_0_adr),
956 		.adr_d = cs42l42_0_adr,
957 	},
958 	{
959 		.mask = BIT(2),
960 		.num_adr = ARRAY_SIZE(mx8363_2_adr),
961 		.adr_d = mx8363_2_adr,
962 	},
963 	{}
964 };
965 
966 static const struct snd_soc_acpi_link_adr mtl_cs42l43_l0[] = {
967 	{
968 		.mask = BIT(0),
969 		.num_adr = ARRAY_SIZE(cs42l43_0_adr),
970 		.adr_d = cs42l43_0_adr,
971 	},
972 	{}
973 };
974 
975 static const struct snd_soc_acpi_link_adr mtl_cs42l43_cs35l56[] = {
976 	{
977 		.mask = BIT(0),
978 		.num_adr = ARRAY_SIZE(cs42l43_0_adr),
979 		.adr_d = cs42l43_0_adr,
980 	},
981 	{
982 		.mask = BIT(1),
983 		.num_adr = ARRAY_SIZE(cs35l56_1_adr),
984 		.adr_d = cs35l56_1_adr,
985 	},
986 	{
987 		.mask = BIT(2),
988 		.num_adr = ARRAY_SIZE(cs35l56_2_adr),
989 		.adr_d = cs35l56_2_adr,
990 	},
991 	{}
992 };
993 
994 static const struct snd_soc_acpi_link_adr cs42l43_link0_cs35l56_link2_link3[] = {
995 	/* Expected order: jack -> amp */
996 	{
997 		.mask = BIT(0),
998 		.num_adr = ARRAY_SIZE(cs42l43_0_adr),
999 		.adr_d = cs42l43_0_adr,
1000 	},
1001 	{
1002 		.mask = BIT(2),
1003 		.num_adr = ARRAY_SIZE(cs35l56_2_r_adr),
1004 		.adr_d = cs35l56_2_r_adr,
1005 	},
1006 	{
1007 		.mask = BIT(3),
1008 		.num_adr = ARRAY_SIZE(cs35l56_3_l_adr),
1009 		.adr_d = cs35l56_3_l_adr,
1010 	},
1011 	{}
1012 };
1013 
1014 static const struct snd_soc_acpi_link_adr cs42l43_link3_cs35l56_x4_link0_link1_spkagg[] = {
1015 	/* Expected order: jack -> amp */
1016 	{
1017 		.mask = BIT(3),
1018 		.num_adr = ARRAY_SIZE(cs42l43_l3_4amp_spkagg_adr),
1019 		.adr_d = cs42l43_l3_4amp_spkagg_adr,
1020 	},
1021 	{
1022 		.mask = BIT(1),
1023 		.num_adr = 2,
1024 		.adr_d = cs35l56_1_adr,
1025 	},
1026 	{
1027 		.mask = BIT(0),
1028 		.num_adr = 2,
1029 		.adr_d = cs35l56_0_adr,
1030 	},
1031 	{}
1032 };
1033 
1034 static const struct snd_soc_acpi_link_adr mtl_cs35l56_x8_link0_link1_fb[] = {
1035 	{
1036 		.mask = BIT(1),
1037 		.num_adr = ARRAY_SIZE(cs35l56_1_fb_adr),
1038 		.adr_d = cs35l56_1_fb_adr,
1039 	},
1040 	{
1041 		.mask = BIT(0),
1042 		.num_adr = ARRAY_SIZE(cs35l56_0_fb_adr),
1043 		.adr_d = cs35l56_0_fb_adr,
1044 	},
1045 	{}
1046 };
1047 
1048 static const struct snd_soc_acpi_link_adr mtl_cs35l63_x2_link1_link3_fb[] = {
1049 	{
1050 		.mask = BIT(3),
1051 		.num_adr = ARRAY_SIZE(cs35l63_3_fb_adr),
1052 		.adr_d = cs35l63_3_fb_adr,
1053 	},
1054 	{
1055 		.mask = BIT(1),
1056 		.num_adr = ARRAY_SIZE(cs35l63_1_fb_adr),
1057 		.adr_d = cs35l63_1_fb_adr,
1058 	},
1059 	{}
1060 };
1061 
1062 /* this table is used when there is no I2S codec present */
1063 struct snd_soc_acpi_mach snd_soc_acpi_intel_mtl_sdw_machines[] = {
1064 	/* mockup tests need to be first */
1065 	{
1066 		.link_mask = GENMASK(3, 0),
1067 		.links = sdw_mockup_headset_2amps_mic,
1068 		.drv_name = "sof_sdw",
1069 		.sof_tplg_filename = "sof-mtl-rt711-rt1308-rt715.tplg",
1070 	},
1071 	{
1072 		.link_mask = BIT(0) | BIT(1) | BIT(3),
1073 		.links = sdw_mockup_headset_1amp_mic,
1074 		.drv_name = "sof_sdw",
1075 		.sof_tplg_filename = "sof-mtl-rt711-rt1308-mono-rt715.tplg",
1076 	},
1077 	{
1078 		.link_mask = GENMASK(2, 0),
1079 		.links = sdw_mockup_mic_headset_1amp,
1080 		.drv_name = "sof_sdw",
1081 		.sof_tplg_filename = "sof-mtl-rt715-rt711-rt1308-mono.tplg",
1082 	},
1083 	{
1084 		.link_mask = GENMASK(3, 0),
1085 		.links = mtl_rt713_l0_rt1316_l12_rt1713_l3,
1086 		.drv_name = "sof_sdw",
1087 		.sof_tplg_filename = "sof-mtl-rt713-l0-rt1316-l12-rt1713-l3.tplg",
1088 	},
1089 	{
1090 		.link_mask = GENMASK(3, 0),
1091 		.links = mtl_rt713_l0_rt1318_l12_rt1713_l3,
1092 		.drv_name = "sof_sdw",
1093 		.sof_tplg_filename = "sof-mtl-rt713-l0-rt1318-l12-rt1713-l3.tplg",
1094 	},
1095 	{
1096 		.link_mask = BIT(0) | BIT(1) | BIT(3),
1097 		.links = mtl_rt713_l0_rt1318_l1_rt1713_l3,
1098 		.drv_name = "sof_sdw",
1099 		.sof_tplg_filename = "sof-mtl-rt713-l0-rt1318-l1-rt1713-l3.tplg",
1100 	},
1101 	{
1102 		.link_mask = GENMASK(2, 0),
1103 		.links = mtl_rt713_l0_rt1316_l12,
1104 		.drv_name = "sof_sdw",
1105 		.sof_tplg_filename = "sof-mtl-rt713-l0-rt1316-l12.tplg",
1106 	},
1107 	{
1108 		.link_mask = BIT(3) | BIT(0),
1109 		.links = mtl_712_l0_1712_l3,
1110 		.drv_name = "sof_sdw",
1111 		.sof_tplg_filename = "sof-mtl-rt712-l0-rt1712-l3.tplg",
1112 	},
1113 	{
1114 		.link_mask = BIT(0),
1115 		.links = mtl_712_vb_l0,
1116 		.drv_name = "sof_sdw",
1117 		.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,
1118 		.sof_tplg_filename = "sof-mtl-rt712-vb-l0.tplg",
1119 		.get_function_tplg_files = sof_sdw_get_tplg_files,
1120 	},
1121 	{
1122 		.link_mask = BIT(0),
1123 		.links = mtl_712_l0,
1124 		.drv_name = "sof_sdw",
1125 		.sof_tplg_filename = "sof-mtl-rt712-l0.tplg",
1126 		.get_function_tplg_files = sof_sdw_get_tplg_files,
1127 	},
1128 	{
1129 		.link_mask = GENMASK(2, 0),
1130 		.links = mtl_sdw_rt1318_l12_rt714_l0,
1131 		.drv_name = "sof_sdw",
1132 		.sof_tplg_filename = "sof-mtl-rt1318-l12-rt714-l0.tplg"
1133 	},
1134 	{
1135 		.link_mask = BIT(0) | BIT(2) | BIT(3),
1136 		.links = cs42l43_link0_cs35l56_link2_link3,
1137 		.drv_name = "sof_sdw",
1138 		.sof_tplg_filename = "sof-mtl-cs42l43-l0-cs35l56-l23.tplg",
1139 		.get_function_tplg_files = sof_sdw_get_tplg_files,
1140 	},
1141 	{
1142 		.link_mask = BIT(0) | BIT(1) | BIT(3),
1143 		.links = cs42l43_link3_cs35l56_x4_link0_link1_spkagg,
1144 		.drv_name = "sof_sdw",
1145 		.sof_tplg_filename = "sof-mtl-cs42l43-l3-cs35l56-l01-spkagg.tplg",
1146 		.get_function_tplg_files = sof_sdw_get_tplg_files,
1147 	},
1148 	{
1149 		.link_mask = GENMASK(2, 0),
1150 		.links = mtl_cs42l43_cs35l56,
1151 		.drv_name = "sof_sdw",
1152 		.sof_tplg_filename = "sof-mtl-cs42l43-l0-cs35l56-l12.tplg",
1153 		.get_function_tplg_files = sof_sdw_get_tplg_files,
1154 	},
1155 	{
1156 		.link_mask = BIT(0) | BIT(1),
1157 		.links = mtl_cs35l56_x8_link0_link1_fb,
1158 		.drv_name = "sof_sdw",
1159 		.sof_tplg_filename = "sof-mtl-cs35l56-l01-fb8.tplg",
1160 		.get_function_tplg_files = sof_sdw_get_tplg_files,
1161 	},
1162 	{
1163 		.link_mask = BIT(0),
1164 		.links = mtl_cs42l43_l0,
1165 		.drv_name = "sof_sdw",
1166 		.sof_tplg_filename = "sof-mtl-cs42l43-l0.tplg",
1167 		.get_function_tplg_files = sof_sdw_get_tplg_files,
1168 	},
1169 	{
1170 		.link_mask = BIT(1) | BIT(3),
1171 		.links = mtl_cs35l63_x2_link1_link3_fb,
1172 		.drv_name = "sof_sdw",
1173 		.sof_tplg_filename = "sof-mtl-cs35l56-l01-fb8.tplg",
1174 	},
1175 	{
1176 		.link_mask = GENMASK(3, 0),
1177 		.links = mtl_3_in_1_sdca,
1178 		.drv_name = "sof_sdw",
1179 		.sof_tplg_filename = "sof-mtl-rt711-l0-rt1316-l23-rt714-l1.tplg",
1180 	},
1181 	{
1182 		.link_mask = 0x9, /* 2 active links required */
1183 		.links = mtl_rt711_l0_rt1316_l3,
1184 		.drv_name = "sof_sdw",
1185 		.sof_tplg_filename = "sof-mtl-rt711-l0-rt1316-l3.tplg",
1186 	},
1187 	{
1188 		.link_mask = BIT(0),
1189 		.links = mtl_rt722_only,
1190 		.drv_name = "sof_sdw",
1191 		.sof_tplg_filename = "sof-mtl-rt722-l0.tplg",
1192 		.get_function_tplg_files = sof_sdw_get_tplg_files,
1193 	},
1194 	{
1195 		.link_mask = BIT(0),
1196 		.links = mtl_rvp,
1197 		.drv_name = "sof_sdw",
1198 		.sof_tplg_filename = "sof-mtl-rt711.tplg",
1199 	},
1200 	{
1201 		.link_mask = BIT(0) | BIT(2),
1202 		.links = rt5682_link2_max98373_link0,
1203 		.drv_name = "sof_sdw",
1204 		.sof_tplg_filename = "sof-mtl-sdw-rt5682-l2-max98373-l0.tplg",
1205 	},
1206 	{
1207 		.link_mask = BIT(0) | BIT(2),
1208 		.links = cs42l42_link0_max98363_link2,
1209 		.drv_name = "sof_sdw",
1210 		.sof_tplg_filename = "sof-mtl-sdw-cs42l42-l0-max98363-l2.tplg",
1211 	},
1212 	{},
1213 };
1214 EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_mtl_sdw_machines);
1215 
1216 MODULE_IMPORT_NS("SND_SOC_ACPI_INTEL_SDCA_QUIRKS");
1217