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); 1982d9d54aSJaroslav Kysela MODULE_PARM_DESC(dsp_driver, "Force the DSP driver for Intel DSP (0=auto, 1=legacy, 2=SST, 3=SOF)"); 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 /* 170*905240d1SBrady Norander * CoffeeLake, CannonLake, CometLake, IceLake, TigerLake, AlderLake, 171*905240d1SBrady Norander * RaptorLake use legacy HDAudio driver except for Google Chromebooks 172*905240d1SBrady Norander * and when DMICs are present. Two cases are required since Coreboot 173*905240d1SBrady 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 }, 33919980aa1SBrent Lu {} 34019980aa1SBrent Lu } 34119980aa1SBrent Lu }, 34219980aa1SBrent Lu { 34319980aa1SBrent Lu .flags = FLAG_SOF, 3440cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_JSL_N, 345de24d97fSPierre-Louis Bossart .codec_hid = &essx_83x6, 346fa9730b4SPierre-Louis Bossart }, 34719980aa1SBrent Lu { 34819980aa1SBrent Lu .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, 3490cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_JSL_N, 35019980aa1SBrent Lu }, 351fa9730b4SPierre-Louis Bossart #endif 352fa9730b4SPierre-Louis Bossart 353cc8f81c7SPierre-Louis Bossart /* Tigerlake */ 354cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_TIGERLAKE) 355cc8f81c7SPierre-Louis Bossart { 356cc8f81c7SPierre-Louis Bossart .flags = FLAG_SOF, 3570cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_TGL_LP, 358cc8f81c7SPierre-Louis Bossart .dmi_table = (const struct dmi_system_id []) { 359cc8f81c7SPierre-Louis Bossart { 360cc8f81c7SPierre-Louis Bossart .ident = "Google Chromebooks", 361cc8f81c7SPierre-Louis Bossart .matches = { 362cc8f81c7SPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "Google"), 363cc8f81c7SPierre-Louis Bossart } 364cc8f81c7SPierre-Louis Bossart }, 36533fa35dbSPierre-Louis Bossart { 36633fa35dbSPierre-Louis Bossart .ident = "UPX-TGL", 36733fa35dbSPierre-Louis Bossart .matches = { 36833fa35dbSPierre-Louis Bossart DMI_MATCH(DMI_SYS_VENDOR, "AAEON"), 36933fa35dbSPierre-Louis Bossart } 37033fa35dbSPierre-Louis Bossart }, 371cc8f81c7SPierre-Louis Bossart {} 372cc8f81c7SPierre-Louis Bossart } 373cc8f81c7SPierre-Louis Bossart }, 374cc8f81c7SPierre-Louis Bossart { 375081c7370SBrent Lu .flags = FLAG_SOF, 3760cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_TGL_LP, 377de24d97fSPierre-Louis Bossart .codec_hid = &essx_83x6, 378081c7370SBrent Lu }, 379081c7370SBrent Lu { 38006508575SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 3810cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_TGL_LP, 382cc8f81c7SPierre-Louis Bossart }, 383c5b5ff60SBard Liao { 384c5b5ff60SBard Liao .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 3850cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_TGL_H, 386c5b5ff60SBard Liao }, 387cc8f81c7SPierre-Louis Bossart #endif 388cc8f81c7SPierre-Louis Bossart 389cc8f81c7SPierre-Louis Bossart /* Elkhart Lake */ 390cc8f81c7SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_ELKHARTLAKE) 391cc8f81c7SPierre-Louis Bossart { 392cc8f81c7SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, 3930cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_EHL_0, 394cc8f81c7SPierre-Louis Bossart }, 395114613f6SPierre-Louis Bossart { 396114613f6SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC, 3970cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_EHL_3, 398114613f6SPierre-Louis Bossart }, 399cc8f81c7SPierre-Louis Bossart #endif 400cc8f81c7SPierre-Louis Bossart 4010cd0a7c2SAmadeusz Sławiński /* Alder Lake / Raptor Lake */ 402c4294d7fSKai Vehmanen #if IS_ENABLED(CONFIG_SND_SOC_SOF_ALDERLAKE) 403c4294d7fSKai Vehmanen { 404c4294d7fSKai Vehmanen .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 4050cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_S, 406c4294d7fSKai Vehmanen }, 407d52eee98SPierre-Louis Bossart { 408d52eee98SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 4090cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_RPL_S, 410d52eee98SPierre-Louis Bossart }, 411c4294d7fSKai Vehmanen { 4122ec8b081SMuralidhar Reddy .flags = FLAG_SOF, 4130cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_P, 414*905240d1SBrady Norander .dmi_table = (const struct dmi_system_id []) { 415*905240d1SBrady Norander { 416*905240d1SBrady Norander .ident = "Google Chromebooks", 417*905240d1SBrady Norander .matches = { 418*905240d1SBrady Norander DMI_MATCH(DMI_SYS_VENDOR, "Google"), 419*905240d1SBrady Norander } 420*905240d1SBrady Norander }, 421*905240d1SBrady Norander {} 422*905240d1SBrady Norander } 423*905240d1SBrady Norander }, 424*905240d1SBrady Norander { 425*905240d1SBrady Norander .flags = FLAG_SOF, 426*905240d1SBrady Norander .device = PCI_DEVICE_ID_INTEL_HDA_ADL_P, 4272ec8b081SMuralidhar Reddy .codec_hid = &essx_83x6, 4282ec8b081SMuralidhar Reddy }, 4292ec8b081SMuralidhar Reddy { 430c4294d7fSKai Vehmanen .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 4310cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_P, 432c4294d7fSKai Vehmanen }, 4334ad7935dSKai Vehmanen { 4344ad7935dSKai Vehmanen .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 4350cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_PX, 436ca1ece24SKai Vehmanen }, 437d52eee98SPierre-Louis Bossart { 4389db1c9faSMuralidhar Reddy .flags = FLAG_SOF, 4390cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_PS, 4409db1c9faSMuralidhar Reddy .codec_hid = &essx_83x6, 4419db1c9faSMuralidhar Reddy }, 4429db1c9faSMuralidhar Reddy { 443d52eee98SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 4440cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_PS, 445b07908abSGongjun Song }, 446b07908abSGongjun Song { 447b07908abSGongjun Song .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 4480cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_M, 449b07908abSGongjun Song }, 450c35fbea4SPierre-Louis Bossart { 451*905240d1SBrady Norander .flags = FLAG_SOF, 452*905240d1SBrady Norander .device = PCI_DEVICE_ID_INTEL_HDA_ADL_N, 453*905240d1SBrady Norander .dmi_table = (const struct dmi_system_id []) { 454*905240d1SBrady Norander { 455*905240d1SBrady Norander .ident = "Google Chromebooks", 456*905240d1SBrady Norander .matches = { 457*905240d1SBrady Norander DMI_MATCH(DMI_SYS_VENDOR, "Google"), 458*905240d1SBrady Norander } 459*905240d1SBrady Norander }, 460*905240d1SBrady Norander {} 461*905240d1SBrady Norander } 462*905240d1SBrady Norander }, 463*905240d1SBrady Norander { 464c35fbea4SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 4650cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_N, 466c35fbea4SPierre-Louis Bossart }, 467c35fbea4SPierre-Louis Bossart { 468*905240d1SBrady Norander .flags = FLAG_SOF, 469*905240d1SBrady Norander .device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_0, 470*905240d1SBrady Norander .dmi_table = (const struct dmi_system_id []) { 471*905240d1SBrady Norander { 472*905240d1SBrady Norander .ident = "Google Chromebooks", 473*905240d1SBrady Norander .matches = { 474*905240d1SBrady Norander DMI_MATCH(DMI_SYS_VENDOR, "Google"), 475*905240d1SBrady Norander } 476*905240d1SBrady Norander }, 477*905240d1SBrady Norander {} 478*905240d1SBrady Norander } 479*905240d1SBrady Norander }, 480*905240d1SBrady Norander { 481c35fbea4SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 4820cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_0, 4830cd0a7c2SAmadeusz Sławiński }, 4840cd0a7c2SAmadeusz Sławiński { 485*905240d1SBrady Norander .flags = FLAG_SOF, 486*905240d1SBrady Norander .device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_1, 487*905240d1SBrady Norander .dmi_table = (const struct dmi_system_id []) { 488*905240d1SBrady Norander { 489*905240d1SBrady Norander .ident = "Google Chromebooks", 490*905240d1SBrady Norander .matches = { 491*905240d1SBrady Norander DMI_MATCH(DMI_SYS_VENDOR, "Google"), 492*905240d1SBrady Norander } 493*905240d1SBrady Norander }, 494*905240d1SBrady Norander {} 495*905240d1SBrady Norander } 496*905240d1SBrady Norander }, 497*905240d1SBrady Norander { 4980cd0a7c2SAmadeusz Sławiński .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 4990cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_1, 5000cd0a7c2SAmadeusz Sławiński }, 5010cd0a7c2SAmadeusz Sławiński { 5020cd0a7c2SAmadeusz Sławiński .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 5030cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_RPL_M, 5040cd0a7c2SAmadeusz Sławiński }, 5050cd0a7c2SAmadeusz Sławiński { 5060cd0a7c2SAmadeusz Sławiński .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 5070cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_RPL_PX, 508c35fbea4SPierre-Louis Bossart }, 509c4294d7fSKai Vehmanen #endif 510c4294d7fSKai Vehmanen 511bbdf904bSBard Liao /* Meteor Lake */ 512bbdf904bSBard Liao #if IS_ENABLED(CONFIG_SND_SOC_SOF_METEORLAKE) 513bbdf904bSBard Liao /* Meteorlake-P */ 514bbdf904bSBard Liao { 515bbdf904bSBard Liao .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 51673e6ebf6SPierre-Louis Bossart .device = PCI_DEVICE_ID_INTEL_HDA_MTL, 517bbdf904bSBard Liao }, 518bbdf904bSBard Liao #endif 519bbdf904bSBard Liao 520d2852b8cSPierre-Louis Bossart /* Lunar Lake */ 521d2852b8cSPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_LUNARLAKE) 522d2852b8cSPierre-Louis Bossart /* Lunarlake-P */ 523d2852b8cSPierre-Louis Bossart { 524d2852b8cSPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 525d2852b8cSPierre-Louis Bossart .device = PCI_DEVICE_ID_INTEL_HDA_LNL_P, 526d2852b8cSPierre-Louis Bossart }, 527d2852b8cSPierre-Louis Bossart #endif 52882d9d54aSJaroslav Kysela }; 52982d9d54aSJaroslav Kysela 53082d9d54aSJaroslav Kysela static const struct config_entry *snd_intel_dsp_find_config 53182d9d54aSJaroslav Kysela (struct pci_dev *pci, const struct config_entry *table, u32 len) 53282d9d54aSJaroslav Kysela { 53382d9d54aSJaroslav Kysela u16 device; 53482d9d54aSJaroslav Kysela 53582d9d54aSJaroslav Kysela device = pci->device; 53682d9d54aSJaroslav Kysela for (; len > 0; len--, table++) { 53782d9d54aSJaroslav Kysela if (table->device != device) 53882d9d54aSJaroslav Kysela continue; 53982d9d54aSJaroslav Kysela if (table->dmi_table && !dmi_check_system(table->dmi_table)) 54082d9d54aSJaroslav Kysela continue; 541de24d97fSPierre-Louis Bossart if (table->codec_hid) { 542de24d97fSPierre-Louis Bossart int i; 543de24d97fSPierre-Louis Bossart 544de24d97fSPierre-Louis Bossart for (i = 0; i < table->codec_hid->num_codecs; i++) 545de24d97fSPierre-Louis Bossart if (acpi_dev_present(table->codec_hid->codecs[i], NULL, -1)) 546de24d97fSPierre-Louis Bossart break; 547de24d97fSPierre-Louis Bossart if (i == table->codec_hid->num_codecs) 5489d36ceabSPierre-Louis Bossart continue; 549de24d97fSPierre-Louis Bossart } 55082d9d54aSJaroslav Kysela return table; 55182d9d54aSJaroslav Kysela } 55282d9d54aSJaroslav Kysela return NULL; 55382d9d54aSJaroslav Kysela } 55482d9d54aSJaroslav Kysela 55582d9d54aSJaroslav Kysela static int snd_intel_dsp_check_dmic(struct pci_dev *pci) 55682d9d54aSJaroslav Kysela { 55782d9d54aSJaroslav Kysela struct nhlt_acpi_table *nhlt; 55882d9d54aSJaroslav Kysela int ret = 0; 55982d9d54aSJaroslav Kysela 56082d9d54aSJaroslav Kysela nhlt = intel_nhlt_init(&pci->dev); 56182d9d54aSJaroslav Kysela if (nhlt) { 5628235a08bSAmadeusz Sławiński if (intel_nhlt_has_endpoint_type(nhlt, NHLT_LINK_DMIC)) 56382d9d54aSJaroslav Kysela ret = 1; 56482d9d54aSJaroslav Kysela intel_nhlt_free(nhlt); 56582d9d54aSJaroslav Kysela } 56682d9d54aSJaroslav Kysela return ret; 56782d9d54aSJaroslav Kysela } 56882d9d54aSJaroslav Kysela 56906508575SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE) 57006508575SPierre-Louis Bossart static int snd_intel_dsp_check_soundwire(struct pci_dev *pci) 57106508575SPierre-Louis Bossart { 57206508575SPierre-Louis Bossart struct sdw_intel_acpi_info info; 57306508575SPierre-Louis Bossart acpi_handle handle; 57406508575SPierre-Louis Bossart int ret; 57506508575SPierre-Louis Bossart 57606508575SPierre-Louis Bossart handle = ACPI_HANDLE(&pci->dev); 57706508575SPierre-Louis Bossart 57806508575SPierre-Louis Bossart ret = sdw_intel_acpi_scan(handle, &info); 57906508575SPierre-Louis Bossart if (ret < 0) 58006508575SPierre-Louis Bossart return ret; 58106508575SPierre-Louis Bossart 58206508575SPierre-Louis Bossart return info.link_mask; 58306508575SPierre-Louis Bossart } 58406508575SPierre-Louis Bossart #else 58506508575SPierre-Louis Bossart static int snd_intel_dsp_check_soundwire(struct pci_dev *pci) 58606508575SPierre-Louis Bossart { 58706508575SPierre-Louis Bossart return 0; 58806508575SPierre-Louis Bossart } 58906508575SPierre-Louis Bossart #endif 59006508575SPierre-Louis Bossart 59182d9d54aSJaroslav Kysela int snd_intel_dsp_driver_probe(struct pci_dev *pci) 59282d9d54aSJaroslav Kysela { 59382d9d54aSJaroslav Kysela const struct config_entry *cfg; 59482d9d54aSJaroslav Kysela 59591636a82STakashi Iwai /* Intel vendor only */ 5960cd0a7c2SAmadeusz Sławiński if (pci->vendor != PCI_VENDOR_ID_INTEL) 59791636a82STakashi Iwai return SND_INTEL_DSP_DRIVER_ANY; 59891636a82STakashi Iwai 5990e5cc221SPierre-Louis Bossart /* 6000e5cc221SPierre-Louis Bossart * Legacy devices don't have a PCI-based DSP and use HDaudio 6010e5cc221SPierre-Louis Bossart * for HDMI/DP support, ignore kernel parameter 6020e5cc221SPierre-Louis Bossart */ 6030e5cc221SPierre-Louis Bossart switch (pci->device) { 6040cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_BDW: 6050cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_HSW_0: 6060cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_HSW_2: 6070cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_HSW_3: 6080cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_BYT: 6090cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_BSW: 6100e5cc221SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_ANY; 6110e5cc221SPierre-Louis Bossart } 6120e5cc221SPierre-Louis Bossart 61382d9d54aSJaroslav Kysela if (dsp_driver > 0 && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST) 61482d9d54aSJaroslav Kysela return dsp_driver; 61582d9d54aSJaroslav Kysela 61682d9d54aSJaroslav Kysela /* 61782d9d54aSJaroslav Kysela * detect DSP by checking class/subclass/prog-id information 61882d9d54aSJaroslav Kysela * class=04 subclass 03 prog-if 00: no DSP, use legacy driver 61982d9d54aSJaroslav Kysela * class=04 subclass 01 prog-if 00: DSP is present 62082d9d54aSJaroslav Kysela * (and may be required e.g. for DMIC or SSP support) 62182d9d54aSJaroslav Kysela * class=04 subclass 03 prog-if 80: use DSP or legacy mode 62282d9d54aSJaroslav Kysela */ 62382d9d54aSJaroslav Kysela if (pci->class == 0x040300) 62482d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_LEGACY; 62582d9d54aSJaroslav Kysela if (pci->class != 0x040100 && pci->class != 0x040380) { 626b79de57bSPierre-Louis Bossart dev_err(&pci->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, selecting HDAudio legacy driver\n", pci->class); 62782d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_LEGACY; 62882d9d54aSJaroslav Kysela } 62982d9d54aSJaroslav Kysela 63082d9d54aSJaroslav Kysela dev_info(&pci->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class); 63182d9d54aSJaroslav Kysela 63282d9d54aSJaroslav Kysela /* find the configuration for the specific device */ 63382d9d54aSJaroslav Kysela cfg = snd_intel_dsp_find_config(pci, config_table, ARRAY_SIZE(config_table)); 63482d9d54aSJaroslav Kysela if (!cfg) 63582d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_ANY; 63682d9d54aSJaroslav Kysela 63782d9d54aSJaroslav Kysela if (cfg->flags & FLAG_SOF) { 63806508575SPierre-Louis Bossart if (cfg->flags & FLAG_SOF_ONLY_IF_SOUNDWIRE && 63906508575SPierre-Louis Bossart snd_intel_dsp_check_soundwire(pci) > 0) { 64006508575SPierre-Louis Bossart dev_info(&pci->dev, "SoundWire enabled on CannonLake+ platform, using SOF driver\n"); 64106508575SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_SOF; 64206508575SPierre-Louis Bossart } 64306508575SPierre-Louis Bossart if (cfg->flags & FLAG_SOF_ONLY_IF_DMIC && 64406508575SPierre-Louis Bossart snd_intel_dsp_check_dmic(pci)) { 64582d9d54aSJaroslav Kysela dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SOF driver\n"); 64682d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_SOF; 64782d9d54aSJaroslav Kysela } 64806508575SPierre-Louis Bossart if (!(cfg->flags & FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE)) 64982d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_SOF; 65082d9d54aSJaroslav Kysela } 65182d9d54aSJaroslav Kysela 652df1fceacSCezary Rojewski 653df1fceacSCezary Rojewski if (cfg->flags & FLAG_SST) { 654df1fceacSCezary Rojewski if (cfg->flags & FLAG_SST_ONLY_IF_DMIC) { 655df1fceacSCezary Rojewski if (snd_intel_dsp_check_dmic(pci)) { 656df1fceacSCezary Rojewski dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SST driver\n"); 65782d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_SST; 658df1fceacSCezary Rojewski } 659df1fceacSCezary Rojewski } else { 660df1fceacSCezary Rojewski return SND_INTEL_DSP_DRIVER_SST; 661df1fceacSCezary Rojewski } 662df1fceacSCezary Rojewski } 66382d9d54aSJaroslav Kysela 66482d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_LEGACY; 66582d9d54aSJaroslav Kysela } 66682d9d54aSJaroslav Kysela EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe); 66782d9d54aSJaroslav Kysela 6685427c7d6SHans de Goede /* Should we default to SOF or SST for BYT/CHT ? */ 6695427c7d6SHans de Goede #if IS_ENABLED(CONFIG_SND_INTEL_BYT_PREFER_SOF) || \ 6705427c7d6SHans de Goede !IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) 6715427c7d6SHans de Goede #define FLAG_SST_OR_SOF_BYT FLAG_SOF 6725427c7d6SHans de Goede #else 6735427c7d6SHans de Goede #define FLAG_SST_OR_SOF_BYT FLAG_SST 6745427c7d6SHans de Goede #endif 6755427c7d6SHans de Goede 676b5682305SPierre-Louis Bossart /* 677b5682305SPierre-Louis Bossart * configuration table 678b5682305SPierre-Louis Bossart * - the order of similar ACPI ID entries is important! 679b5682305SPierre-Louis Bossart * - the first successful match will win 680b5682305SPierre-Louis Bossart */ 681b5682305SPierre-Louis Bossart static const struct config_entry acpi_config_table[] = { 6825427c7d6SHans de Goede #if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \ 6835427c7d6SHans de Goede IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL) 684b5682305SPierre-Louis Bossart /* BayTrail */ 685b5682305SPierre-Louis Bossart { 6865427c7d6SHans de Goede .flags = FLAG_SST_OR_SOF_BYT, 687b5682305SPierre-Louis Bossart .acpi_hid = "80860F28", 688b5682305SPierre-Louis Bossart }, 689b5682305SPierre-Louis Bossart /* CherryTrail */ 690b5682305SPierre-Louis Bossart { 6915427c7d6SHans de Goede .flags = FLAG_SST_OR_SOF_BYT, 692b5682305SPierre-Louis Bossart .acpi_hid = "808622A8", 693b5682305SPierre-Louis Bossart }, 694b5682305SPierre-Louis Bossart #endif 695803e5913SPierre-Louis Bossart /* Broadwell */ 696803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_CATPT) 697803e5913SPierre-Louis Bossart { 698803e5913SPierre-Louis Bossart .flags = FLAG_SST, 699803e5913SPierre-Louis Bossart .acpi_hid = "INT3438" 700803e5913SPierre-Louis Bossart }, 701803e5913SPierre-Louis Bossart #endif 702803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_BROADWELL) 703803e5913SPierre-Louis Bossart { 704803e5913SPierre-Louis Bossart .flags = FLAG_SOF, 705803e5913SPierre-Louis Bossart .acpi_hid = "INT3438" 706803e5913SPierre-Louis Bossart }, 707803e5913SPierre-Louis Bossart #endif 708803e5913SPierre-Louis Bossart /* Haswell - not supported by SOF but added for consistency */ 709803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_CATPT) 710803e5913SPierre-Louis Bossart { 711803e5913SPierre-Louis Bossart .flags = FLAG_SST, 712803e5913SPierre-Louis Bossart .acpi_hid = "INT33C8" 713803e5913SPierre-Louis Bossart }, 714803e5913SPierre-Louis Bossart #endif 715b5682305SPierre-Louis Bossart }; 716b5682305SPierre-Louis Bossart 717b5682305SPierre-Louis Bossart static const struct config_entry *snd_intel_acpi_dsp_find_config(const u8 acpi_hid[ACPI_ID_LEN], 718b5682305SPierre-Louis Bossart const struct config_entry *table, 719b5682305SPierre-Louis Bossart u32 len) 720b5682305SPierre-Louis Bossart { 721b5682305SPierre-Louis Bossart for (; len > 0; len--, table++) { 722b5682305SPierre-Louis Bossart if (memcmp(table->acpi_hid, acpi_hid, ACPI_ID_LEN)) 723b5682305SPierre-Louis Bossart continue; 724b5682305SPierre-Louis Bossart if (table->dmi_table && !dmi_check_system(table->dmi_table)) 725b5682305SPierre-Louis Bossart continue; 726b5682305SPierre-Louis Bossart return table; 727b5682305SPierre-Louis Bossart } 728b5682305SPierre-Louis Bossart return NULL; 729b5682305SPierre-Louis Bossart } 730b5682305SPierre-Louis Bossart 731b5682305SPierre-Louis Bossart int snd_intel_acpi_dsp_driver_probe(struct device *dev, const u8 acpi_hid[ACPI_ID_LEN]) 732b5682305SPierre-Louis Bossart { 733b5682305SPierre-Louis Bossart const struct config_entry *cfg; 734b5682305SPierre-Louis Bossart 735b5682305SPierre-Louis Bossart if (dsp_driver > SND_INTEL_DSP_DRIVER_LEGACY && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST) 736b5682305SPierre-Louis Bossart return dsp_driver; 737b5682305SPierre-Louis Bossart 738b5682305SPierre-Louis Bossart if (dsp_driver == SND_INTEL_DSP_DRIVER_LEGACY) { 739b5682305SPierre-Louis Bossart dev_warn(dev, "dsp_driver parameter %d not supported, using automatic detection\n", 740b5682305SPierre-Louis Bossart SND_INTEL_DSP_DRIVER_LEGACY); 741b5682305SPierre-Louis Bossart } 742b5682305SPierre-Louis Bossart 743b5682305SPierre-Louis Bossart /* find the configuration for the specific device */ 744b5682305SPierre-Louis Bossart cfg = snd_intel_acpi_dsp_find_config(acpi_hid, acpi_config_table, 745b5682305SPierre-Louis Bossart ARRAY_SIZE(acpi_config_table)); 746b5682305SPierre-Louis Bossart if (!cfg) 747b5682305SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_ANY; 748b5682305SPierre-Louis Bossart 749b5682305SPierre-Louis Bossart if (cfg->flags & FLAG_SST) 750b5682305SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_SST; 751b5682305SPierre-Louis Bossart 752b5682305SPierre-Louis Bossart if (cfg->flags & FLAG_SOF) 753b5682305SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_SOF; 754b5682305SPierre-Louis Bossart 755b5682305SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_SST; 756b5682305SPierre-Louis Bossart } 757b5682305SPierre-Louis Bossart EXPORT_SYMBOL_GPL(snd_intel_acpi_dsp_driver_probe); 758b5682305SPierre-Louis Bossart 75982d9d54aSJaroslav Kysela MODULE_LICENSE("GPL v2"); 76082d9d54aSJaroslav Kysela MODULE_DESCRIPTION("Intel DSP config driver"); 76108c2a4bcSPierre-Louis Bossart MODULE_IMPORT_NS(SND_INTEL_SOUNDWIRE_ACPI); 762