]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: wm8962: Don't report a microphone if it's shorted to ground on plug
authorSebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm>
Mon, 5 Jan 2026 03:02:10 +0000 (04:02 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 12 Jan 2026 12:36:50 +0000 (12:36 +0000)
This usually means that a TRS plug with no microphone pin has been plugged
into a TRRS socket. Cases where a user is plugging in a microphone while
pressing a button will be handled via incoming interrupt after the user
releases the button, so the microphone will still be detected once it
becomes usable.

Signed-off-by: Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm>
Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Link: https://patch.msgid.link/20260105-wm8962-l5-fixes-v1-3-f4f4eeacf089@puri.sm
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/wm8962.c

index 1040740fc80f806d420ba93689fbfe54e7460d80..bff86446741631098103789df96726c3c1445ff6 100644 (file)
@@ -67,6 +67,8 @@ struct wm8962_priv {
        struct mutex dsp2_ena_lock;
        u16 dsp2_ena;
 
+       int mic_status;
+
        struct delayed_work mic_work;
        struct snd_soc_jack *jack;
 
@@ -3081,8 +3083,16 @@ static void wm8962_mic_work(struct work_struct *work)
        if (reg & WM8962_MICSHORT_STS) {
                status |= SND_JACK_BTN_0;
                irq_pol |= WM8962_MICSCD_IRQ_POL;
+
+               /* Don't report a microphone if it's shorted right after
+                * plugging in, as this may be a TRS plug in a TRRS socket.
+                */
+               if (!(wm8962->mic_status & WM8962_MICDET_STS))
+                       status = 0;
        }
 
+       wm8962->mic_status = status;
+
        snd_soc_jack_report(wm8962->jack, status,
                            SND_JACK_MICROPHONE | SND_JACK_BTN_0);