FAILED: patch "[PATCH] ALSA: hda/realtek - Update headset mode for ALC256" failed to apply to 4.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 717f43d81afc1250300479075952a0e36d74ded3 Mon Sep 17 00:00:00 2001
From: Kailang Yang <[email protected]>
Date: Fri, 31 May 2019 17:16:53 +0800
Subject: [PATCH] ALSA: hda/realtek - Update headset mode for ALC256
ALC255 and ALC256 were some difference for hidden register. This update was suitable for ALC256.
Fixes e69e7e03ed22 ("ALSA: hda/realtek - ALC256 speaker noise issue")
Signed-off-by Kailang Yang <[email protected]>
Cc <[email protected]>
Signed-off-by Takashi Iwai <[email protected]>
sound/pci/hda/patch_realtek.c +60 -15
@@ -4133,18 +4133,19 @@ static struct coef_fw alc225_pre_hsmode[] = {static void alc_headset_mode_unplugged (struct hda_codec *codec) {static struct coef_fw coef0255[] = { +WRITE_COEF (0x1b ,0x0c0b ),/* LDO and MISC control */ WRITE_COEF (0x45 ,0xd089 ),/* UAJ function set to menual mode */ UPDATE_COEFEX (0x57 ,0x05 ,1 <<14 ,0 ),/* Direct Drive HP Amp control(Set to verb control)*/ WRITE_COEF (0x06 ,0x6104 ),/* Set MIC2 Vref gate with HP */ WRITE_COEFEX (0x57 ,0x03 ,0x8aa6 ),/* Direct Drive HP Amp control */ {} }; -static struct coef_fw coef0255_1[] = { -WRITE_COEF (0x1b ,0x0c0b ),/* LDO and MISC control */ - {} - };static struct coef_fw coef0256[] = {WRITE_COEF (0x1b ,0x0c4b ),/* LDO and MISC control */ +WRITE_COEF (0x45 ,0xd089 ),/* UAJ function set to menual mode */ +WRITE_COEF (0x06 ,0x6104 ),/* Set MIC2 Vref gate with HP */ +WRITE_COEFEX (0x57 ,0x03 ,0x09a3 ),/* Direct Drive HP Amp control */ +UPDATE_COEFEX (0x57 ,0x05 ,1 <<14 ,0 ),/* Direct Drive HP Amp control(Set to verb control)*/ {} };static struct coef_fw coef0233[] = {
@@ -4207,13 +4208,11 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec)switch (codec->core.vendor_id) {case 0x10ec0255 : -alc_process_coef_fw (codec, coef0255_1);alc_process_coef_fw (codec, coef0255);break ;case 0x10ec0236 :case 0x10ec0256 :alc_process_coef_fw (codec, coef0256); -alc_process_coef_fw (codec, coef0255);break ;case 0x10ec0234 :case 0x10ec0274 :
@@ -4266,6 +4265,12 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin, WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */ {} }; +static struct coef_fw coef0256[] = { +UPDATE_COEFEX (0x57 ,0x05 ,1 <<14 ,1 <<14 ),/* Direct Drive HP Amp control(Set to verb control)*/ +WRITE_COEFEX (0x57 ,0x03 ,0x09a3 ), +WRITE_COEF (0x06 ,0x6100 ),/* Set MIC2 Vref gate to normal */ + {} + };static struct coef_fw coef0233[] = {UPDATE_COEF (0x35 ,0 ,1 <<14 ),WRITE_COEF (0x06 ,0x2100 ),
@@ -4313,14 +4318,19 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin, };switch (codec->core.vendor_id) { -case 0x10ec0236 :case 0x10ec0255 : -case 0x10ec0256 :alc_write_coef_idx (codec,0x45 ,0xc489 );snd_hda_set_pin_ctl_cache (codec, hp_pin,0 );alc_process_coef_fw (codec, coef0255);snd_hda_set_pin_ctl_cache (codec, mic_pin,PIN_VREF50 );break ; +case 0x10ec0236 : +case 0x10ec0256 : +alc_write_coef_idx (codec,0x45 ,0xc489 ); +snd_hda_set_pin_ctl_cache (codec, hp_pin,0 ); +alc_process_coef_fw (codec, coef0256); +snd_hda_set_pin_ctl_cache (codec, mic_pin,PIN_VREF50 ); +break ;case 0x10ec0234 :case 0x10ec0274 :case 0x10ec0294 :
@@ -4402,6 +4412,14 @@ static void alc_headset_mode_default(struct hda_codec *codec) WRITE_COEF(0x49, 0x0049), {} }; +static struct coef_fw coef0256[] = { +WRITE_COEF (0x45 ,0xc489 ), +WRITE_COEFEX (0x57 ,0x03 ,0x0da3 ), +WRITE_COEF (0x49 ,0x0049 ), +UPDATE_COEFEX (0x57 ,0x05 ,1 <<14 ,0 ),/* Direct Drive HP Amp control(Set to verb control)*/ +WRITE_COEF (0x06 ,0x6100 ), + {} + };static struct coef_fw coef0233[] = {WRITE_COEF (0x06 ,0x2100 ),WRITE_COEF (0x32 ,0x4ea3 ),
@@ -4452,11 +4470,16 @@ static void alc_headset_mode_default(struct hda_codec *codec)alc_process_coef_fw (codec, alc225_pre_hsmode);alc_process_coef_fw (codec, coef0225);break ; -case 0x10ec0236 :case 0x10ec0255 : -case 0x10ec0256 :alc_process_coef_fw (codec, coef0255);break ; +case 0x10ec0236 : +case 0x10ec0256 : +alc_write_coef_idx (codec,0x1b ,0x0e4b ); +alc_write_coef_idx (codec,0x45 ,0xc089 ); +msleep (50 ); +alc_process_coef_fw (codec, coef0256); +break ;case 0x10ec0234 :case 0x10ec0274 :case 0x10ec0294 :
@@ -4500,8 +4523,7 @@ static void alc_headset_mode_ctia(struct hda_codec *codec) };static struct coef_fw coef0256[] = {WRITE_COEF (0x45 ,0xd489 ),/* Set to CTIA type */ -WRITE_COEF (0x1b ,0x0c6b ), -WRITE_COEFEX (0x57 ,0x03 ,0x8ea6 ), +WRITE_COEF (0x1b ,0x0e6b ), {} };static struct coef_fw coef0233[] = {
@@ -4619,8 +4641,7 @@ static void alc_headset_mode_omtp(struct hda_codec *codec) };static struct coef_fw coef0256[] = {WRITE_COEF (0x45 ,0xe489 ),/* Set to OMTP Type */ -WRITE_COEF (0x1b ,0x0c6b ), -WRITE_COEFEX (0x57 ,0x03 ,0x8ea6 ), +WRITE_COEF (0x1b ,0x0e6b ), {} };static struct coef_fw coef0233[] = {
@@ -4752,13 +4773,37 @@ static void alc_determine_headset_type(struct hda_codec *codec) };switch (codec->core.vendor_id) { -case 0x10ec0236 :case 0x10ec0255 : +alc_process_coef_fw (codec, coef0255); +msleep (300 ); + val =alc_read_coef_idx (codec,0x46 ); + is_ctia = (val &0x0070 ) ==0x0070 ; +break ; +case 0x10ec0236 :case 0x10ec0256 : +alc_write_coef_idx (codec,0x1b ,0x0e4b ); +alc_write_coef_idx (codec,0x06 ,0x6104 ); +alc_write_coefex_idx (codec,0x57 ,0x3 ,0x09a3 ); + +snd_hda_codec_write (codec,0x21 ,0 , +AC_VERB_SET_AMP_GAIN_MUTE ,AMP_OUT_MUTE ); +msleep (80 ); +snd_hda_codec_write (codec,0x21 ,0 , +AC_VERB_SET_PIN_WIDGET_CONTROL ,0x0 ); +alc_process_coef_fw (codec, coef0255);msleep (300 ); val =alc_read_coef_idx (codec,0x46 ); is_ctia = (val &0x0070 ) ==0x0070 ; + +alc_write_coefex_idx (codec,0x57 ,0x3 ,0x0da3 ); +alc_update_coefex_idx (codec,0x57 ,0x5 ,1 <<14 ,0 ); + +snd_hda_codec_write (codec,0x21 ,0 , +AC_VERB_SET_PIN_WIDGET_CONTROL ,PIN_OUT ); +msleep (80 ); +snd_hda_codec_write (codec,0x21 ,0 , +AC_VERB_SET_AMP_GAIN_MUTE ,AMP_OUT_UNMUTE );break ;case 0x10ec0234 :case 0x10ec0274 :