The default time-out value in seconds for HD-audio automatic
          power-save mode.  0 means to disable the power-save mode.
 
+if SND_HDA_INTEL
+
+# The options below should not be enabled by distributions or
+# users. They are selected by Intel/Skylake or SOF drivers when they
+# register for a PCI ID which is also handled by the HDAudio legacy
+# driver. When this option is selected and the DSP is detected based on
+# the PCI class/subclass/prog-if, the probe of the HDAudio legacy
+# aborts. This mechanism removes the need for distributions to use
+# blacklists. It can be bypassed with module parameters should the
+# Intel/Skylake or SOF drivers fail to handle a specific platform.
+
+config SND_HDA_INTEL_DSP_DETECTION_SKL
+       bool
+       help
+         This option is selected by SOF or SST drivers, not users or distros.
+         It enables DSP detection based on PCI class information for
+         Skylake machines.
+
+config SND_HDA_INTEL_DSP_DETECTION_APL
+       bool
+       help
+         This option is selected by SOF or SST drivers, not users or distros.
+         It enables DSP detection based on PCI class information for
+         Broxton/ApolloLake machines
+
+config SND_HDA_INTEL_DSP_DETECTION_KBL
+       bool
+       help
+         This option is selected by SOF or SST drivers, not users or distros.
+         It enables DSP detection based on PCI class information for
+         KabyLake machines
+
+config SND_HDA_INTEL_DSP_DETECTION_GLK
+       bool
+       help
+         This option is selected by SOF or SST drivers, not users or distros.
+         It enables DSP detection based on PCI class information for
+         GeminiLake machines
+
+config SND_HDA_INTEL_DSP_DETECTION_CNL
+       bool
+       help
+         This option is selected by SOF or SST drivers, not users or distros.
+         It enables DSP detection based on PCI class information for
+         CannonLake machines
+
+config SND_HDA_INTEL_DSP_DETECTION_CFL
+       bool
+       help
+         This option is selected by SOF or SST drivers, not users or distros.
+         It enables DSP detection based on PCI class information for
+         CoffeeLake machines
+
+config SND_HDA_INTEL_DSP_DETECTION_ICL
+       bool
+       help
+         This option is selected by SOF or SST drivers, not users or distros.
+         It enables DSP detection based on PCI class information for
+         IceLake machines
+
+endif ## SND_HDA_INTEL
+
 endif
 
 endmenu
 
         AZX_DCAPS_NO_64BIT |\
         AZX_DCAPS_4K_BDLE_BOUNDARY | AZX_DCAPS_SNOOP_OFF)
 
+#define AZX_DCAPS_INTEL_DSP_DETECTION(conf) (IS_ENABLED(CONFIG_SND_HDA_INTEL_DSP_DETECTION_##conf) ? AZX_DCAPS_INTEL_SHARED : 0)
 /*
  * vga_switcheroo support
  */
        bool schedule_probe;
        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 (dev >= SNDRV_CARDS)
                return -ENODEV;
        if (!enable[dev]) {
          .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE },
        /* Sunrise Point-LP */
        { PCI_DEVICE(0x8086, 0x9d70),
-         .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE },
+         .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE |
+         AZX_DCAPS_INTEL_DSP_DETECTION(SKL)
+       },
        /* Kabylake */
        { PCI_DEVICE(0x8086, 0xa171),
          .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE },
        /* Kabylake-LP */
        { PCI_DEVICE(0x8086, 0x9d71),
-         .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE },
+         .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE |
+         AZX_DCAPS_INTEL_DSP_DETECTION(KBL)
+       },
        /* Kabylake-H */
        { PCI_DEVICE(0x8086, 0xa2f0),
          .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE },
        /* Coffelake */
        { PCI_DEVICE(0x8086, 0xa348),
-         .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
+         .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE |
+         AZX_DCAPS_INTEL_DSP_DETECTION(CFL)
+       },
        /* Cannonlake */
        { PCI_DEVICE(0x8086, 0x9dc8),
-         .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
+         .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE |
+         AZX_DCAPS_INTEL_DSP_DETECTION(CNL)
+       },
        /* Icelake */
        { PCI_DEVICE(0x8086, 0x34c8),
-         .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
+         .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE |
+         AZX_DCAPS_INTEL_DSP_DETECTION(ICL)
+       },
        /* Broxton-P(Apollolake) */
        { PCI_DEVICE(0x8086, 0x5a98),
-         .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_BROXTON },
+         .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_BROXTON |
+         AZX_DCAPS_INTEL_DSP_DETECTION(APL)
+       },
        /* Broxton-T */
        { PCI_DEVICE(0x8086, 0x1a98),
          .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_BROXTON },
        /* Gemini-Lake */
        { PCI_DEVICE(0x8086, 0x3198),
-         .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_BROXTON },
+         .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_BROXTON |
+         AZX_DCAPS_INTEL_DSP_DETECTION(GLK)
+       },
        /* Haswell */
        { PCI_DEVICE(0x8086, 0x0a0c),
          .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },