Hi,
On Mon, 20 Jun 2022, Takashi Iwai wrote:
So this looks like a bug due to the use of pci_get_class(). Since there is no pci_get_base_class(), we likely need to open-code the search, e.g. something like below.
yes, this indeed seems to be the case.
diff --git a/sound/hda/hdac_i915.c b/sound/hda/hdac_i915.c index 3f35972e1cf7..161a9711cd63 100644 --- a/sound/hda/hdac_i915.c +++ b/sound/hda/hdac_i915.c @@ -119,21 +119,18 @@ static int i915_component_master_match(struct device *dev, int subcomponent,
[...]
- do {
display_dev = pci_get_class(class, display_dev);
if (display_dev && display_dev->vendor == PCI_VENDOR_ID_INTEL &&
- for_each_pci_dev(display_dev) {
if (display_dev->vendor == PCI_VENDOR_ID_INTEL &&
connectivity_check(display_dev, hdac_pci)) { pci_dev_put(display_dev);(display_dev->class >> 16) == PCI_BASE_CLASS_DISPLAY &&
match = true;
}return true;
- } while (!match && display_dev);
- }
To open code a bit less, I was first thinking:
--cut-- --- a/sound/hda/hdac_i915.c +++ b/sound/hda/hdac_i915.c @@ -124,9 +124,9 @@ static int i915_gfx_present(struct pci_dev *hdac_pci) bool match = false;
do { - display_dev = pci_get_class(class, display_dev); + display_dev = pci_get_device(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, display_dev);
- if (display_dev && display_dev->vendor == PCI_VENDOR_ID_INTEL && + if (display_dev && (display_dev->class >> 16) == PCI_BASE_CLASS_DISPLAY && connectivity_check(display_dev, hdac_pci)) { --cut--
But it's a marginal difference, so for your version:
Reviewed-by: Kai Vehmanen kai.vehmanen@linux.intel.com
Br, Kai