From a9675d1a5d76efae5d63f97632ea6fba45b81e24 Mon Sep 17 00:00:00 2001 From: Vatsal Bucha Date: Wed, 23 Oct 2019 12:32:29 +0530 Subject: [PATCH] ASoC: wcd937x: Fix audio distortion issue during headset record Audio is distorted during first 3 secs on headset record while doing device switch from dmic to headset mic. Disable BCS before slow insertion detection and enable it afterwards to resolve the issue. Change-Id: Icb18a0b5decb0c0bd9959bce7cced70a27566d41 Signed-off-by: Vatsal Bucha --- asoc/codecs/wcd937x/internal.h | 4 ++++ asoc/codecs/wcd937x/wcd937x-mbhc.c | 10 ++++++++++ asoc/codecs/wcd937x/wcd937x.c | 15 +++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/asoc/codecs/wcd937x/internal.h b/asoc/codecs/wcd937x/internal.h index cd11c858b4..faf0118604 100644 --- a/asoc/codecs/wcd937x/internal.h +++ b/asoc/codecs/wcd937x/internal.h @@ -133,6 +133,7 @@ enum { WCD_BOLERO_EVT_RX_MUTE = 1, /* for RX mute/unmute */ WCD_BOLERO_EVT_IMPED_TRUE, /* for imped true */ WCD_BOLERO_EVT_IMPED_FALSE, /* for imped false */ + WCD_BOLERO_EVT_BCS_CLK_OFF, }; enum { @@ -164,6 +165,9 @@ enum { WCD937X_NUM_IRQS, }; +extern void wcd937x_disable_bcs_before_slow_insert( + struct snd_soc_component *component, + bool bcs_disable); extern struct wcd937x_mbhc *wcd937x_soc_get_mbhc( struct snd_soc_component *component); extern int wcd937x_mbhc_micb_adjust_voltage(struct snd_soc_component *component, diff --git a/asoc/codecs/wcd937x/wcd937x-mbhc.c b/asoc/codecs/wcd937x/wcd937x-mbhc.c index 2159cabe71..039f5118be 100644 --- a/asoc/codecs/wcd937x/wcd937x-mbhc.c +++ b/asoc/codecs/wcd937x/wcd937x-mbhc.c @@ -810,6 +810,15 @@ static void wcd937x_mbhc_moisture_polling_ctrl(struct wcd_mbhc *mbhc, 0x04, (enable << 2)); } +static void wcd937x_mbhc_bcs_enable(struct wcd_mbhc *mbhc, + bool bcs_enable) +{ + if (bcs_enable) + wcd937x_disable_bcs_before_slow_insert(mbhc->component, false); + else + wcd937x_disable_bcs_before_slow_insert(mbhc->component, true); +} + static const struct wcd_mbhc_cb mbhc_cb = { .request_irq = wcd937x_mbhc_request_irq, .irq_control = wcd937x_mbhc_irq_control, @@ -834,6 +843,7 @@ static const struct wcd_mbhc_cb mbhc_cb = { .mbhc_get_moisture_status = wcd937x_mbhc_get_moisture_status, .mbhc_moisture_polling_ctrl = wcd937x_mbhc_moisture_polling_ctrl, .mbhc_moisture_detect_en = wcd937x_mbhc_moisture_detect_en, + .bcs_enable = wcd937x_mbhc_bcs_enable, }; static int wcd937x_get_hph_type(struct snd_kcontrol *kcontrol, diff --git a/asoc/codecs/wcd937x/wcd937x.c b/asoc/codecs/wcd937x/wcd937x.c index 94e59d98dd..6a6caf1376 100644 --- a/asoc/codecs/wcd937x/wcd937x.c +++ b/asoc/codecs/wcd937x/wcd937x.c @@ -1517,6 +1517,21 @@ int wcd937x_micbias_control(struct snd_soc_component *component, } EXPORT_SYMBOL(wcd937x_micbias_control); +void wcd937x_disable_bcs_before_slow_insert(struct snd_soc_component *component, + bool bcs_disable) +{ + struct wcd937x_priv *wcd937x = snd_soc_component_get_drvdata(component); + + if (wcd937x->update_wcd_event) { + if (bcs_disable) + wcd937x->update_wcd_event(wcd937x->handle, + WCD_BOLERO_EVT_BCS_CLK_OFF, 0); + else + wcd937x->update_wcd_event(wcd937x->handle, + WCD_BOLERO_EVT_BCS_CLK_OFF, 1); + } +} + static int wcd937x_get_logical_addr(struct swr_device *swr_dev) { int ret = 0;