]> www.infradead.org Git - users/hch/misc.git/commitdiff
ASoC: cs42l43: Shutdown jack detection on suspend
authorCharles Keepax <ckeepax@opensource.cirrus.com>
Wed, 3 Sep 2025 09:45:47 +0000 (10:45 +0100)
committerMark Brown <broonie@kernel.org>
Thu, 4 Sep 2025 12:00:39 +0000 (13:00 +0100)
Fully power down the jack detection on system suspend since the device
will not be powered up during.

Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Message-ID: <20250903094549.271068-5-ckeepax@opensource.cirrus.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/cs42l43-jack.c
sound/soc/codecs/cs42l43.c
sound/soc/codecs/cs42l43.h

index 2a0a4986a9ce8f452c893ab29437b911401dc770..867e23d4fb8d8bd01a4757589289f927947f25dd 100644 (file)
@@ -684,7 +684,7 @@ static int cs42l43_run_type_detect(struct cs42l43_codec *priv)
        }
 }
 
-static void cs42l43_clear_jack(struct cs42l43_codec *priv)
+void cs42l43_clear_jack(struct cs42l43_codec *priv)
 {
        struct cs42l43 *cs42l43 = priv->core;
 
@@ -703,8 +703,6 @@ static void cs42l43_clear_jack(struct cs42l43_codec *priv)
        regmap_update_bits(cs42l43->regmap, CS42L43_HS2,
                           CS42L43_HSDET_MODE_MASK | CS42L43_HSDET_MANUAL_MODE_MASK,
                           0x2 << CS42L43_HSDET_MODE_SHIFT);
-
-       snd_soc_jack_report(priv->jack_hp, 0, 0xFFFF);
 }
 
 void cs42l43_tip_sense_work(struct work_struct *work)
@@ -753,6 +751,8 @@ void cs42l43_tip_sense_work(struct work_struct *work)
 
                cs42l43_clear_jack(priv);
 
+               snd_soc_jack_report(priv->jack_hp, 0, 0xFFFF);
+
                if (cs42l43->sdw && priv->jack_present) {
                        pm_runtime_put(priv->dev);
                        priv->jack_present = false;
@@ -903,6 +903,8 @@ int cs42l43_jack_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *u
 
        cs42l43_clear_jack(priv);
 
+       snd_soc_jack_report(priv->jack_hp, 0, 0xFFFF);
+
        if (!override) {
                queue_delayed_work(system_long_wq, &priv->tip_sense_work, 0);
        } else {
index 405926149a13752733bfe8291f556d79569b5fad..b61df09f20cf49a1c1303ebc89cdfffe32a0ed6c 100644 (file)
@@ -2422,6 +2422,8 @@ static int cs42l43_codec_suspend(struct device *dev)
        cancel_delayed_work_sync(&priv->tip_sense_work);
        cancel_delayed_work_sync(&priv->hp_ilimit_clear_work);
 
+       cs42l43_clear_jack(priv);
+
        return pm_runtime_force_suspend(dev);
 }
 
index 0951ad3525efeed1e7c2ab6cd54eb881b2c97491..b2fa2cd1d99f87468631ea3862b69b7b5ecb07c9 100644 (file)
@@ -132,6 +132,7 @@ static inline int cs42l43_sdw_add_peripheral(struct snd_pcm_substream *substream
 int cs42l43_set_jack(struct snd_soc_component *component,
                     struct snd_soc_jack *jack, void *d);
 void cs42l43_bias_sense_timeout(struct work_struct *work);
+void cs42l43_clear_jack(struct cs42l43_codec *priv);
 void cs42l43_tip_sense_work(struct work_struct *work);
 irqreturn_t cs42l43_bias_detect_clamp(int irq, void *data);
 irqreturn_t cs42l43_button_press(int irq, void *data);