From 3dd07e69379fcba0c511bc4a1453ada7c1c90c4a Mon Sep 17 00:00:00 2001 From: Karthikeyan Mani Date: Thu, 28 Jun 2018 18:25:08 -0700 Subject: [PATCH] asoc: mbhc: ignore mbhc event report during ssr When ssr is in progress, during some race conditions mbhc events are getting reported when codec is still coming up. Ignore such events without reporting. Change-Id: I3d3f78f97c2b855fc36a480f38c166bda2d979f0 Signed-off-by: Karthikeyan Mani --- asoc/codecs/wcd-mbhc-v2.c | 6 ++++++ asoc/codecs/wcd-mbhc-v2.h | 1 + asoc/codecs/wcd934x/wcd934x.c | 1 + 3 files changed, 8 insertions(+) diff --git a/asoc/codecs/wcd-mbhc-v2.c b/asoc/codecs/wcd-mbhc-v2.c index fd02dce7cb..6f3b19ba6c 100644 --- a/asoc/codecs/wcd-mbhc-v2.c +++ b/asoc/codecs/wcd-mbhc-v2.c @@ -776,6 +776,11 @@ void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, bool anc_mic_found = false; enum snd_jack_types jack_type; + if (mbhc->deinit_in_progress) { + pr_info("%s: mbhc deinit in progess: ignore report\n"); + return; + } + pr_debug("%s: enter current_plug(%d) new_plug(%d)\n", __func__, mbhc->current_plug, plug_type); @@ -1882,6 +1887,7 @@ int wcd_mbhc_init(struct wcd_mbhc *mbhc, struct snd_soc_codec *codec, goto err_hphr_ocp_irq; } + mbhc->deinit_in_progress = false; pr_debug("%s: leave ret %d\n", __func__, ret); return ret; diff --git a/asoc/codecs/wcd-mbhc-v2.h b/asoc/codecs/wcd-mbhc-v2.h index 2fb09ff5be..0473574104 100644 --- a/asoc/codecs/wcd-mbhc-v2.h +++ b/asoc/codecs/wcd-mbhc-v2.h @@ -582,6 +582,7 @@ struct wcd_mbhc { struct completion btn_press_compl; struct mutex hphl_pa_lock; struct mutex hphr_pa_lock; + bool deinit_in_progress; /* Holds mbhc detection method - ADC/Legacy */ unsigned int mbhc_detection_logic; diff --git a/asoc/codecs/wcd934x/wcd934x.c b/asoc/codecs/wcd934x/wcd934x.c index 92395d3401..4f28ae99c3 100644 --- a/asoc/codecs/wcd934x/wcd934x.c +++ b/asoc/codecs/wcd934x/wcd934x.c @@ -9980,6 +9980,7 @@ static int tavil_device_down(struct wcd9xxx *wcd9xxx) for (count = 0; count < NUM_CODEC_DAIS; count++) priv->dai[count].bus_down_in_recovery = true; + priv->mbhc->wcd_mbhc.deinit_in_progress = true; if (delayed_work_pending(&priv->spk_anc_dwork.dwork)) cancel_delayed_work(&priv->spk_anc_dwork.dwork); for (decimator = 0; decimator < WCD934X_NUM_DECIMATORS; decimator++) {