]>
Commit | Line | Data |
---|---|---|
fa991481 VM |
1 | // SPDX-License-Identifier: GPL-2.0+ |
2 | /* | |
3 | * Machine driver for AMD Yellow Carp platform using DMIC | |
4 | * | |
5 | * Copyright 2021 Advanced Micro Devices, Inc. | |
6 | */ | |
7 | ||
8 | #include <sound/soc.h> | |
9 | #include <sound/soc-dapm.h> | |
10 | #include <linux/module.h> | |
11 | #include <sound/pcm.h> | |
12 | #include <sound/pcm_params.h> | |
13 | #include <linux/io.h> | |
14 | #include <linux/dmi.h> | |
5426f506 | 15 | #include <linux/acpi.h> |
fa991481 VM |
16 | |
17 | #include "acp6x.h" | |
18 | ||
19 | #define DRV_NAME "acp_yc_mach" | |
20 | ||
21 | SND_SOC_DAILINK_DEF(acp6x_pdm, | |
22 | DAILINK_COMP_ARRAY(COMP_CPU("acp_yc_pdm_dma.0"))); | |
23 | ||
24 | SND_SOC_DAILINK_DEF(dmic_codec, | |
25 | DAILINK_COMP_ARRAY(COMP_CODEC("dmic-codec.0", | |
26 | "dmic-hifi"))); | |
27 | ||
28 | SND_SOC_DAILINK_DEF(pdm_platform, | |
29 | DAILINK_COMP_ARRAY(COMP_PLATFORM("acp_yc_pdm_dma.0"))); | |
30 | ||
31 | static struct snd_soc_dai_link acp6x_dai_pdm[] = { | |
32 | { | |
33 | .name = "acp6x-dmic-capture", | |
34 | .stream_name = "DMIC capture", | |
35 | .capture_only = 1, | |
36 | SND_SOC_DAILINK_REG(acp6x_pdm, dmic_codec, pdm_platform), | |
37 | }, | |
38 | }; | |
39 | ||
40 | static struct snd_soc_card acp6x_card = { | |
41 | .name = "acp6x", | |
42 | .owner = THIS_MODULE, | |
43 | .dai_link = acp6x_dai_pdm, | |
44 | .num_links = 1, | |
45 | }; | |
46 | ||
47 | static const struct dmi_system_id yc_acp_quirk_table[] = { | |
faf15233 CK |
48 | { |
49 | .driver_data = &acp6x_card, | |
50 | .matches = { | |
51 | DMI_MATCH(DMI_BOARD_VENDOR, "Dell Inc."), | |
52 | DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5525"), | |
53 | } | |
54 | }, | |
a450b5c8 | 55 | { |
56 | .driver_data = &acp6x_card, | |
57 | .matches = { | |
58 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
59 | DMI_MATCH(DMI_PRODUCT_NAME, "21D0"), | |
60 | } | |
61 | }, | |
a75481fa L |
62 | { |
63 | .driver_data = &acp6x_card, | |
64 | .matches = { | |
65 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
66 | DMI_MATCH(DMI_PRODUCT_NAME, "21D0"), | |
67 | } | |
68 | }, | |
a450b5c8 | 69 | { |
70 | .driver_data = &acp6x_card, | |
71 | .matches = { | |
72 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
73 | DMI_MATCH(DMI_PRODUCT_NAME, "21D1"), | |
74 | } | |
75 | }, | |
fa991481 | 76 | { |
e521f087 | 77 | .driver_data = &acp6x_card, |
fa991481 VM |
78 | .matches = { |
79 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
80 | DMI_MATCH(DMI_PRODUCT_NAME, "21D2"), | |
81 | } | |
82 | }, | |
83 | { | |
e521f087 | 84 | .driver_data = &acp6x_card, |
fa991481 VM |
85 | .matches = { |
86 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
87 | DMI_MATCH(DMI_PRODUCT_NAME, "21D3"), | |
88 | } | |
89 | }, | |
90 | { | |
e521f087 | 91 | .driver_data = &acp6x_card, |
fa991481 VM |
92 | .matches = { |
93 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
94 | DMI_MATCH(DMI_PRODUCT_NAME, "21D4"), | |
95 | } | |
96 | }, | |
97 | { | |
e521f087 | 98 | .driver_data = &acp6x_card, |
fa991481 VM |
99 | .matches = { |
100 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
101 | DMI_MATCH(DMI_PRODUCT_NAME, "21D5"), | |
102 | } | |
103 | }, | |
104 | { | |
e521f087 | 105 | .driver_data = &acp6x_card, |
fa991481 VM |
106 | .matches = { |
107 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
108 | DMI_MATCH(DMI_PRODUCT_NAME, "21CF"), | |
109 | } | |
110 | }, | |
111 | { | |
e521f087 | 112 | .driver_data = &acp6x_card, |
fa991481 VM |
113 | .matches = { |
114 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
115 | DMI_MATCH(DMI_PRODUCT_NAME, "21CG"), | |
116 | } | |
117 | }, | |
118 | { | |
e521f087 | 119 | .driver_data = &acp6x_card, |
fa991481 VM |
120 | .matches = { |
121 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
122 | DMI_MATCH(DMI_PRODUCT_NAME, "21CQ"), | |
123 | } | |
124 | }, | |
125 | { | |
e521f087 | 126 | .driver_data = &acp6x_card, |
fa991481 VM |
127 | .matches = { |
128 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
129 | DMI_MATCH(DMI_PRODUCT_NAME, "21CR"), | |
130 | } | |
131 | }, | |
132 | { | |
e521f087 | 133 | .driver_data = &acp6x_card, |
fa991481 VM |
134 | .matches = { |
135 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
be0aa8d4 | 136 | DMI_MATCH(DMI_PRODUCT_NAME, "21CM"), |
fa991481 VM |
137 | } |
138 | }, | |
139 | { | |
e521f087 | 140 | .driver_data = &acp6x_card, |
fa991481 VM |
141 | .matches = { |
142 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
be0aa8d4 | 143 | DMI_MATCH(DMI_PRODUCT_NAME, "21CN"), |
fa991481 VM |
144 | } |
145 | }, | |
146 | { | |
e521f087 | 147 | .driver_data = &acp6x_card, |
fa991481 VM |
148 | .matches = { |
149 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
150 | DMI_MATCH(DMI_PRODUCT_NAME, "21CH"), | |
151 | } | |
152 | }, | |
153 | { | |
e521f087 | 154 | .driver_data = &acp6x_card, |
fa991481 VM |
155 | .matches = { |
156 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
157 | DMI_MATCH(DMI_PRODUCT_NAME, "21CJ"), | |
158 | } | |
159 | }, | |
160 | { | |
e521f087 | 161 | .driver_data = &acp6x_card, |
fa991481 VM |
162 | .matches = { |
163 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
164 | DMI_MATCH(DMI_PRODUCT_NAME, "21CK"), | |
165 | } | |
166 | }, | |
167 | { | |
e521f087 | 168 | .driver_data = &acp6x_card, |
fa991481 VM |
169 | .matches = { |
170 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
171 | DMI_MATCH(DMI_PRODUCT_NAME, "21CL"), | |
172 | } | |
173 | }, | |
57d1e890 SJ |
174 | { |
175 | .driver_data = &acp6x_card, | |
176 | .matches = { | |
177 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
178 | DMI_MATCH(DMI_PRODUCT_NAME, "21EF"), | |
179 | } | |
180 | }, | |
c0fc96fe | 181 | { |
182 | .driver_data = &acp6x_card, | |
183 | .matches = { | |
184 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
185 | DMI_MATCH(DMI_PRODUCT_NAME, "21EM"), | |
186 | } | |
187 | }, | |
188 | { | |
189 | .driver_data = &acp6x_card, | |
190 | .matches = { | |
191 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
192 | DMI_MATCH(DMI_PRODUCT_NAME, "21EN"), | |
193 | } | |
194 | }, | |
a8f5da0b BJ |
195 | { |
196 | .driver_data = &acp6x_card, | |
197 | .matches = { | |
198 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
199 | DMI_MATCH(DMI_PRODUCT_NAME, "21HY"), | |
200 | } | |
201 | }, | |
c0fc96fe | 202 | { |
203 | .driver_data = &acp6x_card, | |
204 | .matches = { | |
205 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
206 | DMI_MATCH(DMI_PRODUCT_NAME, "21J5"), | |
207 | } | |
208 | }, | |
209 | { | |
210 | .driver_data = &acp6x_card, | |
211 | .matches = { | |
212 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
213 | DMI_MATCH(DMI_PRODUCT_NAME, "21J6"), | |
214 | } | |
215 | }, | |
1263cc0f AW |
216 | { |
217 | .driver_data = &acp6x_card, | |
218 | .matches = { | |
219 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
220 | DMI_MATCH(DMI_PRODUCT_NAME, "82QF"), | |
221 | } | |
222 | }, | |
cfff2a77 ML |
223 | { |
224 | .driver_data = &acp6x_card, | |
225 | .matches = { | |
226 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
227 | DMI_MATCH(DMI_PRODUCT_NAME, "82TL"), | |
228 | } | |
229 | }, | |
1263cc0f AW |
230 | { |
231 | .driver_data = &acp6x_card, | |
232 | .matches = { | |
233 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
234 | DMI_MATCH(DMI_PRODUCT_NAME, "82UG"), | |
235 | } | |
236 | }, | |
2232b2dd ML |
237 | { |
238 | .driver_data = &acp6x_card, | |
239 | .matches = { | |
240 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
c008323f | 241 | DMI_MATCH(DMI_PRODUCT_NAME, "82V2"), |
2232b2dd ML |
242 | } |
243 | }, | |
1948fa64 SF |
244 | { |
245 | .driver_data = &acp6x_card, | |
246 | .matches = { | |
247 | DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), | |
248 | DMI_MATCH(DMI_PRODUCT_NAME, "82YM"), | |
249 | } | |
250 | }, | |
4df5b13d XL |
251 | { |
252 | .driver_data = &acp6x_card, | |
253 | .matches = { | |
254 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), | |
255 | DMI_MATCH(DMI_PRODUCT_NAME, "UM5302TA"), | |
256 | } | |
257 | }, | |
a0dd7fca AM |
258 | { |
259 | .driver_data = &acp6x_card, | |
260 | .matches = { | |
261 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), | |
262 | DMI_MATCH(DMI_PRODUCT_NAME, "M5402RA"), | |
263 | } | |
264 | }, | |
4a1b5bc7 AR |
265 | { |
266 | .driver_data = &acp6x_card, | |
267 | .matches = { | |
268 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), | |
269 | DMI_MATCH(DMI_PRODUCT_NAME, "M6400RC"), | |
270 | } | |
271 | }, | |
110ccfa9 EB |
272 | { |
273 | .driver_data = &acp6x_card, | |
274 | .matches = { | |
275 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), | |
276 | DMI_MATCH(DMI_PRODUCT_NAME, "M3402RA"), | |
277 | } | |
278 | }, | |
3b1f0883 B |
279 | { |
280 | .driver_data = &acp6x_card, | |
281 | .matches = { | |
282 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), | |
283 | DMI_MATCH(DMI_PRODUCT_NAME, "M6500RC"), | |
284 | } | |
285 | }, | |
e616a916 WH |
286 | { |
287 | .driver_data = &acp6x_card, | |
288 | .matches = { | |
289 | DMI_MATCH(DMI_BOARD_VENDOR, "Micro-Star International Co., Ltd."), | |
290 | DMI_MATCH(DMI_PRODUCT_NAME, "Bravo 15 B7ED"), | |
291 | } | |
292 | }, | |
d40b6529 BM |
293 | { |
294 | .driver_data = &acp6x_card, | |
295 | .matches = { | |
296 | DMI_MATCH(DMI_BOARD_VENDOR, "Alienware"), | |
297 | DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m17 R5 AMD"), | |
298 | } | |
299 | }, | |
c1dd6bf6 AL |
300 | { |
301 | .driver_data = &acp6x_card, | |
302 | .matches = { | |
303 | DMI_MATCH(DMI_BOARD_VENDOR, "TIMI"), | |
304 | DMI_MATCH(DMI_PRODUCT_NAME, "Redmi Book Pro 14 2022"), | |
305 | } | |
306 | }, | |
dcff8b7c | 307 | { |
308 | .driver_data = &acp6x_card, | |
309 | .matches = { | |
310 | DMI_MATCH(DMI_BOARD_VENDOR, "TIMI"), | |
311 | DMI_MATCH(DMI_PRODUCT_NAME, "Redmi Book Pro 15 2022"), | |
312 | } | |
313 | }, | |
68506a17 WVB |
314 | { |
315 | .driver_data = &acp6x_card, | |
316 | .matches = { | |
317 | DMI_MATCH(DMI_BOARD_VENDOR, "Razer"), | |
318 | DMI_MATCH(DMI_PRODUCT_NAME, "Blade 14 (2022) - RZ09-0427"), | |
319 | } | |
320 | }, | |
7fd26a27 SSK |
321 | { |
322 | .driver_data = &acp6x_card, | |
323 | .matches = { | |
324 | DMI_MATCH(DMI_BOARD_VENDOR, "RB"), | |
325 | DMI_MATCH(DMI_PRODUCT_NAME, "Swift SFA16-41"), | |
326 | } | |
327 | }, | |
328 | { | |
329 | .driver_data = &acp6x_card, | |
330 | .matches = { | |
331 | DMI_MATCH(DMI_BOARD_VENDOR, "IRBIS"), | |
332 | DMI_MATCH(DMI_PRODUCT_NAME, "15NBC1011"), | |
333 | } | |
334 | }, | |
22ce6843 JH |
335 | { |
336 | .driver_data = &acp6x_card, | |
337 | .matches = { | |
338 | DMI_MATCH(DMI_BOARD_VENDOR, "HP"), | |
339 | DMI_MATCH(DMI_PRODUCT_NAME, "OMEN by HP Gaming Laptop 16z-n000"), | |
340 | } | |
341 | }, | |
ee4281de PS |
342 | { |
343 | .driver_data = &acp6x_card, | |
344 | .matches = { | |
345 | DMI_MATCH(DMI_BOARD_VENDOR, "HP"), | |
346 | DMI_MATCH(DMI_BOARD_NAME, "8A42"), | |
347 | } | |
348 | }, | |
d52279d5 DAL |
349 | { |
350 | .driver_data = &acp6x_card, | |
351 | .matches = { | |
352 | DMI_MATCH(DMI_BOARD_VENDOR, "HP"), | |
353 | DMI_MATCH(DMI_BOARD_NAME, "8A43"), | |
354 | } | |
355 | }, | |
205efd46 GB |
356 | { |
357 | .driver_data = &acp6x_card, | |
358 | .matches = { | |
359 | DMI_MATCH(DMI_BOARD_VENDOR, "HP"), | |
360 | DMI_MATCH(DMI_BOARD_NAME, "8A22"), | |
361 | } | |
362 | }, | |
d1cf5d30 S |
363 | { |
364 | .driver_data = &acp6x_card, | |
365 | .matches = { | |
366 | DMI_MATCH(DMI_BOARD_VENDOR, "HP"), | |
367 | DMI_MATCH(DMI_BOARD_NAME, "8A3E"), | |
368 | } | |
369 | }, | |
deeb7855 R |
370 | { |
371 | .driver_data = &acp6x_card, | |
372 | .matches = { | |
373 | DMI_MATCH(DMI_BOARD_VENDOR, "MECHREVO"), | |
374 | DMI_MATCH(DMI_BOARD_NAME, "MRID6"), | |
375 | } | |
376 | }, | |
7b9891ad JS |
377 | { |
378 | .driver_data = &acp6x_card, | |
379 | .matches = { | |
380 | DMI_MATCH(DMI_BOARD_VENDOR, "System76"), | |
381 | DMI_MATCH(DMI_PRODUCT_VERSION, "pang12"), | |
382 | } | |
383 | }, | |
fa991481 VM |
384 | {} |
385 | }; | |
386 | ||
387 | static int acp6x_probe(struct platform_device *pdev) | |
388 | { | |
e521f087 | 389 | const struct dmi_system_id *dmi_id; |
fa991481 VM |
390 | struct acp6x_pdm *machine = NULL; |
391 | struct snd_soc_card *card; | |
5426f506 | 392 | struct acpi_device *adev; |
fa991481 | 393 | int ret; |
fa991481 | 394 | |
5426f506 ML |
395 | /* check the parent device's firmware node has _DSD or not */ |
396 | adev = ACPI_COMPANION(pdev->dev.parent); | |
397 | if (adev) { | |
398 | const union acpi_object *obj; | |
399 | ||
400 | if (!acpi_dev_get_property(adev, "AcpDmicConnected", ACPI_TYPE_INTEGER, &obj) && | |
401 | obj->integer.value == 1) | |
402 | platform_set_drvdata(pdev, &acp6x_card); | |
403 | } | |
404 | ||
e521f087 | 405 | /* check for any DMI overrides */ |
fa991481 | 406 | dmi_id = dmi_first_match(yc_acp_quirk_table); |
e521f087 ML |
407 | if (dmi_id) |
408 | platform_set_drvdata(pdev, dmi_id->driver_data); | |
409 | ||
410 | card = platform_get_drvdata(pdev); | |
411 | if (!card) | |
fa991481 | 412 | return -ENODEV; |
5426f506 | 413 | dev_info(&pdev->dev, "Enabling ACP DMIC support via %s", dmi_id ? "DMI" : "ACPI"); |
fa991481 VM |
414 | acp6x_card.dev = &pdev->dev; |
415 | ||
fa991481 VM |
416 | snd_soc_card_set_drvdata(card, machine); |
417 | ret = devm_snd_soc_register_card(&pdev->dev, card); | |
418 | if (ret) { | |
419 | return dev_err_probe(&pdev->dev, ret, | |
420 | "snd_soc_register_card(%s) failed\n", | |
421 | card->name); | |
422 | } | |
423 | return 0; | |
424 | } | |
425 | ||
426 | static struct platform_driver acp6x_mach_driver = { | |
427 | .driver = { | |
428 | .name = "acp_yc_mach", | |
429 | .pm = &snd_soc_pm_ops, | |
430 | }, | |
431 | .probe = acp6x_probe, | |
432 | }; | |
433 | ||
434 | module_platform_driver(acp6x_mach_driver); | |
435 | ||
436 | MODULE_AUTHOR("Vijendar.Mukunda@amd.com"); | |
437 | MODULE_LICENSE("GPL v2"); | |
438 | MODULE_ALIAS("platform:" DRV_NAME); |