MODULE_PARM_DESC(beep_mode, "Select HDA Beep registration mode "
                            "(0=off, 1=on) (default=1).");
 #endif
+static int skl_pci_binding;
+module_param_named(pci_binding, skl_pci_binding, int, 0444);
+MODULE_PARM_DESC(pci_binding, "PCI binding (0=auto, 1=only legacy, 2=only asoc");
 
 #ifdef CONFIG_PM
 static int param_set_xint(const char *val, const struct kernel_param *kp);
        int err;
 
        /* check if this driver can be used on SKL+ Intel platforms */
-       if ((pci_id->driver_data & AZX_DCAPS_INTEL_SHARED) &&
-           pci->class != 0x040300)
-               return -ENODEV;
+       if (pci_id->driver_data & AZX_DCAPS_INTEL_SHARED) {
+               switch (skl_pci_binding) {
+               case SND_SKL_PCI_BIND_AUTO:
+                       if (pci->class != 0x040300) {
+                               dev_info(&pci->dev, "The DSP is enabled on this platform, aborting probe\n");
+                               return -ENODEV;
+                       }
+                       dev_info(&pci->dev, "No DSP detected, continuing HDaudio legacy probe\n");
+                       break;
+               case SND_SKL_PCI_BIND_LEGACY:
+                       dev_info(&pci->dev, "Module parameter forced binding with HDaudio legacy, bypassed detection logic\n");
+                       break;
+               case SND_SKL_PCI_BIND_ASOC:
+                       dev_info(&pci->dev, "Module parameter forced binding with SKL+ ASoC driver, aborting probe\n");
+                       return -ENODEV;
+               default:
+                       dev_err(&pci->dev, "invalid value for skl_pci_binding module parameter, ignored\n");
+                       break;
+               }
+       }
 
        if (dev >= SNDRV_CARDS)
                return -ENODEV;
 
 #if IS_ENABLED(CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC)
 #include "../../../soc/codecs/hdac_hda.h"
 #endif
+static int skl_pci_binding;
+module_param_named(pci_binding, skl_pci_binding, int, 0444);
+MODULE_PARM_DESC(pci_binding, "PCI binding (0=auto, 1=only legacy, 2=only asoc");
 
 /*
  * initialize the PCI registers
        unsigned short gcap;
        int cp_streams, pb_streams, start_idx;
 
-       /*
-        * detect DSP by checking class/subclass/prog-id information
-        * class=04 subclass 03 prog-if 00: no DSP, legacy driver needs to be used
-        * class=04 subclass 01 prog-if 00: DSP is present (and may be required e.g. for DMIC or SSP support)
-        * class=04 subclass 03 prog-if 80: either of DSP or legacy mode can be used
-        */
-       if (pci->class == 0x040300) {
-               dev_err(bus->dev, "The DSP is not enabled on this platform, aborting probe\n");
-               return -ENODEV;
-       } else if (pci->class != 0x040100 && pci->class != 0x040380) {
-               dev_err(bus->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, aborting probe\n", pci->class);
-               return -ENODEV;
-       }
-       dev_info(bus->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class);
-
        err = pci_request_regions(pci, "Skylake HD audio");
        if (err < 0)
                return err;
        struct hdac_bus *bus = NULL;
        int err;
 
+       switch (skl_pci_binding) {
+       case SND_SKL_PCI_BIND_AUTO:
+               /*
+                * detect DSP by checking class/subclass/prog-id information
+                * class=04 subclass 03 prog-if 00: no DSP, use legacy driver
+                * class=04 subclass 01 prog-if 00: DSP is present
+                *   (and may be required e.g. for DMIC or SSP support)
+                * class=04 subclass 03 prog-if 80: use DSP or legacy mode
+                */
+               if (pci->class == 0x040300) {
+                       dev_info(&pci->dev, "The DSP is not enabled on this platform, aborting probe\n");
+                       return -ENODEV;
+               }
+               if (pci->class != 0x040100 && pci->class != 0x040380) {
+                       dev_err(&pci->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, aborting probe\n", pci->class);
+                       return -ENODEV;
+               }
+               dev_info(&pci->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class);
+               break;
+       case SND_SKL_PCI_BIND_LEGACY:
+               dev_info(&pci->dev, "Module parameter forced binding with HDaudio legacy, aborting probe\n");
+               return -ENODEV;
+       case SND_SKL_PCI_BIND_ASOC:
+               dev_info(&pci->dev, "Module parameter forced binding with SKL driver, bypassed detection logic\n");
+               break;
+       default:
+               dev_err(&pci->dev, "invalid value for skl_pci_binding module parameter, ignored\n");
+               break;
+       }
+
        /* we use ext core ops, so provide NULL for ops here */
        err = skl_create(pci, NULL, &skl);
        if (err < 0)