Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e9b54de4 authored by Mark Brown's avatar Mark Brown
Browse files

ASoC: wm8994: Add debounce to wm8994 mic detection

parent cbd71f30
Loading
Loading
Loading
Loading
+20 −7
Original line number Diff line number Diff line
@@ -3059,22 +3059,20 @@ int wm8994_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack,
}
EXPORT_SYMBOL_GPL(wm8994_mic_detect);

static irqreturn_t wm8994_mic_irq(int irq, void *data)
static void wm8994_mic_work(struct work_struct *work)
{
	struct wm8994_priv *priv = data;
	struct wm8994_priv *priv = container_of(work,
						struct wm8994_priv,
						mic_work.work);
	struct snd_soc_codec *codec = priv->codec;
	int reg;
	int report;

#ifndef CONFIG_SND_SOC_WM8994_MODULE
	trace_snd_soc_jack_irq(dev_name(codec->dev));
#endif

	reg = snd_soc_read(codec, WM8994_INTERRUPT_RAW_STATUS_2);
	if (reg < 0) {
		dev_err(codec->dev, "Failed to read microphone status: %d\n",
			reg);
		return IRQ_HANDLED;
		return;
	}

	dev_dbg(codec->dev, "Microphone status: %x\n", reg);
@@ -3116,6 +3114,20 @@ static irqreturn_t wm8994_mic_irq(int irq, void *data)

	snd_soc_jack_report(priv->micdet[1].jack, report,
			    SND_JACK_HEADSET | SND_JACK_BTN_0);
}

static irqreturn_t wm8994_mic_irq(int irq, void *data)
{
	struct wm8994_priv *priv = data;
	struct snd_soc_codec *codec = priv->codec;

#ifndef CONFIG_SND_SOC_WM8994_MODULE
	trace_snd_soc_jack_irq(dev_name(codec->dev));
#endif

	pm_wakeup_event(codec->dev, 300);

	schedule_delayed_work(&priv->mic_work, msecs_to_jiffies(250));

	return IRQ_HANDLED;
}
@@ -3488,6 +3500,7 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
	wm8994->codec = codec;

	mutex_init(&wm8994->accdet_lock);
	INIT_DELAYED_WORK(&wm8994->mic_work, wm8994_mic_work);

	for (i = 0; i < ARRAY_SIZE(wm8994->fll_locked); i++)
		init_completion(&wm8994->fll_locked[i]);
+2 −0
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@
#include <sound/soc.h>
#include <linux/firmware.h>
#include <linux/completion.h>
#include <linux/workqueue.h>

#include "wm_hubs.h"

@@ -127,6 +128,7 @@ struct wm8994_priv {

	struct mutex accdet_lock;
	struct wm8994_micdet micdet[2];
	struct delayed_work mic_work;
	bool mic_detecting;
	bool jack_mic;
	int btn_mask;