111fe58c4SBard Liao // SPDX-License-Identifier: GPL-2.0-only
211fe58c4SBard Liao /*
311fe58c4SBard Liao  * soc-acpi-intel-mtl-match.c - tables and support for MTL ACPI enumeration.
411fe58c4SBard Liao  *
511fe58c4SBard Liao  * Copyright (c) 2022, Intel Corporation.
611fe58c4SBard Liao  *
711fe58c4SBard Liao  */
811fe58c4SBard Liao 
911fe58c4SBard Liao #include <sound/soc-acpi.h>
1011fe58c4SBard Liao #include <sound/soc-acpi-intel-match.h>
1111fe58c4SBard Liao #include "soc-acpi-intel-sdw-mockup-match.h"
1211fe58c4SBard Liao 
131f6645b1SYong Zhi static const struct snd_soc_acpi_codecs mtl_max98357a_amp = {
141f6645b1SYong Zhi 	.num_codecs = 1,
151f6645b1SYong Zhi 	.codecs = {"MX98357A"}
161f6645b1SYong Zhi };
171f6645b1SYong Zhi 
187e43b75dSDharageswari.R static const struct snd_soc_acpi_codecs mtl_max98360a_amp = {
197e43b75dSDharageswari.R 	.num_codecs = 1,
207e43b75dSDharageswari.R 	.codecs = {"MX98360A"}
217e43b75dSDharageswari.R };
227e43b75dSDharageswari.R 
23b20c8137SMac Chiang static const struct snd_soc_acpi_codecs mtl_rt1019p_amp = {
24b20c8137SMac Chiang 	.num_codecs = 1,
25b20c8137SMac Chiang 	.codecs = {"RTL1019"}
26b20c8137SMac Chiang };
27b20c8137SMac Chiang 
281f6645b1SYong Zhi static const struct snd_soc_acpi_codecs mtl_rt5682_rt5682s_hp = {
291f6645b1SYong Zhi 	.num_codecs = 2,
301f6645b1SYong Zhi 	.codecs = {"10EC5682", "RTL5682"},
311f6645b1SYong Zhi };
321f6645b1SYong Zhi 
3311fe58c4SBard Liao struct snd_soc_acpi_mach snd_soc_acpi_intel_mtl_machines[] = {
341f6645b1SYong Zhi 	{
351f6645b1SYong Zhi 		.comp_ids = &mtl_rt5682_rt5682s_hp,
361f6645b1SYong Zhi 		.drv_name = "mtl_mx98357_rt5682",
371f6645b1SYong Zhi 		.machine_quirk = snd_soc_acpi_codec_list,
381f6645b1SYong Zhi 		.quirk_data = &mtl_max98357a_amp,
391f6645b1SYong Zhi 		.sof_tplg_filename = "sof-mtl-max98357a-rt5682.tplg",
401f6645b1SYong Zhi 	},
417e43b75dSDharageswari.R 	{
427e43b75dSDharageswari.R 		.comp_ids = &mtl_rt5682_rt5682s_hp,
437e43b75dSDharageswari.R 		.drv_name = "mtl_mx98360_rt5682",
447e43b75dSDharageswari.R 		.machine_quirk = snd_soc_acpi_codec_list,
457e43b75dSDharageswari.R 		.quirk_data = &mtl_max98360a_amp,
467e43b75dSDharageswari.R 		.sof_tplg_filename = "sof-mtl-max98360a-rt5682.tplg",
477e43b75dSDharageswari.R 	},
48b20c8137SMac Chiang 	{
49b20c8137SMac Chiang 		.comp_ids = &mtl_rt5682_rt5682s_hp,
50b20c8137SMac Chiang 		.drv_name = "mtl_rt1019_rt5682",
51b20c8137SMac Chiang 		.machine_quirk = snd_soc_acpi_codec_list,
52b20c8137SMac Chiang 		.quirk_data = &mtl_rt1019p_amp,
53b20c8137SMac Chiang 		.sof_tplg_filename = "sof-mtl-rt1019-rt5682.tplg",
54b20c8137SMac Chiang 	},
5511fe58c4SBard Liao 	{},
5611fe58c4SBard Liao };
5711fe58c4SBard Liao EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_mtl_machines);
5811fe58c4SBard Liao 
5918489174SYong Zhi static const struct snd_soc_acpi_endpoint single_endpoint = {
6018489174SYong Zhi 	.num = 0,
6118489174SYong Zhi 	.aggregated = 0,
6218489174SYong Zhi 	.group_position = 0,
6318489174SYong Zhi 	.group_id = 0,
6418489174SYong Zhi };
6518489174SYong Zhi 
668dcc2059SYong Zhi static const struct snd_soc_acpi_endpoint spk_l_endpoint = {
678dcc2059SYong Zhi 	.num = 0,
688dcc2059SYong Zhi 	.aggregated = 1,
698dcc2059SYong Zhi 	.group_position = 0,
708dcc2059SYong Zhi 	.group_id = 1,
718dcc2059SYong Zhi };
728dcc2059SYong Zhi 
738dcc2059SYong Zhi static const struct snd_soc_acpi_endpoint spk_r_endpoint = {
748dcc2059SYong Zhi 	.num = 0,
758dcc2059SYong Zhi 	.aggregated = 1,
768dcc2059SYong Zhi 	.group_position = 1,
778dcc2059SYong Zhi 	.group_id = 1,
788dcc2059SYong Zhi };
798dcc2059SYong Zhi 
809efa6f46SBard Liao static const struct snd_soc_acpi_endpoint rt712_endpoints[] = {
819efa6f46SBard Liao 	{
829efa6f46SBard Liao 		.num = 0,
839efa6f46SBard Liao 		.aggregated = 0,
849efa6f46SBard Liao 		.group_position = 0,
859efa6f46SBard Liao 		.group_id = 0,
869efa6f46SBard Liao 	},
879efa6f46SBard Liao 	{
889efa6f46SBard Liao 		.num = 1,
899efa6f46SBard Liao 		.aggregated = 0,
909efa6f46SBard Liao 		.group_position = 0,
919efa6f46SBard Liao 		.group_id = 0,
929efa6f46SBard Liao 	},
939efa6f46SBard Liao };
949efa6f46SBard Liao 
9518489174SYong Zhi static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = {
9618489174SYong Zhi 	{
9718489174SYong Zhi 		.adr = 0x000030025D071101ull,
9818489174SYong Zhi 		.num_endpoints = 1,
9918489174SYong Zhi 		.endpoints = &single_endpoint,
10018489174SYong Zhi 		.name_prefix = "rt711"
10118489174SYong Zhi 	}
10218489174SYong Zhi };
10318489174SYong Zhi 
1049efa6f46SBard Liao static const struct snd_soc_acpi_adr_device rt712_0_single_adr[] = {
1059efa6f46SBard Liao 	{
1069efa6f46SBard Liao 		.adr = 0x000030025D071201ull,
1079efa6f46SBard Liao 		.num_endpoints = ARRAY_SIZE(rt712_endpoints),
1089efa6f46SBard Liao 		.endpoints = rt712_endpoints,
1099efa6f46SBard Liao 		.name_prefix = "rt712"
1109efa6f46SBard Liao 	}
1119efa6f46SBard Liao };
1129efa6f46SBard Liao 
1139efa6f46SBard Liao static const struct snd_soc_acpi_adr_device rt1712_3_single_adr[] = {
1149efa6f46SBard Liao 	{
1159efa6f46SBard Liao 		.adr = 0x000330025D171201ull,
1169efa6f46SBard Liao 		.num_endpoints = 1,
1179efa6f46SBard Liao 		.endpoints = &single_endpoint,
1189efa6f46SBard Liao 		.name_prefix = "rt712-dmic"
1199efa6f46SBard Liao 	}
1209efa6f46SBard Liao };
1219efa6f46SBard Liao 
1228dcc2059SYong Zhi static const struct snd_soc_acpi_adr_device mx8373_0_adr[] = {
1238dcc2059SYong Zhi 	{
1248dcc2059SYong Zhi 		.adr = 0x000023019F837300ull,
1258dcc2059SYong Zhi 		.num_endpoints = 1,
1268dcc2059SYong Zhi 		.endpoints = &spk_l_endpoint,
1278dcc2059SYong Zhi 		.name_prefix = "Left"
1288dcc2059SYong Zhi 	},
1298dcc2059SYong Zhi 	{
1308dcc2059SYong Zhi 		.adr = 0x000027019F837300ull,
1318dcc2059SYong Zhi 		.num_endpoints = 1,
1328dcc2059SYong Zhi 		.endpoints = &spk_r_endpoint,
1338dcc2059SYong Zhi 		.name_prefix = "Right"
1348dcc2059SYong Zhi 	}
1358dcc2059SYong Zhi };
1368dcc2059SYong Zhi 
1378dcc2059SYong Zhi static const struct snd_soc_acpi_adr_device rt5682_2_adr[] = {
1388dcc2059SYong Zhi 	{
1398dcc2059SYong Zhi 		.adr = 0x000221025D568200ull,
1408dcc2059SYong Zhi 		.num_endpoints = 1,
1418dcc2059SYong Zhi 		.endpoints = &single_endpoint,
1428dcc2059SYong Zhi 		.name_prefix = "rt5682"
1438dcc2059SYong Zhi 	}
1448dcc2059SYong Zhi };
1458dcc2059SYong Zhi 
146b06e33aaSChao Song static const struct snd_soc_acpi_adr_device rt1316_2_group1_adr[] = {
147b06e33aaSChao Song 	{
148b06e33aaSChao Song 		.adr = 0x000230025D131601ull,
149b06e33aaSChao Song 		.num_endpoints = 1,
150b06e33aaSChao Song 		.endpoints = &spk_l_endpoint,
151b06e33aaSChao Song 		.name_prefix = "rt1316-1"
152b06e33aaSChao Song 	}
153b06e33aaSChao Song };
154b06e33aaSChao Song 
155b06e33aaSChao Song static const struct snd_soc_acpi_adr_device rt1316_3_group1_adr[] = {
156b06e33aaSChao Song 	{
157b06e33aaSChao Song 		.adr = 0x000331025D131601ull,
158b06e33aaSChao Song 		.num_endpoints = 1,
159b06e33aaSChao Song 		.endpoints = &spk_r_endpoint,
160b06e33aaSChao Song 		.name_prefix = "rt1316-2"
161b06e33aaSChao Song 	}
162b06e33aaSChao Song };
163b06e33aaSChao Song 
164*fec75606SChao Song static const struct snd_soc_acpi_adr_device rt1318_1_group1_adr[] = {
165*fec75606SChao Song 	{
166*fec75606SChao Song 		.adr = 0x000130025D131801ull,
167*fec75606SChao Song 		.num_endpoints = 1,
168*fec75606SChao Song 		.endpoints = &spk_l_endpoint,
169*fec75606SChao Song 		.name_prefix = "rt1318-1"
170*fec75606SChao Song 	}
171*fec75606SChao Song };
172*fec75606SChao Song 
173*fec75606SChao Song static const struct snd_soc_acpi_adr_device rt1318_2_group1_adr[] = {
174*fec75606SChao Song 	{
175*fec75606SChao Song 		.adr = 0x000232025D131801ull,
176*fec75606SChao Song 		.num_endpoints = 1,
177*fec75606SChao Song 		.endpoints = &spk_r_endpoint,
178*fec75606SChao Song 		.name_prefix = "rt1318-2"
179*fec75606SChao Song 	}
180*fec75606SChao Song };
181*fec75606SChao Song 
182*fec75606SChao Song static const struct snd_soc_acpi_adr_device rt714_0_adr[] = {
183*fec75606SChao Song 	{
184*fec75606SChao Song 		.adr = 0x000030025D071401ull,
185*fec75606SChao Song 		.num_endpoints = 1,
186*fec75606SChao Song 		.endpoints = &single_endpoint,
187*fec75606SChao Song 		.name_prefix = "rt714"
188*fec75606SChao Song 	}
189*fec75606SChao Song };
190*fec75606SChao Song 
191b06e33aaSChao Song static const struct snd_soc_acpi_adr_device rt714_1_adr[] = {
192b06e33aaSChao Song 	{
193b06e33aaSChao Song 		.adr = 0x000130025D071401ull,
194b06e33aaSChao Song 		.num_endpoints = 1,
195b06e33aaSChao Song 		.endpoints = &single_endpoint,
196b06e33aaSChao Song 		.name_prefix = "rt714"
197b06e33aaSChao Song 	}
198b06e33aaSChao Song };
199b06e33aaSChao Song 
2009efa6f46SBard Liao static const struct snd_soc_acpi_link_adr mtl_712_only[] = {
2019efa6f46SBard Liao 	{
2029efa6f46SBard Liao 		.mask = BIT(0),
2039efa6f46SBard Liao 		.num_adr = ARRAY_SIZE(rt712_0_single_adr),
2049efa6f46SBard Liao 		.adr_d = rt712_0_single_adr,
2059efa6f46SBard Liao 	},
2069efa6f46SBard Liao 	{
2079efa6f46SBard Liao 		.mask = BIT(3),
2089efa6f46SBard Liao 		.num_adr = ARRAY_SIZE(rt1712_3_single_adr),
2099efa6f46SBard Liao 		.adr_d = rt1712_3_single_adr,
2109efa6f46SBard Liao 	},
2119efa6f46SBard Liao 	{}
2129efa6f46SBard Liao };
2139efa6f46SBard Liao 
2148dcc2059SYong Zhi static const struct snd_soc_acpi_link_adr rt5682_link2_max98373_link0[] = {
2158dcc2059SYong Zhi 	/* Expected order: jack -> amp */
2168dcc2059SYong Zhi 	{
2178dcc2059SYong Zhi 		.mask = BIT(2),
2188dcc2059SYong Zhi 		.num_adr = ARRAY_SIZE(rt5682_2_adr),
2198dcc2059SYong Zhi 		.adr_d = rt5682_2_adr,
2208dcc2059SYong Zhi 	},
2218dcc2059SYong Zhi 	{
2228dcc2059SYong Zhi 		.mask = BIT(0),
2238dcc2059SYong Zhi 		.num_adr = ARRAY_SIZE(mx8373_0_adr),
2248dcc2059SYong Zhi 		.adr_d = mx8373_0_adr,
2258dcc2059SYong Zhi 	},
2268dcc2059SYong Zhi 	{}
2278dcc2059SYong Zhi };
2288dcc2059SYong Zhi 
22918489174SYong Zhi static const struct snd_soc_acpi_link_adr mtl_rvp[] = {
23018489174SYong Zhi 	{
23118489174SYong Zhi 		.mask = BIT(0),
23218489174SYong Zhi 		.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
23318489174SYong Zhi 		.adr_d = rt711_sdca_0_adr,
23418489174SYong Zhi 	},
23518489174SYong Zhi 	{}
23618489174SYong Zhi };
23718489174SYong Zhi 
238b06e33aaSChao Song static const struct snd_soc_acpi_link_adr mtl_3_in_1_sdca[] = {
239b06e33aaSChao Song 	{
240b06e33aaSChao Song 		.mask = BIT(0),
241b06e33aaSChao Song 		.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
242b06e33aaSChao Song 		.adr_d = rt711_sdca_0_adr,
243b06e33aaSChao Song 	},
244b06e33aaSChao Song 	{
245b06e33aaSChao Song 		.mask = BIT(2),
246b06e33aaSChao Song 		.num_adr = ARRAY_SIZE(rt1316_2_group1_adr),
247b06e33aaSChao Song 		.adr_d = rt1316_2_group1_adr,
248b06e33aaSChao Song 	},
249b06e33aaSChao Song 	{
250b06e33aaSChao Song 		.mask = BIT(3),
251b06e33aaSChao Song 		.num_adr = ARRAY_SIZE(rt1316_3_group1_adr),
252b06e33aaSChao Song 		.adr_d = rt1316_3_group1_adr,
253b06e33aaSChao Song 	},
254b06e33aaSChao Song 	{
255b06e33aaSChao Song 		.mask = BIT(1),
256b06e33aaSChao Song 		.num_adr = ARRAY_SIZE(rt714_1_adr),
257b06e33aaSChao Song 		.adr_d = rt714_1_adr,
258b06e33aaSChao Song 	},
259b06e33aaSChao Song 	{}
260b06e33aaSChao Song };
261b06e33aaSChao Song 
262*fec75606SChao Song static const struct snd_soc_acpi_link_adr mtl_sdw_rt1318_l12_rt714_l0[] = {
263*fec75606SChao Song 	{
264*fec75606SChao Song 		.mask = BIT(1),
265*fec75606SChao Song 		.num_adr = ARRAY_SIZE(rt1318_1_group1_adr),
266*fec75606SChao Song 		.adr_d = rt1318_1_group1_adr,
267*fec75606SChao Song 	},
268*fec75606SChao Song 	{
269*fec75606SChao Song 		.mask = BIT(2),
270*fec75606SChao Song 		.num_adr = ARRAY_SIZE(rt1318_2_group1_adr),
271*fec75606SChao Song 		.adr_d = rt1318_2_group1_adr,
272*fec75606SChao Song 	},
273*fec75606SChao Song 	{
274*fec75606SChao Song 		.mask = BIT(0),
275*fec75606SChao Song 		.num_adr = ARRAY_SIZE(rt714_0_adr),
276*fec75606SChao Song 		.adr_d = rt714_0_adr,
277*fec75606SChao Song 	},
278*fec75606SChao Song 	{}
279*fec75606SChao Song };
280*fec75606SChao Song 
281a0503817SUday M Bhat static const struct snd_soc_acpi_adr_device mx8363_2_adr[] = {
282a0503817SUday M Bhat 	{
283a0503817SUday M Bhat 		.adr = 0x000230019F836300ull,
284a0503817SUday M Bhat 		.num_endpoints = 1,
285a0503817SUday M Bhat 		.endpoints = &spk_l_endpoint,
286a0503817SUday M Bhat 		.name_prefix = "Left"
287a0503817SUday M Bhat 	},
288a0503817SUday M Bhat 	{
289a0503817SUday M Bhat 		.adr = 0x000231019F836300ull,
290a0503817SUday M Bhat 		.num_endpoints = 1,
291a0503817SUday M Bhat 		.endpoints = &spk_r_endpoint,
292a0503817SUday M Bhat 		.name_prefix = "Right"
293a0503817SUday M Bhat 	}
294a0503817SUday M Bhat };
295a0503817SUday M Bhat 
296a0503817SUday M Bhat static const struct snd_soc_acpi_adr_device cs42l42_0_adr[] = {
297a0503817SUday M Bhat 	{
298a0503817SUday M Bhat 		.adr = 0x00001001FA424200ull,
299a0503817SUday M Bhat 		.num_endpoints = 1,
300a0503817SUday M Bhat 		.endpoints = &single_endpoint,
301a0503817SUday M Bhat 		.name_prefix = "cs42l42"
302a0503817SUday M Bhat 	}
303a0503817SUday M Bhat };
304a0503817SUday M Bhat 
305a0503817SUday M Bhat static const struct snd_soc_acpi_link_adr cs42l42_link0_max98363_link2[] = {
306a0503817SUday M Bhat 	/* Expected order: jack -> amp */
307a0503817SUday M Bhat 	{
308a0503817SUday M Bhat 		.mask = BIT(0),
309a0503817SUday M Bhat 		.num_adr = ARRAY_SIZE(cs42l42_0_adr),
310a0503817SUday M Bhat 		.adr_d = cs42l42_0_adr,
311a0503817SUday M Bhat 	},
312a0503817SUday M Bhat 	{
313a0503817SUday M Bhat 		.mask = BIT(2),
314a0503817SUday M Bhat 		.num_adr = ARRAY_SIZE(mx8363_2_adr),
315a0503817SUday M Bhat 		.adr_d = mx8363_2_adr,
316a0503817SUday M Bhat 	},
317a0503817SUday M Bhat 	{}
318a0503817SUday M Bhat };
319a0503817SUday M Bhat 
32011fe58c4SBard Liao /* this table is used when there is no I2S codec present */
32111fe58c4SBard Liao struct snd_soc_acpi_mach snd_soc_acpi_intel_mtl_sdw_machines[] = {
32211fe58c4SBard Liao 	/* mockup tests need to be first */
32311fe58c4SBard Liao 	{
32411fe58c4SBard Liao 		.link_mask = GENMASK(3, 0),
32511fe58c4SBard Liao 		.links = sdw_mockup_headset_2amps_mic,
32611fe58c4SBard Liao 		.drv_name = "sof_sdw",
32711fe58c4SBard Liao 		.sof_tplg_filename = "sof-mtl-rt711-rt1308-rt715.tplg",
32811fe58c4SBard Liao 	},
32911fe58c4SBard Liao 	{
33011fe58c4SBard Liao 		.link_mask = BIT(0) | BIT(1) | BIT(3),
33111fe58c4SBard Liao 		.links = sdw_mockup_headset_1amp_mic,
33211fe58c4SBard Liao 		.drv_name = "sof_sdw",
33311fe58c4SBard Liao 		.sof_tplg_filename = "sof-mtl-rt711-rt1308-mono-rt715.tplg",
33411fe58c4SBard Liao 	},
33511fe58c4SBard Liao 	{
33611fe58c4SBard Liao 		.link_mask = GENMASK(2, 0),
33711fe58c4SBard Liao 		.links = sdw_mockup_mic_headset_1amp,
33811fe58c4SBard Liao 		.drv_name = "sof_sdw",
33911fe58c4SBard Liao 		.sof_tplg_filename = "sof-mtl-rt715-rt711-rt1308-mono.tplg",
34011fe58c4SBard Liao 	},
34118489174SYong Zhi 	{
3429efa6f46SBard Liao 		.link_mask = BIT(3) | BIT(0),
3439efa6f46SBard Liao 		.links = mtl_712_only,
3449efa6f46SBard Liao 		.drv_name = "sof_sdw",
3459efa6f46SBard Liao 		.sof_tplg_filename = "sof-mtl-rt712-l0-rt1712-l3.tplg",
3469efa6f46SBard Liao 	},
3479efa6f46SBard Liao 	{
348*fec75606SChao Song 		.link_mask = GENMASK(2, 0),
349*fec75606SChao Song 		.links = mtl_sdw_rt1318_l12_rt714_l0,
350*fec75606SChao Song 		.drv_name = "sof_sdw",
351*fec75606SChao Song 		.sof_tplg_filename = "sof-mtl-rt1318-l12-rt714-l0.tplg"
352*fec75606SChao Song 	},
353*fec75606SChao Song 	{
354b06e33aaSChao Song 		.link_mask = GENMASK(3, 0),
355b06e33aaSChao Song 		.links = mtl_3_in_1_sdca,
356b06e33aaSChao Song 		.drv_name = "sof_sdw",
357b06e33aaSChao Song 		.sof_tplg_filename = "sof-mtl-rt711-l0-rt1316-l23-rt714-l1.tplg",
358b06e33aaSChao Song 	},
359b06e33aaSChao Song 	{
36018489174SYong Zhi 		.link_mask = BIT(0),
36118489174SYong Zhi 		.links = mtl_rvp,
36218489174SYong Zhi 		.drv_name = "sof_sdw",
36318489174SYong Zhi 		.sof_tplg_filename = "sof-mtl-rt711.tplg",
36418489174SYong Zhi 	},
3658dcc2059SYong Zhi 	{
3668dcc2059SYong Zhi 		.link_mask = BIT(0) | BIT(2),
3678dcc2059SYong Zhi 		.links = rt5682_link2_max98373_link0,
3688dcc2059SYong Zhi 		.drv_name = "sof_sdw",
3698dcc2059SYong Zhi 		.sof_tplg_filename = "sof-mtl-sdw-rt5682-l2-max98373-l0.tplg",
3708dcc2059SYong Zhi 	},
371a0503817SUday M Bhat 	{
372a0503817SUday M Bhat 		.link_mask = BIT(0) | BIT(2),
373a0503817SUday M Bhat 		.links = cs42l42_link0_max98363_link2,
374a0503817SUday M Bhat 		.drv_name = "sof_sdw",
375a0503817SUday M Bhat 		.sof_tplg_filename = "sof-mtl-sdw-cs42l42-l0-max98363-l2.tplg",
376a0503817SUday M Bhat 	},
37711fe58c4SBard Liao 	{},
37811fe58c4SBard Liao };
37911fe58c4SBard Liao EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_mtl_sdw_machines);
380