|
Takashi Iwai |
1d500a |
From c1b55029493879f5bd585ff79f326e71f0bc05e3 Mon Sep 17 00:00:00 2001
|
|
Takashi Iwai |
1d500a |
From: Daniel Cordova A <danesc87@gmail.com>
|
|
Takashi Iwai |
1d500a |
Date: Fri, 7 May 2021 12:31:16 -0500
|
|
Takashi Iwai |
1d500a |
Subject: [PATCH] ALSA: hda: fixup headset for ASUS GU502 laptop
|
|
Takashi Iwai |
1d500a |
Git-commit: c1b55029493879f5bd585ff79f326e71f0bc05e3
|
|
Takashi Iwai |
1d500a |
Patch-mainline: v5.13-rc3
|
|
Takashi Iwai |
1d500a |
References: git-fixes
|
|
Takashi Iwai |
1d500a |
|
|
Takashi Iwai |
1d500a |
The GU502 requires a few steps to make headset i/o works properly:
|
|
Takashi Iwai |
1d500a |
pincfg, verbs to unmute headphone out and callback to toggle output
|
|
Takashi Iwai |
1d500a |
between speakers and headphone using jack.
|
|
Takashi Iwai |
1d500a |
|
|
Takashi Iwai |
1d500a |
Signed-off-by: Daniel Cordova A <danesc87@gmail.com>
|
|
Takashi Iwai |
1d500a |
Cc: <stable@vger.kernel.org>
|
|
Takashi Iwai |
1d500a |
Link: https://lore.kernel.org/r/20210507173116.12043-1-danesc87@gmail.com
|
|
Takashi Iwai |
1d500a |
Signed-off-by: Takashi Iwai <tiwai@suse.de>
|
|
Takashi Iwai |
1d500a |
|
|
Takashi Iwai |
1d500a |
---
|
|
Takashi Iwai |
1d500a |
sound/pci/hda/patch_realtek.c | 62 ++++++++++++++++++++++++++++++++++++++++++
|
|
Takashi Iwai |
1d500a |
1 file changed, 62 insertions(+)
|
|
Takashi Iwai |
1d500a |
|
|
Takashi Iwai |
1d500a |
--- a/sound/pci/hda/patch_realtek.c
|
|
Takashi Iwai |
1d500a |
+++ b/sound/pci/hda/patch_realtek.c
|
|
Takashi Iwai |
1d500a |
@@ -6171,6 +6171,35 @@ static void alc294_fixup_gx502_hp(struct
|
|
Takashi Iwai |
1d500a |
}
|
|
Takashi Iwai |
1d500a |
}
|
|
Takashi Iwai |
1d500a |
|
|
Takashi Iwai |
1d500a |
+static void alc294_gu502_toggle_output(struct hda_codec *codec,
|
|
Takashi Iwai |
1d500a |
+ struct hda_jack_callback *cb)
|
|
Takashi Iwai |
1d500a |
+{
|
|
Takashi Iwai |
1d500a |
+ /* Windows sets 0x10 to 0x8420 for Node 0x20 which is
|
|
Takashi Iwai |
1d500a |
+ * responsible from changes between speakers and headphones
|
|
Takashi Iwai |
1d500a |
+ */
|
|
Takashi Iwai |
1d500a |
+ if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
|
|
Takashi Iwai |
1d500a |
+ alc_write_coef_idx(codec, 0x10, 0x8420);
|
|
Takashi Iwai |
1d500a |
+ else
|
|
Takashi Iwai |
1d500a |
+ alc_write_coef_idx(codec, 0x10, 0x0a20);
|
|
Takashi Iwai |
1d500a |
+}
|
|
Takashi Iwai |
1d500a |
+
|
|
Takashi Iwai |
1d500a |
+static void alc294_fixup_gu502_hp(struct hda_codec *codec,
|
|
Takashi Iwai |
1d500a |
+ const struct hda_fixup *fix, int action)
|
|
Takashi Iwai |
1d500a |
+{
|
|
Takashi Iwai |
1d500a |
+ if (!is_jack_detectable(codec, 0x21))
|
|
Takashi Iwai |
1d500a |
+ return;
|
|
Takashi Iwai |
1d500a |
+
|
|
Takashi Iwai |
1d500a |
+ switch (action) {
|
|
Takashi Iwai |
1d500a |
+ case HDA_FIXUP_ACT_PRE_PROBE:
|
|
Takashi Iwai |
1d500a |
+ snd_hda_jack_detect_enable_callback(codec, 0x21,
|
|
Takashi Iwai |
1d500a |
+ alc294_gu502_toggle_output);
|
|
Takashi Iwai |
1d500a |
+ break;
|
|
Takashi Iwai |
1d500a |
+ case HDA_FIXUP_ACT_INIT:
|
|
Takashi Iwai |
1d500a |
+ alc294_gu502_toggle_output(codec, NULL);
|
|
Takashi Iwai |
1d500a |
+ break;
|
|
Takashi Iwai |
1d500a |
+ }
|
|
Takashi Iwai |
1d500a |
+}
|
|
Takashi Iwai |
1d500a |
+
|
|
Takashi Iwai |
1d500a |
static void alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
|
|
Takashi Iwai |
1d500a |
const struct hda_fixup *fix, int action)
|
|
Takashi Iwai |
1d500a |
{
|
|
Takashi Iwai |
1d500a |
@@ -6384,6 +6413,9 @@ enum {
|
|
Takashi Iwai |
1d500a |
ALC294_FIXUP_ASUS_GX502_HP,
|
|
Takashi Iwai |
1d500a |
ALC294_FIXUP_ASUS_GX502_PINS,
|
|
Takashi Iwai |
1d500a |
ALC294_FIXUP_ASUS_GX502_VERBS,
|
|
Takashi Iwai |
1d500a |
+ ALC294_FIXUP_ASUS_GU502_HP,
|
|
Takashi Iwai |
1d500a |
+ ALC294_FIXUP_ASUS_GU502_PINS,
|
|
Takashi Iwai |
1d500a |
+ ALC294_FIXUP_ASUS_GU502_VERBS,
|
|
Takashi Iwai |
1d500a |
ALC285_FIXUP_HP_GPIO_LED,
|
|
Takashi Iwai |
1d500a |
ALC285_FIXUP_HP_MUTE_LED,
|
|
Takashi Iwai |
1d500a |
ALC236_FIXUP_HP_MUTE_LED,
|
|
Takashi Iwai |
1d500a |
@@ -7614,6 +7646,35 @@ static const struct hda_fixup alc269_fix
|
|
Takashi Iwai |
1d500a |
.type = HDA_FIXUP_FUNC,
|
|
Takashi Iwai |
1d500a |
.v.func = alc294_fixup_gx502_hp,
|
|
Takashi Iwai |
1d500a |
},
|
|
Takashi Iwai |
1d500a |
+ [ALC294_FIXUP_ASUS_GU502_PINS] = {
|
|
Takashi Iwai |
1d500a |
+ .type = HDA_FIXUP_PINS,
|
|
Takashi Iwai |
1d500a |
+ .v.pins = (const struct hda_pintbl[]) {
|
|
Takashi Iwai |
1d500a |
+ { 0x19, 0x01a11050 }, /* rear HP mic */
|
|
Takashi Iwai |
1d500a |
+ { 0x1a, 0x01a11830 }, /* rear external mic */
|
|
Takashi Iwai |
1d500a |
+ { 0x21, 0x012110f0 }, /* rear HP out */
|
|
Takashi Iwai |
1d500a |
+ { }
|
|
Takashi Iwai |
1d500a |
+ },
|
|
Takashi Iwai |
1d500a |
+ .chained = true,
|
|
Takashi Iwai |
1d500a |
+ .chain_id = ALC294_FIXUP_ASUS_GU502_VERBS
|
|
Takashi Iwai |
1d500a |
+ },
|
|
Takashi Iwai |
1d500a |
+ [ALC294_FIXUP_ASUS_GU502_VERBS] = {
|
|
Takashi Iwai |
1d500a |
+ .type = HDA_FIXUP_VERBS,
|
|
Takashi Iwai |
1d500a |
+ .v.verbs = (const struct hda_verb[]) {
|
|
Takashi Iwai |
1d500a |
+ /* set 0x15 to HP-OUT ctrl */
|
|
Takashi Iwai |
1d500a |
+ { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
|
|
Takashi Iwai |
1d500a |
+ /* unmute the 0x15 amp */
|
|
Takashi Iwai |
1d500a |
+ { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
|
|
Takashi Iwai |
1d500a |
+ /* set 0x1b to HP-OUT */
|
|
Takashi Iwai |
1d500a |
+ { 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
|
|
Takashi Iwai |
1d500a |
+ { }
|
|
Takashi Iwai |
1d500a |
+ },
|
|
Takashi Iwai |
1d500a |
+ .chained = true,
|
|
Takashi Iwai |
1d500a |
+ .chain_id = ALC294_FIXUP_ASUS_GU502_HP
|
|
Takashi Iwai |
1d500a |
+ },
|
|
Takashi Iwai |
1d500a |
+ [ALC294_FIXUP_ASUS_GU502_HP] = {
|
|
Takashi Iwai |
1d500a |
+ .type = HDA_FIXUP_FUNC,
|
|
Takashi Iwai |
1d500a |
+ .v.func = alc294_fixup_gu502_hp,
|
|
Takashi Iwai |
1d500a |
+ },
|
|
Takashi Iwai |
1d500a |
[ALC294_FIXUP_ASUS_COEF_1B] = {
|
|
Takashi Iwai |
1d500a |
.type = HDA_FIXUP_VERBS,
|
|
Takashi Iwai |
1d500a |
.v.verbs = (const struct hda_verb[]) {
|
|
Takashi Iwai |
1d500a |
@@ -8100,6 +8161,7 @@ static const struct snd_pci_quirk alc269
|
|
Takashi Iwai |
1d500a |
SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
|
|
Takashi Iwai |
1d500a |
SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
|
|
Takashi Iwai |
1d500a |
SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
|
|
Takashi Iwai |
1d500a |
+ SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
|
|
Takashi Iwai |
1d500a |
SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
|
|
Takashi Iwai |
1d500a |
SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
|
|
Takashi Iwai |
1d500a |
SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
|