ASoC: wcd-mbhc: check HPH PA status before impedance detection

If HPH PA is on, the result of impedance detection is not
reliable. So check the HPH PA status before impedance detection.

CRs-Fixed: 1100622
Change-Id: I9c2063011247cca8105b39c913633cd7619a89eb
Signed-off-by: Walter Yang <yandongy@codeaurora.org>
This commit is contained in:
Walter Yang 2016-12-10 11:13:54 +08:00 committed by Gerrit - the friendly Code Review server
parent 3162449f7d
commit 23a11e9c28

View file

@ -570,6 +570,9 @@ static void wcd_mbhc_hs_elec_irq(struct wcd_mbhc *mbhc, int irq_type,
static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion,
enum snd_jack_types jack_type) enum snd_jack_types jack_type)
{ {
struct snd_soc_codec *codec = mbhc->codec;
bool is_pa_on = false;
WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); WCD_MBHC_RSC_ASSERT_LOCKED(mbhc);
pr_debug("%s: enter insertion %d hph_status %x\n", pr_debug("%s: enter insertion %d hph_status %x\n",
@ -595,14 +598,14 @@ static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion,
if (mbhc->micbias_enable) { if (mbhc->micbias_enable) {
if (mbhc->mbhc_cb->mbhc_micbias_control) if (mbhc->mbhc_cb->mbhc_micbias_control)
mbhc->mbhc_cb->mbhc_micbias_control( mbhc->mbhc_cb->mbhc_micbias_control(
mbhc->codec, MIC_BIAS_2, codec, MIC_BIAS_2,
MICB_DISABLE); MICB_DISABLE);
if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic)
mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(
mbhc->codec, codec,
MIC_BIAS_2, false); MIC_BIAS_2, false);
if (mbhc->mbhc_cb->set_micbias_value) { if (mbhc->mbhc_cb->set_micbias_value) {
mbhc->mbhc_cb->set_micbias_value(mbhc->codec); mbhc->mbhc_cb->set_micbias_value(codec);
WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 0); WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 0);
} }
mbhc->micbias_enable = false; mbhc->micbias_enable = false;
@ -632,15 +635,15 @@ static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion,
if (mbhc->micbias_enable) { if (mbhc->micbias_enable) {
if (mbhc->mbhc_cb->mbhc_micbias_control) if (mbhc->mbhc_cb->mbhc_micbias_control)
mbhc->mbhc_cb->mbhc_micbias_control( mbhc->mbhc_cb->mbhc_micbias_control(
mbhc->codec, MIC_BIAS_2, codec, MIC_BIAS_2,
MICB_DISABLE); MICB_DISABLE);
if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic)
mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic(
mbhc->codec, codec,
MIC_BIAS_2, false); MIC_BIAS_2, false);
if (mbhc->mbhc_cb->set_micbias_value) { if (mbhc->mbhc_cb->set_micbias_value) {
mbhc->mbhc_cb->set_micbias_value( mbhc->mbhc_cb->set_micbias_value(
mbhc->codec); codec);
WCD_MBHC_REG_UPDATE_BITS( WCD_MBHC_REG_UPDATE_BITS(
WCD_MBHC_MICB_CTRL, 0); WCD_MBHC_MICB_CTRL, 0);
} }
@ -691,9 +694,13 @@ static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion,
} else if (jack_type == SND_JACK_ANC_HEADPHONE) } else if (jack_type == SND_JACK_ANC_HEADPHONE)
mbhc->current_plug = MBHC_PLUG_TYPE_ANC_HEADPHONE; mbhc->current_plug = MBHC_PLUG_TYPE_ANC_HEADPHONE;
if (mbhc->mbhc_cb->hph_pa_on_status)
is_pa_on = mbhc->mbhc_cb->hph_pa_on_status(codec);
if (mbhc->impedance_detect && if (mbhc->impedance_detect &&
mbhc->mbhc_cb->compute_impedance && mbhc->mbhc_cb->compute_impedance &&
(mbhc->mbhc_cfg->linein_th != 0)) { (mbhc->mbhc_cfg->linein_th != 0) &&
(!is_pa_on)) {
mbhc->mbhc_cb->compute_impedance(mbhc, mbhc->mbhc_cb->compute_impedance(mbhc,
&mbhc->zl, &mbhc->zr); &mbhc->zl, &mbhc->zr);
if ((mbhc->zl > mbhc->mbhc_cfg->linein_th && if ((mbhc->zl > mbhc->mbhc_cfg->linein_th &&