ALSA: hda: intel: Add Lenovo IdeaPad Z570 to probe denylist
[ Upstream commit becc794c5e46f4dfca59f2385f78d83fc9e84700 ] Lenovo IdeaPad Z570 with NVIDIA GeForce Ge 540M doesn't have sound on the discrete GPU. The HDA controller in DGPU is disabled by BIOS, but then reenabled by quirk_nvidia_hda(). The probe fails and ends up with the "GPU sound probed, but not operational" error. Add this laptop to DMI-based denylist to prevent probe early. DMI is used, because the audio device has zero subsystem IDs, and this entry would be too much, blocking all 540M chips: PCI_DEVICE_SUB(0x10de, 0x0bea, 0x0000, 0x0000) Also, this laptop comes in a variety of modifications with different NVIDIA GPUs, so the DMI check will cover them all. Signed-off-by: Maxim Mikityanskiy <maxtram95@gmail.com> Link: https://patch.msgid.link/20250208214602.39607-3-maxtram95@gmail.com Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
fb44392bd5
commit
1d91458b12
@@ -37,6 +37,7 @@
|
||||
#include <linux/completion.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/pgtable.h>
|
||||
#include <linux/dmi.h>
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
/* for snoop control */
|
||||
@@ -2092,6 +2093,27 @@ static const struct pci_device_id driver_denylist[] = {
|
||||
{}
|
||||
};
|
||||
|
||||
static struct pci_device_id driver_denylist_ideapad_z570[] = {
|
||||
{ PCI_DEVICE_SUB(0x10de, 0x0bea, 0x0000, 0x0000) }, /* NVIDIA GF108 HDA */
|
||||
{}
|
||||
};
|
||||
|
||||
/* DMI-based denylist, to be used when:
|
||||
* - PCI subsystem IDs are zero, impossible to distinguish from valid sound cards.
|
||||
* - Different modifications of the same laptop use different GPU models.
|
||||
*/
|
||||
static const struct dmi_system_id driver_denylist_dmi[] = {
|
||||
{
|
||||
/* No HDA in NVIDIA DGPU. BIOS disables it, but quirk_nvidia_hda() reenables. */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "Ideapad Z570"),
|
||||
},
|
||||
.driver_data = &driver_denylist_ideapad_z570,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct hda_controller_ops pci_hda_ops = {
|
||||
.disable_msi_reset_irq = disable_msi_reset_irq,
|
||||
.position_check = azx_position_check,
|
||||
@@ -2102,6 +2124,7 @@ static DECLARE_BITMAP(probed_devs, SNDRV_CARDS);
|
||||
static int azx_probe(struct pci_dev *pci,
|
||||
const struct pci_device_id *pci_id)
|
||||
{
|
||||
const struct dmi_system_id *dmi;
|
||||
struct snd_card *card;
|
||||
struct hda_intel *hda;
|
||||
struct azx *chip;
|
||||
@@ -2114,6 +2137,12 @@ static int azx_probe(struct pci_dev *pci,
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
dmi = dmi_first_match(driver_denylist_dmi);
|
||||
if (dmi && pci_match_id(dmi->driver_data, pci)) {
|
||||
dev_info(&pci->dev, "Skipping the device on the DMI denylist\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
dev = find_first_zero_bit(probed_devs, SNDRV_CARDS);
|
||||
if (dev >= SNDRV_CARDS)
|
||||
return -ENODEV;
|
||||
|
Reference in New Issue
Block a user