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

Commit 2850ded6 authored by Vatsal Bucha's avatar Vatsal Bucha Committed by Gerrit - the friendly Code Review server
Browse files

ASoC: rouleur-mbhc: Fix impedance detection issue on rouleur



Impedance values are not correct sometimes due to ramp
being controlled by hw. Run detection routine for sometime
and take final value as impedance value to resolve issue.

Change-Id: I3a34813657751aa304e150cfa294a42f556d06c4
Signed-off-by: default avatarVatsal Bucha <vbucha@codeaurora.org>
parent 7321b52a
Loading
Loading
Loading
Loading
+36 −21
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@
#define ROULEUR_HPHL_CROSS_CONN_THRESHOLD 350
#define ROULEUR_HPHR_CROSS_CONN_THRESHOLD 350

#define IMPED_NUM_RETRY 5

static struct wcd_mbhc_register
	wcd_mbhc_registers[WCD_MBHC_REG_FUNC_MAX] = {
	WCD_MBHC_REGISTER("WCD_MBHC_L_DET_EN",
@@ -515,6 +517,35 @@ static void rouleur_mbhc_zdet_start(struct snd_soc_component *component,
	*zr = zdet;
}

static void rouleur_mbhc_impedance_fn(struct snd_soc_component *component,
				      int32_t *z1L, int32_t *z1R,
				      int32_t *zl, int32_t *zr)
{
	int i;
	for (i = 0; i < IMPED_NUM_RETRY; i++) {
		/* Start of left ch impedance calculation */
		rouleur_mbhc_zdet_start(component, z1L, NULL);
		if ((*z1L == ROULEUR_ZDET_FLOATING_IMPEDANCE) ||
		    (*z1L > ROULEUR_ZDET_VAL_100K))
			*zl = ROULEUR_ZDET_FLOATING_IMPEDANCE;
		else
			*zl = *z1L/1000;

		/* Start of right ch impedance calculation */
		rouleur_mbhc_zdet_start(component, NULL, z1R);
		if ((*z1R == ROULEUR_ZDET_FLOATING_IMPEDANCE) ||
		    (*z1R > ROULEUR_ZDET_VAL_100K))
			*zr = ROULEUR_ZDET_FLOATING_IMPEDANCE;
		else
			*zr = *z1R/1000;
	}

	dev_dbg(component->dev, "%s: impedance on HPH_L = %d(ohms)\n",
		__func__, *zl);
	dev_dbg(component->dev, "%s: impedance on HPH_R = %d(ohms)\n",
		__func__, *zr);
}

static void rouleur_wcd_mbhc_calc_impedance(struct wcd_mbhc *mbhc, uint32_t *zl,
					  uint32_t *zr)
{
@@ -564,27 +595,11 @@ static void rouleur_wcd_mbhc_calc_impedance(struct wcd_mbhc *mbhc, uint32_t *zl,
	/* 1ms delay needed after disable surge protection */
	usleep_range(1000, 1010);

	/* Start of left ch impedance calculation */
	rouleur_mbhc_zdet_start(component, &z1L, NULL);
	if ((z1L == ROULEUR_ZDET_FLOATING_IMPEDANCE) ||
		(z1L > ROULEUR_ZDET_VAL_100K))
		*zl = ROULEUR_ZDET_FLOATING_IMPEDANCE;
	else
		*zl = z1L/1000;

	dev_dbg(component->dev, "%s: impedance on HPH_L = %d(ohms)\n",
		__func__, *zl);

	/* Start of right ch impedance calculation */
	rouleur_mbhc_zdet_start(component, NULL, &z1R);
	if ((z1R == ROULEUR_ZDET_FLOATING_IMPEDANCE) ||
		(z1R > ROULEUR_ZDET_VAL_100K))
		*zr = ROULEUR_ZDET_FLOATING_IMPEDANCE;
	else
		*zr = z1R/1000;

	dev_dbg(component->dev, "%s: impedance on HPH_R = %d(ohms)\n",
		__func__, *zr);
	/*
	 * Call impedance detection routine multiple times
	 * in order to avoid wrong impedance values.
	 */
	rouleur_mbhc_impedance_fn(component, &z1L, &z1R, zl, zr);

	/* Mono/stereo detection */
	if ((*zl == ROULEUR_ZDET_FLOATING_IMPEDANCE) &&