xref: /openbmc/linux/sound/hda/intel-dsp-config.c (revision 91636a82)
182d9d54aSJaroslav Kysela // SPDX-License-Identifier: GPL-2.0
282d9d54aSJaroslav Kysela // Copyright (c) 2019 Jaroslav Kysela <perex@perex.cz>
382d9d54aSJaroslav Kysela 
482d9d54aSJaroslav Kysela #include <linux/bits.h>
582d9d54aSJaroslav Kysela #include <linux/dmi.h>
682d9d54aSJaroslav Kysela #include <linux/module.h>
782d9d54aSJaroslav Kysela #include <linux/pci.h>
882d9d54aSJaroslav Kysela #include <sound/core.h>
982d9d54aSJaroslav Kysela #include <sound/intel-dsp-config.h>
1082d9d54aSJaroslav Kysela #include <sound/intel-nhlt.h>
1182d9d54aSJaroslav Kysela 
1282d9d54aSJaroslav Kysela static int dsp_driver;
1382d9d54aSJaroslav Kysela 
1482d9d54aSJaroslav Kysela module_param(dsp_driver, int, 0444);
1582d9d54aSJaroslav Kysela MODULE_PARM_DESC(dsp_driver, "Force the DSP driver for Intel DSP (0=auto, 1=legacy, 2=SST, 3=SOF)");
1682d9d54aSJaroslav Kysela 
1782d9d54aSJaroslav Kysela #define FLAG_SST		BIT(0)
1882d9d54aSJaroslav Kysela #define FLAG_SOF		BIT(1)
1982d9d54aSJaroslav Kysela #define FLAG_SOF_ONLY_IF_DMIC	BIT(16)
2082d9d54aSJaroslav Kysela 
2182d9d54aSJaroslav Kysela struct config_entry {
2282d9d54aSJaroslav Kysela 	u32 flags;
2382d9d54aSJaroslav Kysela 	u16 device;
2482d9d54aSJaroslav Kysela 	const struct dmi_system_id *dmi_table;
2582d9d54aSJaroslav Kysela };
2682d9d54aSJaroslav Kysela 
2782d9d54aSJaroslav Kysela /*
2882d9d54aSJaroslav Kysela  * configuration table
2982d9d54aSJaroslav Kysela  * - the order of similar PCI ID entries is important!
3082d9d54aSJaroslav Kysela  * - the first successful match will win
3182d9d54aSJaroslav Kysela  */
3282d9d54aSJaroslav Kysela static const struct config_entry config_table[] = {
3382d9d54aSJaroslav Kysela /* Merrifield */
3482d9d54aSJaroslav Kysela #if IS_ENABLED(CONFIG_SND_SOC_SOF_MERRIFIELD)
3582d9d54aSJaroslav Kysela 	{
3682d9d54aSJaroslav Kysela 		.flags = FLAG_SOF,
3782d9d54aSJaroslav Kysela 		.device = 0x119a,
3882d9d54aSJaroslav Kysela 	},
3982d9d54aSJaroslav Kysela #endif
4082d9d54aSJaroslav Kysela /* Broxton-T */
4182d9d54aSJaroslav Kysela #if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE)
4282d9d54aSJaroslav Kysela 	{
43cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF,
4482d9d54aSJaroslav Kysela 		.device = 0x1a98,
4582d9d54aSJaroslav Kysela 	},
4682d9d54aSJaroslav Kysela #endif
47cc8f81c7SPierre-Louis Bossart /*
48cc8f81c7SPierre-Louis Bossart  * Apollolake (Broxton-P)
49cc8f81c7SPierre-Louis Bossart  * the legacy HDaudio driver is used except on Up Squared (SOF) and
50cc8f81c7SPierre-Louis Bossart  * Chromebooks (SST)
51cc8f81c7SPierre-Louis Bossart  */
5282d9d54aSJaroslav Kysela #if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE)
5382d9d54aSJaroslav Kysela 	{
5482d9d54aSJaroslav Kysela 		.flags = FLAG_SOF,
5582d9d54aSJaroslav Kysela 		.device = 0x5a98,
5682d9d54aSJaroslav Kysela 		.dmi_table = (const struct dmi_system_id []) {
5782d9d54aSJaroslav Kysela 			{
5882d9d54aSJaroslav Kysela 				.ident = "Up Squared",
5982d9d54aSJaroslav Kysela 				.matches = {
6082d9d54aSJaroslav Kysela 					DMI_MATCH(DMI_SYS_VENDOR, "AAEON"),
6182d9d54aSJaroslav Kysela 					DMI_MATCH(DMI_BOARD_NAME, "UP-APL01"),
6282d9d54aSJaroslav Kysela 				}
6382d9d54aSJaroslav Kysela 			},
6482d9d54aSJaroslav Kysela 			{}
6582d9d54aSJaroslav Kysela 		}
6682d9d54aSJaroslav Kysela 	},
6782d9d54aSJaroslav Kysela #endif
6882d9d54aSJaroslav Kysela #if IS_ENABLED(CONFIG_SND_SOC_INTEL_APL)
6982d9d54aSJaroslav Kysela 	{
7082d9d54aSJaroslav Kysela 		.flags = FLAG_SST,
7182d9d54aSJaroslav Kysela 		.device = 0x5a98,
72cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
73cc8f81c7SPierre-Louis Bossart 			{
74cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
75cc8f81c7SPierre-Louis Bossart 				.matches = {
76cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
77cc8f81c7SPierre-Louis Bossart 				}
78cc8f81c7SPierre-Louis Bossart 			},
79cc8f81c7SPierre-Louis Bossart 			{}
80cc8f81c7SPierre-Louis Bossart 		}
8182d9d54aSJaroslav Kysela 	},
8282d9d54aSJaroslav Kysela #endif
83cc8f81c7SPierre-Louis Bossart /*
84cc8f81c7SPierre-Louis Bossart  * Skylake and Kabylake use legacy HDaudio driver except for Google
85cc8f81c7SPierre-Louis Bossart  * Chromebooks (SST)
86cc8f81c7SPierre-Louis Bossart  */
87cc8f81c7SPierre-Louis Bossart 
88cc8f81c7SPierre-Louis Bossart /* Sunrise Point-LP */
89cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_SKL)
90cc8f81c7SPierre-Louis Bossart 	{
91cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SST,
92cc8f81c7SPierre-Louis Bossart 		.device = 0x9d70,
93cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
94cc8f81c7SPierre-Louis Bossart 			{
95cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
96cc8f81c7SPierre-Louis Bossart 				.matches = {
97cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
98cc8f81c7SPierre-Louis Bossart 				}
99cc8f81c7SPierre-Louis Bossart 			},
100cc8f81c7SPierre-Louis Bossart 			{}
101cc8f81c7SPierre-Louis Bossart 		}
102cc8f81c7SPierre-Louis Bossart 	},
103cc8f81c7SPierre-Louis Bossart #endif
104cc8f81c7SPierre-Louis Bossart /* Kabylake-LP */
105cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_KBL)
106cc8f81c7SPierre-Louis Bossart 	{
107cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SST,
108cc8f81c7SPierre-Louis Bossart 		.device = 0x9d71,
109cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
110cc8f81c7SPierre-Louis Bossart 			{
111cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
112cc8f81c7SPierre-Louis Bossart 				.matches = {
113cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
114cc8f81c7SPierre-Louis Bossart 				}
115cc8f81c7SPierre-Louis Bossart 			},
116cc8f81c7SPierre-Louis Bossart 			{}
117cc8f81c7SPierre-Louis Bossart 		}
118cc8f81c7SPierre-Louis Bossart 	},
119cc8f81c7SPierre-Louis Bossart #endif
120cc8f81c7SPierre-Louis Bossart 
121cc8f81c7SPierre-Louis Bossart /*
122cc8f81c7SPierre-Louis Bossart  * Geminilake uses legacy HDaudio driver except for Google
123cc8f81c7SPierre-Louis Bossart  * Chromebooks
124cc8f81c7SPierre-Louis Bossart  */
125cc8f81c7SPierre-Louis Bossart /* Geminilake */
126cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_GEMINILAKE)
127cc8f81c7SPierre-Louis Bossart 	{
128cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF,
129cc8f81c7SPierre-Louis Bossart 		.device = 0x3198,
130cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
131cc8f81c7SPierre-Louis Bossart 			{
132cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
133cc8f81c7SPierre-Louis Bossart 				.matches = {
134cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
135cc8f81c7SPierre-Louis Bossart 				}
136cc8f81c7SPierre-Louis Bossart 			},
137cc8f81c7SPierre-Louis Bossart 			{}
138cc8f81c7SPierre-Louis Bossart 		}
139cc8f81c7SPierre-Louis Bossart 	},
140cc8f81c7SPierre-Louis Bossart #endif
141cc8f81c7SPierre-Louis Bossart 
142cc8f81c7SPierre-Louis Bossart /*
143cc8f81c7SPierre-Louis Bossart  * CoffeeLake, CannonLake, CometLake, IceLake, TigerLake use legacy
144cc8f81c7SPierre-Louis Bossart  * HDaudio driver except for Google Chromebooks and when DMICs are
145cc8f81c7SPierre-Louis Bossart  * present. Two cases are required since Coreboot does not expose NHLT
146cc8f81c7SPierre-Louis Bossart  * tables.
147cc8f81c7SPierre-Louis Bossart  *
148cc8f81c7SPierre-Louis Bossart  * When the Chromebook quirk is not present, it's based on information
149cc8f81c7SPierre-Louis Bossart  * that no such device exists. When the quirk is present, it could be
150cc8f81c7SPierre-Louis Bossart  * either based on product information or a placeholder.
151cc8f81c7SPierre-Louis Bossart  */
152cc8f81c7SPierre-Louis Bossart 
15382d9d54aSJaroslav Kysela /* Cannonlake */
15482d9d54aSJaroslav Kysela #if IS_ENABLED(CONFIG_SND_SOC_SOF_CANNONLAKE)
15582d9d54aSJaroslav Kysela 	{
156cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF,
157cc8f81c7SPierre-Louis Bossart 		.device = 0x9dc8,
158cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
159cc8f81c7SPierre-Louis Bossart 			{
160cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
161cc8f81c7SPierre-Louis Bossart 				.matches = {
162cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
163cc8f81c7SPierre-Louis Bossart 				}
164cc8f81c7SPierre-Louis Bossart 			},
165cc8f81c7SPierre-Louis Bossart 			{}
166cc8f81c7SPierre-Louis Bossart 		}
167cc8f81c7SPierre-Louis Bossart 	},
168cc8f81c7SPierre-Louis Bossart 	{
16982d9d54aSJaroslav Kysela 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
17082d9d54aSJaroslav Kysela 		.device = 0x9dc8,
17182d9d54aSJaroslav Kysela 	},
17282d9d54aSJaroslav Kysela #endif
173cc8f81c7SPierre-Louis Bossart 
17482d9d54aSJaroslav Kysela /* Coffelake */
17582d9d54aSJaroslav Kysela #if IS_ENABLED(CONFIG_SND_SOC_SOF_COFFEELAKE)
17682d9d54aSJaroslav Kysela 	{
177cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF,
178cc8f81c7SPierre-Louis Bossart 		.device = 0xa348,
179cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
180cc8f81c7SPierre-Louis Bossart 			{
181cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
182cc8f81c7SPierre-Louis Bossart 				.matches = {
183cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
184cc8f81c7SPierre-Louis Bossart 				}
185cc8f81c7SPierre-Louis Bossart 			},
186cc8f81c7SPierre-Louis Bossart 			{}
187cc8f81c7SPierre-Louis Bossart 		}
188cc8f81c7SPierre-Louis Bossart 	},
189cc8f81c7SPierre-Louis Bossart 	{
19082d9d54aSJaroslav Kysela 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
19182d9d54aSJaroslav Kysela 		.device = 0xa348,
19282d9d54aSJaroslav Kysela 	},
19382d9d54aSJaroslav Kysela #endif
194cc8f81c7SPierre-Louis Bossart 
195cc8f81c7SPierre-Louis Bossart /* Cometlake-LP */
196cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP)
197cc8f81c7SPierre-Louis Bossart 	{
198cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF,
199cc8f81c7SPierre-Louis Bossart 		.device = 0x02c8,
200cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
201cc8f81c7SPierre-Louis Bossart 			{
202cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
203cc8f81c7SPierre-Louis Bossart 				.matches = {
204cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
205cc8f81c7SPierre-Louis Bossart 				}
206cc8f81c7SPierre-Louis Bossart 			},
207cc8f81c7SPierre-Louis Bossart 			{}
208cc8f81c7SPierre-Louis Bossart 		}
209cc8f81c7SPierre-Louis Bossart 	},
210cc8f81c7SPierre-Louis Bossart 	{
211cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
212cc8f81c7SPierre-Louis Bossart 		.device = 0x02c8,
213cc8f81c7SPierre-Louis Bossart 	},
214cc8f81c7SPierre-Louis Bossart #endif
215cc8f81c7SPierre-Louis Bossart /* Cometlake-H */
216cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_H)
217cc8f81c7SPierre-Louis Bossart 	{
218cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
219cc8f81c7SPierre-Louis Bossart 		.device = 0x06c8,
220cc8f81c7SPierre-Louis Bossart 	},
221cc8f81c7SPierre-Louis Bossart #endif
222cc8f81c7SPierre-Louis Bossart 
223cc8f81c7SPierre-Louis Bossart /* Icelake */
224cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_ICELAKE)
225cc8f81c7SPierre-Louis Bossart 	{
226cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF,
227cc8f81c7SPierre-Louis Bossart 		.device = 0x34c8,
228cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
229cc8f81c7SPierre-Louis Bossart 			{
230cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
231cc8f81c7SPierre-Louis Bossart 				.matches = {
232cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
233cc8f81c7SPierre-Louis Bossart 				}
234cc8f81c7SPierre-Louis Bossart 			},
235cc8f81c7SPierre-Louis Bossart 			{}
236cc8f81c7SPierre-Louis Bossart 		}
237cc8f81c7SPierre-Louis Bossart 	},
238cc8f81c7SPierre-Louis Bossart 	{
239cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
240cc8f81c7SPierre-Louis Bossart 		.device = 0x34c8,
241cc8f81c7SPierre-Louis Bossart 	},
242cc8f81c7SPierre-Louis Bossart #endif
243cc8f81c7SPierre-Louis Bossart 
244cc8f81c7SPierre-Louis Bossart /* Tigerlake */
245cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_TIGERLAKE)
246cc8f81c7SPierre-Louis Bossart 	{
247cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF,
248cc8f81c7SPierre-Louis Bossart 		.device = 0xa0c8,
249cc8f81c7SPierre-Louis Bossart 		.dmi_table = (const struct dmi_system_id []) {
250cc8f81c7SPierre-Louis Bossart 			{
251cc8f81c7SPierre-Louis Bossart 				.ident = "Google Chromebooks",
252cc8f81c7SPierre-Louis Bossart 				.matches = {
253cc8f81c7SPierre-Louis Bossart 					DMI_MATCH(DMI_SYS_VENDOR, "Google"),
254cc8f81c7SPierre-Louis Bossart 				}
255cc8f81c7SPierre-Louis Bossart 			},
256cc8f81c7SPierre-Louis Bossart 			{}
257cc8f81c7SPierre-Louis Bossart 		}
258cc8f81c7SPierre-Louis Bossart 	},
259cc8f81c7SPierre-Louis Bossart 
260cc8f81c7SPierre-Louis Bossart 	{
261cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
262cc8f81c7SPierre-Louis Bossart 		.device = 0xa0c8,
263cc8f81c7SPierre-Louis Bossart 	},
264cc8f81c7SPierre-Louis Bossart #endif
265cc8f81c7SPierre-Louis Bossart 
266cc8f81c7SPierre-Louis Bossart /* Elkhart Lake */
267cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_ELKHARTLAKE)
268cc8f81c7SPierre-Louis Bossart 	{
269cc8f81c7SPierre-Louis Bossart 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
270cc8f81c7SPierre-Louis Bossart 		.device = 0x4b55,
271cc8f81c7SPierre-Louis Bossart 	},
272cc8f81c7SPierre-Louis Bossart #endif
273cc8f81c7SPierre-Louis Bossart 
27482d9d54aSJaroslav Kysela };
27582d9d54aSJaroslav Kysela 
27682d9d54aSJaroslav Kysela static const struct config_entry *snd_intel_dsp_find_config
27782d9d54aSJaroslav Kysela 		(struct pci_dev *pci, const struct config_entry *table, u32 len)
27882d9d54aSJaroslav Kysela {
27982d9d54aSJaroslav Kysela 	u16 device;
28082d9d54aSJaroslav Kysela 
28182d9d54aSJaroslav Kysela 	device = pci->device;
28282d9d54aSJaroslav Kysela 	for (; len > 0; len--, table++) {
28382d9d54aSJaroslav Kysela 		if (table->device != device)
28482d9d54aSJaroslav Kysela 			continue;
28582d9d54aSJaroslav Kysela 		if (table->dmi_table && !dmi_check_system(table->dmi_table))
28682d9d54aSJaroslav Kysela 			continue;
28782d9d54aSJaroslav Kysela 		return table;
28882d9d54aSJaroslav Kysela 	}
28982d9d54aSJaroslav Kysela 	return NULL;
29082d9d54aSJaroslav Kysela }
29182d9d54aSJaroslav Kysela 
29282d9d54aSJaroslav Kysela static int snd_intel_dsp_check_dmic(struct pci_dev *pci)
29382d9d54aSJaroslav Kysela {
29482d9d54aSJaroslav Kysela 	struct nhlt_acpi_table *nhlt;
29582d9d54aSJaroslav Kysela 	int ret = 0;
29682d9d54aSJaroslav Kysela 
29782d9d54aSJaroslav Kysela 	nhlt = intel_nhlt_init(&pci->dev);
29882d9d54aSJaroslav Kysela 	if (nhlt) {
29982d9d54aSJaroslav Kysela 		if (intel_nhlt_get_dmic_geo(&pci->dev, nhlt))
30082d9d54aSJaroslav Kysela 			ret = 1;
30182d9d54aSJaroslav Kysela 		intel_nhlt_free(nhlt);
30282d9d54aSJaroslav Kysela 	}
30382d9d54aSJaroslav Kysela 	return ret;
30482d9d54aSJaroslav Kysela }
30582d9d54aSJaroslav Kysela 
30682d9d54aSJaroslav Kysela int snd_intel_dsp_driver_probe(struct pci_dev *pci)
30782d9d54aSJaroslav Kysela {
30882d9d54aSJaroslav Kysela 	const struct config_entry *cfg;
30982d9d54aSJaroslav Kysela 
31091636a82STakashi Iwai 	/* Intel vendor only */
31191636a82STakashi Iwai 	if (pci->vendor != 0x8086)
31291636a82STakashi Iwai 		return SND_INTEL_DSP_DRIVER_ANY;
31391636a82STakashi Iwai 
31482d9d54aSJaroslav Kysela 	if (dsp_driver > 0 && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST)
31582d9d54aSJaroslav Kysela 		return dsp_driver;
31682d9d54aSJaroslav Kysela 
31782d9d54aSJaroslav Kysela 	/*
31882d9d54aSJaroslav Kysela 	 * detect DSP by checking class/subclass/prog-id information
31982d9d54aSJaroslav Kysela 	 * class=04 subclass 03 prog-if 00: no DSP, use legacy driver
32082d9d54aSJaroslav Kysela 	 * class=04 subclass 01 prog-if 00: DSP is present
32182d9d54aSJaroslav Kysela 	 *  (and may be required e.g. for DMIC or SSP support)
32282d9d54aSJaroslav Kysela 	 * class=04 subclass 03 prog-if 80: use DSP or legacy mode
32382d9d54aSJaroslav Kysela 	 */
32482d9d54aSJaroslav Kysela 	if (pci->class == 0x040300)
32582d9d54aSJaroslav Kysela 		return SND_INTEL_DSP_DRIVER_LEGACY;
32682d9d54aSJaroslav Kysela 	if (pci->class != 0x040100 && pci->class != 0x040380) {
32782d9d54aSJaroslav Kysela 		dev_err(&pci->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, selecting HDA legacy driver\n", pci->class);
32882d9d54aSJaroslav Kysela 		return SND_INTEL_DSP_DRIVER_LEGACY;
32982d9d54aSJaroslav Kysela 	}
33082d9d54aSJaroslav Kysela 
33182d9d54aSJaroslav Kysela 	dev_info(&pci->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class);
33282d9d54aSJaroslav Kysela 
33382d9d54aSJaroslav Kysela 	/* find the configuration for the specific device */
33482d9d54aSJaroslav Kysela 	cfg = snd_intel_dsp_find_config(pci, config_table, ARRAY_SIZE(config_table));
33582d9d54aSJaroslav Kysela 	if (!cfg)
33682d9d54aSJaroslav Kysela 		return SND_INTEL_DSP_DRIVER_ANY;
33782d9d54aSJaroslav Kysela 
33882d9d54aSJaroslav Kysela 	if (cfg->flags & FLAG_SOF) {
33982d9d54aSJaroslav Kysela 		if (cfg->flags & FLAG_SOF_ONLY_IF_DMIC) {
34082d9d54aSJaroslav Kysela 			if (snd_intel_dsp_check_dmic(pci)) {
34182d9d54aSJaroslav Kysela 				dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SOF driver\n");
34282d9d54aSJaroslav Kysela 				return SND_INTEL_DSP_DRIVER_SOF;
34382d9d54aSJaroslav Kysela 			}
34482d9d54aSJaroslav Kysela 		} else {
34582d9d54aSJaroslav Kysela 			return SND_INTEL_DSP_DRIVER_SOF;
34682d9d54aSJaroslav Kysela 		}
34782d9d54aSJaroslav Kysela 	}
34882d9d54aSJaroslav Kysela 
34982d9d54aSJaroslav Kysela 	if (cfg->flags & FLAG_SST)
35082d9d54aSJaroslav Kysela 		return SND_INTEL_DSP_DRIVER_SST;
35182d9d54aSJaroslav Kysela 
35282d9d54aSJaroslav Kysela 	return SND_INTEL_DSP_DRIVER_LEGACY;
35382d9d54aSJaroslav Kysela }
35482d9d54aSJaroslav Kysela EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe);
35582d9d54aSJaroslav Kysela 
35682d9d54aSJaroslav Kysela MODULE_LICENSE("GPL v2");
35782d9d54aSJaroslav Kysela MODULE_DESCRIPTION("Intel DSP config driver");
358