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

Commit 018cf081 authored by Yeleswarapu, Nagaradhesh's avatar Yeleswarapu, Nagaradhesh
Browse files

ASoC: wcd9xxx: Don't change button threshold registers



If registers which effect button detection are changed
when mbhc is still in recovering state, sometimes release
interrupt is not getting triggered.So don't modify registers
which effect button detection.

CRs-Fixed: 576855
Change-Id: I307ea4a112d81fecfe23eb58733913b4453284cd
Signed-off-by: default avatarYeleswarapu, Nagaradhesh <nagaradh@codeaurora.org>
parent abedad47
Loading
Loading
Loading
Loading
+86 −66
Original line number Diff line number Diff line
@@ -213,7 +213,6 @@ static void wcd9xxx_pause_hs_polling(struct wcd9xxx_mbhc *mbhc)
/* called under codec_resource_lock acquisition */
static void wcd9xxx_start_hs_polling(struct wcd9xxx_mbhc *mbhc)
{
	s16 v_brh, v_b1_hu;
	struct snd_soc_codec *codec = mbhc->codec;
	int mbhc_state = mbhc->mbhc_state;

@@ -254,17 +253,6 @@ static void wcd9xxx_start_hs_polling(struct wcd9xxx_mbhc *mbhc)
		/* set to max */
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B6_CTL, 0x7F);
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B5_CTL, 0xFF);

		v_brh = wcd9xxx_get_current_v(mbhc, WCD9XXX_CURRENT_V_BR_H);
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B10_CTL,
			      (v_brh >> 8) & 0xFF);
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B9_CTL,
			      v_brh & 0xFF);
		v_b1_hu = wcd9xxx_get_current_v(mbhc, WCD9XXX_CURRENT_V_B1_HU);
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B3_CTL,
			      v_b1_hu & 0xFF);
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B4_CTL,
			      (v_b1_hu >> 8) & 0xFF);
	}

	snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_EN_CTL, 0x1);
@@ -325,22 +313,32 @@ static bool __wcd9xxx_switch_micbias(struct wcd9xxx_mbhc *mbhc,
			snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B2_CTL,
				      (d->v_ins_hu[MBHC_V_IDX_VDDIO] >> 8) &
				      0xFF);

			if (mbhc->mbhc_state != MBHC_STATE_POTENTIAL_RECOVERY) {
				/* Threshods for button press */
			snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B3_CTL,
				snd_soc_write(codec,
					WCD9XXX_A_CDC_MBHC_VOLT_B3_CTL,
					d->v_b1_hu[MBHC_V_IDX_VDDIO] & 0xFF);
			snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B4_CTL,
				snd_soc_write(codec,
					WCD9XXX_A_CDC_MBHC_VOLT_B4_CTL,
					(d->v_b1_hu[MBHC_V_IDX_VDDIO] >> 8) &
					0xFF);
			snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B5_CTL,
				snd_soc_write(codec,
					WCD9XXX_A_CDC_MBHC_VOLT_B5_CTL,
					d->v_b1_h[MBHC_V_IDX_VDDIO] & 0xFF);
			snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B6_CTL,
				snd_soc_write(codec,
					WCD9XXX_A_CDC_MBHC_VOLT_B6_CTL,
					(d->v_b1_h[MBHC_V_IDX_VDDIO] >> 8) &
					0xFF);
				/* Threshods for button release */
			snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B9_CTL,
				snd_soc_write(codec,
					WCD9XXX_A_CDC_MBHC_VOLT_B9_CTL,
					d->v_brh[MBHC_V_IDX_VDDIO] & 0xFF);
			snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B10_CTL,
				      (d->v_brh[MBHC_V_IDX_VDDIO] >> 8) & 0xFF);
				snd_soc_write(codec,
					WCD9XXX_A_CDC_MBHC_VOLT_B10_CTL,
					(d->v_brh[MBHC_V_IDX_VDDIO] >> 8) &
					0xFF);
			}
			pr_debug("%s: Programmed MBHC thresholds to VDDIO\n",
				 __func__);
		}
