[alsa-devel] [PATCH] ASoC: Skylake SST driver - blacklist the PCI device IDs for the auto probe

Jaroslav Kysela perex at perex.cz
Mon Sep 23 18:57:39 CEST 2019


There are basically three drivers for the PCI devices for
the recent Intel hardware with the build-in DSPs. The legacy HDA
driver has dmic_detect module option for the auto detection
of the platforms with the digital microphone. Because the SOF
driver is preferred, just skip PCI probe in the Skylake SST
driver when the PCI device ID clashes by default. The user
can override the auto behaviour with the pci_binding
module parameter.

Boot log from Lenovo Carbon X1 (7th gen) with the default settings:

  snd_hda_intel 0000:00:1f.3: Digital mics found on Skylake+ platform, aborting probe
  snd_soc_skl 0000:00:1f.3: SOF driver is preferred on this platform, aborting probe
  sof-audio-pci 0000:00:1f.3: warning: No matching ASoC machine driver found
  sof-audio-pci 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if 0x040380
  ....

Perhaps, it may be more wise to create one shared module and all
three drivers should call the driver detection routine(s) from one
place.

Signed-off-by: Jaroslav Kysela <perex at perex.cz>
Cc: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
---
 sound/soc/intel/skylake/skl.c | 37 +++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/sound/soc/intel/skylake/skl.c b/sound/soc/intel/skylake/skl.c
index 141dbbf975ac..cace55ca8d55 100644
--- a/sound/soc/intel/skylake/skl.c
+++ b/sound/soc/intel/skylake/skl.c
@@ -38,6 +38,39 @@ 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");
 
+/*
+ *
+ */
+static int skl_sof_support(struct pci_dev *pci)
+{
+	/* the SOF driver has same PCI IDs */
+	if (pci->vendor == 0x8086) {
+		switch (pci->device) {
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_LP)
+		case 0x02c8: /* CML-LP */
+#endif
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE_H)
+		case 0x06c8: /* CML-H */
+#endif
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_GEMINILAKE)
+		case 0x3198: /* GLK */
+#endif
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE)
+		case 0x5a98: /* BXT-P */
+#endif
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_CANNONLAKE)
+		case 0x9dc8: /* CNL */
+#endif
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_COFFEELAKE)
+		case 0xa348: /* CFL */
+#endif
+		case 0x0000: /* a dummy value when no SOF driver enabled */
+			return 1;
+		}
+	}
+	return 0;
+}
+
 /*
  * initialize the PCI registers
  */
@@ -1002,6 +1035,10 @@ static int skl_probe(struct pci_dev *pci,
 			dev_err(&pci->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, aborting probe\n", pci->class);
 			return -ENODEV;
 		}
+		if (skl_sof_support(pci)) {
+			dev_info(&pci->dev, "SOF driver is preferred on this platform, aborting probe\n");
+			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:
-- 
2.20.1


More information about the Alsa-devel mailing list