| From 256aecf8c257e0e5dbac4d7ef5759a386bcb8f9c Mon Sep 17 00:00:00 2001 |
| From: Thomas Hebb <tommyhebb@gmail.com> |
| Date: Mon, 30 Mar 2020 12:09:38 -0400 |
| Subject: [PATCH] ALSA: hda/realtek - Set principled PC Beep configuration for |
| ALC256 |
| |
| commit c44737449468a0bdc50e09ec75e530f208391561 upstream. |
| |
| The Realtek PC Beep Hidden Register[1] is currently set by |
| patch_realtek.c in two different places: |
| |
| In alc_fill_eapd_coef(), it's set to the value 0x5757, corresponding to |
| non-beep input on 1Ah and no 1Ah loopback to either headphones or |
| speakers. (Although, curiously, the loopback amp is still enabled.) This |
| write was added fairly recently by commit e3743f431143 ("ALSA: |
| hda/realtek - Dell headphone has noise on unmute for ALC236") and is a |
| safe default. However, it happens in the wrong place: |
| alc_fill_eapd_coef() runs on module load and cold boot but not on S3 |
| resume, meaning the register loses its value after suspend. |
| |
| Conversely, in alc256_init(), the register is updated to unset bit 13 |
| (disable speaker loopback) and set bit 5 (set non-beep input on 1Ah). |
| Although this write does run on S3 resume, it's not quite enough to fix |
| up the register's default value of 0x3717. What's missing is a set of |
| bit 14 to disable headphone loopback. Without that, we end up with a |
| feedback loop where the headphone jack is being driven by amplified |
| samples of itself[2]. |
| |
| This change eliminates the update in alc256_init() and replaces it with |
| the 0x5757 write from alc_fill_eapd_coef(). Kailang says that 0x5757 is |
| supposed to be the codec's default value, so using it will make |
| debugging easier for Realtek. |
| |
| Affects the ALC255, ALC256, ALC257, ALC235, and ALC236 codecs. |
| |
| [1] Newly documented in Documentation/sound/hd-audio/realtek-pc-beep.rst |
| |
| [2] Setting the "Headphone Mic Boost" control from userspace changes |
| this feedback loop and has been a widely-shared workaround for headphone |
| noise on laptops like the Dell XPS 13 9350. This commit eliminates the |
| feedback loop and makes the workaround unnecessary. |
| |
| Fixes: e1e8c1fdce8b ("ALSA: hda/realtek - Dell headphone has noise on unmute for ALC236") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Thomas Hebb <tommyhebb@gmail.com> |
| Link: https://lore.kernel.org/r/bf22b417d1f2474b12011c2a39ed6cf8b06d3bf5.1585584498.git.tommyhebb@gmail.com |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
| index 564fe8663357..16c74b167eee 100644 |
| --- a/sound/pci/hda/patch_realtek.c |
| +++ b/sound/pci/hda/patch_realtek.c |
| @@ -367,7 +367,9 @@ static void alc_fill_eapd_coef(struct hda_codec *codec) |
| case 0x10ec0215: |
| case 0x10ec0233: |
| case 0x10ec0235: |
| + case 0x10ec0236: |
| case 0x10ec0255: |
| + case 0x10ec0256: |
| case 0x10ec0257: |
| case 0x10ec0282: |
| case 0x10ec0283: |
| @@ -379,11 +381,6 @@ static void alc_fill_eapd_coef(struct hda_codec *codec) |
| case 0x10ec0300: |
| alc_update_coef_idx(codec, 0x10, 1<<9, 0); |
| break; |
| - case 0x10ec0236: |
| - case 0x10ec0256: |
| - alc_write_coef_idx(codec, 0x36, 0x5757); |
| - alc_update_coef_idx(codec, 0x10, 1<<9, 0); |
| - break; |
| case 0x10ec0275: |
| alc_update_coef_idx(codec, 0xe, 0, 1<<0); |
| break; |
| @@ -3264,7 +3261,13 @@ static void alc256_init(struct hda_codec *codec) |
| alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */ |
| alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */ |
| alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15); |
| - alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/ |
| + /* |
| + * Expose headphone mic (or possibly Line In on some machines) instead |
| + * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See |
| + * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of |
| + * this register. |
| + */ |
| + alc_write_coef_idx(codec, 0x36, 0x5757); |
| } |
| |
| static void alc256_shutup(struct hda_codec *codec) |
| -- |
| 2.7.4 |
| |