All of lore.kernel.org
 help / color / mirror / Atom feed
From: Takashi Iwai <tiwai@suse.de>
To: wangdich9700@163.com
Cc: tiwai@suse.com, perex@perex.cz, linux-sound@vger.kernel.org,
	linux-kernel@vger.kernel.org, wangdicheng@kylinos.cn
Subject: Re: [PATCH] ALSA: hda/realtek: Limit Line In boost and ADC gain on DECENTA MATX03
Date: Wed, 14 Oct 2026 11:22:27 +0200	[thread overview]
Message-ID: <87se28eiwc.wl-tiwai@suse.de> (raw)
In-Reply-To: <20261013120327.998217-1-wangdich9700@163.com>

On Tue, 13 Oct 2026 14:03:27 +0200,
wangdich9700@163.com wrote:
> 
> From: wangdicheng <wangdicheng@kylinos.cn>
> 
> The DECENTA MATX03 (ALC897, SSID 1e0b:1297) exposes a high gain
> range on both the Line In pin boost and the ADC input amp. Pin 0x1a
> reports nsteps=0x03 with stepsize=0x27, that is 0, 9.75, 19.5 and
> 29.25 dB. ADC 0x08 reports nsteps=0x3f with stepsize=0x02, that is
> 0 to 31.5 dB in 0.5 dB steps, and defaults to 0x3f (maximum). The
> combined 60.75 dB analogue cascade overloads the front-end when the
> source level is high, producing audible harmonic distortion during
> Line In monitoring.
> 
> Add a new fixup alc897_fixup_limit_linein_boost that overrides the amp
> capabilities of the Line In and external Mic pins to nsteps=1 (max
> ~11.75 dB), and also limits the ADC input amp to nsteps=1 (max ~0.5 dB).
> The total gain drops from 60.75 dB to ~12.25 dB, eliminating the
> clipping. Internal and dock mic pins are excluded to avoid affecting
> built-in microphones.
> 
> Tested on the affected machine: with the fixup applied, Line In
> recording at maximum source volume is clean, and dmesg confirms the
> fixup is picked:
> 
>   ALC897: picked fixup alc897-limit-linein-boost (SSID)
> 
> Signed-off-by: wangdicheng <wangdicheng@kylinos.cn>
> ---
>  sound/hda/codecs/realtek/alc662.c | 50 +++++++++++++++++++++++++++++++
>  1 file changed, 50 insertions(+)
> 
> diff --git a/sound/hda/codecs/realtek/alc662.c b/sound/hda/codecs/realtek/alc662.c
> index eff7c83b9c59..a140891d51fa 100644
> --- a/sound/hda/codecs/realtek/alc662.c
> +++ b/sound/hda/codecs/realtek/alc662.c
> @@ -198,6 +198,49 @@ static void alc897_fixup_lenovo_headset_mode(struct hda_codec *codec,
>  	}
>  }
>  
> +static void alc897_fixup_limit_linein_boost(struct hda_codec *codec,
> +					    const struct hda_fixup *fix, int action)
> +{
> +	struct alc_spec *spec = codec->spec;
> +	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
> +	int i;
> +
> +	if (action != HDA_FIXUP_ACT_PROBE)
> +		return;
> +
> +	for (i = 0; i < cfg->num_inputs; i++) {
> +		hda_nid_t nid = cfg->inputs[i].pin;
> +		unsigned int defcfg;
> +
> +		if (cfg->inputs[i].type != AUTO_PIN_LINE_IN &&
> +		    cfg->inputs[i].type != AUTO_PIN_MIC)
> +			continue;
> +
> +		defcfg = snd_hda_codec_get_pincfg(codec, nid);
> +		if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT ||
> +		    snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_DOCK)
> +			continue;
> +
> +		snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
> +					  (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
> +					  (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
> +					  (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
> +					  (0 << AC_AMPCAP_MUTE_SHIFT));
> +	}
> +
> +	for (i = 0; i < spec->gen.num_all_adcs; i++) {
> +		hda_nid_t adc = spec->gen.all_adcs[i];
> +		unsigned int caps;
> +
> +		caps = query_amp_caps(codec, adc, HDA_INPUT);
> +		if ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT > 1) {
> +			caps &= ~AC_AMPCAP_NUM_STEPS;
> +			caps |= (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT);
> +			snd_hda_override_amp_caps(codec, adc, HDA_INPUT, caps);
> +		}
> +	}
> +}
> +

I guess there aren't so many pins and ADCs, and the quirk is very
specific to the model, so you can just write a few
snd_hda_override_amp_caps() for the fixed hard-coded NIDs.

The alc269_fixup_limit_int_mic_boost() is applied to lots of different
models, hence it handles in a generic way, OTOH.

>  static const struct hda_quirk alc662_fixup_tbl[] = {
> @@ -859,6 +907,7 @@ static const struct hda_quirk alc662_fixup_tbl[] = {
>  	SND_PCI_QUIRK(0x1c6c, 0x1239, "Compaq N14JP6-V2", ALC897_FIXUP_HP_HSMIC_VERB),
>  	SND_PCI_QUIRK(0x1e63, 0x6d9a, "F+ FLAPTOP r", ALC897_FIXUP_HP_HSMIC_VERB),
>  	SND_PCI_QUIRK(0x1f66, 0x0202, "Beelink SER6 Max 6900", ALC897_FIXUP_BEELINK_SER6_AMP),
> +	SND_PCI_QUIRK(0x1e0b, 0x1297, "DECENTA MATX03", ALC897_FIXUP_LIMIT_LINEIN_BOOST),

The table is sorted in PCI SSID order, so please put at the right
position.

> @@ -954,6 +1003,7 @@ static const struct hda_model_fixup alc662_fixup_models[] = {
>  	{.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
>  	{.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
>  	{.id = ALC897_FIXUP_UNIS_H3C_X500S, .name = "unis-h3c-x500s"},
> +	{.id = ALC897_FIXUP_LIMIT_LINEIN_BOOST, .name = "alc897-limit-linein-boost"},
>  	{}
>  };

Nowadays we don't want a model name addition unless it's really
needed.  The existing quirk can be applied with an alias instead of a
model name string.


thanks,

Takashi

      reply	other threads:[~2026-10-14  9:22 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-13 12:03 [PATCH] ALSA: hda/realtek: Limit Line In boost and ADC gain on DECENTA MATX03 wangdich9700
2026-10-14  9:22 ` Takashi Iwai [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87se28eiwc.wl-tiwai@suse.de \
    --to=tiwai@suse.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sound@vger.kernel.org \
    --cc=perex@perex.cz \
    --cc=tiwai@suse.com \
    --cc=wangdich9700@163.com \
    --cc=wangdicheng@kylinos.cn \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.