@@ -376,22 +374,31 @@ static bool __wcd9xxx_switch_micbias(struct wcd9xxx_mbhc *mbhc,
			snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B2_CTL,
					(d->v_ins_hu[MBHC_V_IDX_CFILT] >> 8) &
					0xFF);
			if (mbhc->mbhc_state != MBHC_STATE_POTENTIAL_RECOVERY) {
				/* Revert threshods for button press */
			snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B3_CTL,
				snd_soc_write(codec,
					WCD9XXX_A_CDC_MBHC_VOLT_B3_CTL,
					d->v_b1_hu[MBHC_V_IDX_CFILT] & 0xFF);
			snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B4_CTL,
				snd_soc_write(codec,
					WCD9XXX_A_CDC_MBHC_VOLT_B4_CTL,
					(d->v_b1_hu[MBHC_V_IDX_CFILT] >> 8) &
					0xFF);
			snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B5_CTL,
				snd_soc_write(codec,
					WCD9XXX_A_CDC_MBHC_VOLT_B5_CTL,
					d->v_b1_h[MBHC_V_IDX_CFILT] & 0xFF);
			snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B6_CTL,
				snd_soc_write(codec,
					WCD9XXX_A_CDC_MBHC_VOLT_B6_CTL,
					(d->v_b1_h[MBHC_V_IDX_CFILT] >> 8) &
					0xFF);
				/* Revert threshods for button release */
			snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B9_CTL,
				snd_soc_write(codec,
					WCD9XXX_A_CDC_MBHC_VOLT_B9_CTL,
					d->v_brh[MBHC_V_IDX_CFILT] & 0xFF);
			snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B10_CTL,
				      (d->v_brh[MBHC_V_IDX_CFILT] >> 8) & 0xFF);
				snd_soc_write(codec,
					WCD9XXX_A_CDC_MBHC_VOLT_B10_CTL,
					(d->v_brh[MBHC_V_IDX_CFILT] >> 8) &
					0xFF);
			}
			pr_debug("%s: Programmed MBHC thresholds to MICBIAS\n",
					__func__);
		}
@@ -489,13 +496,18 @@ static void wcd9xxx_calibrate_hs_polling(struct wcd9xxx_mbhc *mbhc)
	snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B1_CTL, v_ins_hu & 0xFF);
	snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B2_CTL,
		      (v_ins_hu >> 8) & 0xFF);
	snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B3_CTL, v_b1_hu & 0xFF);

	if (mbhc->mbhc_state != MBHC_STATE_POTENTIAL_RECOVERY) {
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B3_CTL, v_b1_hu &
				0xFF);
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B4_CTL,
				(v_b1_hu >> 8) & 0xFF);
	snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B5_CTL, v_b1_h & 0xFF);
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B5_CTL, v_b1_h &
				0xFF);
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B6_CTL,
				(v_b1_h >> 8) & 0xFF);
	snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B9_CTL, v_brh & 0xFF);
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B9_CTL, v_brh &
				0xFF);
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B10_CTL,
				(v_brh >> 8) & 0xFF);
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B11_CTL,
@@ -503,6 +515,7 @@ static void wcd9xxx_calibrate_hs_polling(struct wcd9xxx_mbhc *mbhc)
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B12_CTL,
				(mbhc->mbhc_data.v_brl >> 8) & 0xFF);
	}
}

static void wcd9xxx_codec_switch_cfilt_mode(struct wcd9xxx_mbhc *mbhc,
					    bool fast)
@@ -3148,15 +3161,22 @@ static int wcd9xxx_update_rel_threshold(struct wcd9xxx_mbhc *mbhc, int ceilmv)
	mv = ceilmv + btn_det->v_btn_press_delta_cic;
	pr_debug("%s: reprogram vb1hu/vbrh to %dmv\n", __func__, mv);

	/* update LSB first so mbhc hardware block doesn't see too low value */
	if (mbhc->mbhc_state != MBHC_STATE_POTENTIAL_RECOVERY) {
		/*
		 * update LSB first so mbhc hardware block
		 * doesn't see too low value.
		 */
		v_b1_hu = wcd9xxx_codec_v_sta_dce(mbhc, STA, mv, false);
	snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B3_CTL, v_b1_hu & 0xFF);
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B3_CTL, v_b1_hu &
				0xFF);
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B4_CTL,
				(v_b1_hu >> 8) & 0xFF);
		v_brh = wcd9xxx_codec_v_sta_dce(mbhc, DCE, mv, false);
	snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B9_CTL, v_brh & 0xFF);
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B9_CTL, v_brh &
				0xFF);
		snd_soc_write(codec, WCD9XXX_A_CDC_MBHC_VOLT_B10_CTL,
				(v_brh >> 8) & 0xFF);
	}
	return 0;
}