From 875812d38554aa29cab9d8b2e538d845360ec9bf Mon Sep 17 00:00:00 2001 From: Vatsal Bucha Date: Fri, 5 Jul 2019 17:07:27 +0530 Subject: [PATCH] ASoC: wcd937x: Fix spurious interrupts for wcd937x Enabling watchdog interrupt during bind causes spurious interrupts. Disable interrupts during bind and enable during path setup to fix this. Also enable and disable interrupt for ear pa for wcd938x. Change-Id: I4a9526d7b0a63f5325cec6dfe7a4e302ae76fc40 Signed-off-by: Vatsal Bucha --- asoc/codecs/wcd937x/wcd937x.c | 30 ++++++++++++++++++++++++++---- asoc/codecs/wcd938x/wcd938x.c | 12 ++++++++++++ 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/asoc/codecs/wcd937x/wcd937x.c b/asoc/codecs/wcd937x/wcd937x.c index ef9b20abc606..1c583ed49ee9 100644 --- a/asoc/codecs/wcd937x/wcd937x.c +++ b/asoc/codecs/wcd937x/wcd937x.c @@ -688,8 +688,12 @@ static int wcd937x_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w, wcd937x->update_wcd_event(wcd937x->handle, WCD_BOLERO_EVT_RX_MUTE, (WCD_RX2 << 0x10)); + wcd_enable_irq(&wcd937x->irq_info, + WCD937X_IRQ_HPHR_PDM_WD_INT); break; case SND_SOC_DAPM_PRE_PMD: + wcd_disable_irq(&wcd937x->irq_info, + WCD937X_IRQ_HPHR_PDM_WD_INT); if (wcd937x->update_wcd_event) wcd937x->update_wcd_event(wcd937x->handle, WCD_BOLERO_EVT_RX_MUTE, @@ -783,8 +787,12 @@ static int wcd937x_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w, wcd937x->update_wcd_event(wcd937x->handle, WCD_BOLERO_EVT_RX_MUTE, (WCD_RX1 << 0x10)); + wcd_enable_irq(&wcd937x->irq_info, + WCD937X_IRQ_HPHL_PDM_WD_INT); break; case SND_SOC_DAPM_PRE_PMD: + wcd_disable_irq(&wcd937x->irq_info, + WCD937X_IRQ_HPHL_PDM_WD_INT); if (wcd937x->update_wcd_event) wcd937x->update_wcd_event(wcd937x->handle, WCD_BOLERO_EVT_RX_MUTE, @@ -855,8 +863,10 @@ static int wcd937x_codec_enable_aux_pa(struct snd_soc_dapm_widget *w, wcd937x->update_wcd_event(wcd937x->handle, WCD_BOLERO_EVT_RX_MUTE, (WCD_RX3 << 0x10)); + wcd_enable_irq(&wcd937x->irq_info, WCD937X_IRQ_AUX_PDM_WD_INT); break; case SND_SOC_DAPM_PRE_PMD: + wcd_disable_irq(&wcd937x->irq_info, WCD937X_IRQ_AUX_PDM_WD_INT); if (wcd937x->update_wcd_event) wcd937x->update_wcd_event(wcd937x->handle, WCD_BOLERO_EVT_RX_MUTE, @@ -923,8 +933,20 @@ static int wcd937x_codec_enable_ear_pa(struct snd_soc_dapm_widget *w, wcd937x->update_wcd_event(wcd937x->handle, WCD_BOLERO_EVT_RX_MUTE, (WCD_RX1 << 0x10)); + if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX) + wcd_enable_irq(&wcd937x->irq_info, + WCD937X_IRQ_AUX_PDM_WD_INT); + else + wcd_enable_irq(&wcd937x->irq_info, + WCD937X_IRQ_HPHL_PDM_WD_INT); break; case SND_SOC_DAPM_PRE_PMD: + if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX) + wcd_disable_irq(&wcd937x->irq_info, + WCD937X_IRQ_AUX_PDM_WD_INT); + else + wcd_disable_irq(&wcd937x->irq_info, + WCD937X_IRQ_HPHL_PDM_WD_INT); if (wcd937x->update_wcd_event) wcd937x->update_wcd_event(wcd937x->handle, WCD_BOLERO_EVT_RX_MUTE, @@ -2849,10 +2871,10 @@ static int wcd937x_bind(struct device *dev) "HPHL PDM WD INT", wcd937x_wd_handle_irq, NULL); wcd_request_irq(&wcd937x->irq_info, WCD937X_IRQ_AUX_PDM_WD_INT, "AUX PDM WD INT", wcd937x_wd_handle_irq, NULL); - /* Enable watchdog interrupt for HPH and AUX */ - wcd_enable_irq(&wcd937x->irq_info, WCD937X_IRQ_HPHR_PDM_WD_INT); - wcd_enable_irq(&wcd937x->irq_info, WCD937X_IRQ_HPHL_PDM_WD_INT); - wcd_enable_irq(&wcd937x->irq_info, WCD937X_IRQ_AUX_PDM_WD_INT); + /* Disable watchdog interrupt for HPH and AUX */ + wcd_disable_irq(&wcd937x->irq_info, WCD937X_IRQ_HPHR_PDM_WD_INT); + wcd_disable_irq(&wcd937x->irq_info, WCD937X_IRQ_HPHL_PDM_WD_INT); + wcd_disable_irq(&wcd937x->irq_info, WCD937X_IRQ_AUX_PDM_WD_INT); ret = snd_soc_register_component(dev, &soc_codec_dev_wcd937x, NULL, 0); diff --git a/asoc/codecs/wcd938x/wcd938x.c b/asoc/codecs/wcd938x/wcd938x.c index f3a31cae8624..aa89ab896752 100644 --- a/asoc/codecs/wcd938x/wcd938x.c +++ b/asoc/codecs/wcd938x/wcd938x.c @@ -960,8 +960,20 @@ static int wcd938x_codec_enable_ear_pa(struct snd_soc_dapm_widget *w, wcd938x->update_wcd_event(wcd938x->handle, WCD_BOLERO_EVT_RX_MUTE, (WCD_RX1 << 0x10)); + if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) + wcd_enable_irq(&wcd938x->irq_info, + WCD938X_IRQ_AUX_PDM_WD_INT); + else + wcd_enable_irq(&wcd938x->irq_info, + WCD938X_IRQ_HPHL_PDM_WD_INT); break; case SND_SOC_DAPM_PRE_PMD: + if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) + wcd_disable_irq(&wcd938x->irq_info, + WCD938X_IRQ_AUX_PDM_WD_INT); + else + wcd_disable_irq(&wcd938x->irq_info, + WCD938X_IRQ_HPHL_PDM_WD_INT); if (wcd938x->update_wcd_event) wcd938x->update_wcd_event(wcd938x->handle, WCD_BOLERO_EVT_RX_MUTE,