ASoC: cs42l43: Don't enable bias sense during type detect
authorCharles Keepax <ckeepax@opensource.cirrus.com>
Mon, 11 Dec 2023 16:00:18 +0000 (16:00 +0000)
committerMark Brown <broonie@kernel.org>
Mon, 11 Dec 2023 17:25:51 +0000 (17:25 +0000)
Alas on some headsets the bias sense can cause problems with the
type detection. It can occasionally be falsely triggered by the type
detect itself and as the clamp is applied when this happens, it will
cause a headset to be incorrectly identified as headphones. As
such it should be disabled whilst running type detect. This does
mean a jack removal during type detect will cause a larger click
but that is unfortunately unavoidable.

Fixes: 1e4ce0d5c023 ("ASoC: cs42l43: Move headset bias sense enable earlier in process")
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Link: https://msgid.link/r/20231211160019.2034442-1-ckeepax@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/cs42l43-jack.c

index 73454de068cf8c9d5575ed1e5e62733a63eefe68..54a3ea60644384c5674a8369feb98b35b6ff97ee 100644 (file)
@@ -237,7 +237,7 @@ error:
        return ret;
 }
 
-static void cs42l43_start_hs_bias(struct cs42l43_codec *priv, bool force_high)
+static void cs42l43_start_hs_bias(struct cs42l43_codec *priv, bool type_detect)
 {
        struct cs42l43 *cs42l43 = priv->core;
        unsigned int val = 0x3 << CS42L43_HSBIAS_MODE_SHIFT;
@@ -247,16 +247,17 @@ static void cs42l43_start_hs_bias(struct cs42l43_codec *priv, bool force_high)
        regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
                           CS42L43_HS_CLAMP_DISABLE_MASK, CS42L43_HS_CLAMP_DISABLE_MASK);
 
-       if (!force_high && priv->bias_low)
-               val = 0x2 << CS42L43_HSBIAS_MODE_SHIFT;
-
-       if (priv->bias_sense_ua) {
-               regmap_update_bits(cs42l43->regmap,
-                                  CS42L43_HS_BIAS_SENSE_AND_CLAMP_AUTOCONTROL,
-                                  CS42L43_HSBIAS_SENSE_EN_MASK |
-                                  CS42L43_AUTO_HSBIAS_CLAMP_EN_MASK,
-                                  CS42L43_HSBIAS_SENSE_EN_MASK |
-                                  CS42L43_AUTO_HSBIAS_CLAMP_EN_MASK);
+       if (!type_detect) {
+               if (priv->bias_low)
+                       val = 0x2 << CS42L43_HSBIAS_MODE_SHIFT;
+
+               if (priv->bias_sense_ua)
+                       regmap_update_bits(cs42l43->regmap,
+                                          CS42L43_HS_BIAS_SENSE_AND_CLAMP_AUTOCONTROL,
+                                          CS42L43_HSBIAS_SENSE_EN_MASK |
+                                          CS42L43_AUTO_HSBIAS_CLAMP_EN_MASK,
+                                          CS42L43_HSBIAS_SENSE_EN_MASK |
+                                          CS42L43_AUTO_HSBIAS_CLAMP_EN_MASK);
        }
 
        regmap_update_bits(cs42l43->regmap, CS42L43_MIC_DETECT_CONTROL_1,