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_rt1318_link12_rt714_link3[] = {
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(rt1318_1_group1_adr),
258		.adr_d = rt1318_1_group1_adr,
259	},
260	{
261		.mask = BIT(2),
262		.num_adr = ARRAY_SIZE(rt1318_2_group1_adr),
263		.adr_d = rt1318_2_group1_adr,
264	},
265	{
266		.mask = BIT(3),
267		.num_adr = ARRAY_SIZE(rt714_3_adr),
268		.adr_d = rt714_3_adr,
269	},
270	{}
271};
272
273static const struct snd_soc_acpi_link_adr rpl_sdw_rt711_link0_rt1318_link12[] = {
274	{
275		.mask = BIT(0),
276		.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
277		.adr_d = rt711_sdca_0_adr,
278	},
279	{
280		.mask = BIT(1),
281		.num_adr = ARRAY_SIZE(rt1318_1_group1_adr),
282		.adr_d = rt1318_1_group1_adr,
283	},
284	{
285		.mask = BIT(2),
286		.num_adr = ARRAY_SIZE(rt1318_2_group1_adr),
287		.adr_d = rt1318_2_group1_adr,
288	},
289	{}
290};
291
292static const struct snd_soc_acpi_link_adr rpl_sdw_rt1316_link12_rt714_link0[] = {
293	{
294		.mask = BIT(1),
295		.num_adr = ARRAY_SIZE(rt1316_1_group1_adr),
296		.adr_d = rt1316_1_group1_adr,
297	},
298	{
299		.mask = BIT(2),
300		.num_adr = ARRAY_SIZE(rt1316_2_group1_adr),
301		.adr_d = rt1316_2_group1_adr,
302	},
303	{
304		.mask = BIT(0),
305		.num_adr = ARRAY_SIZE(rt714_0_adr),
306		.adr_d = rt714_0_adr,
307	},
308	{}
309};
310
311static const struct snd_soc_acpi_link_adr rpl_sdca_rvp[] = {
312	{
313		.mask = BIT(0),
314		.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
315		.adr_d = rt711_sdca_0_adr,
316	},
317	{}
318};
319
320static const struct snd_soc_acpi_link_adr rplp_crb[] = {
321	{
322		.mask = BIT(2),
323		.num_adr = ARRAY_SIZE(rt711_sdca_2_adr),
324		.adr_d = rt711_sdca_2_adr,
325	},
326	{}
327};
328
329static const struct snd_soc_acpi_codecs rpl_rt5682_hp = {
330	.num_codecs = 2,
331	.codecs = {"10EC5682", "RTL5682"},
332};
333
334static const struct snd_soc_acpi_codecs rpl_essx_83x6 = {
335	.num_codecs = 3,
336	.codecs = { "ESSX8316", "ESSX8326", "ESSX8336"},
337};
338
339static const struct snd_soc_acpi_codecs rpl_max98357a_amp = {
340	.num_codecs = 1,
341	.codecs = {"MX98357A"}
342};
343
344static const struct snd_soc_acpi_codecs rpl_max98360a_amp = {
345	.num_codecs = 1,
346	.codecs = {"MX98360A"},
347};
348
349static const struct snd_soc_acpi_codecs rpl_max98373_amp = {
350	.num_codecs = 1,
351	.codecs = {"MX98373"}
352};
353
354static const struct snd_soc_acpi_codecs rpl_lt6911_hdmi = {
355	.num_codecs = 1,
356	.codecs = {"INTC10B0"}
357};
358
359static const struct snd_soc_acpi_codecs rpl_nau8318_amp = {
360	.num_codecs = 1,
361	.codecs = {"NVTN2012"}
362};
363
364static const struct snd_soc_acpi_codecs rpl_rt1019p_amp = {
365	.num_codecs = 1,
366	.codecs = {"RTL1019"}
367};
368
369struct snd_soc_acpi_mach snd_soc_acpi_intel_rpl_machines[] = {
370	{
371		.comp_ids = &rpl_rt5682_hp,
372		.drv_name = "rpl_mx98357_rt5682",
373		.machine_quirk = snd_soc_acpi_codec_list,
374		.quirk_data = &rpl_max98357a_amp,
375		.sof_tplg_filename = "sof-rpl-max98357a-rt5682.tplg",
376	},
377	{
378		.comp_ids = &rpl_rt5682_hp,
379		.drv_name = "rpl_mx98360_rt5682",
380		.machine_quirk = snd_soc_acpi_codec_list,
381		.quirk_data = &rpl_max98360a_amp,
382		.sof_tplg_filename = "sof-rpl-max98360a-rt5682.tplg",
383	},
384	{
385		.id = "10508825",
386		.drv_name = "rpl_max98373_8825",
387		.machine_quirk = snd_soc_acpi_codec_list,
388		.quirk_data = &rpl_max98373_amp,
389		.sof_tplg_filename = "sof-rpl-max98373-nau8825.tplg",
390	},
391	{
392		.id = "10508825",
393		.drv_name = "rpl_nau8318_8825",
394		.machine_quirk = snd_soc_acpi_codec_list,
395		.quirk_data = &rpl_nau8318_amp,
396		.sof_tplg_filename = "sof-rpl-nau8318-nau8825.tplg",
397	},
398	{
399		.comp_ids = &rpl_rt5682_hp,
400		.drv_name = "rpl_rt1019_rt5682",
401		.machine_quirk = snd_soc_acpi_codec_list,
402		.quirk_data = &rpl_rt1019p_amp,
403		.sof_tplg_filename = "sof-rpl-rt1019-rt5682.tplg",
404	},
405	{
406		.comp_ids = &rpl_essx_83x6,
407		.drv_name = "rpl_es83x6_c1_h02",
408		.machine_quirk = snd_soc_acpi_codec_list,
409		.quirk_data = &rpl_lt6911_hdmi,
410		.sof_tplg_filename = "sof-rpl-es83x6-ssp1-hdmi-ssp02.tplg",
411	},
412	{
413		.comp_ids = &rpl_essx_83x6,
414		.drv_name = "sof-essx8336",
415		.sof_tplg_filename = "sof-rpl-es83x6", /* the tplg suffix is added at run time */
416		.tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER |
417					SND_SOC_ACPI_TPLG_INTEL_SSP_MSB |
418					SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER,
419	},
420	{
421		.id = "INTC10B0",
422		.drv_name = "rpl_lt6911_hdmi_ssp",
423		.sof_tplg_filename = "sof-rpl-nocodec-hdmi-ssp02.tplg"
424	},
425	{},
426};
427EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_rpl_machines);
428
429/* this table is used when there is no I2S codec present */
430struct snd_soc_acpi_mach snd_soc_acpi_intel_rpl_sdw_machines[] = {
431	{
432		.link_mask = 0xF, /* 4 active links required */
433		.links = rpl_sdca_3_in_1,
434		.drv_name = "sof_sdw",
435		.sof_tplg_filename = "sof-rpl-rt711-l0-rt1316-l13-rt714-l2.tplg",
436	},
437	{
438		.link_mask = 0xF, /* 4 active links required */
439		.links = rpl_sdw_rt711_link2_rt1316_link01_rt714_link3,
440		.drv_name = "sof_sdw",
441		.sof_tplg_filename = "sof-rpl-rt711-l2-rt1316-l01-rt714-l3.tplg",
442	},
443	{
444		.link_mask = 0xF, /* 4 active links required */
445		.links = rpl_sdw_rt711_link0_rt1316_link12_rt714_link3,
446		.drv_name = "sof_sdw",
447		.sof_tplg_filename = "sof-rpl-rt711-l0-rt1316-l12-rt714-l3.tplg",
448	},
449	{
450		.link_mask = 0xF, /* 4 active links required */
451		.links = rpl_sdw_rt711_link0_rt1318_link12_rt714_link3,
452		.drv_name = "sof_sdw",
453		.sof_tplg_filename = "sof-rpl-rt711-l0-rt1318-l12-rt714-l3.tplg",
454	},
455	{
456		.link_mask = 0x7, /* rt711 on link0 & two rt1318s on link1 and link2 */
457		.links = rpl_sdw_rt711_link0_rt1318_link12,
458		.drv_name = "sof_sdw",
459		.sof_tplg_filename = "sof-rpl-rt711-l0-rt1318-l12.tplg",
460	},
461	{
462		.link_mask = 0x7, /* rt714 on link0 & two rt1316s on link1 and link2 */
463		.links = rpl_sdw_rt1316_link12_rt714_link0,
464		.drv_name = "sof_sdw",
465		.sof_tplg_filename = "sof-rpl-rt1316-l12-rt714-l0.tplg",
466	},
467	{
468		.link_mask = 0x7, /* rt711 on link2 & two rt1316s on link0 and link1 */
469		.links = rpl_sdw_rt711_link2_rt1316_link01,
470		.drv_name = "sof_sdw",
471		.sof_tplg_filename = "sof-rpl-rt711-l2-rt1316-l01.tplg",
472	},
473	{
474		.link_mask = 0x1, /* link0 required */
475		.links = rpl_rvp,
476		.drv_name = "sof_sdw",
477		.sof_tplg_filename = "sof-rpl-rt711-l0.tplg",
478	},
479	{
480		.link_mask = 0x1, /* link0 required */
481		.links = rpl_sdca_rvp,
482		.drv_name = "sof_sdw",
483		.sof_tplg_filename = "sof-rpl-rt711-l0.tplg",
484	},
485	{
486		.link_mask = 0x4, /* link2 required */
487		.links = rplp_crb,
488		.drv_name = "sof_sdw",
489		.sof_tplg_filename = "sof-rpl-rt711-l2.tplg",
490	},
491	{},
492};
493EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_rpl_sdw_machines);
494