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 /* 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 }, 524*70cb71c9SPierre-Louis Bossart /* ArrowLake-S */ 525*70cb71c9SPierre-Louis Bossart { 526*70cb71c9SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 527*70cb71c9SPierre-Louis Bossart .device = PCI_DEVICE_ID_INTEL_HDA_ARL_S, 528*70cb71c9SPierre-Louis Bossart }, 529*70cb71c9SPierre-Louis Bossart /* ArrowLake */ 530*70cb71c9SPierre-Louis Bossart { 531*70cb71c9SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 532*70cb71c9SPierre-Louis Bossart .device = PCI_DEVICE_ID_INTEL_HDA_ARL, 533*70cb71c9SPierre-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 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 560de24d97fSPierre-Louis Bossart for (i = 0; i < table->codec_hid->num_codecs; i++) 561de24d97fSPierre-Louis Bossart if (acpi_dev_present(table->codec_hid->codecs[i], NULL, -1)) 562de24d97fSPierre-Louis Bossart break; 563de24d97fSPierre-Louis Bossart if (i == table->codec_hid->num_codecs) 5649d36ceabSPierre-Louis Bossart continue; 565de24d97fSPierre-Louis Bossart } 56682d9d54aSJaroslav Kysela return table; 56782d9d54aSJaroslav Kysela } 56882d9d54aSJaroslav Kysela return NULL; 56982d9d54aSJaroslav Kysela } 57082d9d54aSJaroslav Kysela 57182d9d54aSJaroslav Kysela static int snd_intel_dsp_check_dmic(struct pci_dev *pci) 57282d9d54aSJaroslav Kysela { 57382d9d54aSJaroslav Kysela struct nhlt_acpi_table *nhlt; 57482d9d54aSJaroslav Kysela int ret = 0; 57582d9d54aSJaroslav Kysela 57682d9d54aSJaroslav Kysela nhlt = intel_nhlt_init(&pci->dev); 57782d9d54aSJaroslav Kysela if (nhlt) { 5788235a08bSAmadeusz Sławiński if (intel_nhlt_has_endpoint_type(nhlt, NHLT_LINK_DMIC)) 57982d9d54aSJaroslav Kysela ret = 1; 58082d9d54aSJaroslav Kysela intel_nhlt_free(nhlt); 58182d9d54aSJaroslav Kysela } 58282d9d54aSJaroslav Kysela return ret; 58382d9d54aSJaroslav Kysela } 58482d9d54aSJaroslav Kysela 58506508575SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE) 58606508575SPierre-Louis Bossart static int snd_intel_dsp_check_soundwire(struct pci_dev *pci) 58706508575SPierre-Louis Bossart { 58806508575SPierre-Louis Bossart struct sdw_intel_acpi_info info; 58906508575SPierre-Louis Bossart acpi_handle handle; 59006508575SPierre-Louis Bossart int ret; 59106508575SPierre-Louis Bossart 59206508575SPierre-Louis Bossart handle = ACPI_HANDLE(&pci->dev); 59306508575SPierre-Louis Bossart 59406508575SPierre-Louis Bossart ret = sdw_intel_acpi_scan(handle, &info); 59506508575SPierre-Louis Bossart if (ret < 0) 59606508575SPierre-Louis Bossart return ret; 59706508575SPierre-Louis Bossart 59806508575SPierre-Louis Bossart return info.link_mask; 59906508575SPierre-Louis Bossart } 60006508575SPierre-Louis Bossart #else 60106508575SPierre-Louis Bossart static int snd_intel_dsp_check_soundwire(struct pci_dev *pci) 60206508575SPierre-Louis Bossart { 60306508575SPierre-Louis Bossart return 0; 60406508575SPierre-Louis Bossart } 60506508575SPierre-Louis Bossart #endif 60606508575SPierre-Louis Bossart 60782d9d54aSJaroslav Kysela int snd_intel_dsp_driver_probe(struct pci_dev *pci) 60882d9d54aSJaroslav Kysela { 60982d9d54aSJaroslav Kysela const struct config_entry *cfg; 61082d9d54aSJaroslav Kysela 61191636a82STakashi Iwai /* Intel vendor only */ 6120cd0a7c2SAmadeusz Sławiński if (pci->vendor != PCI_VENDOR_ID_INTEL) 61391636a82STakashi Iwai return SND_INTEL_DSP_DRIVER_ANY; 61491636a82STakashi Iwai 6150e5cc221SPierre-Louis Bossart /* 6160e5cc221SPierre-Louis Bossart * Legacy devices don't have a PCI-based DSP and use HDaudio 6170e5cc221SPierre-Louis Bossart * for HDMI/DP support, ignore kernel parameter 6180e5cc221SPierre-Louis Bossart */ 6190e5cc221SPierre-Louis Bossart switch (pci->device) { 6200cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_BDW: 6210cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_HSW_0: 6220cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_HSW_2: 6230cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_HSW_3: 6240cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_BYT: 6250cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_BSW: 6260e5cc221SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_ANY; 6270e5cc221SPierre-Louis Bossart } 6280e5cc221SPierre-Louis Bossart 62982d9d54aSJaroslav Kysela if (dsp_driver > 0 && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST) 63082d9d54aSJaroslav Kysela return dsp_driver; 63182d9d54aSJaroslav Kysela 63282d9d54aSJaroslav Kysela /* 63382d9d54aSJaroslav Kysela * detect DSP by checking class/subclass/prog-id information 63482d9d54aSJaroslav Kysela * class=04 subclass 03 prog-if 00: no DSP, use legacy driver 63582d9d54aSJaroslav Kysela * class=04 subclass 01 prog-if 00: DSP is present 63682d9d54aSJaroslav Kysela * (and may be required e.g. for DMIC or SSP support) 63782d9d54aSJaroslav Kysela * class=04 subclass 03 prog-if 80: use DSP or legacy mode 63882d9d54aSJaroslav Kysela */ 63982d9d54aSJaroslav Kysela if (pci->class == 0x040300) 64082d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_LEGACY; 64182d9d54aSJaroslav Kysela if (pci->class != 0x040100 && pci->class != 0x040380) { 642b79de57bSPierre-Louis Bossart dev_err(&pci->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, selecting HDAudio legacy driver\n", pci->class); 64382d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_LEGACY; 64482d9d54aSJaroslav Kysela } 64582d9d54aSJaroslav Kysela 64682d9d54aSJaroslav Kysela dev_info(&pci->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class); 64782d9d54aSJaroslav Kysela 64882d9d54aSJaroslav Kysela /* find the configuration for the specific device */ 64982d9d54aSJaroslav Kysela cfg = snd_intel_dsp_find_config(pci, config_table, ARRAY_SIZE(config_table)); 65082d9d54aSJaroslav Kysela if (!cfg) 65182d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_ANY; 65282d9d54aSJaroslav Kysela 65382d9d54aSJaroslav Kysela if (cfg->flags & FLAG_SOF) { 65406508575SPierre-Louis Bossart if (cfg->flags & FLAG_SOF_ONLY_IF_SOUNDWIRE && 65506508575SPierre-Louis Bossart snd_intel_dsp_check_soundwire(pci) > 0) { 65606508575SPierre-Louis Bossart dev_info(&pci->dev, "SoundWire enabled on CannonLake+ platform, using SOF driver\n"); 65706508575SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_SOF; 65806508575SPierre-Louis Bossart } 65906508575SPierre-Louis Bossart if (cfg->flags & FLAG_SOF_ONLY_IF_DMIC && 66006508575SPierre-Louis Bossart snd_intel_dsp_check_dmic(pci)) { 66182d9d54aSJaroslav Kysela dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SOF driver\n"); 66282d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_SOF; 66382d9d54aSJaroslav Kysela } 66406508575SPierre-Louis Bossart if (!(cfg->flags & FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE)) 66582d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_SOF; 66682d9d54aSJaroslav Kysela } 66782d9d54aSJaroslav Kysela 668df1fceacSCezary Rojewski 669df1fceacSCezary Rojewski if (cfg->flags & FLAG_SST) { 670df1fceacSCezary Rojewski if (cfg->flags & FLAG_SST_ONLY_IF_DMIC) { 671df1fceacSCezary Rojewski if (snd_intel_dsp_check_dmic(pci)) { 672df1fceacSCezary Rojewski dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SST driver\n"); 67382d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_SST; 674df1fceacSCezary Rojewski } 675df1fceacSCezary Rojewski } else { 676df1fceacSCezary Rojewski return SND_INTEL_DSP_DRIVER_SST; 677df1fceacSCezary Rojewski } 678df1fceacSCezary Rojewski } 67982d9d54aSJaroslav Kysela 68082d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_LEGACY; 68182d9d54aSJaroslav Kysela } 68282d9d54aSJaroslav Kysela EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe); 68382d9d54aSJaroslav Kysela 6845427c7d6SHans de Goede /* Should we default to SOF or SST for BYT/CHT ? */ 6855427c7d6SHans de Goede #if IS_ENABLED(CONFIG_SND_INTEL_BYT_PREFER_SOF) || \ 6865427c7d6SHans de Goede !IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) 6875427c7d6SHans de Goede #define FLAG_SST_OR_SOF_BYT FLAG_SOF 6885427c7d6SHans de Goede #else 6895427c7d6SHans de Goede #define FLAG_SST_OR_SOF_BYT FLAG_SST 6905427c7d6SHans de Goede #endif 6915427c7d6SHans de Goede 692b5682305SPierre-Louis Bossart /* 693b5682305SPierre-Louis Bossart * configuration table 694b5682305SPierre-Louis Bossart * - the order of similar ACPI ID entries is important! 695b5682305SPierre-Louis Bossart * - the first successful match will win 696b5682305SPierre-Louis Bossart */ 697b5682305SPierre-Louis Bossart static const struct config_entry acpi_config_table[] = { 6985427c7d6SHans de Goede #if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \ 6995427c7d6SHans de Goede IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL) 700b5682305SPierre-Louis Bossart /* BayTrail */ 701b5682305SPierre-Louis Bossart { 7025427c7d6SHans de Goede .flags = FLAG_SST_OR_SOF_BYT, 703b5682305SPierre-Louis Bossart .acpi_hid = "80860F28", 704b5682305SPierre-Louis Bossart }, 705b5682305SPierre-Louis Bossart /* CherryTrail */ 706b5682305SPierre-Louis Bossart { 7075427c7d6SHans de Goede .flags = FLAG_SST_OR_SOF_BYT, 708b5682305SPierre-Louis Bossart .acpi_hid = "808622A8", 709b5682305SPierre-Louis Bossart }, 710b5682305SPierre-Louis Bossart #endif 711803e5913SPierre-Louis Bossart /* Broadwell */ 712803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_CATPT) 713803e5913SPierre-Louis Bossart { 714803e5913SPierre-Louis Bossart .flags = FLAG_SST, 715803e5913SPierre-Louis Bossart .acpi_hid = "INT3438" 716803e5913SPierre-Louis Bossart }, 717803e5913SPierre-Louis Bossart #endif 718803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_BROADWELL) 719803e5913SPierre-Louis Bossart { 720803e5913SPierre-Louis Bossart .flags = FLAG_SOF, 721803e5913SPierre-Louis Bossart .acpi_hid = "INT3438" 722803e5913SPierre-Louis Bossart }, 723803e5913SPierre-Louis Bossart #endif 724803e5913SPierre-Louis Bossart /* Haswell - not supported by SOF but added for consistency */ 725803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_CATPT) 726803e5913SPierre-Louis Bossart { 727803e5913SPierre-Louis Bossart .flags = FLAG_SST, 728803e5913SPierre-Louis Bossart .acpi_hid = "INT33C8" 729803e5913SPierre-Louis Bossart }, 730803e5913SPierre-Louis Bossart #endif 731b5682305SPierre-Louis Bossart }; 732b5682305SPierre-Louis Bossart 733b5682305SPierre-Louis Bossart static const struct config_entry *snd_intel_acpi_dsp_find_config(const u8 acpi_hid[ACPI_ID_LEN], 734b5682305SPierre-Louis Bossart const struct config_entry *table, 735b5682305SPierre-Louis Bossart u32 len) 736b5682305SPierre-Louis Bossart { 737b5682305SPierre-Louis Bossart for (; len > 0; len--, table++) { 738b5682305SPierre-Louis Bossart if (memcmp(table->acpi_hid, acpi_hid, ACPI_ID_LEN)) 739b5682305SPierre-Louis Bossart continue; 740b5682305SPierre-Louis Bossart if (table->dmi_table && !dmi_check_system(table->dmi_table)) 741b5682305SPierre-Louis Bossart continue; 742b5682305SPierre-Louis Bossart return table; 743b5682305SPierre-Louis Bossart } 744b5682305SPierre-Louis Bossart return NULL; 745b5682305SPierre-Louis Bossart } 746b5682305SPierre-Louis Bossart 747b5682305SPierre-Louis Bossart int snd_intel_acpi_dsp_driver_probe(struct device *dev, const u8 acpi_hid[ACPI_ID_LEN]) 748b5682305SPierre-Louis Bossart { 749b5682305SPierre-Louis Bossart const struct config_entry *cfg; 750b5682305SPierre-Louis Bossart 751b5682305SPierre-Louis Bossart if (dsp_driver > SND_INTEL_DSP_DRIVER_LEGACY && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST) 752b5682305SPierre-Louis Bossart return dsp_driver; 753b5682305SPierre-Louis Bossart 754b5682305SPierre-Louis Bossart if (dsp_driver == SND_INTEL_DSP_DRIVER_LEGACY) { 755b5682305SPierre-Louis Bossart dev_warn(dev, "dsp_driver parameter %d not supported, using automatic detection\n", 756b5682305SPierre-Louis Bossart SND_INTEL_DSP_DRIVER_LEGACY); 757b5682305SPierre-Louis Bossart } 758b5682305SPierre-Louis Bossart 759b5682305SPierre-Louis Bossart /* find the configuration for the specific device */ 760b5682305SPierre-Louis Bossart cfg = snd_intel_acpi_dsp_find_config(acpi_hid, acpi_config_table, 761b5682305SPierre-Louis Bossart ARRAY_SIZE(acpi_config_table)); 762b5682305SPierre-Louis Bossart if (!cfg) 763b5682305SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_ANY; 764b5682305SPierre-Louis Bossart 765b5682305SPierre-Louis Bossart if (cfg->flags & FLAG_SST) 766b5682305SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_SST; 767b5682305SPierre-Louis Bossart 768b5682305SPierre-Louis Bossart if (cfg->flags & FLAG_SOF) 769b5682305SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_SOF; 770b5682305SPierre-Louis Bossart 771b5682305SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_SST; 772b5682305SPierre-Louis Bossart } 773b5682305SPierre-Louis Bossart EXPORT_SYMBOL_GPL(snd_intel_acpi_dsp_driver_probe); 774b5682305SPierre-Louis Bossart 77582d9d54aSJaroslav Kysela MODULE_LICENSE("GPL v2"); 77682d9d54aSJaroslav Kysela MODULE_DESCRIPTION("Intel DSP config driver"); 77708c2a4bcSPierre-Louis Bossart MODULE_IMPORT_NS(SND_INTEL_SOUNDWIRE_ACPI); 778