From 560fe2bc62727b86cb9976cd8f2466631cf15ca7 Mon Sep 17 00:00:00 2001 From: Vatsal Bucha Date: Mon, 10 Aug 2020 17:57:00 +0530 Subject: [PATCH] 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: Vatsal Bucha --- asoc/codecs/rouleur/rouleur-mbhc.c | 57 +++++++++++++++++++----------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/asoc/codecs/rouleur/rouleur-mbhc.c b/asoc/codecs/rouleur/rouleur-mbhc.c index c7ba03cd2b1a..7edfe1fbddc2 100644 --- a/asoc/codecs/rouleur/rouleur-mbhc.c +++ b/asoc/codecs/rouleur/rouleur-mbhc.c @@ -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 @@ z_right: *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) &&