diff --git a/asoc/codecs/wcd937x/internal.h b/asoc/codecs/wcd937x/internal.h index 81b1e5df2c..f883e961d1 100644 --- a/asoc/codecs/wcd937x/internal.h +++ b/asoc/codecs/wcd937x/internal.h @@ -56,7 +56,6 @@ struct wcd937x_priv { s32 dmic_4_5_clk_cnt; /* mbhc module */ struct wcd937x_mbhc *mbhc; - struct blocking_notifier_head notifier; u32 hph_mode; diff --git a/asoc/codecs/wcd937x/wcd937x-mbhc.c b/asoc/codecs/wcd937x/wcd937x-mbhc.c index e54710707d..c7be66d8ae 100644 --- a/asoc/codecs/wcd937x/wcd937x-mbhc.c +++ b/asoc/codecs/wcd937x/wcd937x-mbhc.c @@ -972,7 +972,7 @@ int wcd937x_mbhc_post_ssr_init(struct wcd937x_mbhc *mbhc, wcd_mbhc_deinit(wcd_mbhc); ret = wcd_mbhc_init(wcd_mbhc, codec, &mbhc_cb, &intr_ids, - wcd_mbhc_registers, WCD937X_ZDET_SUPPORTED); + wcd_mbhc_registers, false); if (ret) { dev_err(codec->dev, "%s: mbhc initialization failed\n", __func__); @@ -1024,7 +1024,7 @@ int wcd937x_mbhc_init(struct wcd937x_mbhc **mbhc, struct snd_soc_codec *codec, ret = wcd_mbhc_init(wcd_mbhc, codec, &mbhc_cb, &intr_ids, wcd_mbhc_registers, - WCD937X_ZDET_SUPPORTED); + false); if (ret) { dev_err(codec->dev, "%s: mbhc initialization failed\n", __func__); diff --git a/asoc/codecs/wcd937x/wcd937x-mbhc.h b/asoc/codecs/wcd937x/wcd937x-mbhc.h index 648d81c9be..554cb88781 100644 --- a/asoc/codecs/wcd937x/wcd937x-mbhc.h +++ b/asoc/codecs/wcd937x/wcd937x-mbhc.h @@ -17,7 +17,6 @@ struct wcd937x_mbhc { struct wcd_mbhc wcd_mbhc; struct blocking_notifier_head notifier; struct fw_info *fw_data; - bool mbhc_started; }; #if IS_ENABLED(CONFIG_SND_SOC_WCD937X) diff --git a/asoc/codecs/wcd937x/wcd937x.c b/asoc/codecs/wcd937x/wcd937x.c index 9ef0045196..0b7004d67a 100644 --- a/asoc/codecs/wcd937x/wcd937x.c +++ b/asoc/codecs/wcd937x/wcd937x.c @@ -547,8 +547,16 @@ static int wcd937x_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w, wcd937x->rx_swr_dev->dev_num, true); break; + case SND_SOC_DAPM_PRE_PMD: + blocking_notifier_call_chain(&wcd937x->mbhc->notifier, + WCD_EVENT_PRE_HPHR_PA_OFF, + &wcd937x->mbhc->wcd_mbhc); + break; case SND_SOC_DAPM_POST_PMD: usleep_range(7000, 7010); + blocking_notifier_call_chain(&wcd937x->mbhc->notifier, + WCD_EVENT_POST_HPHR_PA_OFF, + &wcd937x->mbhc->wcd_mbhc); snd_soc_update_bits(codec, WCD937X_ANA_HPH, 0x10, 0x00); break; }; @@ -579,8 +587,16 @@ static int wcd937x_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w, wcd937x->rx_swr_dev->dev_num, true); break; + case SND_SOC_DAPM_PRE_PMD: + blocking_notifier_call_chain(&wcd937x->mbhc->notifier, + WCD_EVENT_PRE_HPHL_PA_OFF, + &wcd937x->mbhc->wcd_mbhc); + break; case SND_SOC_DAPM_POST_PMD: usleep_range(7000, 7010); + blocking_notifier_call_chain(&wcd937x->mbhc->notifier, + WCD_EVENT_POST_HPHL_PA_OFF, + &wcd937x->mbhc->wcd_mbhc); snd_soc_update_bits(codec, WCD937X_ANA_HPH, 0x20, 0x00); break; }; @@ -1092,15 +1108,15 @@ int wcd937x_micbias_control(struct snd_soc_codec *codec, snd_soc_update_bits(codec, WCD937X_MICB2_TEST_CTL_2, 0x01, 0x01); snd_soc_update_bits(codec, WCD937X_MICB3_TEST_CTL_2, 0x01, 0x01); snd_soc_update_bits(codec, micb_reg, 0xC0, 0x40); - if (post_on_event) - blocking_notifier_call_chain(&wcd937x->notifier, - post_on_event, - &wcd937x->mbhc); + if (post_on_event && wcd937x->mbhc) + blocking_notifier_call_chain( + &wcd937x->mbhc->notifier, post_on_event, + &wcd937x->mbhc->wcd_mbhc); } - if (is_dapm && post_dapm_on) - blocking_notifier_call_chain(&wcd937x->notifier, - post_dapm_on, - &wcd937x->mbhc); + if (is_dapm && post_dapm_on && wcd937x->mbhc) + blocking_notifier_call_chain( + &wcd937x->mbhc->notifier, post_dapm_on, + &wcd937x->mbhc->wcd_mbhc); break; case MICB_DISABLE: if (wcd937x->micb_ref[micb_index] > 0) @@ -1110,20 +1126,21 @@ int wcd937x_micbias_control(struct snd_soc_codec *codec, snd_soc_update_bits(codec, micb_reg, 0xC0, 0x80); else if ((wcd937x->micb_ref[micb_index] == 0) && (wcd937x->pullup_ref[micb_index] == 0)) { - if (pre_off_event) - blocking_notifier_call_chain(&wcd937x->notifier, - pre_off_event, - &wcd937x->mbhc); + if (pre_off_event && wcd937x->mbhc) + blocking_notifier_call_chain( + &wcd937x->mbhc->notifier, pre_off_event, + &wcd937x->mbhc->wcd_mbhc); snd_soc_update_bits(codec, micb_reg, 0xC0, 0x00); - if (post_off_event) - blocking_notifier_call_chain(&wcd937x->notifier, - post_off_event, - &wcd937x->mbhc); + if (post_off_event && wcd937x->mbhc) + blocking_notifier_call_chain( + &wcd937x->mbhc->notifier, + post_off_event, + &wcd937x->mbhc->wcd_mbhc); } - if (is_dapm && post_dapm_off) - blocking_notifier_call_chain(&wcd937x->notifier, - post_dapm_off, - &wcd937x->mbhc); + if (is_dapm && post_dapm_off && wcd937x->mbhc) + blocking_notifier_call_chain( + &wcd937x->mbhc->notifier, post_dapm_off, + &wcd937x->mbhc->wcd_mbhc); break; }; @@ -1367,11 +1384,11 @@ static const struct snd_soc_dapm_widget wcd937x_dapm_widgets[] = { SND_SOC_DAPM_PGA_E("HPHL PGA", WCD937X_ANA_HPH, 7, 0, NULL, 0, wcd937x_codec_enable_hphl_pa, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), + SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_PGA_E("HPHR PGA", WCD937X_ANA_HPH, 6, 0, NULL, 0, wcd937x_codec_enable_hphr_pa, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | - SND_SOC_DAPM_POST_PMD), + SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_DAC_E("RDAC1", NULL, SND_SOC_NOPM, 0, 0, wcd937x_codec_hphl_dac_event,