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