]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ALSA: hda/conexant: fix Z60MR100 startup pop issue
authorbo liu <bo.liu@senarytech.com>
Fri, 29 Nov 2024 01:44:41 +0000 (09:44 +0800)
committerTakashi Iwai <tiwai@suse.de>
Fri, 29 Nov 2024 10:08:41 +0000 (11:08 +0100)
When Z60MR100 startup, speaker will output a pop. To fix this issue,
we mute codec by init verbs in bios when system startup, and set GPIO
to low to unmute codec in codec driver when it loaded .

[ white space fixes and compile warning fix by tiwai ]

Signed-off-by: bo liu <bo.liu@senarytech.com>
Link: https://patch.msgid.link/20241129014441.437205-1-bo.liu@senarytech.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/patch_conexant.c

index 2e9f817b948eb343a6e317804d2569c70203ae46..538c37a78a56f73adc61949990bf526923349b9b 100644 (file)
@@ -307,6 +307,7 @@ enum {
        CXT_FIXUP_HP_MIC_NO_PRESENCE,
        CXT_PINCFG_SWS_JS201D,
        CXT_PINCFG_TOP_SPEAKER,
+       CXT_FIXUP_HP_A_U,
 };
 
 /* for hda_fixup_thinkpad_acpi() */
@@ -774,6 +775,18 @@ static void cxt_setup_mute_led(struct hda_codec *codec,
        }
 }
 
+static void cxt_setup_gpio_unmute(struct hda_codec *codec,
+                                 unsigned int gpio_mute_mask)
+{
+       if (gpio_mute_mask) {
+               // set gpio data to 0.
+               snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
+               snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_MASK, gpio_mute_mask);
+               snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DIRECTION, gpio_mute_mask);
+               snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_STICKY_MASK, 0);
+       }
+}
+
 static void cxt_fixup_mute_led_gpio(struct hda_codec *codec,
                                const struct hda_fixup *fix, int action)
 {
@@ -788,6 +801,15 @@ static void cxt_fixup_hp_zbook_mute_led(struct hda_codec *codec,
                cxt_setup_mute_led(codec, 0x10, 0x20);
 }
 
+static void cxt_fixup_hp_a_u(struct hda_codec *codec,
+                            const struct hda_fixup *fix, int action)
+{
+       // Init vers in BIOS mute the spk/hp by set gpio high to avoid pop noise,
+       // so need to unmute once by clearing the gpio data when runs into the system.
+       if (action == HDA_FIXUP_ACT_INIT)
+               cxt_setup_gpio_unmute(codec, 0x2);
+}
+
 /* ThinkPad X200 & co with cxt5051 */
 static const struct hda_pintbl cxt_pincfg_lenovo_x200[] = {
        { 0x16, 0x042140ff }, /* HP (seq# overridden) */
@@ -998,6 +1020,10 @@ static const struct hda_fixup cxt_fixups[] = {
                        { }
                },
        },
+       [CXT_FIXUP_HP_A_U] = {
+               .type = HDA_FIXUP_FUNC,
+               .v.func = cxt_fixup_hp_a_u,
+       },
 };
 
 static const struct hda_quirk cxt5045_fixups[] = {
@@ -1072,6 +1098,7 @@ static const struct hda_quirk cxt5066_fixups[] = {
        SND_PCI_QUIRK(0x103c, 0x8457, "HP Z2 G4 mini", CXT_FIXUP_HP_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x103c, 0x8458, "HP Z2 G4 mini premium", CXT_FIXUP_HP_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1043, 0x138d, "Asus", CXT_FIXUP_HEADPHONE_MIC_PIN),
+       SND_PCI_QUIRK(0x14f1, 0x0252, "MBX-Z60MR100", CXT_FIXUP_HP_A_U),
        SND_PCI_QUIRK(0x14f1, 0x0265, "SWS JS201D", CXT_PINCFG_SWS_JS201D),
        SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT_FIXUP_OLPC_XO),
        SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400", CXT_PINCFG_LENOVO_TP410),
@@ -1117,6 +1144,7 @@ static const struct hda_model_fixup cxt5066_fixup_models[] = {
        { .id = CXT_PINCFG_LENOVO_NOTEBOOK, .name = "lenovo-20149" },
        { .id = CXT_PINCFG_SWS_JS201D, .name = "sws-js201d" },
        { .id = CXT_PINCFG_TOP_SPEAKER, .name = "sirius-top-speaker" },
+       { .id = CXT_FIXUP_HP_A_U, .name = "HP-U-support" },
        {}
 };