182d9d54aSJaroslav Kysela // SPDX-License-Identifier: GPL-2.0
282d9d54aSJaroslav Kysela // Copyright (c) 2019 Jaroslav Kysela <perex@perex.cz>
382d9d54aSJaroslav Kysela
406508575SPierre-Louis Bossart #include <linux/acpi.h>
582d9d54aSJaroslav Kysela #include <linux/bits.h>
682d9d54aSJaroslav Kysela #include <linux/dmi.h>
782d9d54aSJaroslav Kysela #include <linux/module.h>
882d9d54aSJaroslav Kysela #include <linux/pci.h>
906508575SPierre-Louis Bossart #include <linux/soundwire/sdw.h>
1006508575SPierre-Louis Bossart #include <linux/soundwire/sdw_intel.h>
1182d9d54aSJaroslav Kysela #include <sound/core.h>
1282d9d54aSJaroslav Kysela #include <sound/intel-dsp-config.h>
1382d9d54aSJaroslav Kysela #include <sound/intel-nhlt.h>
14de24d97fSPierre-Louis Bossart #include <sound/soc-acpi.h>
1582d9d54aSJaroslav Kysela
1682d9d54aSJaroslav Kysela static int dsp_driver;
1782d9d54aSJaroslav Kysela
1882d9d54aSJaroslav Kysela module_param(dsp_driver, int, 0444);
19*83de3aceSPeter Ujfalusi MODULE_PARM_DESC(dsp_driver, "Force the DSP driver for Intel DSP (0=auto, 1=legacy, 2=SST, 3=SOF, 4=AVS)");
2082d9d54aSJaroslav Kysela
2182d9d54aSJaroslav Kysela #define FLAG_SST BIT(0)
2282d9d54aSJaroslav Kysela #define FLAG_SOF BIT(1)
23df1fceacSCezary Rojewski #define FLAG_SST_ONLY_IF_DMIC BIT(15)
2482d9d54aSJaroslav Kysela #define FLAG_SOF_ONLY_IF_DMIC BIT(16)
2506508575SPierre-Louis Bossart #define FLAG_SOF_ONLY_IF_SOUNDWIRE BIT(17)
2606508575SPierre-Louis Bossart
2706508575SPierre-Louis Bossart #define FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE (FLAG_SOF_ONLY_IF_DMIC | \
2806508575SPierre-Louis Bossart FLAG_SOF_ONLY_IF_SOUNDWIRE)
2982d9d54aSJaroslav Kysela
3082d9d54aSJaroslav Kysela struct config_entry {
3182d9d54aSJaroslav Kysela u32 flags;
3282d9d54aSJaroslav Kysela u16 device;
33b5682305SPierre-Louis Bossart u8 acpi_hid[ACPI_ID_LEN];
3482d9d54aSJaroslav Kysela const struct dmi_system_id *dmi_table;
35de24d97fSPierre-Louis Bossart const struct snd_soc_acpi_codecs *codec_hid;
36de24d97fSPierre-Louis Bossart };
37de24d97fSPierre-Louis Bossart
38de24d97fSPierre-Louis Bossart static const struct snd_soc_acpi_codecs __maybe_unused essx_83x6 = {
39de24d97fSPierre-Louis Bossart .num_codecs = 3,
40de24d97fSPierre-Louis Bossart .codecs = { "ESSX8316", "ESSX8326", "ESSX8336"},
4182d9d54aSJaroslav Kysela };
4282d9d54aSJaroslav Kysela
4382d9d54aSJaroslav Kysela /*
4482d9d54aSJaroslav Kysela * configuration table
4582d9d54aSJaroslav Kysela * - the order of similar PCI ID entries is important!
4682d9d54aSJaroslav Kysela * - the first successful match will win
4782d9d54aSJaroslav Kysela */
4882d9d54aSJaroslav Kysela static const struct config_entry config_table[] = {
4982d9d54aSJaroslav Kysela /* Merrifield */
5082d9d54aSJaroslav Kysela #if IS_ENABLED(CONFIG_SND_SOC_SOF_MERRIFIELD)
5182d9d54aSJaroslav Kysela {
5282d9d54aSJaroslav Kysela .flags = FLAG_SOF,
530cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_SST_TNG,
5482d9d54aSJaroslav Kysela },
5582d9d54aSJaroslav Kysela #endif
56cc8f81c7SPierre-Louis Bossart /*
57cc8f81c7SPierre-Louis Bossart * Apollolake (Broxton-P)
58b79de57bSPierre-Louis Bossart * the legacy HDAudio driver is used except on Up Squared (SOF) and
599d36ceabSPierre-Louis Bossart * Chromebooks (SST), as well as devices based on the ES8336 codec
60cc8f81c7SPierre-Louis Bossart */
6182d9d54aSJaroslav Kysela #if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE)
6282d9d54aSJaroslav Kysela {
6382d9d54aSJaroslav Kysela .flags = FLAG_SOF,
640cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_APL,
6582d9d54aSJaroslav Kysela .dmi_table = (const struct dmi_system_id []) {
6682d9d54aSJaroslav Kysela {
6782d9d54aSJaroslav Kysela .ident = "Up Squared",
6882d9d54aSJaroslav Kysela .matches = {
6982d9d54aSJaroslav Kysela DMI_MATCH(DMI_SYS_VENDOR, "AAEON"),
7082d9d54aSJaroslav Kysela DMI_MATCH(DMI_BOARD_NAME, "UP-APL01"),
7182d9d54aSJaroslav Kysela }
7282d9d54aSJaroslav Kysela },
7382d9d54aSJaroslav Kysela {}
7482d9d54aSJaroslav Kysela }
7582d9d54aSJaroslav Kysela },
769d36ceabSPierre-Louis Bossart {
779d36ceabSPierre-Louis Bossart .flags = FLAG_SOF,
780cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_APL,
79de24d97fSPierre-Louis Bossart .codec_hid = &essx_83x6,
809d36ceabSPierre-Louis Bossart },
8182d9d54aSJaroslav Kysela #endif
8282d9d54aSJaroslav Kysela #if IS_ENABLED(CONFIG_SND_SOC_INTEL_APL)
8382d9d54aSJaroslav Kysela {
8482d9d54aSJaroslav Kysela .flags = FLAG_SST,
850cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_APL,
86cc8f81c7SPierre-Louis Bossart .dmi_table = (const struct dmi_system_id []) {
87cc8f81c7SPierre-Louis Bossart {
88cc8f81c7SPierre-Louis Bossart .ident = "Google Chromebooks",
89cc8f81c7SPierre-Louis Bossart .matches = {
90cc8f81c7SPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "Google"),
91cc8f81c7SPierre-Louis Bossart }
92cc8f81c7SPierre-Louis Bossart },
93cc8f81c7SPierre-Louis Bossart {}
94cc8f81c7SPierre-Louis Bossart }
9582d9d54aSJaroslav Kysela },
9682d9d54aSJaroslav Kysela #endif
97cc8f81c7SPierre-Louis Bossart /*
98b79de57bSPierre-Louis Bossart * Skylake and Kabylake use legacy HDAudio driver except for Google
99cc8f81c7SPierre-Louis Bossart * Chromebooks (SST)
100cc8f81c7SPierre-Louis Bossart */
101cc8f81c7SPierre-Louis Bossart
102cc8f81c7SPierre-Louis Bossart /* Sunrise Point-LP */
103cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_SKL)
104cc8f81c7SPierre-Louis Bossart {
105cc8f81c7SPierre-Louis Bossart .flags = FLAG_SST,
1060cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_SKL_LP,
107cc8f81c7SPierre-Louis Bossart .dmi_table = (const struct dmi_system_id []) {
108cc8f81c7SPierre-Louis Bossart {
109cc8f81c7SPierre-Louis Bossart .ident = "Google Chromebooks",
110cc8f81c7SPierre-Louis Bossart .matches = {
111cc8f81c7SPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "Google"),
112cc8f81c7SPierre-Louis Bossart }
113cc8f81c7SPierre-Louis Bossart },
114cc8f81c7SPierre-Louis Bossart {}
115cc8f81c7SPierre-Louis Bossart }
116cc8f81c7SPierre-Louis Bossart },
117df1fceacSCezary Rojewski {
118df1fceacSCezary Rojewski .flags = FLAG_SST | FLAG_SST_ONLY_IF_DMIC,
1190cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_SKL_LP,
120df1fceacSCezary Rojewski },
121cc8f81c7SPierre-Louis Bossart #endif
122cc8f81c7SPierre-Louis Bossart /* Kabylake-LP */
123cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_KBL)
124cc8f81c7SPierre-Louis Bossart {
125cc8f81c7SPierre-Louis Bossart .flags = FLAG_SST,
1260cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_KBL_LP,
127cc8f81c7SPierre-Louis Bossart .dmi_table = (const struct dmi_system_id []) {
128cc8f81c7SPierre-Louis Bossart {
129cc8f81c7SPierre-Louis Bossart .ident = "Google Chromebooks",
130cc8f81c7SPierre-Louis Bossart .matches = {
131cc8f81c7SPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "Google"),
132cc8f81c7SPierre-Louis Bossart }
133cc8f81c7SPierre-Louis Bossart },
134cc8f81c7SPierre-Louis Bossart {}
135cc8f81c7SPierre-Louis Bossart }
136cc8f81c7SPierre-Louis Bossart },
137df1fceacSCezary Rojewski {
138df1fceacSCezary Rojewski .flags = FLAG_SST | FLAG_SST_ONLY_IF_DMIC,
1390cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_KBL_LP,
140df1fceacSCezary Rojewski },
141cc8f81c7SPierre-Louis Bossart #endif
142cc8f81c7SPierre-Louis Bossart
143cc8f81c7SPierre-Louis Bossart /*
144b79de57bSPierre-Louis Bossart * Geminilake uses legacy HDAudio driver except for Google
1459d36ceabSPierre-Louis Bossart * Chromebooks and devices based on the ES8336 codec
146cc8f81c7SPierre-Louis Bossart */
147cc8f81c7SPierre-Louis Bossart /* Geminilake */
148cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_GEMINILAKE)
149cc8f81c7SPierre-Louis Bossart {
150cc8f81c7SPierre-Louis Bossart .flags = FLAG_SOF,
1510cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_GML,
152cc8f81c7SPierre-Louis Bossart .dmi_table = (const struct dmi_system_id []) {
153cc8f81c7SPierre-Louis Bossart {
154cc8f81c7SPierre-Louis Bossart .ident = "Google Chromebooks",
155cc8f81c7SPierre-Louis Bossart .matches = {
156cc8f81c7SPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "Google"),
157cc8f81c7SPierre-Louis Bossart }
158cc8f81c7SPierre-Louis Bossart },
159cc8f81c7SPierre-Louis Bossart {}
160cc8f81c7SPierre-Louis Bossart }
161cc8f81c7SPierre-Louis Bossart },
1629d36ceabSPierre-Louis Bossart {
1639d36ceabSPierre-Louis Bossart .flags = FLAG_SOF,
1640cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_GML,
165de24d97fSPierre-Louis Bossart .codec_hid = &essx_83x6,
1669d36ceabSPierre-Louis Bossart },
167cc8f81c7SPierre-Louis Bossart #endif
168cc8f81c7SPierre-Louis Bossart
169cc8f81c7SPierre-Louis Bossart /*
170905240d1SBrady Norander * CoffeeLake, CannonLake, CometLake, IceLake, TigerLake, AlderLake,
171905240d1SBrady Norander * RaptorLake use legacy HDAudio driver except for Google Chromebooks
172905240d1SBrady Norander * and when DMICs are present. Two cases are required since Coreboot
173905240d1SBrady Norander * does not expose NHLT tables.
174cc8f81c7SPierre-Louis Bossart *
175cc8f81c7SPierre-Louis Bossart * When the Chromebook quirk is not present, it's based on information
176cc8f81c7SPierre-Louis Bossart * that no such device exists. When the quirk is present, it could be
177cc8f81c7SPierre-Louis Bossart * either based on product information or a placeholder.
178cc8f81c7SPierre-Louis Bossart */
179cc8f81c7SPierre-Louis Bossart
18082d9d54aSJaroslav Kysela /* Cannonlake */
18182d9d54aSJaroslav Kysela #if IS_ENABLED(CONFIG_SND_SOC_SOF_CANNONLAKE)
18282d9d54aSJaroslav Kysela {
183cc8f81c7SPierre-Louis Bossart .flags = FLAG_SOF,
1840cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_CNL_LP,
185cc8f81c7SPierre-Louis Bossart .dmi_table = (const struct dmi_system_id []) {
186cc8f81c7SPierre-Louis Bossart {
187cc8f81c7SPierre-Louis Bossart .ident = "Google Chromebooks",
188cc8f81c7SPierre-Louis Bossart .matches = {
189cc8f81c7SPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "Google"),
190cc8f81c7SPierre-Louis Bossart }
191cc8f81c7SPierre-Louis Bossart },
19233fa35dbSPierre-Louis Bossart {
19333fa35dbSPierre-Louis Bossart .ident = "UP-WHL",
19433fa35dbSPierre-Louis Bossart .matches = {
19533fa35dbSPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "AAEON"),
19633fa35dbSPierre-Louis Bossart }
19733fa35dbSPierre-Louis Bossart },
198cc8f81c7SPierre-Louis Bossart {}
199cc8f81c7SPierre-Louis Bossart }
200cc8f81c7SPierre-Louis Bossart },
201cc8f81c7SPierre-Louis Bossart {
202cded07a2SPierre-Louis Bossart .flags = FLAG_SOF,
2030cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_CNL_LP,
204cded07a2SPierre-Louis Bossart .codec_hid = &essx_83x6,
205cded07a2SPierre-Louis Bossart },
206cded07a2SPierre-Louis Bossart {
20706508575SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
2080cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_CNL_LP,
20982d9d54aSJaroslav Kysela },
21082d9d54aSJaroslav Kysela #endif
211cc8f81c7SPierre-Louis Bossart
21282d9d54aSJaroslav Kysela /* Coffelake */
21382d9d54aSJaroslav Kysela #if IS_ENABLED(CONFIG_SND_SOC_SOF_COFFEELAKE)
21482d9d54aSJaroslav Kysela {
215cc8f81c7SPierre-Louis Bossart .flags = FLAG_SOF,
2160cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_CNL_H,
217cc8f81c7SPierre-Louis Bossart .dmi_table = (const struct dmi_system_id []) {
218cc8f81c7SPierre-Louis Bossart {
219cc8f81c7SPierre-Louis Bossart .ident = "Google Chromebooks",
220cc8f81c7SPierre-Louis Bossart .matches = {
221cc8f81c7SPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "Google"),
222cc8f81c7SPierre-Louis Bossart }
223cc8f81c7SPierre-Louis Bossart },
224cc8f81c7SPierre-Louis Bossart {}
225cc8f81c7SPierre-Louis Bossart }
226cc8f81c7SPierre-Louis Bossart },
227cc8f81c7SPierre-Louis Bossart {
22806508575SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
2290cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_CNL_H,
23082d9d54aSJaroslav Kysela },
23182d9d54aSJaroslav Kysela #endif
232cc8f81c7SPierre-Louis Bossart
2334228668eSPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE)
234cc8f81c7SPierre-Louis Bossart /* Cometlake-LP */
235cc8f81c7SPierre-Louis Bossart {
236cc8f81c7SPierre-Louis Bossart .flags = FLAG_SOF,
2370cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_CML_LP,
238cc8f81c7SPierre-Louis Bossart .dmi_table = (const struct dmi_system_id []) {
239cc8f81c7SPierre-Louis Bossart {
240cc8f81c7SPierre-Louis Bossart .ident = "Google Chromebooks",
241cc8f81c7SPierre-Louis Bossart .matches = {
242cc8f81c7SPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "Google"),
243cc8f81c7SPierre-Louis Bossart }
244cc8f81c7SPierre-Louis Bossart },
24506508575SPierre-Louis Bossart {
24606508575SPierre-Louis Bossart .matches = {
24706508575SPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"),
24806508575SPierre-Louis Bossart DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "09C6")
24906508575SPierre-Louis Bossart },
25006508575SPierre-Louis Bossart },
25106508575SPierre-Louis Bossart {
25206508575SPierre-Louis Bossart /* early version of SKU 09C6 */
25306508575SPierre-Louis Bossart .matches = {
25406508575SPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"),
25506508575SPierre-Louis Bossart DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0983")
25606508575SPierre-Louis Bossart },
25706508575SPierre-Louis Bossart },
258cc8f81c7SPierre-Louis Bossart {}
259cc8f81c7SPierre-Louis Bossart }
260cc8f81c7SPierre-Louis Bossart },
261cc8f81c7SPierre-Louis Bossart {
262ae26c08eSPierre-Louis Bossart .flags = FLAG_SOF,
2630cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_CML_LP,
264de24d97fSPierre-Louis Bossart .codec_hid = &essx_83x6,
265ae26c08eSPierre-Louis Bossart },
266081c7370SBrent Lu {
267081c7370SBrent Lu .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
2680cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_CML_LP,
269081c7370SBrent Lu },
270cc8f81c7SPierre-Louis Bossart /* Cometlake-H */
271cc8f81c7SPierre-Louis Bossart {
27206508575SPierre-Louis Bossart .flags = FLAG_SOF,
2730cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_CML_H,
27406508575SPierre-Louis Bossart .dmi_table = (const struct dmi_system_id []) {
27506508575SPierre-Louis Bossart {
27606508575SPierre-Louis Bossart .matches = {
27706508575SPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"),
27806508575SPierre-Louis Bossart DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "098F"),
27906508575SPierre-Louis Bossart },
28006508575SPierre-Louis Bossart },
28106508575SPierre-Louis Bossart {
28206508575SPierre-Louis Bossart .matches = {
28306508575SPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"),
28406508575SPierre-Louis Bossart DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0990"),
28506508575SPierre-Louis Bossart },
28606508575SPierre-Louis Bossart },
28706508575SPierre-Louis Bossart {}
28806508575SPierre-Louis Bossart }
28906508575SPierre-Louis Bossart },
29006508575SPierre-Louis Bossart {
291ae26c08eSPierre-Louis Bossart .flags = FLAG_SOF,
2920cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_CML_H,
293de24d97fSPierre-Louis Bossart .codec_hid = &essx_83x6,
294ae26c08eSPierre-Louis Bossart },
295081c7370SBrent Lu {
296081c7370SBrent Lu .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
2970cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_CML_H,
298081c7370SBrent Lu },
299cc8f81c7SPierre-Louis Bossart #endif
300cc8f81c7SPierre-Louis Bossart
301cc8f81c7SPierre-Louis Bossart /* Icelake */
302cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_ICELAKE)
303cc8f81c7SPierre-Louis Bossart {
304cc8f81c7SPierre-Louis Bossart .flags = FLAG_SOF,
3050cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ICL_LP,
306cc8f81c7SPierre-Louis Bossart .dmi_table = (const struct dmi_system_id []) {
307cc8f81c7SPierre-Louis Bossart {
308cc8f81c7SPierre-Louis Bossart .ident = "Google Chromebooks",
309cc8f81c7SPierre-Louis Bossart .matches = {
310cc8f81c7SPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "Google"),
311cc8f81c7SPierre-Louis Bossart }
312cc8f81c7SPierre-Louis Bossart },
313cc8f81c7SPierre-Louis Bossart {}
314cc8f81c7SPierre-Louis Bossart }
315cc8f81c7SPierre-Louis Bossart },
316cc8f81c7SPierre-Louis Bossart {
3175d73263fSPierre-Louis Bossart .flags = FLAG_SOF,
3180cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ICL_LP,
3195d73263fSPierre-Louis Bossart .codec_hid = &essx_83x6,
3205d73263fSPierre-Louis Bossart },
3215d73263fSPierre-Louis Bossart {
32206508575SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
3230cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ICL_LP,
324cc8f81c7SPierre-Louis Bossart },
325cc8f81c7SPierre-Louis Bossart #endif
326cc8f81c7SPierre-Louis Bossart
327fa9730b4SPierre-Louis Bossart /* Jasper Lake */
328fa9730b4SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_JASPERLAKE)
329fa9730b4SPierre-Louis Bossart {
330fa9730b4SPierre-Louis Bossart .flags = FLAG_SOF,
3310cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_JSL_N,
33219980aa1SBrent Lu .dmi_table = (const struct dmi_system_id []) {
33319980aa1SBrent Lu {
33419980aa1SBrent Lu .ident = "Google Chromebooks",
33519980aa1SBrent Lu .matches = {
33619980aa1SBrent Lu DMI_MATCH(DMI_SYS_VENDOR, "Google"),
33719980aa1SBrent Lu }
33819980aa1SBrent Lu },
339f09e16ebSMark Hasemeyer {
340f09e16ebSMark Hasemeyer .ident = "Google firmware",
341f09e16ebSMark Hasemeyer .matches = {
342f09e16ebSMark Hasemeyer DMI_MATCH(DMI_BIOS_VERSION, "Google"),
343f09e16ebSMark Hasemeyer }
344f09e16ebSMark Hasemeyer },
34519980aa1SBrent Lu {}
34619980aa1SBrent Lu }
34719980aa1SBrent Lu },
34819980aa1SBrent Lu {
34919980aa1SBrent Lu .flags = FLAG_SOF,
3500cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_JSL_N,
351de24d97fSPierre-Louis Bossart .codec_hid = &essx_83x6,
352fa9730b4SPierre-Louis Bossart },
35319980aa1SBrent Lu {
35419980aa1SBrent Lu .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
3550cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_JSL_N,
35619980aa1SBrent Lu },
357fa9730b4SPierre-Louis Bossart #endif
358fa9730b4SPierre-Louis Bossart
359cc8f81c7SPierre-Louis Bossart /* Tigerlake */
360cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_TIGERLAKE)
361cc8f81c7SPierre-Louis Bossart {
362cc8f81c7SPierre-Louis Bossart .flags = FLAG_SOF,
3630cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_TGL_LP,
364cc8f81c7SPierre-Louis Bossart .dmi_table = (const struct dmi_system_id []) {
365cc8f81c7SPierre-Louis Bossart {
366cc8f81c7SPierre-Louis Bossart .ident = "Google Chromebooks",
367cc8f81c7SPierre-Louis Bossart .matches = {
368cc8f81c7SPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "Google"),
369cc8f81c7SPierre-Louis Bossart }
370cc8f81c7SPierre-Louis Bossart },
37133fa35dbSPierre-Louis Bossart {
37233fa35dbSPierre-Louis Bossart .ident = "UPX-TGL",
37333fa35dbSPierre-Louis Bossart .matches = {
37433fa35dbSPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "AAEON"),
37533fa35dbSPierre-Louis Bossart }
37633fa35dbSPierre-Louis Bossart },
377cc8f81c7SPierre-Louis Bossart {}
378cc8f81c7SPierre-Louis Bossart }
379cc8f81c7SPierre-Louis Bossart },
380cc8f81c7SPierre-Louis Bossart {
381081c7370SBrent Lu .flags = FLAG_SOF,
3820cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_TGL_LP,
383de24d97fSPierre-Louis Bossart .codec_hid = &essx_83x6,
384081c7370SBrent Lu },
385081c7370SBrent Lu {
38606508575SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
3870cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_TGL_LP,
388cc8f81c7SPierre-Louis Bossart },
389c5b5ff60SBard Liao {
390c5b5ff60SBard Liao .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
3910cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_TGL_H,
392c5b5ff60SBard Liao },
393cc8f81c7SPierre-Louis Bossart #endif
394cc8f81c7SPierre-Louis Bossart
395cc8f81c7SPierre-Louis Bossart /* Elkhart Lake */
396cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_ELKHARTLAKE)
397cc8f81c7SPierre-Louis Bossart {
398cc8f81c7SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
3990cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_EHL_0,
400cc8f81c7SPierre-Louis Bossart },
401114613f6SPierre-Louis Bossart {
402114613f6SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
4030cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_EHL_3,
404114613f6SPierre-Louis Bossart },
405cc8f81c7SPierre-Louis Bossart #endif
406cc8f81c7SPierre-Louis Bossart
4070cd0a7c2SAmadeusz Sławiński /* Alder Lake / Raptor Lake */
408c4294d7fSKai Vehmanen #if IS_ENABLED(CONFIG_SND_SOC_SOF_ALDERLAKE)
409c4294d7fSKai Vehmanen {
410c4294d7fSKai Vehmanen .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4110cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_S,
412c4294d7fSKai Vehmanen },
413d52eee98SPierre-Louis Bossart {
414d52eee98SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4150cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_RPL_S,
416d52eee98SPierre-Louis Bossart },
417c4294d7fSKai Vehmanen {
4182ec8b081SMuralidhar Reddy .flags = FLAG_SOF,
4190cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_P,
420905240d1SBrady Norander .dmi_table = (const struct dmi_system_id []) {
421905240d1SBrady Norander {
422905240d1SBrady Norander .ident = "Google Chromebooks",
423905240d1SBrady Norander .matches = {
424905240d1SBrady Norander DMI_MATCH(DMI_SYS_VENDOR, "Google"),
425905240d1SBrady Norander }
426905240d1SBrady Norander },
427905240d1SBrady Norander {}
428905240d1SBrady Norander }
429905240d1SBrady Norander },
430905240d1SBrady Norander {
431905240d1SBrady Norander .flags = FLAG_SOF,
432905240d1SBrady Norander .device = PCI_DEVICE_ID_INTEL_HDA_ADL_P,
4332ec8b081SMuralidhar Reddy .codec_hid = &essx_83x6,
4342ec8b081SMuralidhar Reddy },
4352ec8b081SMuralidhar Reddy {
436c4294d7fSKai Vehmanen .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4370cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_P,
438c4294d7fSKai Vehmanen },
4394ad7935dSKai Vehmanen {
4404ad7935dSKai Vehmanen .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4410cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_PX,
442ca1ece24SKai Vehmanen },
443d52eee98SPierre-Louis Bossart {
4449db1c9faSMuralidhar Reddy .flags = FLAG_SOF,
4450cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_PS,
4469db1c9faSMuralidhar Reddy .codec_hid = &essx_83x6,
4479db1c9faSMuralidhar Reddy },
4489db1c9faSMuralidhar Reddy {
449d52eee98SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4500cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_PS,
451b07908abSGongjun Song },
452b07908abSGongjun Song {
453b07908abSGongjun Song .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4540cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_M,
455b07908abSGongjun Song },
456c35fbea4SPierre-Louis Bossart {
457905240d1SBrady Norander .flags = FLAG_SOF,
458905240d1SBrady Norander .device = PCI_DEVICE_ID_INTEL_HDA_ADL_N,
459905240d1SBrady Norander .dmi_table = (const struct dmi_system_id []) {
460905240d1SBrady Norander {
461905240d1SBrady Norander .ident = "Google Chromebooks",
462905240d1SBrady Norander .matches = {
463905240d1SBrady Norander DMI_MATCH(DMI_SYS_VENDOR, "Google"),
464905240d1SBrady Norander }
465905240d1SBrady Norander },
466905240d1SBrady Norander {}
467905240d1SBrady Norander }
468905240d1SBrady Norander },
469905240d1SBrady Norander {
470c35fbea4SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4710cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_N,
472c35fbea4SPierre-Louis Bossart },
473c35fbea4SPierre-Louis Bossart {
474905240d1SBrady Norander .flags = FLAG_SOF,
475905240d1SBrady Norander .device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_0,
476905240d1SBrady Norander .dmi_table = (const struct dmi_system_id []) {
477905240d1SBrady Norander {
478905240d1SBrady Norander .ident = "Google Chromebooks",
479905240d1SBrady Norander .matches = {
480905240d1SBrady Norander DMI_MATCH(DMI_SYS_VENDOR, "Google"),
481905240d1SBrady Norander }
482905240d1SBrady Norander },
483905240d1SBrady Norander {}
484905240d1SBrady Norander }
485905240d1SBrady Norander },
486905240d1SBrady Norander {
487c35fbea4SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
4880cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_0,
4890cd0a7c2SAmadeusz Sławiński },
4900cd0a7c2SAmadeusz Sławiński {
491905240d1SBrady Norander .flags = FLAG_SOF,
492905240d1SBrady Norander .device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_1,
493905240d1SBrady Norander .dmi_table = (const struct dmi_system_id []) {
494905240d1SBrady Norander {
495905240d1SBrady Norander .ident = "Google Chromebooks",
496905240d1SBrady Norander .matches = {
497905240d1SBrady Norander DMI_MATCH(DMI_SYS_VENDOR, "Google"),
498905240d1SBrady Norander }
499905240d1SBrady Norander },
500905240d1SBrady Norander {}
501905240d1SBrady Norander }
502905240d1SBrady Norander },
503905240d1SBrady Norander {
5040cd0a7c2SAmadeusz Sławiński .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
5050cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_1,
5060cd0a7c2SAmadeusz Sławiński },
5070cd0a7c2SAmadeusz Sławiński {
5080cd0a7c2SAmadeusz Sławiński .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
5090cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_RPL_M,
5100cd0a7c2SAmadeusz Sławiński },
5110cd0a7c2SAmadeusz Sławiński {
5120cd0a7c2SAmadeusz Sławiński .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
5130cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_RPL_PX,
514c35fbea4SPierre-Louis Bossart },
515c4294d7fSKai Vehmanen #endif
516c4294d7fSKai Vehmanen
517bbdf904bSBard Liao /* Meteor Lake */
518bbdf904bSBard Liao #if IS_ENABLED(CONFIG_SND_SOC_SOF_METEORLAKE)
519bbdf904bSBard Liao /* Meteorlake-P */
520bbdf904bSBard Liao {
521bbdf904bSBard Liao .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
52273e6ebf6SPierre-Louis Bossart .device = PCI_DEVICE_ID_INTEL_HDA_MTL,
523bbdf904bSBard Liao },
52470cb71c9SPierre-Louis Bossart /* ArrowLake-S */
52570cb71c9SPierre-Louis Bossart {
52670cb71c9SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
52770cb71c9SPierre-Louis Bossart .device = PCI_DEVICE_ID_INTEL_HDA_ARL_S,
52870cb71c9SPierre-Louis Bossart },
52970cb71c9SPierre-Louis Bossart /* ArrowLake */
53070cb71c9SPierre-Louis Bossart {
53170cb71c9SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
53270cb71c9SPierre-Louis Bossart .device = PCI_DEVICE_ID_INTEL_HDA_ARL,
53370cb71c9SPierre-Louis Bossart },
534bbdf904bSBard Liao #endif
535bbdf904bSBard Liao
536d2852b8cSPierre-Louis Bossart /* Lunar Lake */
537d2852b8cSPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_LUNARLAKE)
538d2852b8cSPierre-Louis Bossart /* Lunarlake-P */
539d2852b8cSPierre-Louis Bossart {
540d2852b8cSPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
541d2852b8cSPierre-Louis Bossart .device = PCI_DEVICE_ID_INTEL_HDA_LNL_P,
542d2852b8cSPierre-Louis Bossart },
543d2852b8cSPierre-Louis Bossart #endif
54482d9d54aSJaroslav Kysela };
54582d9d54aSJaroslav Kysela
snd_intel_dsp_find_config(struct pci_dev * pci,const struct config_entry * table,u32 len)54682d9d54aSJaroslav Kysela static const struct config_entry *snd_intel_dsp_find_config
54782d9d54aSJaroslav Kysela (struct pci_dev *pci, const struct config_entry *table, u32 len)
54882d9d54aSJaroslav Kysela {
54982d9d54aSJaroslav Kysela u16 device;
55082d9d54aSJaroslav Kysela
55182d9d54aSJaroslav Kysela device = pci->device;
55282d9d54aSJaroslav Kysela for (; len > 0; len--, table++) {
55382d9d54aSJaroslav Kysela if (table->device != device)
55482d9d54aSJaroslav Kysela continue;
55582d9d54aSJaroslav Kysela if (table->dmi_table && !dmi_check_system(table->dmi_table))
55682d9d54aSJaroslav Kysela continue;
557de24d97fSPierre-Louis Bossart if (table->codec_hid) {
558de24d97fSPierre-Louis Bossart int i;
559de24d97fSPierre-Louis Bossart
560cc73306bSPierre-Louis Bossart for (i = 0; i < table->codec_hid->num_codecs; i++) {
561cc73306bSPierre-Louis Bossart struct nhlt_acpi_table *nhlt;
562cc73306bSPierre-Louis Bossart bool ssp_found = false;
563cc73306bSPierre-Louis Bossart
564cc73306bSPierre-Louis Bossart if (!acpi_dev_present(table->codec_hid->codecs[i], NULL, -1))
565cc73306bSPierre-Louis Bossart continue;
566cc73306bSPierre-Louis Bossart
567cc73306bSPierre-Louis Bossart nhlt = intel_nhlt_init(&pci->dev);
568cc73306bSPierre-Louis Bossart if (!nhlt) {
569cc73306bSPierre-Louis Bossart dev_warn(&pci->dev, "%s: NHLT table not found, skipped HID %s\n",
570cc73306bSPierre-Louis Bossart __func__, table->codec_hid->codecs[i]);
571cc73306bSPierre-Louis Bossart continue;
572cc73306bSPierre-Louis Bossart }
573cc73306bSPierre-Louis Bossart
574cc73306bSPierre-Louis Bossart if (intel_nhlt_has_endpoint_type(nhlt, NHLT_LINK_SSP) &&
575cc73306bSPierre-Louis Bossart intel_nhlt_ssp_endpoint_mask(nhlt, NHLT_DEVICE_I2S))
576cc73306bSPierre-Louis Bossart ssp_found = true;
577cc73306bSPierre-Louis Bossart
578cc73306bSPierre-Louis Bossart intel_nhlt_free(nhlt);
579cc73306bSPierre-Louis Bossart
580cc73306bSPierre-Louis Bossart if (ssp_found)
581de24d97fSPierre-Louis Bossart break;
582cc73306bSPierre-Louis Bossart
583cc73306bSPierre-Louis Bossart dev_warn(&pci->dev, "%s: no valid SSP found for HID %s, skipped\n",
584cc73306bSPierre-Louis Bossart __func__, table->codec_hid->codecs[i]);
585cc73306bSPierre-Louis Bossart }
586de24d97fSPierre-Louis Bossart if (i == table->codec_hid->num_codecs)
5879d36ceabSPierre-Louis Bossart continue;
588de24d97fSPierre-Louis Bossart }
58982d9d54aSJaroslav Kysela return table;
59082d9d54aSJaroslav Kysela }
59182d9d54aSJaroslav Kysela return NULL;
59282d9d54aSJaroslav Kysela }
59382d9d54aSJaroslav Kysela
snd_intel_dsp_check_dmic(struct pci_dev * pci)59482d9d54aSJaroslav Kysela static int snd_intel_dsp_check_dmic(struct pci_dev *pci)
59582d9d54aSJaroslav Kysela {
59682d9d54aSJaroslav Kysela struct nhlt_acpi_table *nhlt;
59782d9d54aSJaroslav Kysela int ret = 0;
59882d9d54aSJaroslav Kysela
59982d9d54aSJaroslav Kysela nhlt = intel_nhlt_init(&pci->dev);
60082d9d54aSJaroslav Kysela if (nhlt) {
6018235a08bSAmadeusz Sławiński if (intel_nhlt_has_endpoint_type(nhlt, NHLT_LINK_DMIC))
60282d9d54aSJaroslav Kysela ret = 1;
60382d9d54aSJaroslav Kysela intel_nhlt_free(nhlt);
60482d9d54aSJaroslav Kysela }
60582d9d54aSJaroslav Kysela return ret;
60682d9d54aSJaroslav Kysela }
60782d9d54aSJaroslav Kysela
60806508575SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE)
snd_intel_dsp_check_soundwire(struct pci_dev * pci)60906508575SPierre-Louis Bossart static int snd_intel_dsp_check_soundwire(struct pci_dev *pci)
61006508575SPierre-Louis Bossart {
61106508575SPierre-Louis Bossart struct sdw_intel_acpi_info info;
61206508575SPierre-Louis Bossart acpi_handle handle;
61306508575SPierre-Louis Bossart int ret;
61406508575SPierre-Louis Bossart
61506508575SPierre-Louis Bossart handle = ACPI_HANDLE(&pci->dev);
61606508575SPierre-Louis Bossart
61706508575SPierre-Louis Bossart ret = sdw_intel_acpi_scan(handle, &info);
61806508575SPierre-Louis Bossart if (ret < 0)
61906508575SPierre-Louis Bossart return ret;
62006508575SPierre-Louis Bossart
62106508575SPierre-Louis Bossart return info.link_mask;
62206508575SPierre-Louis Bossart }
62306508575SPierre-Louis Bossart #else
snd_intel_dsp_check_soundwire(struct pci_dev * pci)62406508575SPierre-Louis Bossart static int snd_intel_dsp_check_soundwire(struct pci_dev *pci)
62506508575SPierre-Louis Bossart {
62606508575SPierre-Louis Bossart return 0;
62706508575SPierre-Louis Bossart }
62806508575SPierre-Louis Bossart #endif
62906508575SPierre-Louis Bossart
snd_intel_dsp_driver_probe(struct pci_dev * pci)63082d9d54aSJaroslav Kysela int snd_intel_dsp_driver_probe(struct pci_dev *pci)
63182d9d54aSJaroslav Kysela {
63282d9d54aSJaroslav Kysela const struct config_entry *cfg;
63382d9d54aSJaroslav Kysela
63491636a82STakashi Iwai /* Intel vendor only */
6350cd0a7c2SAmadeusz Sławiński if (pci->vendor != PCI_VENDOR_ID_INTEL)
63691636a82STakashi Iwai return SND_INTEL_DSP_DRIVER_ANY;
63791636a82STakashi Iwai
6380e5cc221SPierre-Louis Bossart /*
6390e5cc221SPierre-Louis Bossart * Legacy devices don't have a PCI-based DSP and use HDaudio
6400e5cc221SPierre-Louis Bossart * for HDMI/DP support, ignore kernel parameter
6410e5cc221SPierre-Louis Bossart */
6420e5cc221SPierre-Louis Bossart switch (pci->device) {
6430cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_BDW:
6440cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_HSW_0:
6450cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_HSW_2:
6460cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_HSW_3:
6470cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_BYT:
6480cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_BSW:
6490e5cc221SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_ANY;
6500e5cc221SPierre-Louis Bossart }
6510e5cc221SPierre-Louis Bossart
65282d9d54aSJaroslav Kysela if (dsp_driver > 0 && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST)
65382d9d54aSJaroslav Kysela return dsp_driver;
65482d9d54aSJaroslav Kysela
65582d9d54aSJaroslav Kysela /*
65682d9d54aSJaroslav Kysela * detect DSP by checking class/subclass/prog-id information
65782d9d54aSJaroslav Kysela * class=04 subclass 03 prog-if 00: no DSP, use legacy driver
65882d9d54aSJaroslav Kysela * class=04 subclass 01 prog-if 00: DSP is present
65982d9d54aSJaroslav Kysela * (and may be required e.g. for DMIC or SSP support)
66082d9d54aSJaroslav Kysela * class=04 subclass 03 prog-if 80: use DSP or legacy mode
66182d9d54aSJaroslav Kysela */
66282d9d54aSJaroslav Kysela if (pci->class == 0x040300)
66382d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_LEGACY;
66482d9d54aSJaroslav Kysela if (pci->class != 0x040100 && pci->class != 0x040380) {
665b79de57bSPierre-Louis Bossart dev_err(&pci->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, selecting HDAudio legacy driver\n", pci->class);
66682d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_LEGACY;
66782d9d54aSJaroslav Kysela }
66882d9d54aSJaroslav Kysela
66982d9d54aSJaroslav Kysela dev_info(&pci->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class);
67082d9d54aSJaroslav Kysela
67182d9d54aSJaroslav Kysela /* find the configuration for the specific device */
67282d9d54aSJaroslav Kysela cfg = snd_intel_dsp_find_config(pci, config_table, ARRAY_SIZE(config_table));
67382d9d54aSJaroslav Kysela if (!cfg)
67482d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_ANY;
67582d9d54aSJaroslav Kysela
67682d9d54aSJaroslav Kysela if (cfg->flags & FLAG_SOF) {
67706508575SPierre-Louis Bossart if (cfg->flags & FLAG_SOF_ONLY_IF_SOUNDWIRE &&
67806508575SPierre-Louis Bossart snd_intel_dsp_check_soundwire(pci) > 0) {
67906508575SPierre-Louis Bossart dev_info(&pci->dev, "SoundWire enabled on CannonLake+ platform, using SOF driver\n");
68006508575SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_SOF;
68106508575SPierre-Louis Bossart }
68206508575SPierre-Louis Bossart if (cfg->flags & FLAG_SOF_ONLY_IF_DMIC &&
68306508575SPierre-Louis Bossart snd_intel_dsp_check_dmic(pci)) {
68482d9d54aSJaroslav Kysela dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SOF driver\n");
68582d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_SOF;
68682d9d54aSJaroslav Kysela }
68706508575SPierre-Louis Bossart if (!(cfg->flags & FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE))
68882d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_SOF;
68982d9d54aSJaroslav Kysela }
69082d9d54aSJaroslav Kysela
691df1fceacSCezary Rojewski
692df1fceacSCezary Rojewski if (cfg->flags & FLAG_SST) {
693df1fceacSCezary Rojewski if (cfg->flags & FLAG_SST_ONLY_IF_DMIC) {
694df1fceacSCezary Rojewski if (snd_intel_dsp_check_dmic(pci)) {
695df1fceacSCezary Rojewski dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SST driver\n");
69682d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_SST;
697df1fceacSCezary Rojewski }
698df1fceacSCezary Rojewski } else {
699df1fceacSCezary Rojewski return SND_INTEL_DSP_DRIVER_SST;
700df1fceacSCezary Rojewski }
701df1fceacSCezary Rojewski }
70282d9d54aSJaroslav Kysela
70382d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_LEGACY;
70482d9d54aSJaroslav Kysela }
70582d9d54aSJaroslav Kysela EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe);
70682d9d54aSJaroslav Kysela
7075427c7d6SHans de Goede /* Should we default to SOF or SST for BYT/CHT ? */
7085427c7d6SHans de Goede #if IS_ENABLED(CONFIG_SND_INTEL_BYT_PREFER_SOF) || \
7095427c7d6SHans de Goede !IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
7105427c7d6SHans de Goede #define FLAG_SST_OR_SOF_BYT FLAG_SOF
7115427c7d6SHans de Goede #else
7125427c7d6SHans de Goede #define FLAG_SST_OR_SOF_BYT FLAG_SST
7135427c7d6SHans de Goede #endif
7145427c7d6SHans de Goede
715b5682305SPierre-Louis Bossart /*
716b5682305SPierre-Louis Bossart * configuration table
717b5682305SPierre-Louis Bossart * - the order of similar ACPI ID entries is important!
718b5682305SPierre-Louis Bossart * - the first successful match will win
719b5682305SPierre-Louis Bossart */
720b5682305SPierre-Louis Bossart static const struct config_entry acpi_config_table[] = {
7215427c7d6SHans de Goede #if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \
7225427c7d6SHans de Goede IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
723b5682305SPierre-Louis Bossart /* BayTrail */
724b5682305SPierre-Louis Bossart {
7255427c7d6SHans de Goede .flags = FLAG_SST_OR_SOF_BYT,
726b5682305SPierre-Louis Bossart .acpi_hid = "80860F28",
727b5682305SPierre-Louis Bossart },
728b5682305SPierre-Louis Bossart /* CherryTrail */
729b5682305SPierre-Louis Bossart {
7305427c7d6SHans de Goede .flags = FLAG_SST_OR_SOF_BYT,
731b5682305SPierre-Louis Bossart .acpi_hid = "808622A8",
732b5682305SPierre-Louis Bossart },
733b5682305SPierre-Louis Bossart #endif
734803e5913SPierre-Louis Bossart /* Broadwell */
735803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_CATPT)
736803e5913SPierre-Louis Bossart {
737803e5913SPierre-Louis Bossart .flags = FLAG_SST,
738803e5913SPierre-Louis Bossart .acpi_hid = "INT3438"
739803e5913SPierre-Louis Bossart },
740803e5913SPierre-Louis Bossart #endif
741803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_BROADWELL)
742803e5913SPierre-Louis Bossart {
743803e5913SPierre-Louis Bossart .flags = FLAG_SOF,
744803e5913SPierre-Louis Bossart .acpi_hid = "INT3438"
745803e5913SPierre-Louis Bossart },
746803e5913SPierre-Louis Bossart #endif
747803e5913SPierre-Louis Bossart /* Haswell - not supported by SOF but added for consistency */
748803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_CATPT)
749803e5913SPierre-Louis Bossart {
750803e5913SPierre-Louis Bossart .flags = FLAG_SST,
751803e5913SPierre-Louis Bossart .acpi_hid = "INT33C8"
752803e5913SPierre-Louis Bossart },
753803e5913SPierre-Louis Bossart #endif
754b5682305SPierre-Louis Bossart };
755b5682305SPierre-Louis Bossart
snd_intel_acpi_dsp_find_config(const u8 acpi_hid[ACPI_ID_LEN],const struct config_entry * table,u32 len)756b5682305SPierre-Louis Bossart static const struct config_entry *snd_intel_acpi_dsp_find_config(const u8 acpi_hid[ACPI_ID_LEN],
757b5682305SPierre-Louis Bossart const struct config_entry *table,
758b5682305SPierre-Louis Bossart u32 len)
759b5682305SPierre-Louis Bossart {
760b5682305SPierre-Louis Bossart for (; len > 0; len--, table++) {
761b5682305SPierre-Louis Bossart if (memcmp(table->acpi_hid, acpi_hid, ACPI_ID_LEN))
762b5682305SPierre-Louis Bossart continue;
763b5682305SPierre-Louis Bossart if (table->dmi_table && !dmi_check_system(table->dmi_table))
764b5682305SPierre-Louis Bossart continue;
765b5682305SPierre-Louis Bossart return table;
766b5682305SPierre-Louis Bossart }
767b5682305SPierre-Louis Bossart return NULL;
768b5682305SPierre-Louis Bossart }
769b5682305SPierre-Louis Bossart
snd_intel_acpi_dsp_driver_probe(struct device * dev,const u8 acpi_hid[ACPI_ID_LEN])770b5682305SPierre-Louis Bossart int snd_intel_acpi_dsp_driver_probe(struct device *dev, const u8 acpi_hid[ACPI_ID_LEN])
771b5682305SPierre-Louis Bossart {
772b5682305SPierre-Louis Bossart const struct config_entry *cfg;
773b5682305SPierre-Louis Bossart
774b5682305SPierre-Louis Bossart if (dsp_driver > SND_INTEL_DSP_DRIVER_LEGACY && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST)
775b5682305SPierre-Louis Bossart return dsp_driver;
776b5682305SPierre-Louis Bossart
777b5682305SPierre-Louis Bossart if (dsp_driver == SND_INTEL_DSP_DRIVER_LEGACY) {
778b5682305SPierre-Louis Bossart dev_warn(dev, "dsp_driver parameter %d not supported, using automatic detection\n",
779b5682305SPierre-Louis Bossart SND_INTEL_DSP_DRIVER_LEGACY);
780b5682305SPierre-Louis Bossart }
781b5682305SPierre-Louis Bossart
782b5682305SPierre-Louis Bossart /* find the configuration for the specific device */
783b5682305SPierre-Louis Bossart cfg = snd_intel_acpi_dsp_find_config(acpi_hid, acpi_config_table,
784b5682305SPierre-Louis Bossart ARRAY_SIZE(acpi_config_table));
785b5682305SPierre-Louis Bossart if (!cfg)
786b5682305SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_ANY;
787b5682305SPierre-Louis Bossart
788b5682305SPierre-Louis Bossart if (cfg->flags & FLAG_SST)
789b5682305SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_SST;
790b5682305SPierre-Louis Bossart
791b5682305SPierre-Louis Bossart if (cfg->flags & FLAG_SOF)
792b5682305SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_SOF;
793b5682305SPierre-Louis Bossart
794b5682305SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_SST;
795b5682305SPierre-Louis Bossart }
796b5682305SPierre-Louis Bossart EXPORT_SYMBOL_GPL(snd_intel_acpi_dsp_driver_probe);
797b5682305SPierre-Louis Bossart
79882d9d54aSJaroslav Kysela MODULE_LICENSE("GPL v2");
79982d9d54aSJaroslav Kysela MODULE_DESCRIPTION("Intel DSP config driver");
80008c2a4bcSPierre-Louis Bossart MODULE_IMPORT_NS(SND_INTEL_SOUNDWIRE_ACPI);
801