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, 53*0cd0a7c2SAmadeusz 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, 64*0cd0a7c2SAmadeusz 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, 78*0cd0a7c2SAmadeusz 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, 85*0cd0a7c2SAmadeusz 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, 106*0cd0a7c2SAmadeusz 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, 119*0cd0a7c2SAmadeusz 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, 126*0cd0a7c2SAmadeusz 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, 139*0cd0a7c2SAmadeusz 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, 151*0cd0a7c2SAmadeusz 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, 164*0cd0a7c2SAmadeusz 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 /* 170cc8f81c7SPierre-Louis Bossart * CoffeeLake, CannonLake, CometLake, IceLake, TigerLake use legacy 171b79de57bSPierre-Louis Bossart * HDAudio driver except for Google Chromebooks and when DMICs are 172cc8f81c7SPierre-Louis Bossart * present. Two cases are required since Coreboot does not expose NHLT 173cc8f81c7SPierre-Louis Bossart * 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, 184*0cd0a7c2SAmadeusz 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, 203*0cd0a7c2SAmadeusz 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, 208*0cd0a7c2SAmadeusz 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, 216*0cd0a7c2SAmadeusz 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, 229*0cd0a7c2SAmadeusz 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, 237*0cd0a7c2SAmadeusz 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, 263*0cd0a7c2SAmadeusz 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, 268*0cd0a7c2SAmadeusz 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, 273*0cd0a7c2SAmadeusz 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, 292*0cd0a7c2SAmadeusz 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, 297*0cd0a7c2SAmadeusz 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, 305*0cd0a7c2SAmadeusz 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, 318*0cd0a7c2SAmadeusz 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, 323*0cd0a7c2SAmadeusz 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, 331*0cd0a7c2SAmadeusz 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, 344*0cd0a7c2SAmadeusz 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, 349*0cd0a7c2SAmadeusz 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, 357*0cd0a7c2SAmadeusz 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, 376*0cd0a7c2SAmadeusz 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, 381*0cd0a7c2SAmadeusz 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, 385*0cd0a7c2SAmadeusz 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, 393*0cd0a7c2SAmadeusz 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, 397*0cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_EHL_3, 398114613f6SPierre-Louis Bossart }, 399cc8f81c7SPierre-Louis Bossart #endif 400cc8f81c7SPierre-Louis Bossart 401*0cd0a7c2SAmadeusz 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, 405*0cd0a7c2SAmadeusz 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, 409*0cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_RPL_S, 410d52eee98SPierre-Louis Bossart }, 411c4294d7fSKai Vehmanen { 4122ec8b081SMuralidhar Reddy .flags = FLAG_SOF, 413*0cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_P, 4142ec8b081SMuralidhar Reddy .codec_hid = &essx_83x6, 4152ec8b081SMuralidhar Reddy }, 4162ec8b081SMuralidhar Reddy { 417c4294d7fSKai Vehmanen .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 418*0cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_P, 419c4294d7fSKai Vehmanen }, 4204ad7935dSKai Vehmanen { 4214ad7935dSKai Vehmanen .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 422*0cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_PX, 423ca1ece24SKai Vehmanen }, 424d52eee98SPierre-Louis Bossart { 4259db1c9faSMuralidhar Reddy .flags = FLAG_SOF, 426*0cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_PS, 4279db1c9faSMuralidhar Reddy .codec_hid = &essx_83x6, 4289db1c9faSMuralidhar Reddy }, 4299db1c9faSMuralidhar Reddy { 430d52eee98SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 431*0cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_PS, 432b07908abSGongjun Song }, 433b07908abSGongjun Song { 434b07908abSGongjun Song .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 435*0cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_M, 436b07908abSGongjun Song }, 437c35fbea4SPierre-Louis Bossart { 438c35fbea4SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 439*0cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_ADL_N, 440c35fbea4SPierre-Louis Bossart }, 441c35fbea4SPierre-Louis Bossart { 442c35fbea4SPierre-Louis Bossart .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 443*0cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_0, 444*0cd0a7c2SAmadeusz Sławiński }, 445*0cd0a7c2SAmadeusz Sławiński { 446*0cd0a7c2SAmadeusz Sławiński .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 447*0cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_RPL_P_1, 448*0cd0a7c2SAmadeusz Sławiński }, 449*0cd0a7c2SAmadeusz Sławiński { 450*0cd0a7c2SAmadeusz Sławiński .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 451*0cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_RPL_M, 452*0cd0a7c2SAmadeusz Sławiński }, 453*0cd0a7c2SAmadeusz Sławiński { 454*0cd0a7c2SAmadeusz Sławiński .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 455*0cd0a7c2SAmadeusz Sławiński .device = PCI_DEVICE_ID_INTEL_HDA_RPL_PX, 456c35fbea4SPierre-Louis Bossart }, 457c4294d7fSKai Vehmanen #endif 458c4294d7fSKai Vehmanen 459bbdf904bSBard Liao /* Meteor Lake */ 460bbdf904bSBard Liao #if IS_ENABLED(CONFIG_SND_SOC_SOF_METEORLAKE) 461bbdf904bSBard Liao /* Meteorlake-P */ 462bbdf904bSBard Liao { 463bbdf904bSBard Liao .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, 464bbdf904bSBard Liao .device = 0x7e28, 465bbdf904bSBard Liao }, 466bbdf904bSBard Liao #endif 467bbdf904bSBard Liao 46882d9d54aSJaroslav Kysela }; 46982d9d54aSJaroslav Kysela 47082d9d54aSJaroslav Kysela static const struct config_entry *snd_intel_dsp_find_config 47182d9d54aSJaroslav Kysela (struct pci_dev *pci, const struct config_entry *table, u32 len) 47282d9d54aSJaroslav Kysela { 47382d9d54aSJaroslav Kysela u16 device; 47482d9d54aSJaroslav Kysela 47582d9d54aSJaroslav Kysela device = pci->device; 47682d9d54aSJaroslav Kysela for (; len > 0; len--, table++) { 47782d9d54aSJaroslav Kysela if (table->device != device) 47882d9d54aSJaroslav Kysela continue; 47982d9d54aSJaroslav Kysela if (table->dmi_table && !dmi_check_system(table->dmi_table)) 48082d9d54aSJaroslav Kysela continue; 481de24d97fSPierre-Louis Bossart if (table->codec_hid) { 482de24d97fSPierre-Louis Bossart int i; 483de24d97fSPierre-Louis Bossart 484de24d97fSPierre-Louis Bossart for (i = 0; i < table->codec_hid->num_codecs; i++) 485de24d97fSPierre-Louis Bossart if (acpi_dev_present(table->codec_hid->codecs[i], NULL, -1)) 486de24d97fSPierre-Louis Bossart break; 487de24d97fSPierre-Louis Bossart if (i == table->codec_hid->num_codecs) 4889d36ceabSPierre-Louis Bossart continue; 489de24d97fSPierre-Louis Bossart } 49082d9d54aSJaroslav Kysela return table; 49182d9d54aSJaroslav Kysela } 49282d9d54aSJaroslav Kysela return NULL; 49382d9d54aSJaroslav Kysela } 49482d9d54aSJaroslav Kysela 49582d9d54aSJaroslav Kysela static int snd_intel_dsp_check_dmic(struct pci_dev *pci) 49682d9d54aSJaroslav Kysela { 49782d9d54aSJaroslav Kysela struct nhlt_acpi_table *nhlt; 49882d9d54aSJaroslav Kysela int ret = 0; 49982d9d54aSJaroslav Kysela 50082d9d54aSJaroslav Kysela nhlt = intel_nhlt_init(&pci->dev); 50182d9d54aSJaroslav Kysela if (nhlt) { 5028235a08bSAmadeusz Sławiński if (intel_nhlt_has_endpoint_type(nhlt, NHLT_LINK_DMIC)) 50382d9d54aSJaroslav Kysela ret = 1; 50482d9d54aSJaroslav Kysela intel_nhlt_free(nhlt); 50582d9d54aSJaroslav Kysela } 50682d9d54aSJaroslav Kysela return ret; 50782d9d54aSJaroslav Kysela } 50882d9d54aSJaroslav Kysela 50906508575SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE) 51006508575SPierre-Louis Bossart static int snd_intel_dsp_check_soundwire(struct pci_dev *pci) 51106508575SPierre-Louis Bossart { 51206508575SPierre-Louis Bossart struct sdw_intel_acpi_info info; 51306508575SPierre-Louis Bossart acpi_handle handle; 51406508575SPierre-Louis Bossart int ret; 51506508575SPierre-Louis Bossart 51606508575SPierre-Louis Bossart handle = ACPI_HANDLE(&pci->dev); 51706508575SPierre-Louis Bossart 51806508575SPierre-Louis Bossart ret = sdw_intel_acpi_scan(handle, &info); 51906508575SPierre-Louis Bossart if (ret < 0) 52006508575SPierre-Louis Bossart return ret; 52106508575SPierre-Louis Bossart 52206508575SPierre-Louis Bossart return info.link_mask; 52306508575SPierre-Louis Bossart } 52406508575SPierre-Louis Bossart #else 52506508575SPierre-Louis Bossart static int snd_intel_dsp_check_soundwire(struct pci_dev *pci) 52606508575SPierre-Louis Bossart { 52706508575SPierre-Louis Bossart return 0; 52806508575SPierre-Louis Bossart } 52906508575SPierre-Louis Bossart #endif 53006508575SPierre-Louis Bossart 53182d9d54aSJaroslav Kysela int snd_intel_dsp_driver_probe(struct pci_dev *pci) 53282d9d54aSJaroslav Kysela { 53382d9d54aSJaroslav Kysela const struct config_entry *cfg; 53482d9d54aSJaroslav Kysela 53591636a82STakashi Iwai /* Intel vendor only */ 536*0cd0a7c2SAmadeusz Sławiński if (pci->vendor != PCI_VENDOR_ID_INTEL) 53791636a82STakashi Iwai return SND_INTEL_DSP_DRIVER_ANY; 53891636a82STakashi Iwai 5390e5cc221SPierre-Louis Bossart /* 5400e5cc221SPierre-Louis Bossart * Legacy devices don't have a PCI-based DSP and use HDaudio 5410e5cc221SPierre-Louis Bossart * for HDMI/DP support, ignore kernel parameter 5420e5cc221SPierre-Louis Bossart */ 5430e5cc221SPierre-Louis Bossart switch (pci->device) { 544*0cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_BDW: 545*0cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_HSW_0: 546*0cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_HSW_2: 547*0cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_HSW_3: 548*0cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_BYT: 549*0cd0a7c2SAmadeusz Sławiński case PCI_DEVICE_ID_INTEL_HDA_BSW: 5500e5cc221SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_ANY; 5510e5cc221SPierre-Louis Bossart } 5520e5cc221SPierre-Louis Bossart 55382d9d54aSJaroslav Kysela if (dsp_driver > 0 && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST) 55482d9d54aSJaroslav Kysela return dsp_driver; 55582d9d54aSJaroslav Kysela 55682d9d54aSJaroslav Kysela /* 55782d9d54aSJaroslav Kysela * detect DSP by checking class/subclass/prog-id information 55882d9d54aSJaroslav Kysela * class=04 subclass 03 prog-if 00: no DSP, use legacy driver 55982d9d54aSJaroslav Kysela * class=04 subclass 01 prog-if 00: DSP is present 56082d9d54aSJaroslav Kysela * (and may be required e.g. for DMIC or SSP support) 56182d9d54aSJaroslav Kysela * class=04 subclass 03 prog-if 80: use DSP or legacy mode 56282d9d54aSJaroslav Kysela */ 56382d9d54aSJaroslav Kysela if (pci->class == 0x040300) 56482d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_LEGACY; 56582d9d54aSJaroslav Kysela if (pci->class != 0x040100 && pci->class != 0x040380) { 566b79de57bSPierre-Louis Bossart dev_err(&pci->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, selecting HDAudio legacy driver\n", pci->class); 56782d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_LEGACY; 56882d9d54aSJaroslav Kysela } 56982d9d54aSJaroslav Kysela 57082d9d54aSJaroslav Kysela dev_info(&pci->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class); 57182d9d54aSJaroslav Kysela 57282d9d54aSJaroslav Kysela /* find the configuration for the specific device */ 57382d9d54aSJaroslav Kysela cfg = snd_intel_dsp_find_config(pci, config_table, ARRAY_SIZE(config_table)); 57482d9d54aSJaroslav Kysela if (!cfg) 57582d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_ANY; 57682d9d54aSJaroslav Kysela 57782d9d54aSJaroslav Kysela if (cfg->flags & FLAG_SOF) { 57806508575SPierre-Louis Bossart if (cfg->flags & FLAG_SOF_ONLY_IF_SOUNDWIRE && 57906508575SPierre-Louis Bossart snd_intel_dsp_check_soundwire(pci) > 0) { 58006508575SPierre-Louis Bossart dev_info(&pci->dev, "SoundWire enabled on CannonLake+ platform, using SOF driver\n"); 58106508575SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_SOF; 58206508575SPierre-Louis Bossart } 58306508575SPierre-Louis Bossart if (cfg->flags & FLAG_SOF_ONLY_IF_DMIC && 58406508575SPierre-Louis Bossart snd_intel_dsp_check_dmic(pci)) { 58582d9d54aSJaroslav Kysela dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SOF driver\n"); 58682d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_SOF; 58782d9d54aSJaroslav Kysela } 58806508575SPierre-Louis Bossart if (!(cfg->flags & FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE)) 58982d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_SOF; 59082d9d54aSJaroslav Kysela } 59182d9d54aSJaroslav Kysela 592df1fceacSCezary Rojewski 593df1fceacSCezary Rojewski if (cfg->flags & FLAG_SST) { 594df1fceacSCezary Rojewski if (cfg->flags & FLAG_SST_ONLY_IF_DMIC) { 595df1fceacSCezary Rojewski if (snd_intel_dsp_check_dmic(pci)) { 596df1fceacSCezary Rojewski dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SST driver\n"); 59782d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_SST; 598df1fceacSCezary Rojewski } 599df1fceacSCezary Rojewski } else { 600df1fceacSCezary Rojewski return SND_INTEL_DSP_DRIVER_SST; 601df1fceacSCezary Rojewski } 602df1fceacSCezary Rojewski } 60382d9d54aSJaroslav Kysela 60482d9d54aSJaroslav Kysela return SND_INTEL_DSP_DRIVER_LEGACY; 60582d9d54aSJaroslav Kysela } 60682d9d54aSJaroslav Kysela EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe); 60782d9d54aSJaroslav Kysela 6085427c7d6SHans de Goede /* Should we default to SOF or SST for BYT/CHT ? */ 6095427c7d6SHans de Goede #if IS_ENABLED(CONFIG_SND_INTEL_BYT_PREFER_SOF) || \ 6105427c7d6SHans de Goede !IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) 6115427c7d6SHans de Goede #define FLAG_SST_OR_SOF_BYT FLAG_SOF 6125427c7d6SHans de Goede #else 6135427c7d6SHans de Goede #define FLAG_SST_OR_SOF_BYT FLAG_SST 6145427c7d6SHans de Goede #endif 6155427c7d6SHans de Goede 616b5682305SPierre-Louis Bossart /* 617b5682305SPierre-Louis Bossart * configuration table 618b5682305SPierre-Louis Bossart * - the order of similar ACPI ID entries is important! 619b5682305SPierre-Louis Bossart * - the first successful match will win 620b5682305SPierre-Louis Bossart */ 621b5682305SPierre-Louis Bossart static const struct config_entry acpi_config_table[] = { 6225427c7d6SHans de Goede #if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \ 6235427c7d6SHans de Goede IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL) 624b5682305SPierre-Louis Bossart /* BayTrail */ 625b5682305SPierre-Louis Bossart { 6265427c7d6SHans de Goede .flags = FLAG_SST_OR_SOF_BYT, 627b5682305SPierre-Louis Bossart .acpi_hid = "80860F28", 628b5682305SPierre-Louis Bossart }, 629b5682305SPierre-Louis Bossart /* CherryTrail */ 630b5682305SPierre-Louis Bossart { 6315427c7d6SHans de Goede .flags = FLAG_SST_OR_SOF_BYT, 632b5682305SPierre-Louis Bossart .acpi_hid = "808622A8", 633b5682305SPierre-Louis Bossart }, 634b5682305SPierre-Louis Bossart #endif 635803e5913SPierre-Louis Bossart /* Broadwell */ 636803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_CATPT) 637803e5913SPierre-Louis Bossart { 638803e5913SPierre-Louis Bossart .flags = FLAG_SST, 639803e5913SPierre-Louis Bossart .acpi_hid = "INT3438" 640803e5913SPierre-Louis Bossart }, 641803e5913SPierre-Louis Bossart #endif 642803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_SOF_BROADWELL) 643803e5913SPierre-Louis Bossart { 644803e5913SPierre-Louis Bossart .flags = FLAG_SOF, 645803e5913SPierre-Louis Bossart .acpi_hid = "INT3438" 646803e5913SPierre-Louis Bossart }, 647803e5913SPierre-Louis Bossart #endif 648803e5913SPierre-Louis Bossart /* Haswell - not supported by SOF but added for consistency */ 649803e5913SPierre-Louis Bossart #if IS_ENABLED(CONFIG_SND_SOC_INTEL_CATPT) 650803e5913SPierre-Louis Bossart { 651803e5913SPierre-Louis Bossart .flags = FLAG_SST, 652803e5913SPierre-Louis Bossart .acpi_hid = "INT33C8" 653803e5913SPierre-Louis Bossart }, 654803e5913SPierre-Louis Bossart #endif 655b5682305SPierre-Louis Bossart }; 656b5682305SPierre-Louis Bossart 657b5682305SPierre-Louis Bossart static const struct config_entry *snd_intel_acpi_dsp_find_config(const u8 acpi_hid[ACPI_ID_LEN], 658b5682305SPierre-Louis Bossart const struct config_entry *table, 659b5682305SPierre-Louis Bossart u32 len) 660b5682305SPierre-Louis Bossart { 661b5682305SPierre-Louis Bossart for (; len > 0; len--, table++) { 662b5682305SPierre-Louis Bossart if (memcmp(table->acpi_hid, acpi_hid, ACPI_ID_LEN)) 663b5682305SPierre-Louis Bossart continue; 664b5682305SPierre-Louis Bossart if (table->dmi_table && !dmi_check_system(table->dmi_table)) 665b5682305SPierre-Louis Bossart continue; 666b5682305SPierre-Louis Bossart return table; 667b5682305SPierre-Louis Bossart } 668b5682305SPierre-Louis Bossart return NULL; 669b5682305SPierre-Louis Bossart } 670b5682305SPierre-Louis Bossart 671b5682305SPierre-Louis Bossart int snd_intel_acpi_dsp_driver_probe(struct device *dev, const u8 acpi_hid[ACPI_ID_LEN]) 672b5682305SPierre-Louis Bossart { 673b5682305SPierre-Louis Bossart const struct config_entry *cfg; 674b5682305SPierre-Louis Bossart 675b5682305SPierre-Louis Bossart if (dsp_driver > SND_INTEL_DSP_DRIVER_LEGACY && dsp_driver <= SND_INTEL_DSP_DRIVER_LAST) 676b5682305SPierre-Louis Bossart return dsp_driver; 677b5682305SPierre-Louis Bossart 678b5682305SPierre-Louis Bossart if (dsp_driver == SND_INTEL_DSP_DRIVER_LEGACY) { 679b5682305SPierre-Louis Bossart dev_warn(dev, "dsp_driver parameter %d not supported, using automatic detection\n", 680b5682305SPierre-Louis Bossart SND_INTEL_DSP_DRIVER_LEGACY); 681b5682305SPierre-Louis Bossart } 682b5682305SPierre-Louis Bossart 683b5682305SPierre-Louis Bossart /* find the configuration for the specific device */ 684b5682305SPierre-Louis Bossart cfg = snd_intel_acpi_dsp_find_config(acpi_hid, acpi_config_table, 685b5682305SPierre-Louis Bossart ARRAY_SIZE(acpi_config_table)); 686b5682305SPierre-Louis Bossart if (!cfg) 687b5682305SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_ANY; 688b5682305SPierre-Louis Bossart 689b5682305SPierre-Louis Bossart if (cfg->flags & FLAG_SST) 690b5682305SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_SST; 691b5682305SPierre-Louis Bossart 692b5682305SPierre-Louis Bossart if (cfg->flags & FLAG_SOF) 693b5682305SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_SOF; 694b5682305SPierre-Louis Bossart 695b5682305SPierre-Louis Bossart return SND_INTEL_DSP_DRIVER_SST; 696b5682305SPierre-Louis Bossart } 697b5682305SPierre-Louis Bossart EXPORT_SYMBOL_GPL(snd_intel_acpi_dsp_driver_probe); 698b5682305SPierre-Louis Bossart 69982d9d54aSJaroslav Kysela MODULE_LICENSE("GPL v2"); 70082d9d54aSJaroslav Kysela MODULE_DESCRIPTION("Intel DSP config driver"); 70108c2a4bcSPierre-Louis Bossart MODULE_IMPORT_NS(SND_INTEL_SOUNDWIRE_ACPI); 702