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 
12 static struct snd_soc_acpi_codecs rt1011_spk_codecs = {
13 	.num_codecs = 1,
14 	.codecs = {"10EC1011"}
15 };
16 
17 static struct snd_soc_acpi_codecs max98357a_spk_codecs = {
18 	.num_codecs = 1,
19 	.codecs = {"MX98357A"}
20 };
21 
22 /*
23  * The order of the three entries with .id = "10EC5682" matters
24  * here, because DSDT tables expose an ACPI HID for the MAX98357A
25  * speaker amplifier which is not populated on the board.
26  */
27 struct snd_soc_acpi_mach snd_soc_acpi_intel_cml_machines[] = {
28 	{
29 		.id = "10EC5682",
30 		.drv_name = "cml_rt1011_rt5682",
31 		.machine_quirk = snd_soc_acpi_codec_list,
32 		.quirk_data = &rt1011_spk_codecs,
33 		.sof_fw_filename = "sof-cml.ri",
34 		.sof_tplg_filename = "sof-cml-rt1011-rt5682.tplg",
35 	},
36 	{
37 		.id = "10EC5682",
38 		.drv_name = "sof_rt5682",
39 		.machine_quirk = snd_soc_acpi_codec_list,
40 		.quirk_data = &max98357a_spk_codecs,
41 		.sof_fw_filename = "sof-cml.ri",
42 		.sof_tplg_filename = "sof-cml-rt5682-max98357a.tplg",
43 	},
44 	{
45 		.id = "10EC5682",
46 		.drv_name = "sof_rt5682",
47 		.sof_fw_filename = "sof-cml.ri",
48 		.sof_tplg_filename = "sof-cml-rt5682.tplg",
49 	},
50 	{
51 		.id = "DLGS7219",
52 		.drv_name = "cml_da7219_max98357a",
53 		.machine_quirk = snd_soc_acpi_codec_list,
54 		.quirk_data = &max98357a_spk_codecs,
55 		.sof_fw_filename = "sof-cml.ri",
56 		.sof_tplg_filename = "sof-cml-da7219-max98357a.tplg",
57 	},
58 	{},
59 };
60 EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_cml_machines);
61 
62 static const struct snd_soc_acpi_endpoint single_endpoint = {
63 	.num = 0,
64 	.aggregated = 0,
65 	.group_position = 0,
66 	.group_id = 0,
67 };
68 
69 static const struct snd_soc_acpi_endpoint spk_l_endpoint = {
70 	.num = 0,
71 	.aggregated = 1,
72 	.group_position = 0,
73 	.group_id = 1,
74 };
75 
76 static const struct snd_soc_acpi_endpoint spk_r_endpoint = {
77 	.num = 0,
78 	.aggregated = 1,
79 	.group_position = 1,
80 	.group_id = 1,
81 };
82 
83 static const struct snd_soc_acpi_adr_device rt700_1_adr[] = {
84 	{
85 		.adr = 0x000110025D070000,
86 		.num_endpoints = 1,
87 		.endpoints = &single_endpoint,
88 	}
89 };
90 
91 static const struct snd_soc_acpi_link_adr cml_rvp[] = {
92 	{
93 		.mask = BIT(1),
94 		.num_adr = ARRAY_SIZE(rt700_1_adr),
95 		.adr_d = rt700_1_adr,
96 	},
97 	{}
98 };
99 
100 static const struct snd_soc_acpi_adr_device rt711_0_adr[] = {
101 	{
102 		.adr = 0x000010025D071100,
103 		.num_endpoints = 1,
104 		.endpoints = &single_endpoint,
105 	}
106 };
107 
108 static const struct snd_soc_acpi_adr_device rt1308_1_adr[] = {
109 	{
110 		.adr = 0x000110025D130800,
111 		.num_endpoints = 1,
112 		.endpoints = &single_endpoint,
113 	}
114 };
115 
116 static const struct snd_soc_acpi_adr_device rt1308_1_group1_adr[] = {
117 	{
118 		.adr = 0x000110025D130800,
119 		.num_endpoints = 1,
120 		.endpoints = &spk_l_endpoint,
121 	}
122 };
123 
124 static const struct snd_soc_acpi_adr_device rt1308_2_group1_adr[] = {
125 	{
126 		.adr = 0x000210025D130800,
127 		.num_endpoints = 1,
128 		.endpoints = &spk_r_endpoint,
129 	}
130 };
131 
132 static const struct snd_soc_acpi_adr_device rt715_3_adr[] = {
133 	{
134 		.adr = 0x000310025D071500,
135 		.num_endpoints = 1,
136 		.endpoints = &single_endpoint,
137 	}
138 };
139 
140 static const struct snd_soc_acpi_link_adr cml_3_in_1_default[] = {
141 	{
142 		.mask = BIT(0),
143 		.num_adr = ARRAY_SIZE(rt711_0_adr),
144 		.adr_d = rt711_0_adr,
145 	},
146 	{
147 		.mask = BIT(1),
148 		.num_adr = ARRAY_SIZE(rt1308_1_group1_adr),
149 		.adr_d = rt1308_1_group1_adr,
150 	},
151 	{
152 		.mask = BIT(2),
153 		.num_adr = ARRAY_SIZE(rt1308_2_group1_adr),
154 		.adr_d = rt1308_2_group1_adr,
155 	},
156 	{
157 		.mask = BIT(3),
158 		.num_adr = ARRAY_SIZE(rt715_3_adr),
159 		.adr_d = rt715_3_adr,
160 	},
161 	{}
162 };
163 
164 static const struct snd_soc_acpi_link_adr cml_3_in_1_mono_amp[] = {
165 	{
166 		.mask = BIT(0),
167 		.num_adr = ARRAY_SIZE(rt711_0_adr),
168 		.adr_d = rt711_0_adr,
169 	},
170 	{
171 		.mask = BIT(1),
172 		.num_adr = ARRAY_SIZE(rt1308_1_adr),
173 		.adr_d = rt1308_1_adr,
174 	},
175 	{
176 		.mask = BIT(3),
177 		.num_adr = ARRAY_SIZE(rt715_3_adr),
178 		.adr_d = rt715_3_adr,
179 	},
180 	{}
181 };
182 
183 struct snd_soc_acpi_mach snd_soc_acpi_intel_cml_sdw_machines[] = {
184 	{
185 		.link_mask = 0xF, /* 4 active links required */
186 		.links = cml_3_in_1_default,
187 		.drv_name = "sof_sdw",
188 		.sof_fw_filename = "sof-cml.ri",
189 		.sof_tplg_filename = "sof-cml-rt711-rt1308-rt715.tplg",
190 	},
191 	{
192 		/*
193 		 * link_mask should be 0xB, but all links are enabled by BIOS.
194 		 * This entry will be selected if there is no rt1308 exposed
195 		 * on link2 since it will fail to match the above entry.
196 		 */
197 		.link_mask = 0xF,
198 		.links = cml_3_in_1_mono_amp,
199 		.drv_name = "sof_sdw",
200 		.sof_fw_filename = "sof-cml.ri",
201 		.sof_tplg_filename = "sof-cml-rt711-rt1308-mono-rt715.tplg",
202 	},
203 	{
204 		.link_mask = 0x2, /* RT700 connected on Link1 */
205 		.links = cml_rvp,
206 		.drv_name = "sof_sdw",
207 		.sof_fw_filename = "sof-cml.ri",
208 		.sof_tplg_filename = "sof-cml-rt700.tplg",
209 	},
210 	{}
211 };
212 EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_cml_sdw_machines);
213 
214 MODULE_LICENSE("GPL v2");
215 MODULE_DESCRIPTION("Intel Common ACPI Match module");
216