public inbox for linux-sound@vger.kernel.org
 help / color / mirror / Atom feed
From: Cole Leavitt <cole@unwrap.rs>
To: linux-sound@vger.kernel.org
Cc: patches@opensource.cirrus.com, rf@opensource.cirrus.com,
	broonie@kernel.org, Cole Leavitt <cole@unwrap.rs>
Subject: [PATCH 2/2] ASoC: cs42l43: Fix headphone output by properly disabling HP clamp
Date: Sun, 11 Jan 2026 20:13:43 -0700	[thread overview]
Message-ID: <20260112031343.17196-1-cole@unwrap.rs> (raw)

The CS42L43 codec requires proper configuration of the headphone amplifier
clamp circuitry for audio output to work. Two issues were preventing
headphone audio:

1. The STEREO_MIC_CLAMP_CTRL register (0x100c4) requires both bit 0
   (SMIC_HPAMP_CLAMP_DIS_FRC) AND bit 1 (SMIC_HPAMP_CLAMP_DIS_FRC_VAL)
   to be set to properly disable the HP amp clamp. The driver was only
   setting bit 0, which enables force mode but leaves the clamp enabled.

2. When switching to headphone or line-out mode via the Jack Override
   control, the HS_CLAMP_DISABLE bit (bit 28) in the HS2 register must
   be set to disable the headset clamp circuitry.

Without these fixes, the headphone amplifier output is clamped to ground
and no audio is heard despite correct DAPM routing.

Tested on Lenovo ThinkPad P16 Gen 3 with CS42L43 codec.

Signed-off-by: Cole Leavitt <cole@unwrap.rs>
---
 sound/soc/codecs/cs42l43-jack.c | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/sound/soc/codecs/cs42l43-jack.c b/sound/soc/codecs/cs42l43-jack.c
index b719d6263..7d6a93eec 100644
--- a/sound/soc/codecs/cs42l43-jack.c
+++ b/sound/soc/codecs/cs42l43-jack.c
@@ -698,7 +698,7 @@ void cs42l43_clear_jack(struct cs42l43_codec *priv)
 	regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CTRL,
 			   CS42L43_JACK_STEREO_CONFIG_MASK, 0);
 	regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CLAMP_CTRL,
-			   CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK,
+			   CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK | CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK,
 			   CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK);
 	regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
 			   CS42L43_HSDET_MODE_MASK | CS42L43_HSDET_MANUAL_MODE_MASK,
@@ -814,7 +814,7 @@ static const struct cs42l43_jack_override_mode {
 			      CS42L43_HSBIAS_GNDREF_HS3_SEL_MASK |
 			      CS42L43_HSBIAS_OUT_HS4_SEL_MASK |
 			      CS42L43_HSGND_HS3_SEL_MASK,
-		.clamp_ctrl = CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK,
+		.clamp_ctrl = CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK | CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK,
 		.report = CS42L43_JACK_HEADSET,
 	},
 	[CS42L43_JACK_RAW_OMTP] = {
@@ -823,17 +823,17 @@ static const struct cs42l43_jack_override_mode {
 			       CS42L43_HSBIAS_GNDREF_HS4_SEL_MASK |
 			       CS42L43_HSBIAS_OUT_HS3_SEL_MASK |
 			       CS42L43_HSGND_HS4_SEL_MASK,
-		.clamp_ctrl = CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK,
+		.clamp_ctrl = CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK | CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK,
 		.report = CS42L43_JACK_HEADSET,
 	},
 	[CS42L43_JACK_RAW_HEADPHONE] = {
 		.hsdet_mode = CS42L43_JACK_3_POLE_SWITCHES,
-		.clamp_ctrl = CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK,
+		.clamp_ctrl = CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK | CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK,
 		.report = CS42L43_JACK_HEADPHONE,
 	},
 	[CS42L43_JACK_RAW_LINE_OUT] = {
 		.hsdet_mode = CS42L43_JACK_3_POLE_SWITCHES,
-		.clamp_ctrl = CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK,
+		.clamp_ctrl = CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK | CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK,
 		.report = CS42L43_JACK_LINEOUT,
 	},
 	[CS42L43_JACK_RAW_LINE_IN] = {
@@ -849,7 +849,7 @@ static const struct cs42l43_jack_override_mode {
 	},
 	[CS42L43_JACK_RAW_OPTICAL] = {
 		.hsdet_mode = CS42L43_JACK_3_POLE_SWITCHES,
-		.clamp_ctrl = CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK,
+		.clamp_ctrl = CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK | CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK,
 		.report = CS42L43_JACK_OPTICAL,
 	},
 };
@@ -927,7 +927,7 @@ int cs42l43_jack_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *u
 				   CS42L43_JACK_STEREO_CONFIG_MASK,
 				   cs42l43_jack_override_modes[override].mic_ctrl);
 		regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CLAMP_CTRL,
-				   CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK,
+				   CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK | CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK,
 				   cs42l43_jack_override_modes[override].clamp_ctrl);
 
 		switch (override) {
@@ -947,6 +947,13 @@ int cs42l43_jack_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *u
 		case CS42L43_JACK_RAW_MICROPHONE:
 			cs42l43_start_hs_bias(priv, false);
 			break;
+		case CS42L43_JACK_RAW_HEADPHONE:
+		case CS42L43_JACK_RAW_LINE_OUT:
+			/* Disable HS clamp for headphone/line-out playback */
+			regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
+					   CS42L43_HS_CLAMP_DISABLE_MASK,
+					   CS42L43_HS_CLAMP_DISABLE_MASK);
+			break;
 		default:
 			break;
 		}
-- 
2.52.0


             reply	other threads:[~2026-01-12  3:14 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-01-12  3:13 Cole Leavitt [this message]
2026-01-12 13:02 ` [PATCH 2/2] ASoC: cs42l43: Fix headphone output by properly disabling HP clamp Charles Keepax

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=20260112031343.17196-1-cole@unwrap.rs \
    --to=cole@unwrap.rs \
    --cc=broonie@kernel.org \
    --cc=linux-sound@vger.kernel.org \
    --cc=patches@opensource.cirrus.com \
    --cc=rf@opensource.cirrus.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox