mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-09 05:39:54 -04:00
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 <vbucha@codeaurora.org>
This commit is contained in:
parent
1b6c22837e
commit
560fe2bc62
1 changed files with 36 additions and 21 deletions
|
|
@ -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) &&
|
||||
|
|
|
|||
Loading…
Reference in a new issue