Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ALSA: hda/realtek: Use codec SSID matching for Lenovo devices

Now we can perform the codec ID matching primarily, and reduce the
conditional application of the quirk for conflicting PCI SSIDs in
various Lenovo devices.

Here, HDA_CODEC_QUIRK() is applied at first so that the device with
the codec SSID matching is picked up, followed by SND_PCI_QUIRK() for
PCI SSID matching with the same ID number.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://patch.msgid.link/20241008120233.7154-4-tiwai@suse.de

+8 -90
+8 -90
sound/pci/hda/patch_realtek.c
··· 7687 7687 ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE, 7688 7688 ALC287_FIXUP_YOGA7_14ITL_SPEAKERS, 7689 7689 ALC298_FIXUP_LENOVO_C940_DUET7, 7690 - ALC287_FIXUP_LENOVO_14IRP8_DUETITL, 7691 - ALC287_FIXUP_LENOVO_LEGION_7, 7692 7690 ALC287_FIXUP_13S_GEN2_SPEAKERS, 7693 7691 ALC256_FIXUP_SET_COEF_DEFAULTS, 7694 7692 ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE, ··· 7730 7732 ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1, 7731 7733 ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318, 7732 7734 ALC256_FIXUP_CHROME_BOOK, 7733 - ALC287_FIXUP_LENOVO_14ARP8_LEGION_IAH7, 7734 - ALC287_FIXUP_LENOVO_SSID_17AA3820, 7735 7735 ALC245_FIXUP_CLEVO_NOISY_MIC, 7736 7736 ALC269_FIXUP_VAIO_VJFH52_MIC_NO_PRESENCE, 7737 7737 }; ··· 7748 7752 id = ALC298_FIXUP_LENOVO_SPK_VOLUME; /* C940 */ 7749 7753 else 7750 7754 id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* Duet 7 */ 7751 - __snd_hda_apply_fixup(codec, id, action, 0); 7752 - } 7753 - 7754 - /* A special fixup for Lenovo Slim/Yoga Pro 9 14IRP8 and Yoga DuetITL 2021; 7755 - * 14IRP8 PCI SSID will mistakenly be matched with the DuetITL codec SSID, 7756 - * so we need to apply a different fixup in this case. The only DuetITL codec 7757 - * SSID reported so far is the 17aa:3802 while the 14IRP8 has the 17aa:38be 7758 - * and 17aa:38bf. If it weren't for the PCI SSID, the 14IRP8 models would 7759 - * have matched correctly by their codecs. 7760 - */ 7761 - static void alc287_fixup_lenovo_14irp8_duetitl(struct hda_codec *codec, 7762 - const struct hda_fixup *fix, 7763 - int action) 7764 - { 7765 - int id; 7766 - 7767 - if (codec->core.subsystem_id == 0x17aa3802) 7768 - id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* DuetITL */ 7769 - else 7770 - id = ALC287_FIXUP_TAS2781_I2C; /* 14IRP8 */ 7771 - __snd_hda_apply_fixup(codec, id, action, 0); 7772 - } 7773 - 7774 - /* Similar to above the Lenovo Yoga Pro 7 14ARP8 PCI SSID matches the codec SSID of the 7775 - Legion Y9000X 2022 IAH7.*/ 7776 - static void alc287_fixup_lenovo_14arp8_legion_iah7(struct hda_codec *codec, 7777 - const struct hda_fixup *fix, 7778 - int action) 7779 - { 7780 - int id; 7781 - 7782 - if (codec->core.subsystem_id == 0x17aa386e) 7783 - id = ALC287_FIXUP_CS35L41_I2C_2; /* Legion Y9000X 2022 IAH7 */ 7784 - else 7785 - id = ALC285_FIXUP_SPEAKER2_TO_DAC1; /* Yoga Pro 7 14ARP8 */ 7786 - __snd_hda_apply_fixup(codec, id, action, 0); 7787 - } 7788 - 7789 - /* Another hilarious PCI SSID conflict with Lenovo Legion Pro 7 16ARX8H (with 7790 - * TAS2781 codec) and Legion 7i 16IAX7 (with CS35L41 codec); 7791 - * we apply a corresponding fixup depending on the codec SSID instead 7792 - */ 7793 - static void alc287_fixup_lenovo_legion_7(struct hda_codec *codec, 7794 - const struct hda_fixup *fix, 7795 - int action) 7796 - { 7797 - int id; 7798 - 7799 - if (codec->core.subsystem_id == 0x17aa38a8) 7800 - id = ALC287_FIXUP_TAS2781_I2C; /* Legion Pro 7 16ARX8H */ 7801 - else 7802 - id = ALC287_FIXUP_CS35L41_I2C_2; /* Legion 7i 16IAX7 */ 7803 - __snd_hda_apply_fixup(codec, id, action, 0); 7804 - } 7805 - 7806 - /* Yet more conflicting PCI SSID (17aa:3820) on two Lenovo models */ 7807 - static void alc287_fixup_lenovo_ssid_17aa3820(struct hda_codec *codec, 7808 - const struct hda_fixup *fix, 7809 - int action) 7810 - { 7811 - int id; 7812 - 7813 - if (codec->core.subsystem_id == 0x17aa3820) 7814 - id = ALC269_FIXUP_ASPIRE_HEADSET_MIC; /* IdeaPad 330-17IKB 81DM */ 7815 - else /* 0x17aa3802 */ 7816 - id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* "Yoga Duet 7 13ITL6 */ 7817 7755 __snd_hda_apply_fixup(codec, id, action, 0); 7818 7756 } 7819 7757 ··· 9661 9731 .type = HDA_FIXUP_FUNC, 9662 9732 .v.func = alc298_fixup_lenovo_c940_duet7, 9663 9733 }, 9664 - [ALC287_FIXUP_LENOVO_14IRP8_DUETITL] = { 9665 - .type = HDA_FIXUP_FUNC, 9666 - .v.func = alc287_fixup_lenovo_14irp8_duetitl, 9667 - }, 9668 - [ALC287_FIXUP_LENOVO_LEGION_7] = { 9669 - .type = HDA_FIXUP_FUNC, 9670 - .v.func = alc287_fixup_lenovo_legion_7, 9671 - }, 9672 9734 [ALC287_FIXUP_13S_GEN2_SPEAKERS] = { 9673 9735 .type = HDA_FIXUP_VERBS, 9674 9736 .v.verbs = (const struct hda_verb[]) { ··· 9845 9923 .chained = true, 9846 9924 .chain_id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK, 9847 9925 }, 9848 - [ALC287_FIXUP_LENOVO_14ARP8_LEGION_IAH7] = { 9849 - .type = HDA_FIXUP_FUNC, 9850 - .v.func = alc287_fixup_lenovo_14arp8_legion_iah7, 9851 - }, 9852 9926 [ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN] = { 9853 9927 .type = HDA_FIXUP_FUNC, 9854 9928 .v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin, ··· 9974 10056 .v.func = alc256_fixup_chromebook, 9975 10057 .chained = true, 9976 10058 .chain_id = ALC225_FIXUP_HEADSET_JACK 9977 - }, 9978 - [ALC287_FIXUP_LENOVO_SSID_17AA3820] = { 9979 - .type = HDA_FIXUP_FUNC, 9980 - .v.func = alc287_fixup_lenovo_ssid_17aa3820, 9981 10059 }, 9982 10060 [ALC245_FIXUP_CLEVO_NOISY_MIC] = { 9983 10061 .type = HDA_FIXUP_FUNC, ··· 10708 10794 SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340), 10709 10795 SND_PCI_QUIRK(0x17aa, 0x334b, "Lenovo ThinkCentre M70 Gen5", ALC283_FIXUP_HEADSET_MIC), 10710 10796 SND_PCI_QUIRK(0x17aa, 0x3801, "Lenovo Yoga9 14IAP7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN), 10711 - SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga Pro 9 14IRP8 / DuetITL 2021", ALC287_FIXUP_LENOVO_14IRP8_DUETITL), 10797 + HDA_CODEC_QUIRK(0x17aa, 0x3802, "DuetITL 2021", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS), 10798 + SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga Pro 9 14IRP8", ALC287_FIXUP_TAS2781_I2C), 10712 10799 SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS), 10713 10800 SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940 / Yoga Duet 7", ALC298_FIXUP_LENOVO_C940_DUET7), 10714 10801 SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS), 10715 - SND_PCI_QUIRK(0x17aa, 0x3820, "IdeaPad 330 / Yoga Duet 7", ALC287_FIXUP_LENOVO_SSID_17AA3820), 10802 + HDA_CODEC_QUIRK(0x17aa, 0x3820, "IdeaPad 330-17IKB 81DM", ALC269_FIXUP_ASPIRE_HEADSET_MIC), 10803 + SND_PCI_QUIRK(0x17aa, 0x3820, "Yoga Duet 7 13ITL6", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS), 10716 10804 SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS), 10717 10805 SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF), 10718 10806 SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS), ··· 10728 10812 SND_PCI_QUIRK(0x17aa, 0x3865, "Lenovo 13X", ALC287_FIXUP_CS35L41_I2C_2), 10729 10813 SND_PCI_QUIRK(0x17aa, 0x3866, "Lenovo 13X", ALC287_FIXUP_CS35L41_I2C_2), 10730 10814 SND_PCI_QUIRK(0x17aa, 0x3869, "Lenovo Yoga7 14IAL7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN), 10731 - SND_PCI_QUIRK(0x17aa, 0x386e, "Legion Y9000X 2022 IAH7 / Yoga Pro 7 14ARP8", ALC287_FIXUP_LENOVO_14ARP8_LEGION_IAH7), 10732 - SND_PCI_QUIRK(0x17aa, 0x386f, "Legion Pro 7/7i", ALC287_FIXUP_LENOVO_LEGION_7), 10815 + HDA_CODEC_QUIRK(0x17aa, 0x386e, "Legion Y9000X 2022 IAH7", ALC287_FIXUP_CS35L41_I2C_2), 10816 + SND_PCI_QUIRK(0x17aa, 0x386e, "Yoga Pro 7 14ARP8", ALC285_FIXUP_SPEAKER2_TO_DAC1), 10817 + HDA_CODEC_QUIRK(0x17aa, 0x386f, "Legion Pro 7 16ARX8H", ALC287_FIXUP_TAS2781_I2C), 10818 + SND_PCI_QUIRK(0x17aa, 0x386f, "Legion Pro 7i 16IAX7", ALC287_FIXUP_CS35L41_I2C_2), 10733 10819 SND_PCI_QUIRK(0x17aa, 0x3870, "Lenovo Yoga 7 14ARB7", ALC287_FIXUP_YOGA7_14ARB7_I2C), 10734 10820 SND_PCI_QUIRK(0x17aa, 0x3877, "Lenovo Legion 7 Slim 16ARHA7", ALC287_FIXUP_CS35L41_I2C_2), 10735 10821 SND_PCI_QUIRK(0x17aa, 0x3878, "Lenovo Legion 7 Slim 16ARHA7", ALC287_FIXUP_CS35L41_I2C_2),