1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * soc-acpi-intel-cml-match.c - tables and support for CML ACPI enumeration.
4 *
5 * Copyright (c) 2019, Intel Corporation.
6 *
7 */
8
9#include <sound/soc-acpi.h>
10#include <sound/soc-acpi-intel-match.h>
11
12static struct snd_soc_acpi_codecs rt1011_spk_codecs = {
13	.num_codecs = 1,
14	.codecs = {"10EC1011"}
15};
16
17static struct snd_soc_acpi_codecs max98357a_spk_codecs = {
18	.num_codecs = 1,
19	.codecs = {"MX98357A"}
20};
21
22static struct snd_soc_acpi_codecs max98390_spk_codecs = {
23	.num_codecs = 1,
24	.codecs = {"MX98390"}
25};
26
27/*
28 * The order of the three entries with .id = "10EC5682" matters
29 * here, because DSDT tables expose an ACPI HID for the MAX98357A
30 * speaker amplifier which is not populated on the board.
31 */
32struct snd_soc_acpi_mach snd_soc_acpi_intel_cml_machines[] = {
33	{
34		.id = "10EC5682",
35		.drv_name = "cml_rt1011_rt5682",
36		.machine_quirk = snd_soc_acpi_codec_list,
37		.quirk_data = &rt1011_spk_codecs,
38		.sof_fw_filename = "sof-cml.ri",
39		.sof_tplg_filename = "sof-cml-rt1011-rt5682.tplg",
40	},
41	{
42		.id = "10EC5682",
43		.drv_name = "sof_rt5682",
44		.machine_quirk = snd_soc_acpi_codec_list,
45		.quirk_data = &max98357a_spk_codecs,
46		.sof_fw_filename = "sof-cml.ri",
47		.sof_tplg_filename = "sof-cml-rt5682-max98357a.tplg",
48	},
49	{
50		.id = "10EC5682",
51		.drv_name = "sof_rt5682",
52		.sof_fw_filename = "sof-cml.ri",
53		.sof_tplg_filename = "sof-cml-rt5682.tplg",
54	},
55	{
56		.id = "DLGS7219",
57		.drv_name = "cml_da7219_max98357a",
58		.machine_quirk = snd_soc_acpi_codec_list,
59		.quirk_data = &max98357a_spk_codecs,
60		.sof_fw_filename = "sof-cml.ri",
61		.sof_tplg_filename = "sof-cml-da7219-max98357a.tplg",
62	},
63	{
64		.id = "DLGS7219",
65		.drv_name = "cml_da7219_mx98357a",
66		.machine_quirk = snd_soc_acpi_codec_list,
67		.quirk_data = &max98390_spk_codecs,
68		.sof_fw_filename = "sof-cml.ri",
69		.sof_tplg_filename = "sof-cml-da7219-max98357a.tplg",
70	},
71	{},
72};
73EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_cml_machines);
74
75static const struct snd_soc_acpi_endpoint single_endpoint = {
76	.num = 0,
77	.aggregated = 0,
78	.group_position = 0,
79	.group_id = 0,
80};
81
82static const struct snd_soc_acpi_endpoint spk_l_endpoint = {
83	.num = 0,
84	.aggregated = 1,
85	.group_position = 0,
86	.group_id = 1,
87};
88
89static const struct snd_soc_acpi_endpoint spk_r_endpoint = {
90	.num = 0,
91	.aggregated = 1,
92	.group_position = 1,
93	.group_id = 1,
94};
95
96static const struct snd_soc_acpi_adr_device rt700_1_adr[] = {
97	{
98		.adr = 0x000110025D070000,
99		.num_endpoints = 1,
100		.endpoints = &single_endpoint,
101		.name_prefix = "rt700"
102	}
103};
104
105static const struct snd_soc_acpi_link_adr cml_rvp[] = {
106	{
107		.mask = BIT(1),
108		.num_adr = ARRAY_SIZE(rt700_1_adr),
109		.adr_d = rt700_1_adr,
110	},
111	{}
112};
113
114static const struct snd_soc_acpi_adr_device rt711_0_adr[] = {
115	{
116		.adr = 0x000020025D071100,
117		.num_endpoints = 1,
118		.endpoints = &single_endpoint,
119		.name_prefix = "rt711"
120	}
121};
122
123static const struct snd_soc_acpi_adr_device rt1308_1_single_adr[] = {
124	{
125		.adr = 0x000120025D130800,
126		.num_endpoints = 1,
127		.endpoints = &single_endpoint,
128		.name_prefix = "rt1308-1"
129	}
130};
131
132static const struct snd_soc_acpi_adr_device rt1308_1_group1_adr[] = {
133	{
134		.adr = 0x000120025D130800,
135		.num_endpoints = 1,
136		.endpoints = &spk_l_endpoint,
137		.name_prefix = "rt1308-1"
138	}
139};
140
141static const struct snd_soc_acpi_adr_device rt1308_2_group1_adr[] = {
142	{
143		.adr = 0x000220025D130800,
144		.num_endpoints = 1,
145		.endpoints = &spk_r_endpoint,
146		.name_prefix = "rt1308-2"
147	}
148};
149
150static const struct snd_soc_acpi_adr_device rt715_3_adr[] = {
151	{
152		.adr = 0x000320025D071500,
153		.num_endpoints = 1,
154		.endpoints = &single_endpoint,
155		.name_prefix = "rt715"
156	}
157};
158
159static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = {
160	{
161		.adr = 0x000030025D071101,
162		.num_endpoints = 1,
163		.endpoints = &single_endpoint,
164		.name_prefix = "rt711"
165	}
166};
167
168static const struct snd_soc_acpi_adr_device rt1316_1_group1_adr[] = {
169	{
170		.adr = 0x000131025D131601, /* unique ID is set for some reason */
171		.num_endpoints = 1,
172		.endpoints = &spk_l_endpoint,
173		.name_prefix = "rt1316-1"
174	}
175};
176
177static const struct snd_soc_acpi_adr_device rt1316_2_group1_adr[] = {
178	{
179		.adr = 0x000230025D131601,
180		.num_endpoints = 1,
181		.endpoints = &spk_r_endpoint,
182		.name_prefix = "rt1316-2"
183	}
184};
185
186static const struct snd_soc_acpi_adr_device rt714_3_adr[] = {
187	{
188		.adr = 0x000330025D071401,
189		.num_endpoints = 1,
190		.endpoints = &single_endpoint,
191		.name_prefix = "rt714"
192	}
193};
194
195static const struct snd_soc_acpi_link_adr cml_3_in_1_default[] = {
196	{
197		.mask = BIT(0),
198		.num_adr = ARRAY_SIZE(rt711_0_adr),
199		.adr_d = rt711_0_adr,
200	},
201	{
202		.mask = BIT(1),
203		.num_adr = ARRAY_SIZE(rt1308_1_group1_adr),
204		.adr_d = rt1308_1_group1_adr,
205	},
206	{
207		.mask = BIT(2),
208		.num_adr = ARRAY_SIZE(rt1308_2_group1_adr),
209		.adr_d = rt1308_2_group1_adr,
210	},
211	{
212		.mask = BIT(3),
213		.num_adr = ARRAY_SIZE(rt715_3_adr),
214		.adr_d = rt715_3_adr,
215	},
216	{}
217};
218
219static const struct snd_soc_acpi_link_adr cml_3_in_1_mono_amp[] = {
220	{
221		.mask = BIT(0),
222		.num_adr = ARRAY_SIZE(rt711_0_adr),
223		.adr_d = rt711_0_adr,
224	},
225	{
226		.mask = BIT(1),
227		.num_adr = ARRAY_SIZE(rt1308_1_single_adr),
228		.adr_d = rt1308_1_single_adr,
229	},
230	{
231		.mask = BIT(3),
232		.num_adr = ARRAY_SIZE(rt715_3_adr),
233		.adr_d = rt715_3_adr,
234	},
235	{}
236};
237
238static const struct snd_soc_acpi_link_adr cml_3_in_1_sdca[] = {
239	{
240		.mask = BIT(0),
241		.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
242		.adr_d = rt711_sdca_0_adr,
243	},
244	{
245		.mask = BIT(1),
246		.num_adr = ARRAY_SIZE(rt1316_1_group1_adr),
247		.adr_d = rt1316_1_group1_adr,
248	},
249	{
250		.mask = BIT(2),
251		.num_adr = ARRAY_SIZE(rt1316_2_group1_adr),
252		.adr_d = rt1316_2_group1_adr,
253	},
254	{
255		.mask = BIT(3),
256		.num_adr = ARRAY_SIZE(rt714_3_adr),
257		.adr_d = rt714_3_adr,
258	},
259	{}
260};
261
262struct snd_soc_acpi_mach snd_soc_acpi_intel_cml_sdw_machines[] = {
263	{
264		.link_mask = 0xF, /* 4 active links required */
265		.links = cml_3_in_1_default,
266		.drv_name = "sof_sdw",
267		.sof_fw_filename = "sof-cml.ri",
268		.sof_tplg_filename = "sof-cml-rt711-rt1308-rt715.tplg",
269	},
270	{
271		.link_mask = 0xF, /* 4 active links required */
272		.links = cml_3_in_1_sdca,
273		.drv_name = "sof_sdw",
274		.sof_fw_filename = "sof-cml.ri",
275		.sof_tplg_filename = "sof-cml-rt711-rt1316-rt714.tplg",
276	},
277	{
278		/*
279		 * link_mask should be 0xB, but all links are enabled by BIOS.
280		 * This entry will be selected if there is no rt1308 exposed
281		 * on link2 since it will fail to match the above entry.
282		 */
283		.link_mask = 0xF,
284		.links = cml_3_in_1_mono_amp,
285		.drv_name = "sof_sdw",
286		.sof_fw_filename = "sof-cml.ri",
287		.sof_tplg_filename = "sof-cml-rt711-rt1308-mono-rt715.tplg",
288	},
289	{
290		.link_mask = 0x2, /* RT700 connected on Link1 */
291		.links = cml_rvp,
292		.drv_name = "sof_sdw",
293		.sof_fw_filename = "sof-cml.ri",
294		.sof_tplg_filename = "sof-cml-rt700.tplg",
295	},
296	{}
297};
298EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_cml_sdw_machines);
299
300MODULE_LICENSE("GPL v2");
301MODULE_DESCRIPTION("Intel Common ACPI Match module");
302