1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * soc-apci-intel-rpl-match.c - tables and support for RPL ACPI enumeration.
4 *
5 * Copyright (c) 2022 Intel Corporation.
6 */
7
8#include <sound/soc-acpi.h>
9#include <sound/soc-acpi-intel-match.h>
10
11static const struct snd_soc_acpi_endpoint single_endpoint = {
12 .num = 0,
13 .aggregated = 0,
14 .group_position = 0,
15 .group_id = 0,
16};
17
18static const struct snd_soc_acpi_endpoint spk_l_endpoint = {
19 .num = 0,
20 .aggregated = 1,
21 .group_position = 0,
22 .group_id = 1,
23};
24
25static const struct snd_soc_acpi_endpoint spk_r_endpoint = {
26 .num = 0,
27 .aggregated = 1,
28 .group_position = 1,
29 .group_id = 1,
30};
31
32static const struct snd_soc_acpi_adr_device rt711_0_adr[] = {
33 {
34 .adr = 0x000020025D071100ull,
35 .num_endpoints = 1,
36 .endpoints = &single_endpoint,
37 .name_prefix = "rt711"
38 }
39};
40
41static const struct snd_soc_acpi_link_adr rpl_rvp[] = {
42 {
43 .mask = BIT(0),
44 .num_adr = ARRAY_SIZE(rt711_0_adr),
45 .adr_d = rt711_0_adr,
46 },
47 {}
48};
49
50static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = {
51 {
52 .adr = 0x000030025D071101ull,
53 .num_endpoints = 1,
54 .endpoints = &single_endpoint,
55 .name_prefix = "rt711"
56 }
57};
58
59static const struct snd_soc_acpi_adr_device rt711_sdca_2_adr[] = {
60 {
61 .adr = 0x000230025D071101ull,
62 .num_endpoints = 1,
63 .endpoints = &single_endpoint,
64 .name_prefix = "rt711"
65 }
66};
67
68static const struct snd_soc_acpi_adr_device rt1316_1_group1_adr[] = {
69 {
70 .adr = 0x000131025D131601ull, /* unique ID is set for some reason */
71 .num_endpoints = 1,
72 .endpoints = &spk_l_endpoint,
73 .name_prefix = "rt1316-1"
74 }
75};
76
77static const struct snd_soc_acpi_adr_device rt1316_2_group1_adr[] = {
78 {
79 .adr = 0x000230025D131601ull,
80 .num_endpoints = 1,
81 .endpoints = &spk_r_endpoint,
82 .name_prefix = "rt1316-2"
83 }
84};
85
86static const struct snd_soc_acpi_adr_device rt1316_3_group1_adr[] = {
87 {
88 .adr = 0x000330025D131601ull,
89 .num_endpoints = 1,
90 .endpoints = &spk_r_endpoint,
91 .name_prefix = "rt1316-2"
92 }
93};
94
95static const struct snd_soc_acpi_adr_device rt1316_0_group2_adr[] = {
96 {
97 .adr = 0x000030025D131601ull,
98 .num_endpoints = 1,
99 .endpoints = &spk_l_endpoint,
100 .name_prefix = "rt1316-1"
101 }
102};
103
104static const struct snd_soc_acpi_adr_device rt1316_1_group2_adr[] = {
105 {
106 .adr = 0x000131025D131601ull,
107 .num_endpoints = 1,
108 .endpoints = &spk_r_endpoint,
109 .name_prefix = "rt1316-2"
110 }
111};
112
113static const struct snd_soc_acpi_adr_device rt1318_1_group1_adr[] = {
114 {
115 .adr = 0x000132025D131801ull,
116 .num_endpoints = 1,
117 .endpoints = &spk_l_endpoint,
118 .name_prefix = "rt1318-1"
119 }
120};
121
122static const struct snd_soc_acpi_adr_device rt1318_2_group1_adr[] = {
123 {
124 .adr = 0x000230025D131801ull,
125 .num_endpoints = 1,
126 .endpoints = &spk_r_endpoint,
127 .name_prefix = "rt1318-2"
128 }
129};
130
131static const struct snd_soc_acpi_adr_device rt714_0_adr[] = {
132 {
133 .adr = 0x000030025D071401ull,
134 .num_endpoints = 1,
135 .endpoints = &single_endpoint,
136 .name_prefix = "rt714"
137 }
138};
139
140static const struct snd_soc_acpi_adr_device rt714_2_adr[] = {
141 {
142 .adr = 0x000230025D071401ull,
143 .num_endpoints = 1,
144 .endpoints = &single_endpoint,
145 .name_prefix = "rt714"
146 }
147};
148
149static const struct snd_soc_acpi_adr_device rt714_3_adr[] = {
150 {
151 .adr = 0x000330025D071401ull,
152 .num_endpoints = 1,
153 .endpoints = &single_endpoint,
154 .name_prefix = "rt714"
155 }
156};
157
158static const struct snd_soc_acpi_link_adr rpl_sdca_3_in_1[] = {
159 {
160 .mask = BIT(0),
161 .num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
162 .adr_d = rt711_sdca_0_adr,
163 },
164 {
165 .mask = BIT(1),
166 .num_adr = ARRAY_SIZE(rt1316_1_group1_adr),
167 .adr_d = rt1316_1_group1_adr,
168 },
169 {
170 .mask = BIT(2),
171 .num_adr = ARRAY_SIZE(rt714_2_adr),
172 .adr_d = rt714_2_adr,
173 },
174 {
175 .mask = BIT(3),
176 .num_adr = ARRAY_SIZE(rt1316_3_group1_adr),
177 .adr_d = rt1316_3_group1_adr,
178 },
179 {}
180};
181
182static const struct snd_soc_acpi_link_adr rpl_sdw_rt711_link0_rt1316_link12_rt714_link3[] = {
183 {
184 .mask = BIT(0),
185 .num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
186 .adr_d = rt711_sdca_0_adr,
187 },
188 {
189 .mask = BIT(1),
190 .num_adr = ARRAY_SIZE(rt1316_1_group1_adr),
191 .adr_d = rt1316_1_group1_adr,
192 },
193 {
194 .mask = BIT(2),
195 .num_adr = ARRAY_SIZE(rt1316_2_group1_adr),
196 .adr_d = rt1316_2_group1_adr,
197 },
198 {
199 .mask = BIT(3),
200 .num_adr = ARRAY_SIZE(rt714_3_adr),
201 .adr_d = rt714_3_adr,
202 },
203 {}
204};
205
206static const struct snd_soc_acpi_link_adr rpl_sdw_rt711_link2_rt1316_link01_rt714_link3[] = {
207 {
208 .mask = BIT(2),
209 .num_adr = ARRAY_SIZE(rt711_sdca_2_adr),
210 .adr_d = rt711_sdca_2_adr,
211 },
212 {
213 .mask = BIT(0),
214 .num_adr = ARRAY_SIZE(rt1316_0_group2_adr),
215 .adr_d = rt1316_0_group2_adr,
216 },
217 {
218 .mask = BIT(1),
219 .num_adr = ARRAY_SIZE(rt1316_1_group2_adr),
220 .adr_d = rt1316_1_group2_adr,
221 },
222 {
223 .mask = BIT(3),
224 .num_adr = ARRAY_SIZE(rt714_3_adr),
225 .adr_d = rt714_3_adr,
226 },
227 {}
228};
229
230static const struct snd_soc_acpi_link_adr rpl_sdw_rt711_link2_rt1316_link01[] = {
231 {
232 .mask = BIT(2),
233 .num_adr = ARRAY_SIZE(rt711_sdca_2_adr),
234 .adr_d = rt711_sdca_2_adr,
235 },
236 {
237 .mask = BIT(0),
238 .num_adr = ARRAY_SIZE(rt1316_0_group2_adr),
239 .adr_d = rt1316_0_group2_adr,
240 },
241 {
242 .mask = BIT(1),
243 .num_adr = ARRAY_SIZE(rt1316_1_group2_adr),
244 .adr_d = rt1316_1_group2_adr,
245 },
246 {}
247};
248
249static const struct snd_soc_acpi_link_adr rpl_sdw_rt711_link0_rt1316_link12[] = {
250 {
251 .mask = BIT(0),
252 .num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
253 .adr_d = rt711_sdca_0_adr,
254 },
255 {
256 .mask = BIT(1),
257 .num_adr = ARRAY_SIZE(rt1316_1_group1_adr),
258 .adr_d = rt1316_1_group1_adr,
259 },
260 {
261 .mask = BIT(2),
262 .num_adr = ARRAY_SIZE(rt1316_2_group1_adr),
263 .adr_d = rt1316_2_group1_adr,
264 },
265 {}
266};
267
268static const struct snd_soc_acpi_link_adr rpl_sdw_rt711_link0_rt1318_link12_rt714_link3[] = {
269 {
270 .mask = BIT(0),
271 .num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
272 .adr_d = rt711_sdca_0_adr,
273 },
274 {
275 .mask = BIT(1),
276 .num_adr = ARRAY_SIZE(rt1318_1_group1_adr),
277 .adr_d = rt1318_1_group1_adr,
278 },
279 {
280 .mask = BIT(2),
281 .num_adr = ARRAY_SIZE(rt1318_2_group1_adr),
282 .adr_d = rt1318_2_group1_adr,
283 },
284 {
285 .mask = BIT(3),
286 .num_adr = ARRAY_SIZE(rt714_3_adr),
287 .adr_d = rt714_3_adr,
288 },
289 {}
290};
291
292static const struct snd_soc_acpi_link_adr rpl_sdw_rt711_link0_rt1318_link12[] = {
293 {
294 .mask = BIT(0),
295 .num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
296 .adr_d = rt711_sdca_0_adr,
297 },
298 {
299 .mask = BIT(1),
300 .num_adr = ARRAY_SIZE(rt1318_1_group1_adr),
301 .adr_d = rt1318_1_group1_adr,
302 },
303 {
304 .mask = BIT(2),
305 .num_adr = ARRAY_SIZE(rt1318_2_group1_adr),
306 .adr_d = rt1318_2_group1_adr,
307 },
308 {}
309};
310
311static const struct snd_soc_acpi_link_adr rpl_sdw_rt1316_link12_rt714_link0[] = {
312 {
313 .mask = BIT(1),
314 .num_adr = ARRAY_SIZE(rt1316_1_group1_adr),
315 .adr_d = rt1316_1_group1_adr,
316 },
317 {
318 .mask = BIT(2),
319 .num_adr = ARRAY_SIZE(rt1316_2_group1_adr),
320 .adr_d = rt1316_2_group1_adr,
321 },
322 {
323 .mask = BIT(0),
324 .num_adr = ARRAY_SIZE(rt714_0_adr),
325 .adr_d = rt714_0_adr,
326 },
327 {}
328};
329
330static const struct snd_soc_acpi_link_adr rpl_sdca_rvp[] = {
331 {
332 .mask = BIT(0),
333 .num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
334 .adr_d = rt711_sdca_0_adr,
335 },
336 {}
337};
338
339static const struct snd_soc_acpi_link_adr rplp_crb[] = {
340 {
341 .mask = BIT(2),
342 .num_adr = ARRAY_SIZE(rt711_sdca_2_adr),
343 .adr_d = rt711_sdca_2_adr,
344 },
345 {}
346};
347
348static const struct snd_soc_acpi_codecs rpl_rt5682_hp = {
349 .num_codecs = 2,
350 .codecs = {"10EC5682", "RTL5682"},
351};
352
353static const struct snd_soc_acpi_codecs rpl_essx_83x6 = {
354 .num_codecs = 3,
355 .codecs = { "ESSX8316", "ESSX8326", "ESSX8336"},
356};
357
358static const struct snd_soc_acpi_codecs rpl_max98357a_amp = {
359 .num_codecs = 1,
360 .codecs = {"MX98357A"}
361};
362
363static const struct snd_soc_acpi_codecs rpl_max98360a_amp = {
364 .num_codecs = 1,
365 .codecs = {"MX98360A"},
366};
367
368static const struct snd_soc_acpi_codecs rpl_max98373_amp = {
369 .num_codecs = 1,
370 .codecs = {"MX98373"}
371};
372
373static const struct snd_soc_acpi_codecs rpl_lt6911_hdmi = {
374 .num_codecs = 1,
375 .codecs = {"INTC10B0"}
376};
377
378static const struct snd_soc_acpi_codecs rpl_nau8318_amp = {
379 .num_codecs = 1,
380 .codecs = {"NVTN2012"}
381};
382
383static const struct snd_soc_acpi_codecs rpl_rt1019p_amp = {
384 .num_codecs = 1,
385 .codecs = {"RTL1019"}
386};
387
388struct snd_soc_acpi_mach snd_soc_acpi_intel_rpl_machines[] = {
389 {
390 .comp_ids = &rpl_rt5682_hp,
391 .drv_name = "rpl_mx98357_rt5682",
392 .machine_quirk = snd_soc_acpi_codec_list,
393 .quirk_data = &rpl_max98357a_amp,
394 .sof_tplg_filename = "sof-rpl-max98357a-rt5682.tplg",
395 },
396 {
397 .comp_ids = &rpl_rt5682_hp,
398 .drv_name = "rpl_rt5682_def",
399 .machine_quirk = snd_soc_acpi_codec_list,
400 .quirk_data = &rpl_max98360a_amp,
401 .sof_tplg_filename = "sof-rpl-max98360a-rt5682.tplg",
402 },
403 {
404 .id = "10508825",
405 .drv_name = "rpl_nau8825_def",
406 .machine_quirk = snd_soc_acpi_codec_list,
407 .quirk_data = &rpl_max98373_amp,
408 .sof_tplg_filename = "sof-rpl-max98373-nau8825.tplg",
409 },
410 {
411 .id = "10508825",
412 .drv_name = "rpl_nau8825_def",
413 .machine_quirk = snd_soc_acpi_codec_list,
414 .quirk_data = &rpl_max98360a_amp,
415 .sof_tplg_filename = "sof-rpl-max98360a-nau8825.tplg",
416 },
417 {
418 .id = "10508825",
419 .drv_name = "rpl_nau8825_def",
420 .machine_quirk = snd_soc_acpi_codec_list,
421 .quirk_data = &rpl_nau8318_amp,
422 .sof_tplg_filename = "sof-rpl-nau8318-nau8825.tplg",
423 },
424 {
425 .comp_ids = &rpl_rt5682_hp,
426 .drv_name = "rpl_rt5682_def",
427 .machine_quirk = snd_soc_acpi_codec_list,
428 .quirk_data = &rpl_rt1019p_amp,
429 .sof_tplg_filename = "sof-rpl-rt1019-rt5682.tplg",
430 },
431 {
432 .comp_ids = &rpl_rt5682_hp,
433 .drv_name = "rpl_rt5682_c1_h02",
434 .machine_quirk = snd_soc_acpi_codec_list,
435 .quirk_data = &rpl_lt6911_hdmi,
436 .sof_tplg_filename = "sof-rpl-rt5682-ssp1-hdmi-ssp02.tplg",
437 },
438 {
439 .comp_ids = &rpl_essx_83x6,
440 .drv_name = "rpl_es83x6_c1_h02",
441 .machine_quirk = snd_soc_acpi_codec_list,
442 .quirk_data = &rpl_lt6911_hdmi,
443 .sof_tplg_filename = "sof-rpl-es83x6-ssp1-hdmi-ssp02.tplg",
444 },
445 {
446 .comp_ids = &rpl_essx_83x6,
447 .drv_name = "sof-essx8336",
448 .sof_tplg_filename = "sof-rpl-es83x6", /* the tplg suffix is added at run time */
449 .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER |
450 SND_SOC_ACPI_TPLG_INTEL_SSP_MSB |
451 SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER,
452 },
453 {
454 .id = "INTC10B0",
455 .drv_name = "rpl_lt6911_hdmi_ssp",
456 .sof_tplg_filename = "sof-rpl-nocodec-hdmi-ssp02.tplg"
457 },
458 {},
459};
460EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_rpl_machines);
461
462/* this table is used when there is no I2S codec present */
463struct snd_soc_acpi_mach snd_soc_acpi_intel_rpl_sdw_machines[] = {
464 {
465 .link_mask = 0xF, /* 4 active links required */
466 .links = rpl_sdca_3_in_1,
467 .drv_name = "sof_sdw",
468 .sof_tplg_filename = "sof-rpl-rt711-l0-rt1316-l13-rt714-l2.tplg",
469 },
470 {
471 .link_mask = 0xF, /* 4 active links required */
472 .links = rpl_sdw_rt711_link2_rt1316_link01_rt714_link3,
473 .drv_name = "sof_sdw",
474 .sof_tplg_filename = "sof-rpl-rt711-l2-rt1316-l01-rt714-l3.tplg",
475 },
476 {
477 .link_mask = 0xF, /* 4 active links required */
478 .links = rpl_sdw_rt711_link0_rt1316_link12_rt714_link3,
479 .drv_name = "sof_sdw",
480 .sof_tplg_filename = "sof-rpl-rt711-l0-rt1316-l12-rt714-l3.tplg",
481 },
482 {
483 .link_mask = 0xF, /* 4 active links required */
484 .links = rpl_sdw_rt711_link0_rt1318_link12_rt714_link3,
485 .drv_name = "sof_sdw",
486 .sof_tplg_filename = "sof-rpl-rt711-l0-rt1318-l12-rt714-l3.tplg",
487 },
488 {
489 .link_mask = 0x7, /* rt711 on link0 & two rt1316s on link1 and link2 */
490 .links = rpl_sdw_rt711_link0_rt1316_link12,
491 .drv_name = "sof_sdw",
492 .sof_tplg_filename = "sof-rpl-rt711-l0-rt1316-l12.tplg",
493 },
494 {
495 .link_mask = 0x7, /* rt711 on link0 & two rt1318s on link1 and link2 */
496 .links = rpl_sdw_rt711_link0_rt1318_link12,
497 .drv_name = "sof_sdw",
498 .sof_tplg_filename = "sof-rpl-rt711-l0-rt1318-l12.tplg",
499 },
500 {
501 .link_mask = 0x7, /* rt714 on link0 & two rt1316s on link1 and link2 */
502 .links = rpl_sdw_rt1316_link12_rt714_link0,
503 .drv_name = "sof_sdw",
504 .sof_tplg_filename = "sof-rpl-rt1316-l12-rt714-l0.tplg",
505 },
506 {
507 .link_mask = 0x7, /* rt711 on link2 & two rt1316s on link0 and link1 */
508 .links = rpl_sdw_rt711_link2_rt1316_link01,
509 .drv_name = "sof_sdw",
510 .sof_tplg_filename = "sof-rpl-rt711-l2-rt1316-l01.tplg",
511 },
512 {
513 .link_mask = 0x1, /* link0 required */
514 .links = rpl_rvp,
515 .drv_name = "sof_sdw",
516 .sof_tplg_filename = "sof-rpl-rt711-l0.tplg",
517 },
518 {
519 .link_mask = 0x1, /* link0 required */
520 .links = rpl_sdca_rvp,
521 .drv_name = "sof_sdw",
522 .sof_tplg_filename = "sof-rpl-rt711-l0.tplg",
523 },
524 {
525 .link_mask = 0x4, /* link2 required */
526 .links = rplp_crb,
527 .drv_name = "sof_sdw",
528 .sof_tplg_filename = "sof-rpl-rt711-l2.tplg",
529 },
530 {},
531};
532EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_rpl_sdw_machines);
533

source code of linux/sound/soc/intel/common/soc-acpi-intel-rpl-match.c