From nobody Sat Jul 25 20:47:02 2026 Received: from smtp-relay-internal-0.canonical.com (smtp-relay-internal-0.canonical.com [185.125.188.122]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 97EA937F745 for ; Tue, 14 Jul 2026 02:29:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.125.188.122 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783996196; cv=none; b=f9gaiiu8fgth96mwtcg/tfv6jJVaixQXHjJKM83YSRnQbGRNDa/iixkTnkSTzcu7GYcXmJyL8yI8AwR/VFK0yNrivvQsrxHceUnODDDecsdQgVkL14YEcAhT3k4uoCHDUfUMAHbFup4TpkiHfi3FJJ++V/Z017yJfqf2op2W5Ec= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783996196; c=relaxed/simple; bh=WLUoXyoCGlf4hrKMh+AAgtQJ9KQSz4ar4AA1jN82X0Y=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=DjMyIF60USjjRvdNZyus9xKVMJngb+dI40/7FwxFSU/4io4ppZr3JY1XTI64OZPP7YbX0UndpqvD0J4RZYzsEyuAYqW9j0VZ5oDPget614UT3mVVT6xx9o8H4MxJdtSLvKctb+Hz6u3DH6cq/P7YG/ixvnJzUtZaa/0Yj4A1+Mw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=canonical.com; spf=pass smtp.mailfrom=canonical.com; dkim=pass (4096-bit key) header.d=canonical.com header.i=@canonical.com header.b=Tv2R+hgz; arc=none smtp.client-ip=185.125.188.122 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=canonical.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=canonical.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (4096-bit key) header.d=canonical.com header.i=@canonical.com header.b="Tv2R+hgz" Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id EE5663F29D for ; Tue, 14 Jul 2026 02:29:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20251003; t=1783996184; bh=UANpJ8cS2s6hZdq+1u/gjFdD5nBg/lgUDqG+zu87xCY=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=Tv2R+hgzVU1182VLsD+es/Sbv1R6ZNjLxS0eZT8vKf0yAcbwY1IAyXDjjBN19eoWA 39OccgNTkn/lyRMg+QzqynbWKdJWDsK6lkmk2c7/Mb0qQKsMzUkOcOBNWhA+HDSEB4 UKq+kzO4PTtjL7zaocwlebRh8eGNVpwy+Py8iGW+ZLp8OOct3hbP6KrlAVOPNwMOJV 1WSwEgrN5WRYHns1IS1J+hFqM8+5RvSeV0xEpHRnM4YKY8N/XSMciR1h5aBwr8Ip5b hsiVJw//CzaNWp/D9msDW/H2I2ZyMDsZYCC/9HVEcqJjiMsZqzq54WOFTz6Q35DHY/ 6vQT42SQNrlYc17CTcB6RFe9bDa3ySUOAoQQKPq+Qxs2mc7g28Tb9Dt24HBpzEFdkK h6FV4MSC8N0/O3gg9KNAdFSneM9njtL3DJAZmRIwfqmVC4lzfDBcaRSD/bg2zJlIGn fatU/UkYRqkqNQ8qkEf7Yit8r92gbBAJ5KVzstAW92cN+wklv2rtZPSUNgbkuVl7gM gswtiRltHxHUXWxhnjYQbuTIgc/Hf2WKzqQRRvRWMIp67LBvdQNEKVq2i7zSkk6sVt 7YVglaf8AcT0cpJp05KqWRMkfZJQuaXkfj4VTkym8tjMUSDyEHmxfPMB6zYsGBAghD evE3uhmNQdUQ9WLEw8RQ51pQ= Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2cd01a14e81so54478945ad.1 for ; Mon, 13 Jul 2026 19:29:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783996183; x=1784600983; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=UANpJ8cS2s6hZdq+1u/gjFdD5nBg/lgUDqG+zu87xCY=; b=dwIOxwRt9JACaFxAwNa5+pYuZA0khnXBWiXOocw25uRzrT9D5uiZKLEJ/XHj8skn+R K3bcZ79RZLfa53PnJewMGSCvYT3W4gPBYwNxr263VfVpnFOGxPs2VDO9ZiFP4IZDlh+K jhg2JLPGZw8ghSPdSWckS34309mQnTv0/PVWr3nN0gP9k7ojQBqW6lGsmMtcbtpkVHTg TAJAcLvrtY0gaS7v3ojj2ZwIYY2oQgw/Aye2loX9OiJhrn5lDFsFQNZew60KsEs6HbTp AuCkEKKpUEn1brPuoTvZGBiSkTRKqYxu/Fg6ZF5s0Svjj5/tO/F+SgYsvmpn8UslWZZo ZU3A== X-Forwarded-Encrypted: i=1; AHgh+RpI6qwIBLxTY+ctgh9yh55dFLrjqF7l4X1ta3uc0U0fE7vrgDICUUb0HrEjA0mDzys6iJ1nDQfnjVSwkV4=@vger.kernel.org X-Gm-Message-State: AOJu0Ywr5fF81C5YaYHTRqTPNAAT3139eZ/kniFqrC/bQ64hSmrq0MxL yO2+YH1mtOdrRhFAd6bI1QOumwL6cEOuKZ6CLVrDOBB8b1lO02uskqBu+4MdBQ8+oP+vZNmvKM1 XpjaztxgrOVSWQC4icSOjIDJfz1mdbApPoU2kTmP69MBvLlsXo7wK3HEfsf5zz3llSQICJj5OVI eylxhspA== X-Gm-Gg: AfdE7ckHHyVh6kic0JFS067GXIBLbEpEz2qVhezu4sdfaF9WO+fz4NJ8HvruUQl7T2f 4tWsqrjn1HTDdC3MwwC/AkV4IvZ5PycqgBhny7a7TTI7TaX/v4qSx0AVr8SV+ztNIyJBNabYdOb ESdqAVzWTTBGrOfS+KYgBTFg1IPWuVSDqnO6B3IQNLMwLF5GEdP8Zo/xFHT4MPo0M386j1d9puj SXJFd2yIyJ9hg11c1lwpE/hKd8vsiMeAdez1Cs2ysF+DKgKHJ6Wg4H/YWDzaa1Q0tv/5Q8Eqk9D AX5zZ9SQZCIjjuAn25aZAgDr+diLyfkYkCvv9m5QHr5w0BvQLKbWoOJJIzM/busJtTfBIf0s7y3 ftSj1xQJ5LocJa6ZboqmKhxezJ++wdM8uElRFIa1CigU6vJljjdLwNw== X-Received: by 2002:a17:902:ef11:b0:2c9:b48c:fdec with SMTP id d9443c01a7336-2ce9eab31e3mr115279805ad.12.1783996183357; Mon, 13 Jul 2026 19:29:43 -0700 (PDT) X-Received: by 2002:a17:902:ef11:b0:2c9:b48c:fdec with SMTP id d9443c01a7336-2ce9eab31e3mr115279505ad.12.1783996182971; Mon, 13 Jul 2026 19:29:42 -0700 (PDT) Received: from localhost.. (118-163-61-247.hinet-ip.hinet.net. [118.163.61.247]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ccc9d1e5d0sm109587695ad.42.2026.07.13.19.29.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 19:29:42 -0700 (PDT) From: Chris Chiu To: tiwai@suse.com, kailang@realtek.com Cc: linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, Chris Chiu Subject: [PATCH v3] ALSA: hda/realtek: Add inverted LED quirk for HP ZBook 8 G2a Date: Tue, 14 Jul 2026 10:29:37 +0800 Message-ID: <20260714022937.4062646-1-chris.chiu@canonical.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" HP ZBook 8 G2a 14 and 16 (SSIDs 0x103c:0x8f94, 0x103c:0x8f95) use Realtek ALC245 codec with TAS2781 amplifier via I2C. These models require inverted speaker mute LED handling. The existing ALC245_FIXUP_HP_TAS2781_I2C_MUTE_LED quirk produces reversed LED behavior: LED is off when speaker is muted and on when unmuted. The new quirk corrects this polarity issue. The code flow depends on HP pin detection: - With HP pin: Uses HDA LED framework for full control interface support - Without HP pin: Registers vmaster_mute hook for direct LED control Both SSIDs share this quirk since they have the same hardware LED configuration despite being different form factors. Signed-off-by: Chris Chiu --- Changes from v2: - Simplified commit message to be more concise and brief - Removed detailed explanation of "multiple models with same SSID" as it's not necessary for commit history - Fixed comment block formatting (removed unbalanced comment marker) sound/hda/codecs/realtek/alc269.c | 50 +++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/sound/hda/codecs/realtek/alc269.c b/sound/hda/codecs/realtek/a= lc269.c index b26ed9c1f09f..c1b10647110c 100644 --- a/sound/hda/codecs/realtek/alc269.c +++ b/sound/hda/codecs/realtek/alc269.c @@ -3776,6 +3776,15 @@ static void alc245_hp_spk_mute_led_update(void *priv= ate_data, int enabled) alc_update_coef_idx(codec, 0x0b, 0x0c, val); } =20 +static void alc245_hp_spk_mute_led_update_inverted(void *private_data, int= enabled) +{ + struct hda_codec *codec =3D private_data; + unsigned int val; + + val =3D enabled ? 0x04 : 0x08; /* inverted: 0x04 led off, 0x08 led on */ + alc_update_coef_idx(codec, 0x0b, 0x0c, val); +} + /* JD2: mute led GPIO3: micmute led */ static void alc245_tas2781_i2c_hp_fixup_muteled(struct hda_codec *codec, const struct hda_fixup *fix, int action) @@ -3804,6 +3813,40 @@ static void alc245_tas2781_i2c_hp_fixup_muteled(stru= ct hda_codec *codec, alc245_fixup_hp_mute_led_coefbit(codec, fix, action); alc285_fixup_hp_coef_micmute_led(codec, fix, action); } + +/* Inverted LED quirk for HP laptops with TAS2781 amplifier via I2C. + * Speaker mute LED polarity is reversed vs standard behavior. + * Code flow depends on HP pin detection availability: + * - With HP pin: Uses HDA LED framework for full control support + * - Without HP pin: Registers vmaster_mute hook for direct control + */ +static void alc245_tas2781_i2c_hp_fixup_muteled_inverted(struct hda_codec = *codec, + const struct hda_fixup *fix, int action) +{ + struct alc_spec *spec =3D codec->spec; + hda_nid_t hp_pin =3D alc_get_hp_pin(spec); + static const hda_nid_t conn[] =3D { 0x02 }; + + switch (action) { + case HDA_FIXUP_ACT_PRE_PROBE: + if (!hp_pin) { + spec->gen.vmaster_mute.hook =3D alc245_hp_spk_mute_led_update_inverted; + spec->gen.vmaster_mute_led =3D 1; + } + spec->gen.auto_mute_via_amp =3D 1; + snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn); + break; + case HDA_FIXUP_ACT_INIT: + if (!hp_pin) + alc245_hp_spk_mute_led_update_inverted(codec, !spec->gen.master_mute); + break; + } + + tas2781_fixup_txnw_i2c(codec, fix, action); + if (hp_pin) + alc245_fixup_hp_mute_led_coefbit(codec, fix, action); + alc285_fixup_hp_coef_micmute_led(codec, fix, action); +} /* * Clear COEF 0x0d (PCBEEP passthrough) bit 0x40 where BIOS sets it wrongly * at PM resume @@ -4164,6 +4207,7 @@ enum { ALC256_FIXUP_VAIO_RPL_MIC_NO_PRESENCE, ALC245_FIXUP_HP_TAS2781_SPI_MUTE_LED, ALC245_FIXUP_HP_TAS2781_I2C_MUTE_LED, + ALC245_FIXUP_HP_TAS2781_I2C_MUTE_LED_INVERTED, ALC288_FIXUP_SURFACE_SWAP_DACS, ALC236_FIXUP_HP_MUTE_LED_MICMUTE_GPIO, ALC233_FIXUP_LENOVO_GPIO2_MIC_HOTKEY, @@ -6134,6 +6178,10 @@ static const struct hda_fixup alc269_fixups[] =3D { .chained =3D true, .chain_id =3D ALC285_FIXUP_THINKPAD_HEADSET_JACK, }, + [ALC245_FIXUP_HP_TAS2781_I2C_MUTE_LED_INVERTED] =3D { + .type =3D HDA_FIXUP_FUNC, + .v.func =3D alc245_tas2781_i2c_hp_fixup_muteled_inverted, + }, [ALC287_FIXUP_LENOVO_YOGA_PRO7] =3D { .type =3D HDA_FIXUP_FUNC, /* Reuse the DAC routing selected for ThinkPad X1 Gen7 */ @@ -7361,6 +7409,8 @@ static const struct hda_quirk alc269_fixup_tbl[] =3D { SND_PCI_QUIRK(0x103c, 0x8f42, "HP ZBook 8 G2a 14W", ALC245_FIXUP_HP_TAS27= 81_I2C_MUTE_LED), SND_PCI_QUIRK(0x103c, 0x8f57, "HP Trekker G7JC", ALC287_FIXUP_CS35L41_I2C= _2), SND_PCI_QUIRK(0x103c, 0x8f62, "HP ZBook 8 G2a 16W", ALC245_FIXUP_HP_TAS27= 81_I2C_MUTE_LED), + SND_PCI_QUIRK(0x103c, 0x8f94, "HP ZBook 8 G2a 14", ALC245_FIXUP_HP_TAS278= 1_I2C_MUTE_LED_INVERTED), + SND_PCI_QUIRK(0x103c, 0x8f95, "HP ZBook 8 G2a 16", ALC245_FIXUP_HP_TAS278= 1_I2C_MUTE_LED_INVERTED), SND_PCI_QUIRK(0x1043, 0x1024, "ASUS Zephyrus G14 2025", ALC285_FIXUP_ASUS= _GA403U_HEADSET_MIC), SND_PCI_QUIRK(0x1043, 0x1032, "ASUS VivoBook X513EA", ALC256_FIXUP_ASUS_M= IC_NO_PRESENCE), SND_PCI_QUIRK(0x1043, 0x1034, "ASUS GU605C", ALC285_FIXUP_ASUS_GU605_SPI_= SPEAKER2_TO_DAC1), --=20 2.43.0