Browse Source

Merge "asoc: mbhc: disable pa while measuring the adc values"

qctecmdr 2 years ago
parent
commit
6c35de32f9
3 changed files with 28 additions and 0 deletions
  1. 15 0
      asoc/codecs/wcd-mbhc-adc.c
  2. 10 0
      asoc/codecs/wcd938x/wcd938x-mbhc.c
  3. 3 0
      include/asoc/wcd-mbhc-v2.h

+ 15 - 0
asoc/codecs/wcd-mbhc-adc.c

@@ -1,5 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #include <linux/module.h>
 #include <linux/init.h>
@@ -127,9 +128,18 @@ static int wcd_measure_adc_once(struct wcd_mbhc *mbhc, int mux_ctl)
 	int ret = 0;
 	int output_mv = 0;
 	u8 adc_en = 0;
+	bool is_pa_on = false;
 
 	pr_debug("%s: enter\n", __func__);
 
+	if (mbhc->mbhc_cb->hph_pa_on_status) {
+		if (mbhc->mbhc_cb->hph_pa_on_status(mbhc->component)) {
+			mbhc->mbhc_cb->hph_pa_enable(mbhc->component, 0);
+			is_pa_on = true;
+			pr_debug("%s: pa is on before detection,so disable pa and read adc \n", __func__);
+		}
+	}
+
 	WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 0);
 	/* Read ADC Enable bit to restore after adc measurement */
 	WCD_MBHC_REG_READ(WCD_MBHC_ADC_EN, adc_en);
@@ -178,6 +188,11 @@ static int wcd_measure_adc_once(struct wcd_mbhc *mbhc, int mux_ctl)
 		ret = output_mv;
 	}
 
+	if (is_pa_on) {
+		mbhc->mbhc_cb->hph_pa_enable(mbhc->component, 1);
+		pr_debug("%s: restore pa \n", __func__);
+	}
+
 	pr_debug("%s: leave\n", __func__);
 
 	return ret;

+ 10 - 0
asoc/codecs/wcd938x/wcd938x-mbhc.c

@@ -804,6 +804,15 @@ static void wcd938x_mbhc_moisture_polling_ctrl(struct wcd_mbhc *mbhc,
 			0x04, (enable << 2));
 }
 
+static void wcd938x_mbhc_hph_pa_enable(struct snd_soc_component *component,
+						bool enable)
+{
+	if (enable)
+		snd_soc_component_update_bits(component, WCD938X_ANA_HPH, 0xC0, 0xC0);
+	else
+		snd_soc_component_update_bits(component, WCD938X_ANA_HPH,0xC0, 00);
+}
+
 static void wcd938x_mbhc_bcs_enable(struct wcd_mbhc *mbhc,
 						  bool bcs_enable)
 {
@@ -838,6 +847,7 @@ static const struct wcd_mbhc_cb mbhc_cb = {
 	.mbhc_moisture_polling_ctrl = wcd938x_mbhc_moisture_polling_ctrl,
 	.mbhc_moisture_detect_en = wcd938x_mbhc_moisture_detect_en,
 	.bcs_enable = wcd938x_mbhc_bcs_enable,
+	.hph_pa_enable = wcd938x_mbhc_hph_pa_enable,
 };
 
 static int wcd938x_get_hph_type(struct snd_kcontrol *kcontrol,

+ 3 - 0
include/asoc/wcd-mbhc-v2.h

@@ -1,5 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /* Copyright (c) 2014-2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #ifndef __WCD_MBHC_V2_H__
 #define __WCD_MBHC_V2_H__
@@ -528,6 +529,8 @@ struct wcd_mbhc_cb {
 	bool (*mbhc_get_moisture_status)(struct wcd_mbhc *mbhc);
 	void (*mbhc_moisture_polling_ctrl)(struct wcd_mbhc *mbhc, bool enable);
 	void (*mbhc_moisture_detect_en)(struct wcd_mbhc *mbhc, bool enable);
+	void (*hph_pa_enable)(struct snd_soc_component *component, bool enable);
+
 };
 
 struct wcd_mbhc_fn {