File Index
Files and directories
Sign in
FILE

soc-acpi-intel-arl-match.c

File preview with syntax highlighting.

linux-6.19.14/sound/soc/intel/common/soc-acpi-intel-arl-match.c C
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * soc-apci-intel-arl-match.c - tables and support for ARL ACPI enumeration.
  4 *
  5 * Copyright (c) 2023 Intel Corporation.
  6 */
  7
  8#include <sound/soc-acpi.h>
  9#include <sound/soc-acpi-intel-match.h>
 10#include <sound/soc-acpi-intel-ssp-common.h>
 11#include "sof-function-topology-lib.h"
 12
 13static const struct snd_soc_acpi_endpoint single_endpoint = {
 14	.num = 0,
 15	.aggregated = 0,
 16	.group_position = 0,
 17	.group_id = 0,
 18};
 19
 20static const struct snd_soc_acpi_endpoint spk_l_endpoint = {
 21	.num = 0,
 22	.aggregated = 1,
 23	.group_position = 0,
 24	.group_id = 1,
 25};
 26
 27static const struct snd_soc_acpi_endpoint spk_r_endpoint = {
 28	.num = 0,
 29	.aggregated = 1,
 30	.group_position = 1,
 31	.group_id = 1,
 32};
 33
 34static const struct snd_soc_acpi_endpoint spk_2_endpoint = {
 35	.num = 0,
 36	.aggregated = 1,
 37	.group_position = 2,
 38	.group_id = 1,
 39};
 40
 41static const struct snd_soc_acpi_endpoint spk_3_endpoint = {
 42	.num = 0,
 43	.aggregated = 1,
 44	.group_position = 3,
 45	.group_id = 1,
 46};
 47
 48static const struct snd_soc_acpi_endpoint jack_amp_g1_dmic_endpoints[] = {
 49	/* Jack Endpoint */
 50	{
 51		.num = 0,
 52		.aggregated = 0,
 53		.group_position = 0,
 54		.group_id = 0,
 55	},
 56	/* Amp Endpoint, work as spk_l_endpoint */
 57	{
 58		.num = 1,
 59		.aggregated = 1,
 60		.group_position = 0,
 61		.group_id = 1,
 62	},
 63	/* DMIC Endpoint */
 64	{
 65		.num = 2,
 66		.aggregated = 0,
 67		.group_position = 0,
 68		.group_id = 0,
 69	},
 70};
 71
 72static const struct snd_soc_acpi_adr_device cs35l56_2_lr_adr[] = {
 73	{
 74		.adr = 0x00023001FA355601ull,
 75		.num_endpoints = 1,
 76		.endpoints = &spk_l_endpoint,
 77		.name_prefix = "AMP1"
 78	},
 79	{
 80		.adr = 0x00023101FA355601ull,
 81		.num_endpoints = 1,
 82		.endpoints = &spk_r_endpoint,
 83		.name_prefix = "AMP2"
 84	}
 85};
 86
 87static const struct snd_soc_acpi_adr_device cs35l56_3_lr_adr[] = {
 88	{
 89		.adr = 0x00033001FA355601ull,
 90		.num_endpoints = 1,
 91		.endpoints = &spk_l_endpoint,
 92		.name_prefix = "AMP1"
 93	},
 94	{
 95		.adr = 0x00033401FA355601ull,
 96		.num_endpoints = 1,
 97		.endpoints = &spk_r_endpoint,
 98		.name_prefix = "AMP2"
 99	}
100};
101
102static const struct snd_soc_acpi_adr_device cs35l56_2_r_adr[] = {
103	{
104		.adr = 0x00023201FA355601ull,
105		.num_endpoints = 1,
106		.endpoints = &spk_r_endpoint,
107		.name_prefix = "AMP3"
108	},
109	{
110		.adr = 0x00023301FA355601ull,
111		.num_endpoints = 1,
112		.endpoints = &spk_3_endpoint,
113		.name_prefix = "AMP4"
114	}
115};
116
117static const struct snd_soc_acpi_adr_device cs35l56_3_l_adr[] = {
118	{
119		.adr = 0x00033001fa355601ull,
120		.num_endpoints = 1,
121		.endpoints = &spk_l_endpoint,
122		.name_prefix = "AMP1"
123	},
124	{
125		.adr = 0x00033101fa355601ull,
126		.num_endpoints = 1,
127		.endpoints = &spk_2_endpoint,
128		.name_prefix = "AMP2"
129	}
130};
131
132static const struct snd_soc_acpi_adr_device cs35l56_2_r1_adr[] = {
133	{
134		.adr = 0x00023101FA355601ull,
135		.num_endpoints = 1,
136		.endpoints = &spk_r_endpoint,
137		.name_prefix = "AMP2"
138	},
139};
140
141static const struct snd_soc_acpi_adr_device cs35l56_3_l3_adr[] = {
142	{
143		.adr = 0x00033301fa355601ull,
144		.num_endpoints = 1,
145		.endpoints = &spk_l_endpoint,
146		.name_prefix = "AMP1"
147	},
148};
149
150static const struct snd_soc_acpi_adr_device cs35l56_2_r3_adr[] = {
151	{
152		.adr = 0x00023301fa355601ull,
153		.num_endpoints = 1,
154		.endpoints = &spk_r_endpoint,
155		.name_prefix = "AMP2"
156	},
157};
158
159static const struct snd_soc_acpi_adr_device cs35l56_3_l1_adr[] = {
160	{
161		.adr = 0x00033101fa355601ull,
162		.num_endpoints = 1,
163		.endpoints = &spk_l_endpoint,
164		.name_prefix = "AMP1"
165	},
166};
167
168static const struct snd_soc_acpi_endpoint cs42l43_endpoints[] = {
169	{ /* Jack Playback Endpoint */
170		.num = 0,
171		.aggregated = 0,
172		.group_position = 0,
173		.group_id = 0,
174	},
175	{ /* DMIC Capture Endpoint */
176		.num = 1,
177		.aggregated = 0,
178		.group_position = 0,
179		.group_id = 0,
180	},
181	{ /* Jack Capture Endpoint */
182		.num = 2,
183		.aggregated = 0,
184		.group_position = 0,
185		.group_id = 0,
186	},
187	{ /* Speaker Playback Endpoint */
188		.num = 3,
189		.aggregated = 0,
190		.group_position = 0,
191		.group_id = 0,
192	},
193};
194
195static const struct snd_soc_acpi_adr_device cs42l43_0_adr[] = {
196	{
197		.adr = 0x00003001FA424301ull,
198		.num_endpoints = ARRAY_SIZE(cs42l43_endpoints),
199		.endpoints = cs42l43_endpoints,
200		.name_prefix = "cs42l43"
201	}
202};
203
204static const struct snd_soc_acpi_adr_device cs42l43_2_adr[] = {
205	{
206		.adr = 0x00023001FA424301ull,
207		.num_endpoints = ARRAY_SIZE(cs42l43_endpoints),
208		.endpoints = cs42l43_endpoints,
209		.name_prefix = "cs42l43"
210	}
211};
212
213static const struct snd_soc_acpi_adr_device rt711_0_adr[] = {
214	{
215		.adr = 0x000020025D071100ull,
216		.num_endpoints = 1,
217		.endpoints = &single_endpoint,
218		.name_prefix = "rt711"
219	}
220};
221
222static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = {
223	{
224		.adr = 0x000030025D071101ull,
225		.num_endpoints = 1,
226		.endpoints = &single_endpoint,
227		.name_prefix = "rt711"
228	}
229};
230
231static const struct snd_soc_acpi_adr_device rt722_0_agg_adr[] = {
232	{
233		.adr = 0x000030025D072201ull,
234		.num_endpoints = ARRAY_SIZE(jack_amp_g1_dmic_endpoints),
235		.endpoints = jack_amp_g1_dmic_endpoints,
236		.name_prefix = "rt722"
237	}
238};
239
240static const struct snd_soc_acpi_adr_device rt1316_3_single_adr[] = {
241	{
242		.adr = 0x000330025D131601ull,
243		.num_endpoints = 1,
244		.endpoints = &single_endpoint,
245		.name_prefix = "rt1316-1"
246	}
247};
248
249static const struct snd_soc_acpi_adr_device rt1320_2_single_adr[] = {
250	{
251		.adr = 0x000230025D132001ull,
252		.num_endpoints = 1,
253		.endpoints = &single_endpoint,
254		.name_prefix = "rt1320-1"
255	}
256};
257
258static const struct snd_soc_acpi_link_adr arl_cs42l43_l0[] = {
259	{
260		.mask = BIT(0),
261		.num_adr = ARRAY_SIZE(cs42l43_0_adr),
262		.adr_d = cs42l43_0_adr,
263	},
264	{}
265};
266
267static const struct snd_soc_acpi_link_adr arl_cs42l43_l2[] = {
268	{
269		.mask = BIT(2),
270		.num_adr = ARRAY_SIZE(cs42l43_2_adr),
271		.adr_d = cs42l43_2_adr,
272	},
273	{}
274};
275
276static const struct snd_soc_acpi_link_adr arl_cs42l43_l2_cs35l56_l3[] = {
277	{
278		.mask = BIT(2),
279		.num_adr = ARRAY_SIZE(cs42l43_2_adr),
280		.adr_d = cs42l43_2_adr,
281	},
282	{
283		.mask = BIT(3),
284		.num_adr = ARRAY_SIZE(cs35l56_3_lr_adr),
285		.adr_d = cs35l56_3_lr_adr,
286	},
287	{}
288};
289
290static const struct snd_soc_acpi_link_adr arl_cs42l43_l0_cs35l56_l2[] = {
291	{
292		.mask = BIT(0),
293		.num_adr = ARRAY_SIZE(cs42l43_0_adr),
294		.adr_d = cs42l43_0_adr,
295	},
296	{
297		.mask = BIT(2),
298		.num_adr = ARRAY_SIZE(cs35l56_2_lr_adr),
299		.adr_d = cs35l56_2_lr_adr,
300	},
301	{}
302};
303
304static const struct snd_soc_acpi_link_adr arl_cs42l43_l0_cs35l56_l23[] = {
305	{
306		.mask = BIT(0),
307		.num_adr = ARRAY_SIZE(cs42l43_0_adr),
308		.adr_d = cs42l43_0_adr,
309	},
310	{
311		.mask = BIT(2),
312		.num_adr = ARRAY_SIZE(cs35l56_2_r_adr),
313		.adr_d = cs35l56_2_r_adr,
314	},
315	{
316		.mask = BIT(3),
317		.num_adr = ARRAY_SIZE(cs35l56_3_l_adr),
318		.adr_d = cs35l56_3_l_adr,
319	},
320	{}
321};
322
323static const struct snd_soc_acpi_link_adr arl_cs42l43_l0_cs35l56_2_l23[] = {
324	{
325		.mask = BIT(0),
326		.num_adr = ARRAY_SIZE(cs42l43_0_adr),
327		.adr_d = cs42l43_0_adr,
328	},
329	{
330		.mask = BIT(2),
331		.num_adr = ARRAY_SIZE(cs35l56_2_r1_adr),
332		.adr_d = cs35l56_2_r1_adr,
333	},
334	{
335		.mask = BIT(3),
336		.num_adr = ARRAY_SIZE(cs35l56_3_l3_adr),
337		.adr_d = cs35l56_3_l3_adr,
338	},
339	{}
340};
341
342static const struct snd_soc_acpi_link_adr arl_cs42l43_l0_cs35l56_3_l23[] = {
343	{
344		.mask = BIT(0),
345		.num_adr = ARRAY_SIZE(cs42l43_0_adr),
346		.adr_d = cs42l43_0_adr,
347	},
348	{
349		.mask = BIT(2),
350		.num_adr = ARRAY_SIZE(cs35l56_2_r3_adr),
351		.adr_d = cs35l56_2_r3_adr,
352	},
353	{
354		.mask = BIT(3),
355		.num_adr = ARRAY_SIZE(cs35l56_3_l1_adr),
356		.adr_d = cs35l56_3_l1_adr,
357	},
358	{}
359};
360
361static const struct snd_soc_acpi_link_adr arl_rvp[] = {
362	{
363		.mask = BIT(0),
364		.num_adr = ARRAY_SIZE(rt711_0_adr),
365		.adr_d = rt711_0_adr,
366	},
367	{}
368};
369
370static const struct snd_soc_acpi_link_adr arl_sdca_rvp[] = {
371	{
372		.mask = BIT(0),
373		.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
374		.adr_d = rt711_sdca_0_adr,
375	},
376	{}
377};
378
379static const struct snd_soc_acpi_link_adr arl_rt711_l0_rt1316_l3[] = {
380	{
381		.mask = BIT(0),
382		.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
383		.adr_d = rt711_sdca_0_adr,
384	},
385	{
386		.mask = BIT(3),
387		.num_adr = ARRAY_SIZE(rt1316_3_single_adr),
388		.adr_d = rt1316_3_single_adr,
389	},
390	{}
391};
392
393static const struct snd_soc_acpi_link_adr arl_rt722_l0_rt1320_l2[] = {
394	{
395		.mask = BIT(0),
396		.num_adr = ARRAY_SIZE(rt722_0_agg_adr),
397		.adr_d = rt722_0_agg_adr,
398	},
399	{
400		.mask = BIT(2),
401		.num_adr = ARRAY_SIZE(rt1320_2_single_adr),
402		.adr_d = rt1320_2_single_adr,
403	},
404	{}
405};
406
407static const struct snd_soc_acpi_codecs arl_essx_83x6 = {
408	.num_codecs = 3,
409	.codecs = { "ESSX8316", "ESSX8326", "ESSX8336"},
410};
411
412static const struct snd_soc_acpi_codecs arl_rt5682_hp = {
413	.num_codecs = 2,
414	.codecs = {RT5682_ACPI_HID, RT5682S_ACPI_HID},
415};
416
417static const struct snd_soc_acpi_codecs arl_lt6911_hdmi = {
418	.num_codecs = 1,
419	.codecs = {"INTC10B0"}
420};
421
422struct snd_soc_acpi_mach snd_soc_acpi_intel_arl_machines[] = {
423	{
424		.comp_ids = &arl_essx_83x6,
425		.drv_name = "arl_es83x6_c1_h02",
426		.machine_quirk = snd_soc_acpi_codec_list,
427		.quirk_data = &arl_lt6911_hdmi,
428		.sof_tplg_filename = "sof-arl-es83x6-ssp1-hdmi-ssp02.tplg",
429	},
430	{
431		.comp_ids = &arl_essx_83x6,
432		.drv_name = "sof-essx8336",
433		.sof_tplg_filename = "sof-arl-es8336", /* the tplg suffix is added at run time */
434		.tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER |
435			SND_SOC_ACPI_TPLG_INTEL_SSP_MSB |
436			SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER,
437	},
438	{
439		.comp_ids = &arl_rt5682_hp,
440		.drv_name = "arl_rt5682_c1_h02",
441		.machine_quirk = snd_soc_acpi_codec_list,
442		.quirk_data = &arl_lt6911_hdmi,
443		.sof_tplg_filename = "sof-arl-rt5682-ssp1-hdmi-ssp02.tplg",
444	},
445	/* place amp-only boards in the end of table */
446	{
447		.id = "INTC10B0",
448		.drv_name = "arl_lt6911_hdmi_ssp",
449		.sof_tplg_filename = "sof-arl-hdmi-ssp02.tplg",
450	},
451	{},
452};
453EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_arl_machines);
454
455/* this table is used when there is no I2S codec present */
456struct snd_soc_acpi_mach snd_soc_acpi_intel_arl_sdw_machines[] = {
457	{
458		.link_mask = BIT(0) | BIT(2) | BIT(3),
459		.links = arl_cs42l43_l0_cs35l56_l23,
460		.drv_name = "sof_sdw",
461		.sof_tplg_filename = "sof-arl-cs42l43-l0-cs35l56-l23.tplg",
462		.get_function_tplg_files = sof_sdw_get_tplg_files,
463	},
464	{
465		.link_mask = BIT(0) | BIT(2) | BIT(3),
466		.links = arl_cs42l43_l0_cs35l56_2_l23,
467		.drv_name = "sof_sdw",
468		.sof_tplg_filename = "sof-arl-cs42l43-l0-cs35l56-l23.tplg",
469		.get_function_tplg_files = sof_sdw_get_tplg_files,
470	},
471	{
472		.link_mask = BIT(0) | BIT(2) | BIT(3),
473		.links = arl_cs42l43_l0_cs35l56_3_l23,
474		.drv_name = "sof_sdw",
475		.sof_tplg_filename = "sof-arl-cs42l43-l0-cs35l56-l23.tplg",
476		.get_function_tplg_files = sof_sdw_get_tplg_files,
477	},
478	{
479		.link_mask = BIT(0) | BIT(2),
480		.links = arl_cs42l43_l0_cs35l56_l2,
481		.drv_name = "sof_sdw",
482		.sof_tplg_filename = "sof-arl-cs42l43-l0-cs35l56-l2.tplg",
483		.get_function_tplg_files = sof_sdw_get_tplg_files,
484	},
485	{
486		.link_mask = BIT(0),
487		.links = arl_cs42l43_l0,
488		.drv_name = "sof_sdw",
489		.sof_tplg_filename = "sof-arl-cs42l43-l0.tplg",
490		.get_function_tplg_files = sof_sdw_get_tplg_files,
491	},
492	{
493		.link_mask = BIT(2) | BIT(3),
494		.links = arl_cs42l43_l2_cs35l56_l3,
495		.drv_name = "sof_sdw",
496		.sof_tplg_filename = "sof-arl-cs42l43-l2-cs35l56-l3.tplg",
497		.get_function_tplg_files = sof_sdw_get_tplg_files,
498	},
499	{
500		.link_mask = BIT(2),
501		.links = arl_cs42l43_l2,
502		.drv_name = "sof_sdw",
503		.sof_tplg_filename = "sof-arl-cs42l43-l2.tplg",
504		.get_function_tplg_files = sof_sdw_get_tplg_files,
505	},
506	{
507		.link_mask = BIT(0) | BIT(3),
508		.links = arl_rt711_l0_rt1316_l3,
509		.drv_name = "sof_sdw",
510		.sof_tplg_filename = "sof-arl-rt711-l0-rt1316-l3.tplg",
511	},
512	{
513		.link_mask = 0x1, /* link0 required */
514		.links = arl_rvp,
515		.drv_name = "sof_sdw",
516		.sof_tplg_filename = "sof-arl-rt711.tplg",
517	},
518	{
519		.link_mask = 0x1, /* link0 required */
520		.links = arl_sdca_rvp,
521		.drv_name = "sof_sdw",
522		.sof_tplg_filename = "sof-arl-rt711-l0.tplg",
523	},
524	{
525		.link_mask = BIT(0) | BIT(2),
526		.links = arl_rt722_l0_rt1320_l2,
527		.drv_name = "sof_sdw",
528		.sof_tplg_filename = "sof-arl-rt722-l0_rt1320-l2.tplg",
529		.get_function_tplg_files = sof_sdw_get_tplg_files,
530	},
531	{},
532};
533EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_arl_sdw_machines);
~/ Read-only file preview.