[PATCH] ALSA: hda/realtek: fix mic boost on Intel NUC 8

Phil Calvin phil at philcalvin.com
Fri Apr 9 04:07:52 CEST 2021


Just wanted to say thank you to everybody that helps maintain the
Intel HDA subsystem. My first Linux sound experience was running
`modprobe cs46xx` or so on a SuSE installation and hearing a promising
noise from the speakers, and these days it seems audio works out of
the box on most hardware.

Thanks also to Takashi Iwai for `hda-emu`, which saved me a lot of
rebooting while testing.

I have tested the patch on this hardware both by recompiling the
relevant modules and running them with the 5.10 kernel distributed in
Debian `testing`, and atop the 5.12-rc6 kernel built with `make
deb-pkg`.

I could not decipher the ordering of the fixup tables, so I am of
course happy to move these around to fit the organizational scheme as
needed.

I'm not an EE, but I am inclined to think the upper two boost values
can probably be made to work by some kind of software workaround,
given that they do produce analog noise coming from something. If you
have any hunches about a possible workaround based on experience with
other similar codecs, please point me to those fixups on- or off-list
and I can try them out on my hardware.

Phil

>8------------------------------------------------------8<

Fix two bugs with the Intel HDA Realtek ALC233 sound codec
present in Intel NUC NUC8i7BEH and probably a few other similar
NUC models.

These codecs advertise a 4-level microphone input boost amplifier on
pin 0x19, but the highest two boost settings do not work correctly,
and produce only low analog noise that does not seem to contain any
discernible signal. There is an existing fixup for this exact problem
but for a different PCI subsystem ID, so we re-use that logic.

Changing the boost level also triggers a DC spike in the input signal
that bleeds off over about a second and overwhelms any input during
that time. Thankfully, the existing fixup has the side effect of
making the boost control show up in userspace as a mute/unmute switch,
and this keeps (e.g.) PulseAudio from fiddling with it during normal
input volume adjustments.

Finally, the NUC hardware has built-in inverted stereo mics. This
patch also enables the usual fixup for this so the two channels cancel
noise instead of the actual signal.

Signed-off-by: Phil Calvin <phil at philcalvin.com>
---
  sound/pci/hda/patch_realtek.c | 13 +++++++++++++
  1 file changed, 13 insertions(+)

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 58946d069ee5..e1fd4c81965a 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -6405,6 +6405,8 @@ enum {
  	ALC269_FIXUP_LEMOTE_A1802,
  	ALC269_FIXUP_LEMOTE_A190X,
  	ALC256_FIXUP_INTEL_NUC8_RUGGED,
+	ALC233_FIXUP_INTEL_NUC8_DMIC,
+	ALC233_FIXUP_INTEL_NUC8_BOOST,
  	ALC256_FIXUP_INTEL_NUC10,
  	ALC255_FIXUP_XIAOMI_HEADSET_MIC,
  	ALC274_FIXUP_HP_MIC,
@@ -7122,6 +7124,16 @@ static const struct hda_fixup alc269_fixups[] = {
  		.type = HDA_FIXUP_FUNC,
  		.v.func = alc233_fixup_lenovo_line2_mic_hotkey,
  	},
+	[ALC233_FIXUP_INTEL_NUC8_DMIC] = {
+		.type = HDA_FIXUP_FUNC,
+		.v.func = alc_fixup_inv_dmic,
+		.chained = true,
+		.chain_id = ALC233_FIXUP_INTEL_NUC8_BOOST,
+	},
+	[ALC233_FIXUP_INTEL_NUC8_BOOST] = {
+		.type = HDA_FIXUP_FUNC,
+		.v.func = alc269_fixup_limit_int_mic_boost
+	},
  	[ALC255_FIXUP_DELL_SPK_NOISE] = {
  		.type = HDA_FIXUP_FUNC,
  		.v.func = alc_fixup_disable_aamix,
@@ -8265,6 +8277,7 @@ static const struct snd_pci_quirk 
alc269_fixup_tbl[] = {
  	SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
  	SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
  	SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", 
ALC256_FIXUP_INTEL_NUC8_RUGGED),
+	SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", 
ALC233_FIXUP_INTEL_NUC8_DMIC),
  	SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
   #if 0
-- 
2.30.2



More information about the Alsa-devel mailing list