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

Commit 19940b3d authored by Mark Brown's avatar Mark Brown
Browse files

ASoC: Ensure we get an impedence reported for WM8958 jack detect



Occasionally we may see an accessory reported before we have a stable
impedance for the accessory. If this happens then reread the status in
order to ensure that the handler can take the appropriate action for the
status change.

Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent 5a3ad6bd
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -1962,6 +1962,21 @@
#define WM8958_MICB2_DISCH_SHIFT                     0  /* MICB2_DISCH */
#define WM8958_MICB2_DISCH_WIDTH                     1  /* MICB2_DISCH */

/*
 * R210 (0xD2) - Mic Detect 3
 */
#define WM8958_MICD_LVL_MASK                    0x07FC  /* MICD_LVL - [10:2] */
#define WM8958_MICD_LVL_SHIFT                        2  /* MICD_LVL - [10:2] */
#define WM8958_MICD_LVL_WIDTH                        9  /* MICD_LVL - [10:2] */
#define WM8958_MICD_VALID                       0x0002  /* MICD_VALID */
#define WM8958_MICD_VALID_MASK                  0x0002  /* MICD_VALID */
#define WM8958_MICD_VALID_SHIFT                      1  /* MICD_VALID */
#define WM8958_MICD_VALID_WIDTH                      1  /* MICD_VALID */
#define WM8958_MICD_STS                         0x0001  /* MICD_STS */
#define WM8958_MICD_STS_MASK                    0x0001  /* MICD_STS */
#define WM8958_MICD_STS_SHIFT                        0  /* MICD_STS */
#define WM8958_MICD_STS_WIDTH                        1  /* MICD_STS */

/*
 * R76 (0x4C) - Charge Pump (1)
 */
+26 −11
Original line number Diff line number Diff line
@@ -3030,11 +3030,17 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data)
{
	struct wm8994_priv *wm8994 = data;
	struct snd_soc_codec *codec = wm8994->codec;
	int reg;
	int reg, count;

	/* We may occasionally read a detection without an impedence
	 * range being provided - if that happens loop again.
	 */
	count = 10;
	do {
		reg = snd_soc_read(codec, WM8958_MIC_DETECT_3);
		if (reg < 0) {
		dev_err(codec->dev, "Failed to read mic detect status: %d\n",
			dev_err(codec->dev,
				"Failed to read mic detect status: %d\n",
				reg);
			return IRQ_NONE;
		}
@@ -3044,6 +3050,15 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data)
			goto out;
		}

		if (!(reg & WM8958_MICD_STS) || (reg & WM8958_MICD_LVL_MASK))
			break;

		msleep(1);
	} while (count--);

	if (count == 0)
		dev_warn(codec->dev, "No impedence range reported for jack\n");

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