Merge "dsp: add support to set topology specific info in voice usecases"
diff --git a/asoc/codecs/sdm660_cdc/Makefile b/asoc/codecs/sdm660_cdc/Makefile
index d846fae..0ebf407 100644
--- a/asoc/codecs/sdm660_cdc/Makefile
+++ b/asoc/codecs/sdm660_cdc/Makefile
@@ -1,2 +1,4 @@
-snd-soc-sdm660-cdc-objs := msm-analog-cdc.o msm-digital-cdc.o sdm660-regmap.o
-obj-$(CONFIG_SND_SOC_SDM660_CDC) += snd-soc-sdm660-cdc.o sdm660-cdc-irq.o
+snd-soc-analog-cdc-objs := sdm660-cdc-irq.o msm-analog-cdc.o
+snd-soc-digital-cdc-objs := msm-digital-cdc.o msm-digital-cdc-regmap.o
+obj-$(CONFIG_SND_SOC_ANALOG_CDC) +=  snd-soc-analog-cdc.o
+obj-$(CONFIG_SND_SOC_DIGITAL_CDC) += snd-soc-digital-cdc.o
diff --git a/asoc/codecs/sdm660_cdc/msm-analog-cdc-regmap.h b/asoc/codecs/sdm660_cdc/msm-analog-cdc-regmap.h
new file mode 100644
index 0000000..55846a1
--- /dev/null
+++ b/asoc/codecs/sdm660_cdc/msm-analog-cdc-regmap.h
@@ -0,0 +1,186 @@
+/*
+ * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef ANALOG_CDC_REGMAP_H
+#define ANALOG_CDC_REGMAP_H
+
+#include <linux/regmap.h>
+#include "sdm660-cdc-registers.h"
+
+/*
+ * Default register reset values that are common across different versions
+ * are defined here. If a register reset value is changed based on version
+ * then remove it from this structure and add it in version specific
+ * structures.
+ */
+
+struct reg_default
+	msm89xx_pmic_cdc_defaults[MSM89XX_PMIC_CDC_CACHE_SIZE] = {
+	{MSM89XX_PMIC_DIGITAL_REVISION1, 0x00},
+	{MSM89XX_PMIC_DIGITAL_REVISION2, 0x00},
+	{MSM89XX_PMIC_DIGITAL_PERPH_TYPE, 0x23},
+	{MSM89XX_PMIC_DIGITAL_PERPH_SUBTYPE, 0x01},
+	{MSM89XX_PMIC_DIGITAL_INT_RT_STS, 0x00},
+	{MSM89XX_PMIC_DIGITAL_INT_SET_TYPE, 0xFF},
+	{MSM89XX_PMIC_DIGITAL_INT_POLARITY_HIGH, 0xFF},
+	{MSM89XX_PMIC_DIGITAL_INT_POLARITY_LOW, 0x00},
+	{MSM89XX_PMIC_DIGITAL_INT_LATCHED_CLR, 0x00},
+	{MSM89XX_PMIC_DIGITAL_INT_EN_SET, 0x00},
+	{MSM89XX_PMIC_DIGITAL_INT_EN_CLR, 0x00},
+	{MSM89XX_PMIC_DIGITAL_INT_LATCHED_STS, 0x00},
+	{MSM89XX_PMIC_DIGITAL_INT_PENDING_STS, 0x00},
+	{MSM89XX_PMIC_DIGITAL_INT_MID_SEL, 0x00},
+	{MSM89XX_PMIC_DIGITAL_INT_PRIORITY, 0x00},
+	{MSM89XX_PMIC_DIGITAL_GPIO_MODE, 0x00},
+	{MSM89XX_PMIC_DIGITAL_PIN_CTL_OE, 0x01},
+	{MSM89XX_PMIC_DIGITAL_PIN_CTL_DATA, 0x00},
+	{MSM89XX_PMIC_DIGITAL_PIN_STATUS, 0x00},
+	{MSM89XX_PMIC_DIGITAL_HDRIVE_CTL, 0x00},
+	{MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x00},
+	{MSM89XX_PMIC_DIGITAL_CDC_TOP_CLK_CTL, 0x00},
+	{MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x00},
+	{MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, 0x00},
+	{MSM89XX_PMIC_DIGITAL_CDC_CONN_TX1_CTL, 0x02},
+	{MSM89XX_PMIC_DIGITAL_CDC_CONN_TX2_CTL, 0x02},
+	{MSM89XX_PMIC_DIGITAL_CDC_CONN_HPHR_DAC_CTL, 0x00},
+	{MSM89XX_PMIC_DIGITAL_CDC_CONN_RX1_CTL, 0x00},
+	{MSM89XX_PMIC_DIGITAL_CDC_CONN_RX2_CTL, 0x00},
+	{MSM89XX_PMIC_DIGITAL_CDC_CONN_RX3_CTL, 0x00},
+	{MSM89XX_PMIC_DIGITAL_CDC_CONN_RX_LB_CTL, 0x00},
+	{MSM89XX_PMIC_DIGITAL_CDC_RX_CTL1, 0x7C},
+	{MSM89XX_PMIC_DIGITAL_CDC_RX_CTL2, 0x7C},
+	{MSM89XX_PMIC_DIGITAL_CDC_RX_CTL3, 0x7C},
+	{MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA0, 0x00},
+	{MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA1, 0x00},
+	{MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA2, 0x00},
+	{MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA3, 0x00},
+	{MSM89XX_PMIC_DIGITAL_DIG_DEBUG_CTL, 0x00},
+	{MSM89XX_PMIC_DIGITAL_DIG_DEBUG_EN, 0x00},
+	{MSM89XX_PMIC_DIGITAL_SPARE_0, 0x00},
+	{MSM89XX_PMIC_DIGITAL_SPARE_1, 0x00},
+	{MSM89XX_PMIC_DIGITAL_SPARE_2, 0x00},
+	{MSM89XX_PMIC_DIGITAL_SEC_ACCESS, 0x00},
+	{MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL1, 0x00},
+	{MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL2, 0x02},
+	{MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3, 0x05},
+	{MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL4, 0x00},
+	{MSM89XX_PMIC_DIGITAL_INT_TEST1, 0x00},
+	{MSM89XX_PMIC_DIGITAL_INT_TEST_VAL, 0x00},
+	{MSM89XX_PMIC_DIGITAL_TRIM_NUM, 0x00},
+	{MSM89XX_PMIC_DIGITAL_TRIM_CTRL, 0x00},
+	{MSM89XX_PMIC_ANALOG_REVISION1, 0x00},
+	{MSM89XX_PMIC_ANALOG_REVISION2, 0x00},
+	{MSM89XX_PMIC_ANALOG_REVISION3, 0x00},
+	{MSM89XX_PMIC_ANALOG_REVISION4, 0x00},
+	{MSM89XX_PMIC_ANALOG_PERPH_TYPE, 0x23},
+	{MSM89XX_PMIC_ANALOG_PERPH_SUBTYPE, 0x09},
+	{MSM89XX_PMIC_ANALOG_INT_RT_STS, 0x00},
+	{MSM89XX_PMIC_ANALOG_INT_SET_TYPE, 0x3F},
+	{MSM89XX_PMIC_ANALOG_INT_POLARITY_HIGH, 0x3F},
+	{MSM89XX_PMIC_ANALOG_INT_POLARITY_LOW, 0x00},
+	{MSM89XX_PMIC_ANALOG_INT_LATCHED_CLR, 0x00},
+	{MSM89XX_PMIC_ANALOG_INT_EN_SET, 0x00},
+	{MSM89XX_PMIC_ANALOG_INT_EN_CLR, 0x00},
+	{MSM89XX_PMIC_ANALOG_INT_LATCHED_STS, 0x00},
+	{MSM89XX_PMIC_ANALOG_INT_PENDING_STS, 0x00},
+	{MSM89XX_PMIC_ANALOG_INT_MID_SEL, 0x00},
+	{MSM89XX_PMIC_ANALOG_INT_PRIORITY, 0x00},
+	{MSM89XX_PMIC_ANALOG_MICB_1_EN, 0x00},
+	{MSM89XX_PMIC_ANALOG_MICB_1_VAL, 0x20},
+	{MSM89XX_PMIC_ANALOG_MICB_1_CTL, 0x00},
+	{MSM89XX_PMIC_ANALOG_MICB_1_INT_RBIAS, 0x49},
+	{MSM89XX_PMIC_ANALOG_MICB_2_EN, 0x20},
+	{MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL_2, 0x00},
+	{MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL, 0x00},
+	{MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_1, 0x35},
+	{MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x08},
+	{MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, 0x00},
+	{MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER, 0x98},
+	{MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL, 0x00},
+	{MSM89XX_PMIC_ANALOG_MBHC_BTN1_ZDETM_CTL, 0x20},
+	{MSM89XX_PMIC_ANALOG_MBHC_BTN2_ZDETH_CTL, 0x40},
+	{MSM89XX_PMIC_ANALOG_MBHC_BTN3_CTL, 0x61},
+	{MSM89XX_PMIC_ANALOG_MBHC_BTN4_CTL, 0x80},
+	{MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT, 0x00},
+	{MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT, 0x00},
+	{MSM89XX_PMIC_ANALOG_TX_1_EN, 0x03},
+	{MSM89XX_PMIC_ANALOG_TX_2_EN, 0x03},
+	{MSM89XX_PMIC_ANALOG_TX_1_2_TEST_CTL_1, 0xBF},
+	{MSM89XX_PMIC_ANALOG_TX_1_2_TEST_CTL_2, 0x8C},
+	{MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL, 0x00},
+	{MSM89XX_PMIC_ANALOG_TX_1_2_OPAMP_BIAS, 0x6B},
+	{MSM89XX_PMIC_ANALOG_TX_1_2_TXFE_CLKDIV, 0x51},
+	{MSM89XX_PMIC_ANALOG_TX_3_EN, 0x02},
+	{MSM89XX_PMIC_ANALOG_NCP_EN, 0x26},
+	{MSM89XX_PMIC_ANALOG_NCP_CLK, 0x23},
+	{MSM89XX_PMIC_ANALOG_NCP_DEGLITCH, 0x5B},
+	{MSM89XX_PMIC_ANALOG_NCP_FBCTRL, 0x08},
+	{MSM89XX_PMIC_ANALOG_NCP_BIAS, 0x29},
+	{MSM89XX_PMIC_ANALOG_NCP_VCTRL, 0x24},
+	{MSM89XX_PMIC_ANALOG_NCP_TEST, 0x00},
+	{MSM89XX_PMIC_ANALOG_NCP_CLIM_ADDR, 0xD5},
+	{MSM89XX_PMIC_ANALOG_RX_CLOCK_DIVIDER, 0xE8},
+	{MSM89XX_PMIC_ANALOG_RX_COM_OCP_CTL, 0xCF},
+	{MSM89XX_PMIC_ANALOG_RX_COM_OCP_COUNT, 0x6E},
+	{MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC, 0x18},
+	{MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_PA, 0x5A},
+	{MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_LDO_OCP, 0x69},
+	{MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_CNP, 0x29},
+	{MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN, 0x80},
+	{MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_CTL, 0xDA},
+	{MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_TIME, 0x16},
+	{MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST, 0x00},
+	{MSM89XX_PMIC_ANALOG_RX_HPH_L_PA_DAC_CTL, 0x20},
+	{MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST, 0x00},
+	{MSM89XX_PMIC_ANALOG_RX_HPH_R_PA_DAC_CTL, 0x20},
+	{MSM89XX_PMIC_ANALOG_RX_EAR_CTL, 0x12},
+	{MSM89XX_PMIC_ANALOG_RX_ATEST, 0x00},
+	{MSM89XX_PMIC_ANALOG_RX_HPH_STATUS, 0x0C},
+	{MSM89XX_PMIC_ANALOG_RX_EAR_STATUS, 0x00},
+	{MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x00},
+	{MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x00},
+	{MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x83},
+	{MSM89XX_PMIC_ANALOG_SPKR_DRV_CLIP_DET, 0x91},
+	{MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, 0x29},
+	{MSM89XX_PMIC_ANALOG_SPKR_ANA_BIAS_SET, 0x4D},
+	{MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL, 0xE1},
+	{MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL, 0x1E},
+	{MSM89XX_PMIC_ANALOG_SPKR_DRV_MISC, 0xCB},
+	{MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG, 0x00},
+	{MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0x02},
+	{MSM89XX_PMIC_ANALOG_OUTPUT_VOLTAGE, 0x14},
+	{MSM89XX_PMIC_ANALOG_BYPASS_MODE, 0x00},
+	{MSM89XX_PMIC_ANALOG_BOOST_EN_CTL, 0x1F},
+	{MSM89XX_PMIC_ANALOG_SLOPE_COMP_IP_ZERO, 0x8C},
+	{MSM89XX_PMIC_ANALOG_RDSON_MAX_DUTY_CYCLE, 0xC0},
+	{MSM89XX_PMIC_ANALOG_BOOST_TEST1_1, 0x00},
+	{MSM89XX_PMIC_ANALOG_BOOST_TEST_2, 0x00},
+	{MSM89XX_PMIC_ANALOG_SPKR_SAR_STATUS, 0x00},
+	{MSM89XX_PMIC_ANALOG_SPKR_DRV_STATUS, 0x00},
+	{MSM89XX_PMIC_ANALOG_PBUS_ADD_CSR, 0x00},
+	{MSM89XX_PMIC_ANALOG_PBUS_ADD_SEL, 0x00},
+	{MSM89XX_PMIC_ANALOG_SEC_ACCESS, 0x00},
+	{MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL1, 0x00},
+	{MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL2, 0x01},
+	{MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3, 0x05},
+	{MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL4, 0x00},
+	{MSM89XX_PMIC_ANALOG_INT_TEST1, 0x00},
+	{MSM89XX_PMIC_ANALOG_INT_TEST_VAL, 0x00},
+	{MSM89XX_PMIC_ANALOG_TRIM_NUM, 0x04},
+	{MSM89XX_PMIC_ANALOG_TRIM_CTRL1, 0x00},
+	{MSM89XX_PMIC_ANALOG_TRIM_CTRL2, 0x00},
+	{MSM89XX_PMIC_ANALOG_TRIM_CTRL3, 0x00},
+	{MSM89XX_PMIC_ANALOG_TRIM_CTRL4, 0x00},
+};
+
+#endif
diff --git a/asoc/codecs/sdm660_cdc/msm-analog-cdc.c b/asoc/codecs/sdm660_cdc/msm-analog-cdc.c
index ddef508..623303c 100644
--- a/asoc/codecs/sdm660_cdc/msm-analog-cdc.c
+++ b/asoc/codecs/sdm660_cdc/msm-analog-cdc.c
@@ -30,7 +30,7 @@
 #include "msm-analog-cdc.h"
 #include "msm-cdc-common.h"
 #include "sdm660-cdc-irq.h"
-#include "sdm660-cdc-registers.h"
+#include "msm-analog-cdc-regmap.h"
 #include "../../sdm660-common.h"
 #include "../wcd-mbhc-v2-api.h"
 
@@ -351,6 +351,7 @@
 	dev_dbg(codec->dev, "%s: Enter\n", __func__);
 	sdm660_cdc->codec_spk_ext_pa_cb = codec_spk_ext_pa;
 }
+EXPORT_SYMBOL(msm_anlg_cdc_spk_ext_pa_cb);
 
 static void msm_anlg_cdc_compute_impedance(struct snd_soc_codec *codec, s16 l,
 					   s16 r, uint32_t *zl, uint32_t *zr,
@@ -3172,6 +3173,7 @@
 	}
 	return 0;
 }
+EXPORT_SYMBOL(msm_anlg_cdc_mclk_enable);
 
 static int msm_anlg_cdc_set_dai_sysclk(struct snd_soc_dai *dai,
 		int clk_id, unsigned int freq, int dir)
diff --git a/asoc/codecs/sdm660_cdc/sdm660-regmap.c b/asoc/codecs/sdm660_cdc/msm-digital-cdc-regmap.c
similarity index 72%
rename from asoc/codecs/sdm660_cdc/sdm660-regmap.c
rename to asoc/codecs/sdm660_cdc/msm-digital-cdc-regmap.c
index 7d8ac6d..a626791 100644
--- a/asoc/codecs/sdm660_cdc/sdm660-regmap.c
+++ b/asoc/codecs/sdm660_cdc/msm-digital-cdc-regmap.c
@@ -154,165 +154,6 @@
 	{MSM89XX_CDC_CORE_TX4_DMIC_CTL, 0x00},
 };
 
-struct reg_default
-	msm89xx_pmic_cdc_defaults[MSM89XX_PMIC_CDC_CACHE_SIZE] = {
-	{MSM89XX_PMIC_DIGITAL_REVISION1, 0x00},
-	{MSM89XX_PMIC_DIGITAL_REVISION2, 0x00},
-	{MSM89XX_PMIC_DIGITAL_PERPH_TYPE, 0x23},
-	{MSM89XX_PMIC_DIGITAL_PERPH_SUBTYPE, 0x01},
-	{MSM89XX_PMIC_DIGITAL_INT_RT_STS, 0x00},
-	{MSM89XX_PMIC_DIGITAL_INT_SET_TYPE, 0xFF},
-	{MSM89XX_PMIC_DIGITAL_INT_POLARITY_HIGH, 0xFF},
-	{MSM89XX_PMIC_DIGITAL_INT_POLARITY_LOW, 0x00},
-	{MSM89XX_PMIC_DIGITAL_INT_LATCHED_CLR, 0x00},
-	{MSM89XX_PMIC_DIGITAL_INT_EN_SET, 0x00},
-	{MSM89XX_PMIC_DIGITAL_INT_EN_CLR, 0x00},
-	{MSM89XX_PMIC_DIGITAL_INT_LATCHED_STS, 0x00},
-	{MSM89XX_PMIC_DIGITAL_INT_PENDING_STS, 0x00},
-	{MSM89XX_PMIC_DIGITAL_INT_MID_SEL, 0x00},
-	{MSM89XX_PMIC_DIGITAL_INT_PRIORITY, 0x00},
-	{MSM89XX_PMIC_DIGITAL_GPIO_MODE, 0x00},
-	{MSM89XX_PMIC_DIGITAL_PIN_CTL_OE, 0x01},
-	{MSM89XX_PMIC_DIGITAL_PIN_CTL_DATA, 0x00},
-	{MSM89XX_PMIC_DIGITAL_PIN_STATUS, 0x00},
-	{MSM89XX_PMIC_DIGITAL_HDRIVE_CTL, 0x00},
-	{MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x00},
-	{MSM89XX_PMIC_DIGITAL_CDC_TOP_CLK_CTL, 0x00},
-	{MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x00},
-	{MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, 0x00},
-	{MSM89XX_PMIC_DIGITAL_CDC_CONN_TX1_CTL, 0x02},
-	{MSM89XX_PMIC_DIGITAL_CDC_CONN_TX2_CTL, 0x02},
-	{MSM89XX_PMIC_DIGITAL_CDC_CONN_HPHR_DAC_CTL, 0x00},
-	{MSM89XX_PMIC_DIGITAL_CDC_CONN_RX1_CTL, 0x00},
-	{MSM89XX_PMIC_DIGITAL_CDC_CONN_RX2_CTL, 0x00},
-	{MSM89XX_PMIC_DIGITAL_CDC_CONN_RX3_CTL, 0x00},
-	{MSM89XX_PMIC_DIGITAL_CDC_CONN_RX_LB_CTL, 0x00},
-	{MSM89XX_PMIC_DIGITAL_CDC_RX_CTL1, 0x7C},
-	{MSM89XX_PMIC_DIGITAL_CDC_RX_CTL2, 0x7C},
-	{MSM89XX_PMIC_DIGITAL_CDC_RX_CTL3, 0x7C},
-	{MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA0, 0x00},
-	{MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA1, 0x00},
-	{MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA2, 0x00},
-	{MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA3, 0x00},
-	{MSM89XX_PMIC_DIGITAL_DIG_DEBUG_CTL, 0x00},
-	{MSM89XX_PMIC_DIGITAL_DIG_DEBUG_EN, 0x00},
-	{MSM89XX_PMIC_DIGITAL_SPARE_0, 0x00},
-	{MSM89XX_PMIC_DIGITAL_SPARE_1, 0x00},
-	{MSM89XX_PMIC_DIGITAL_SPARE_2, 0x00},
-	{MSM89XX_PMIC_DIGITAL_SEC_ACCESS, 0x00},
-	{MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL1, 0x00},
-	{MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL2, 0x02},
-	{MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3, 0x05},
-	{MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL4, 0x00},
-	{MSM89XX_PMIC_DIGITAL_INT_TEST1, 0x00},
-	{MSM89XX_PMIC_DIGITAL_INT_TEST_VAL, 0x00},
-	{MSM89XX_PMIC_DIGITAL_TRIM_NUM, 0x00},
-	{MSM89XX_PMIC_DIGITAL_TRIM_CTRL, 0x00},
-	{MSM89XX_PMIC_ANALOG_REVISION1, 0x00},
-	{MSM89XX_PMIC_ANALOG_REVISION2, 0x00},
-	{MSM89XX_PMIC_ANALOG_REVISION3, 0x00},
-	{MSM89XX_PMIC_ANALOG_REVISION4, 0x00},
-	{MSM89XX_PMIC_ANALOG_PERPH_TYPE, 0x23},
-	{MSM89XX_PMIC_ANALOG_PERPH_SUBTYPE, 0x09},
-	{MSM89XX_PMIC_ANALOG_INT_RT_STS, 0x00},
-	{MSM89XX_PMIC_ANALOG_INT_SET_TYPE, 0x3F},
-	{MSM89XX_PMIC_ANALOG_INT_POLARITY_HIGH, 0x3F},
-	{MSM89XX_PMIC_ANALOG_INT_POLARITY_LOW, 0x00},
-	{MSM89XX_PMIC_ANALOG_INT_LATCHED_CLR, 0x00},
-	{MSM89XX_PMIC_ANALOG_INT_EN_SET, 0x00},
-	{MSM89XX_PMIC_ANALOG_INT_EN_CLR, 0x00},
-	{MSM89XX_PMIC_ANALOG_INT_LATCHED_STS, 0x00},
-	{MSM89XX_PMIC_ANALOG_INT_PENDING_STS, 0x00},
-	{MSM89XX_PMIC_ANALOG_INT_MID_SEL, 0x00},
-	{MSM89XX_PMIC_ANALOG_INT_PRIORITY, 0x00},
-	{MSM89XX_PMIC_ANALOG_MICB_1_EN, 0x00},
-	{MSM89XX_PMIC_ANALOG_MICB_1_VAL, 0x20},
-	{MSM89XX_PMIC_ANALOG_MICB_1_CTL, 0x00},
-	{MSM89XX_PMIC_ANALOG_MICB_1_INT_RBIAS, 0x49},
-	{MSM89XX_PMIC_ANALOG_MICB_2_EN, 0x20},
-	{MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL_2, 0x00},
-	{MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL, 0x00},
-	{MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_1, 0x35},
-	{MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x08},
-	{MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, 0x00},
-	{MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER, 0x98},
-	{MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL, 0x00},
-	{MSM89XX_PMIC_ANALOG_MBHC_BTN1_ZDETM_CTL, 0x20},
-	{MSM89XX_PMIC_ANALOG_MBHC_BTN2_ZDETH_CTL, 0x40},
-	{MSM89XX_PMIC_ANALOG_MBHC_BTN3_CTL, 0x61},
-	{MSM89XX_PMIC_ANALOG_MBHC_BTN4_CTL, 0x80},
-	{MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT, 0x00},
-	{MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT, 0x00},
-	{MSM89XX_PMIC_ANALOG_TX_1_EN, 0x03},
-	{MSM89XX_PMIC_ANALOG_TX_2_EN, 0x03},
-	{MSM89XX_PMIC_ANALOG_TX_1_2_TEST_CTL_1, 0xBF},
-	{MSM89XX_PMIC_ANALOG_TX_1_2_TEST_CTL_2, 0x8C},
-	{MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL, 0x00},
-	{MSM89XX_PMIC_ANALOG_TX_1_2_OPAMP_BIAS, 0x6B},
-	{MSM89XX_PMIC_ANALOG_TX_1_2_TXFE_CLKDIV, 0x51},
-	{MSM89XX_PMIC_ANALOG_TX_3_EN, 0x02},
-	{MSM89XX_PMIC_ANALOG_NCP_EN, 0x26},
-	{MSM89XX_PMIC_ANALOG_NCP_CLK, 0x23},
-	{MSM89XX_PMIC_ANALOG_NCP_DEGLITCH, 0x5B},
-	{MSM89XX_PMIC_ANALOG_NCP_FBCTRL, 0x08},
-	{MSM89XX_PMIC_ANALOG_NCP_BIAS, 0x29},
-	{MSM89XX_PMIC_ANALOG_NCP_VCTRL, 0x24},
-	{MSM89XX_PMIC_ANALOG_NCP_TEST, 0x00},
-	{MSM89XX_PMIC_ANALOG_NCP_CLIM_ADDR, 0xD5},
-	{MSM89XX_PMIC_ANALOG_RX_CLOCK_DIVIDER, 0xE8},
-	{MSM89XX_PMIC_ANALOG_RX_COM_OCP_CTL, 0xCF},
-	{MSM89XX_PMIC_ANALOG_RX_COM_OCP_COUNT, 0x6E},
-	{MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC, 0x18},
-	{MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_PA, 0x5A},
-	{MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_LDO_OCP, 0x69},
-	{MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_CNP, 0x29},
-	{MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN, 0x80},
-	{MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_CTL, 0xDA},
-	{MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_TIME, 0x16},
-	{MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST, 0x00},
-	{MSM89XX_PMIC_ANALOG_RX_HPH_L_PA_DAC_CTL, 0x20},
-	{MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST, 0x00},
-	{MSM89XX_PMIC_ANALOG_RX_HPH_R_PA_DAC_CTL, 0x20},
-	{MSM89XX_PMIC_ANALOG_RX_EAR_CTL, 0x12},
-	{MSM89XX_PMIC_ANALOG_RX_ATEST, 0x00},
-	{MSM89XX_PMIC_ANALOG_RX_HPH_STATUS, 0x0C},
-	{MSM89XX_PMIC_ANALOG_RX_EAR_STATUS, 0x00},
-	{MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x00},
-	{MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x00},
-	{MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x83},
-	{MSM89XX_PMIC_ANALOG_SPKR_DRV_CLIP_DET, 0x91},
-	{MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, 0x29},
-	{MSM89XX_PMIC_ANALOG_SPKR_ANA_BIAS_SET, 0x4D},
-	{MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL, 0xE1},
-	{MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL, 0x1E},
-	{MSM89XX_PMIC_ANALOG_SPKR_DRV_MISC, 0xCB},
-	{MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG, 0x00},
-	{MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0x02},
-	{MSM89XX_PMIC_ANALOG_OUTPUT_VOLTAGE, 0x14},
-	{MSM89XX_PMIC_ANALOG_BYPASS_MODE, 0x00},
-	{MSM89XX_PMIC_ANALOG_BOOST_EN_CTL, 0x1F},
-	{MSM89XX_PMIC_ANALOG_SLOPE_COMP_IP_ZERO, 0x8C},
-	{MSM89XX_PMIC_ANALOG_RDSON_MAX_DUTY_CYCLE, 0xC0},
-	{MSM89XX_PMIC_ANALOG_BOOST_TEST1_1, 0x00},
-	{MSM89XX_PMIC_ANALOG_BOOST_TEST_2, 0x00},
-	{MSM89XX_PMIC_ANALOG_SPKR_SAR_STATUS, 0x00},
-	{MSM89XX_PMIC_ANALOG_SPKR_DRV_STATUS, 0x00},
-	{MSM89XX_PMIC_ANALOG_PBUS_ADD_CSR, 0x00},
-	{MSM89XX_PMIC_ANALOG_PBUS_ADD_SEL, 0x00},
-	{MSM89XX_PMIC_ANALOG_SEC_ACCESS, 0x00},
-	{MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL1, 0x00},
-	{MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL2, 0x01},
-	{MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3, 0x05},
-	{MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL4, 0x00},
-	{MSM89XX_PMIC_ANALOG_INT_TEST1, 0x00},
-	{MSM89XX_PMIC_ANALOG_INT_TEST_VAL, 0x00},
-	{MSM89XX_PMIC_ANALOG_TRIM_NUM, 0x04},
-	{MSM89XX_PMIC_ANALOG_TRIM_CTRL1, 0x00},
-	{MSM89XX_PMIC_ANALOG_TRIM_CTRL2, 0x00},
-	{MSM89XX_PMIC_ANALOG_TRIM_CTRL3, 0x00},
-	{MSM89XX_PMIC_ANALOG_TRIM_CTRL4, 0x00},
-};
-
 static const u8 msm89xx_cdc_core_reg_readable[MSM89XX_CDC_CORE_CACHE_SIZE] = {
 		[MSM89XX_CDC_CORE_CLK_RX_RESET_CTL] = 1,
 		[MSM89XX_CDC_CORE_CLK_TX_RESET_B1_CTL] = 1,
diff --git a/asoc/codecs/wcd-mbhc-adc.c b/asoc/codecs/wcd-mbhc-adc.c
index e44eec9..bcb616e 100644
--- a/asoc/codecs/wcd-mbhc-adc.c
+++ b/asoc/codecs/wcd-mbhc-adc.c
@@ -370,11 +370,18 @@
 	 * btn press/relesae for HEADSET type during correct work.
 	 */
 	output_mv = wcd_measure_adc_once(mbhc, MUX_CTL_IN2P);
-	adc_threshold = ((WCD_MBHC_ADC_HS_THRESHOLD_MV *
+	if (mbhc->hs_thr)
+		adc_threshold = mbhc->hs_thr;
+	else
+		adc_threshold = ((WCD_MBHC_ADC_HS_THRESHOLD_MV *
 			  wcd_mbhc_get_micbias(mbhc))/WCD_MBHC_ADC_MICBIAS_MV);
-	adc_hph_threshold = ((WCD_MBHC_ADC_HPH_THRESHOLD_MV *
-			      wcd_mbhc_get_micbias(mbhc))/
-			      WCD_MBHC_ADC_MICBIAS_MV);
+
+	if (mbhc->hph_thr)
+		adc_hph_threshold = mbhc->hph_thr;
+	else
+		adc_hph_threshold = ((WCD_MBHC_ADC_HPH_THRESHOLD_MV *
+				wcd_mbhc_get_micbias(mbhc))/
+				WCD_MBHC_ADC_MICBIAS_MV);
 
 	if (output_mv > adc_threshold || output_mv < adc_hph_threshold) {
 		spl_hs = false;
@@ -426,8 +433,10 @@
 			return false;
 		}
 	}
-
-	adc_threshold = ((WCD_MBHC_ADC_HS_THRESHOLD_MV *
+	if (mbhc->hs_thr)
+		adc_threshold = mbhc->hs_thr;
+	else
+		adc_threshold = ((WCD_MBHC_ADC_HS_THRESHOLD_MV *
 			  wcd_mbhc_get_micbias(mbhc)) /
 			  WCD_MBHC_ADC_MICBIAS_MV);
 
@@ -556,14 +565,25 @@
 	}
 }
 
-static int wcd_mbhc_get_plug_from_adc(int adc_result)
+static int wcd_mbhc_get_plug_from_adc(struct wcd_mbhc *mbhc, int adc_result)
 
 {
 	enum wcd_mbhc_plug_type plug_type = MBHC_PLUG_TYPE_INVALID;
+	u32 hph_thr = 0, hs_thr = 0;
 
-	if (adc_result < WCD_MBHC_ADC_HPH_THRESHOLD_MV)
+	if (mbhc->hs_thr)
+		hs_thr = mbhc->hs_thr;
+	else
+		hs_thr = WCD_MBHC_ADC_HS_THRESHOLD_MV;
+
+	if (mbhc->hph_thr)
+		hph_thr = mbhc->hph_thr;
+	else
+		hph_thr = WCD_MBHC_ADC_HPH_THRESHOLD_MV;
+
+	if (adc_result < hph_thr)
 		plug_type = MBHC_PLUG_TYPE_HEADPHONE;
-	else if (adc_result > WCD_MBHC_ADC_HS_THRESHOLD_MV)
+	else if (adc_result > hs_thr)
 		plug_type = MBHC_PLUG_TYPE_HIGH_HPH;
 	else
 		plug_type = MBHC_PLUG_TYPE_HEADSET;
@@ -612,7 +632,7 @@
 	}
 	/* Find plug type */
 	output_mv = wcd_measure_adc_continuous(mbhc);
-	plug_type = wcd_mbhc_get_plug_from_adc(output_mv);
+	plug_type = wcd_mbhc_get_plug_from_adc(mbhc, output_mv);
 
 	/*
 	 * Report plug type if it is either headset or headphone
@@ -667,7 +687,7 @@
 		 * instead of hogging system by contineous polling, wait for
 		 * sometime and re-check stop request again.
 		 */
-		plug_type = wcd_mbhc_get_plug_from_adc(output_mv);
+		plug_type = wcd_mbhc_get_plug_from_adc(mbhc, output_mv);
 
 		if ((output_mv > WCD_MBHC_ADC_HS_THRESHOLD_MV) &&
 		    (spl_hs_count < WCD_MBHC_SPL_HS_CNT)) {
@@ -713,7 +733,7 @@
 				no_gnd_mic_swap_cnt++;
 				pt_gnd_mic_swap_cnt = 0;
 				plug_type = wcd_mbhc_get_plug_from_adc(
-						output_mv);
+						mbhc, output_mv);
 				if ((no_gnd_mic_swap_cnt <
 				    GND_MIC_SWAP_THRESHOLD) &&
 				    (spl_hs_count != WCD_MBHC_SPL_HS_CNT)) {
@@ -747,7 +767,7 @@
 				 plug_type);
 			if (plug_type != MBHC_PLUG_TYPE_GND_MIC_SWAP) {
 				plug_type = wcd_mbhc_get_plug_from_adc(
-						output_mv);
+						mbhc, output_mv);
 				if (!spl_hs_reported &&
 				    spl_hs_count == WCD_MBHC_SPL_HS_CNT) {
 					spl_hs_reported = true;
@@ -895,6 +915,8 @@
 	struct wcd_mbhc *mbhc = data;
 	unsigned long timeout;
 	int adc_threshold, output_mv, retry = 0;
+	bool hphpa_on = false;
+	u8  moisture_status = 0;
 
 	pr_debug("%s: enter\n", __func__);
 	WCD_MBHC_RSC_LOCK(mbhc);
@@ -928,17 +950,59 @@
 		goto exit;
 	}
 
-	/*
-	 * ADC COMPLETE and ELEC_REM interrupts are both enabled for HEADPHONE,
-	 * need to reject the ADC COMPLETE interrupt which follows ELEC_REM one
-	 * when HEADPHONE is removed.
-	 */
-	if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE)
-		mbhc->extn_cable_hph_rem = true;
-	WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 0);
-	WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 0);
-	WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0);
-	wcd_mbhc_elec_hs_report_unplug(mbhc);
+	if (mbhc->mbhc_cfg->moisture_en) {
+		if (mbhc->mbhc_cb->hph_pa_on_status)
+			if (mbhc->mbhc_cb->hph_pa_on_status(mbhc->codec)) {
+				hphpa_on = true;
+				WCD_MBHC_REG_UPDATE_BITS(
+					WCD_MBHC_HPHL_PA_EN, 0);
+				WCD_MBHC_REG_UPDATE_BITS(
+					WCD_MBHC_HPH_PA_EN, 0);
+			}
+		WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHR_GND, 1);
+		WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_GND, 1);
+		/* wait for 50ms to get moisture status */
+		usleep_range(50000, 50100);
+
+		WCD_MBHC_REG_READ(WCD_MBHC_MOISTURE_STATUS, moisture_status);
+	}
+
+	if (mbhc->mbhc_cfg->moisture_en && !moisture_status) {
+		pr_debug("%s: moisture present in jack\n", __func__);
+		WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0);
+		WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MECH_DETECTION_TYPE, 1);
+		WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1);
+		WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0);
+		WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0);
+		mbhc->btn_press_intr = false;
+		mbhc->is_btn_press = false;
+		if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET)
+			wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADSET);
+		else if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE)
+			wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADPHONE);
+		else if (mbhc->current_plug == MBHC_PLUG_TYPE_GND_MIC_SWAP)
+			wcd_mbhc_report_plug(mbhc, 0, SND_JACK_UNSUPPORTED);
+		else if (mbhc->current_plug == MBHC_PLUG_TYPE_HIGH_HPH)
+			wcd_mbhc_report_plug(mbhc, 0, SND_JACK_LINEOUT);
+	} else {
+		/*
+		 * ADC COMPLETE and ELEC_REM interrupts are both enabled for
+		 * HEADPHONE, need to reject the ADC COMPLETE interrupt which
+		 * follows ELEC_REM one when HEADPHONE is removed.
+		 */
+		if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE)
+			mbhc->extn_cable_hph_rem = true;
+		WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 0);
+		WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 0);
+		WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0);
+		wcd_mbhc_elec_hs_report_unplug(mbhc);
+
+		if (hphpa_on) {
+			hphpa_on = false;
+			WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_PA_EN, 1);
+			WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPH_PA_EN, 1);
+		}
+	}
 exit:
 	WCD_MBHC_RSC_UNLOCK(mbhc);
 	pr_debug("%s: leave\n", __func__);
diff --git a/asoc/codecs/wcd-mbhc-legacy.c b/asoc/codecs/wcd-mbhc-legacy.c
index 745e2e8..a72f64b 100644
--- a/asoc/codecs/wcd-mbhc-legacy.c
+++ b/asoc/codecs/wcd-mbhc-legacy.c
@@ -794,6 +794,8 @@
 	unsigned long timeout;
 	bool removed = true;
 	int retry = 0;
+	bool hphpa_on = false;
+	u8 moisture_status = 0;
 
 	pr_debug("%s: enter\n", __func__);
 
@@ -830,29 +832,78 @@
 	WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_result);
 
 	if (removed) {
-		if (!(hphl_sch && mic_sch && hs_comp_result)) {
-			/*
-			 * extension cable is still plugged in
-			 * report it as LINEOUT device
-			 */
-			goto report_unplug;
+		if (mbhc->mbhc_cfg->moisture_en) {
+			if (mbhc->mbhc_cb->hph_pa_on_status)
+				if (
+				mbhc->mbhc_cb->hph_pa_on_status(mbhc->codec)) {
+					hphpa_on = true;
+					WCD_MBHC_REG_UPDATE_BITS(
+						WCD_MBHC_HPHL_PA_EN, 0);
+					WCD_MBHC_REG_UPDATE_BITS(
+						WCD_MBHC_HPH_PA_EN, 0);
+				}
+
+			WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHR_GND, 1);
+			WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_GND, 1);
+			/* wait for 50ms to get moisture status */
+			usleep_range(50000, 50100);
+
+			WCD_MBHC_REG_READ(
+				WCD_MBHC_MOISTURE_STATUS, moisture_status);
+		}
+
+		if (mbhc->mbhc_cfg->moisture_en && !moisture_status) {
+			pr_debug("%s: moisture present in jack\n", __func__);
+			WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0);
+			WCD_MBHC_REG_UPDATE_BITS(
+				WCD_MBHC_MECH_DETECTION_TYPE, 1);
+			WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1);
+			WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0);
+			WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0);
+			mbhc->btn_press_intr = false;
+			mbhc->is_btn_press = false;
+			if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET)
+				wcd_mbhc_report_plug(
+					mbhc, 0, SND_JACK_HEADSET);
+			else if (mbhc->current_plug ==
+					MBHC_PLUG_TYPE_HEADPHONE)
+				wcd_mbhc_report_plug(
+					mbhc, 0, SND_JACK_HEADPHONE);
+			else if (mbhc->current_plug ==
+					MBHC_PLUG_TYPE_GND_MIC_SWAP)
+				wcd_mbhc_report_plug(
+					mbhc, 0, SND_JACK_UNSUPPORTED);
+			else if (mbhc->current_plug ==
+					MBHC_PLUG_TYPE_HIGH_HPH)
+				wcd_mbhc_report_plug(
+					mbhc, 0, SND_JACK_LINEOUT);
 		} else {
-			if (!mic_sch) {
-				mic_trigerred++;
-				pr_debug("%s: Removal MIC trigerred %d\n",
-					 __func__, mic_trigerred);
-			}
-			if (!hphl_sch) {
-				hphl_trigerred++;
-				pr_debug("%s: Removal HPHL trigerred %d\n",
-					 __func__, hphl_trigerred);
-			}
-			if (mic_trigerred && hphl_trigerred) {
+			if (!(hphl_sch && mic_sch && hs_comp_result)) {
 				/*
 				 * extension cable is still plugged in
 				 * report it as LINEOUT device
 				 */
 				goto report_unplug;
+			} else {
+				if (!mic_sch) {
+					mic_trigerred++;
+					pr_debug(
+					"%s: Removal MIC trigerred %d\n",
+					__func__, mic_trigerred);
+				}
+				if (!hphl_sch) {
+					hphl_trigerred++;
+					pr_debug(
+					"%s: Removal HPHL trigerred %d\n",
+					 __func__, hphl_trigerred);
+				}
+				if (mic_trigerred && hphl_trigerred) {
+					/*
+					 * extension cable is still plugged in
+					 * report it as LINEOUT device
+					 */
+					goto report_unplug;
+				}
 			}
 		}
 	}
@@ -863,6 +914,11 @@
 
 report_unplug:
 	wcd_mbhc_elec_hs_report_unplug(mbhc);
+	if (hphpa_on) {
+		hphpa_on = false;
+		WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_PA_EN, 1);
+		WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPH_PA_EN, 1);
+	}
 	hphl_trigerred = 0;
 	mic_trigerred = 0;
 	WCD_MBHC_RSC_UNLOCK(mbhc);
diff --git a/asoc/codecs/wcd-mbhc-v2.c b/asoc/codecs/wcd-mbhc-v2.c
index 6b3dd86..d7c5921 100644
--- a/asoc/codecs/wcd-mbhc-v2.c
+++ b/asoc/codecs/wcd-mbhc-v2.c
@@ -550,7 +550,7 @@
 }
 EXPORT_SYMBOL(wcd_mbhc_hs_elec_irq);
 
-static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion,
+void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion,
 				enum snd_jack_types jack_type)
 {
 	struct snd_soc_codec *codec = mbhc->codec;
@@ -725,6 +725,7 @@
 	}
 	pr_debug("%s: leave hph_status %x\n", __func__, mbhc->hph_status);
 }
+EXPORT_SYMBOL(wcd_mbhc_report_plug);
 
 void wcd_mbhc_elec_hs_report_unplug(struct wcd_mbhc *mbhc)
 {
@@ -1838,6 +1839,8 @@
 	struct snd_soc_card *card = codec->component.card;
 	const char *hph_switch = "qcom,msm-mbhc-hphl-swh";
 	const char *gnd_switch = "qcom,msm-mbhc-gnd-swh";
+	const char *hs_thre = "qcom,msm-mbhc-hs-mic-max-threshold-mv";
+	const char *hph_thre = "qcom,msm-mbhc-hs-mic-min-threshold-mv";
 
 	pr_debug("%s: enter\n", __func__);
 
@@ -1855,6 +1858,18 @@
 		goto err;
 	}
 
+	ret = of_property_read_u32(card->dev->of_node, hs_thre,
+				&(mbhc->hs_thr));
+	if (ret)
+		dev_dbg(card->dev,
+			"%s: missing %s in dt node\n", __func__, hs_thre);
+
+	ret = of_property_read_u32(card->dev->of_node, hph_thre,
+				&(mbhc->hph_thr));
+	if (ret)
+		dev_dbg(card->dev,
+			"%s: missing %s in dt node\n", __func__, hph_thre);
+
 	ret = of_property_read_u32_array(card->dev->of_node,
 					 "qcom,msm-mbhc-moist-cfg",
 					 hph_moist_config, 3);
diff --git a/asoc/codecs/wcd-mbhc-v2.h b/asoc/codecs/wcd-mbhc-v2.h
index c8714fc..0c57eee 100644
--- a/asoc/codecs/wcd-mbhc-v2.h
+++ b/asoc/codecs/wcd-mbhc-v2.h
@@ -16,6 +16,7 @@
 #include <linux/stringify.h>
 #include <linux/power_supply.h>
 #include "wcdcal-hwdep.h"
+#include <sound/jack.h>
 
 #define TOMBAK_MBHC_NC	0
 #define TOMBAK_MBHC_NO	1
@@ -204,6 +205,9 @@
 	WCD_MBHC_ANC_DET_EN,
 	WCD_MBHC_FSM_STATUS,
 	WCD_MBHC_MUX_CTL,
+	WCD_MBHC_MOISTURE_STATUS,
+	WCD_MBHC_HPHR_GND,
+	WCD_MBHC_HPHL_GND,
 	WCD_MBHC_HPHL_OCP_DET_EN,
 	WCD_MBHC_HPHR_OCP_DET_EN,
 	WCD_MBHC_HPHL_OCP_STATUS,
@@ -518,6 +522,8 @@
 	bool in_swch_irq_handler;
 	bool hphl_swh; /*track HPHL switch NC / NO */
 	bool gnd_swh; /*track GND switch NC / NO */
+	u32 hs_thr;
+	u32 hph_thr;
 	u32 moist_vref;
 	u32 moist_iref;
 	u32 moist_rref;
@@ -594,5 +600,7 @@
 			  struct snd_soc_jack *jack, int status, int mask);
 int wcd_cancel_btn_work(struct wcd_mbhc *mbhc);
 int wcd_mbhc_get_button_mask(struct wcd_mbhc *mbhc);
+void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion,
+			enum snd_jack_types jack_type);
 
 #endif /* __WCD_MBHC_V2_H__ */
diff --git a/asoc/codecs/wcd9335.c b/asoc/codecs/wcd9335.c
index 21de9f5..19877b9 100644
--- a/asoc/codecs/wcd9335.c
+++ b/asoc/codecs/wcd9335.c
@@ -650,6 +650,12 @@
 			  0, 0, 0, 0),
 	WCD_MBHC_REGISTER("WCD_MBHC_MUX_CTL",
 			  WCD9335_MBHC_CTL_2, 0x70, 4, 0),
+	WCD_MBHC_REGISTER("WCD_MBHC_MOISTURE_STATUS",
+			  WCD9335_MBHC_FSM_STATUS, 0X20, 5, 0),
+	WCD_MBHC_REGISTER("WCD_MBHC_HPHR_GND",
+			  WCD9335_HPH_PA_CTL2, 0x40, 6, 0),
+	WCD_MBHC_REGISTER("WCD_MBHC_HPHL_GND",
+			  WCD9335_HPH_PA_CTL2, 0x10, 4, 0),
 };
 
 static const struct wcd_mbhc_intr intr_ids = {
diff --git a/asoc/codecs/wcd934x/wcd934x-mbhc.c b/asoc/codecs/wcd934x/wcd934x-mbhc.c
index 4eb14de..807d4ea 100644
--- a/asoc/codecs/wcd934x/wcd934x-mbhc.c
+++ b/asoc/codecs/wcd934x/wcd934x-mbhc.c
@@ -120,6 +120,12 @@
 			  WCD934X_MBHC_STATUS_SPARE_1, 0x01, 0, 0),
 	WCD_MBHC_REGISTER("WCD_MBHC_MUX_CTL",
 			  WCD934X_MBHC_NEW_CTL_2, 0x70, 4, 0),
+	WCD_MBHC_REGISTER("WCD_MBHC_MOISTURE_STATUS",
+			  WCD934X_MBHC_NEW_FSM_STATUS, 0x20, 5, 0),
+	WCD_MBHC_REGISTER("WCD_MBHC_HPHR_GND",
+			  WCD934X_HPH_PA_CTL2, 0x40, 6, 0),
+	WCD_MBHC_REGISTER("WCD_MBHC_HPHL_GND",
+			  WCD934X_HPH_PA_CTL2, 0x10, 4, 0),
 	WCD_MBHC_REGISTER("WCD_MBHC_HPHL_OCP_DET_EN",
 			  WCD934X_HPH_L_TEST, 0x01, 0, 0),
 	WCD_MBHC_REGISTER("WCD_MBHC_HPHR_OCP_DET_EN",
diff --git a/asoc/codecs/wcd934x/wcd934x.c b/asoc/codecs/wcd934x/wcd934x.c
index 66c7830..7fd1e63 100644
--- a/asoc/codecs/wcd934x/wcd934x.c
+++ b/asoc/codecs/wcd934x/wcd934x.c
@@ -8633,6 +8633,10 @@
 	{WCD934X_TLMM_DMIC3_DATA_PINCFG, 0xFF, 0x0a},
 	{WCD934X_CPE_SS_SVA_CFG, 0x60, 0x00},
 	{WCD934X_CPE_SS_CPAR_CFG, 0x10, 0x10},
+	{WCD934X_MICB1_TEST_CTL_1, 0xff, 0xfa},
+	{WCD934X_MICB2_TEST_CTL_1, 0xff, 0xfa},
+	{WCD934X_MICB3_TEST_CTL_1, 0xff, 0xfa},
+	{WCD934X_MICB4_TEST_CTL_1, 0xff, 0xfa},
 };
 
 static void tavil_codec_init_reg(struct tavil_priv *priv)
diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c
index 6011926..3338ac6 100644
--- a/asoc/msm-pcm-routing-v2.c
+++ b/asoc/msm-pcm-routing-v2.c
@@ -16533,7 +16533,7 @@
 	{"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
 	{"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
 	{"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
-	{"QUIN_TDM_RX_0", NULL, "QUAT_TDM_RX_0 Port Mixer"},
+	{"QUIN_TDM_RX_0", NULL, "QUIN_TDM_RX_0 Port Mixer"},
 
 	{"QUIN_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
 	{"QUIN_TDM_RX_1 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
@@ -16555,7 +16555,7 @@
 	{"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
 	{"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
 	{"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
-	{"QUIN_TDM_RX_1", NULL, "QUAT_TDM_RX_1 Port Mixer"},
+	{"QUIN_TDM_RX_1", NULL, "QUIN_TDM_RX_1 Port Mixer"},
 
 	{"QUIN_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
 	{"QUIN_TDM_RX_2 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
@@ -16577,7 +16577,7 @@
 	{"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
 	{"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
 	{"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
-	{"QUIN_TDM_RX_2", NULL, "QUAT_TDM_RX_2 Port Mixer"},
+	{"QUIN_TDM_RX_2", NULL, "QUIN_TDM_RX_2 Port Mixer"},
 
 	{"QUIN_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
 	{"QUIN_TDM_RX_3 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
@@ -16599,7 +16599,7 @@
 	{"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
 	{"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
 	{"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
-	{"QUIN_TDM_RX_3", NULL, "QUAT_TDM_RX_3 Port Mixer"},
+	{"QUIN_TDM_RX_3", NULL, "QUIN_TDM_RX_3 Port Mixer"},
 
 	{"INT0_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
 	{"INT0_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
diff --git a/asoc/msm-pcm-routing-v2.h b/asoc/msm-pcm-routing-v2.h
index 479ba35..8f91e4f 100644
--- a/asoc/msm-pcm-routing-v2.h
+++ b/asoc/msm-pcm-routing-v2.h
@@ -58,8 +58,8 @@
 #define LPASS_BE_SEC_MI2S_TX "SEC_MI2S_TX"
 #define LPASS_BE_PRI_MI2S_RX "PRI_MI2S_RX"
 #define LPASS_BE_PRI_MI2S_TX "PRI_MI2S_TX"
-#define LPASS_BE_TERT_MI2S_RX "TERTIARY_MI2S_RX"
-#define LPASS_BE_TERT_MI2S_TX "TERTIARY_MI2S_TX"
+#define LPASS_BE_TERT_MI2S_RX "TERT_MI2S_RX"
+#define LPASS_BE_TERT_MI2S_TX "TERT_MI2S_TX"
 #define LPASS_BE_AUDIO_I2S_RX "AUDIO_I2S_RX"
 #define LPASS_BE_STUB_RX "STUB_RX"
 #define LPASS_BE_STUB_TX "STUB_TX"
diff --git a/asoc/sdm660-common.c b/asoc/sdm660-common.c
index 78218ab..e6b82df 100644
--- a/asoc/sdm660-common.c
+++ b/asoc/sdm660-common.c
@@ -171,15 +171,6 @@
 };
 
 enum {
-	PRIM_MI2S = 0,
-	SEC_MI2S,
-	TERT_MI2S,
-	QUAT_MI2S,
-	QUIN_MI2S,
-	MI2S_MAX,
-};
-
-enum {
 	PRIM_AUX_PCM = 0,
 	SEC_AUX_PCM,
 	TERT_AUX_PCM,
@@ -208,7 +199,8 @@
 	Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT,
 	Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT,
 	Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT,
-	Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT
+	Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT,
+	Q6AFE_LPASS_CLK_ID_QUI_MI2S_EBIT
 };
 
 struct msm_wsa881x_dev_info {
@@ -401,6 +393,14 @@
 		Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
 		Q6AFE_LPASS_CLK_ROOT_DEFAULT,
 		0,
+	},
+	{
+		AFE_API_VERSION_I2S_CONFIG,
+		Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT,
+		Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
+		Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
+		Q6AFE_LPASS_CLK_ROOT_DEFAULT,
+		0,
 	}
 };
 
@@ -415,7 +415,7 @@
 	},
 	{
 		AFE_API_VERSION_I2S_CONFIG,
-		Q6AFE_LPASS_CLK_ID_MCLK_4,
+		Q6AFE_LPASS_CLK_ID_MCLK_2,
 		Q6AFE_LPASS_OSR_CLK_9_P600_MHZ,
 		Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
 		Q6AFE_LPASS_CLK_ROOT_DEFAULT,
@@ -431,7 +431,15 @@
 	},
 	{
 		AFE_API_VERSION_I2S_CONFIG,
-		Q6AFE_LPASS_CLK_ID_MCLK_2,
+		Q6AFE_LPASS_CLK_ID_MCLK_1,
+		Q6AFE_LPASS_OSR_CLK_9_P600_MHZ,
+		Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
+		Q6AFE_LPASS_CLK_ROOT_DEFAULT,
+		0,
+	},
+	{
+		AFE_API_VERSION_I2S_CONFIG,
+		Q6AFE_LPASS_CLK_ID_QUI_MI2S_OSR,
 		Q6AFE_LPASS_OSR_CLK_9_P600_MHZ,
 		Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
 		Q6AFE_LPASS_CLK_ROOT_DEFAULT,
@@ -2614,6 +2622,8 @@
 	int port_id = msm_get_port_id(rtd->dai_link->id);
 	int index = cpu_dai->id;
 	unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS;
+	struct msm_asoc_mach_data *pdata =
+				snd_soc_card_get_drvdata(rtd->card);
 
 	dev_dbg(rtd->card->dev,
 		"%s: substream = %s  stream = %d, dai name %s, dai ID %d\n",
@@ -2665,6 +2675,9 @@
 				goto clk_off;
 			}
 		}
+		if (pdata->mi2s_gpio_p[index])
+			msm_cdc_pinctrl_select_active_state(
+					pdata->mi2s_gpio_p[index]);
 	}
 	mutex_unlock(&mi2s_intf_conf[index].lock);
 	return 0;
@@ -2691,6 +2704,8 @@
 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
 	int port_id = msm_get_port_id(rtd->dai_link->id);
 	int index = rtd->cpu_dai->id;
+	struct msm_asoc_mach_data *pdata =
+				snd_soc_card_get_drvdata(rtd->card);
 
 	pr_debug("%s(): substream = %s  stream = %d\n", __func__,
 		 substream->name, substream->stream);
@@ -2701,6 +2716,10 @@
 
 	mutex_lock(&mi2s_intf_conf[index].lock);
 	if (--mi2s_intf_conf[index].ref_cnt == 0) {
+		if (pdata->mi2s_gpio_p[index])
+			msm_cdc_pinctrl_select_sleep_state(
+					pdata->mi2s_gpio_p[index]);
+
 		ret = msm_mi2s_set_sclk(substream, false);
 		if (ret < 0) {
 			pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n",
@@ -3245,6 +3264,16 @@
 					"qcom,cdc-ext-spk-gpios", 0);
 	}
 
+	pdata->mi2s_gpio_p[PRIM_MI2S] = of_parse_phandle(pdev->dev.of_node,
+					"qcom,pri-mi2s-gpios", 0);
+	pdata->mi2s_gpio_p[SEC_MI2S] = of_parse_phandle(pdev->dev.of_node,
+					"qcom,sec-mi2s-gpios", 0);
+	pdata->mi2s_gpio_p[TERT_MI2S] = of_parse_phandle(pdev->dev.of_node,
+					"qcom,tert-mi2s-gpios", 0);
+	pdata->mi2s_gpio_p[QUAT_MI2S] = of_parse_phandle(pdev->dev.of_node,
+					"qcom,quat-mi2s-gpios", 0);
+	pdata->mi2s_gpio_p[QUIN_MI2S] = of_parse_phandle(pdev->dev.of_node,
+					"qcom,quin-mi2s-gpios", 0);
 	/*
 	 * Parse US-Euro gpio info from DT. Report no error if us-euro
 	 * entry is not found in DT file as some targets do not support
diff --git a/asoc/sdm660-common.h b/asoc/sdm660-common.h
index 3276d1f..2c8e29e 100644
--- a/asoc/sdm660-common.h
+++ b/asoc/sdm660-common.h
@@ -61,6 +61,15 @@
 };
 
 enum {
+	PRIM_MI2S = 0,
+	SEC_MI2S,
+	TERT_MI2S,
+	QUAT_MI2S,
+	QUIN_MI2S,
+	MI2S_MAX,
+};
+
+enum {
 	DIG_CDC,
 	ANA_CDC,
 	CODECS_MAX,
@@ -90,6 +99,7 @@
 	struct device_node *comp_gpio_p; /* used by pinctrl API */
 	struct device_node *dmic_gpio_p; /* used by pinctrl API */
 	struct device_node *ext_spk_gpio_p; /* used by pinctrl API */
+	struct device_node *mi2s_gpio_p[MI2S_MAX]; /* used by pinctrl API */
 	struct snd_soc_codec *codec;
 	struct sdm660_codec sdm660_codec_fn;
 	struct snd_info_entry *codec_root;
diff --git a/config/sdm845auto.conf b/config/sdm845auto.conf
index 64ca29f..5234e2b 100644
--- a/config/sdm845auto.conf
+++ b/config/sdm845auto.conf
@@ -1,14 +1,16 @@
-CONFIG_PINCTRL_WCD=y
-CONFIG_SND_SOC_WCD934X=y
-CONFIG_AUDIO_EXT_CLK=y
-CONFIG_SND_SOC_WCD9XXX_V2=y
-CONFIG_SND_SOC_WCD_MBHC=y
-CONFIG_SND_SOC_WSA881X=y
-CONFIG_SND_SOC_WCD_DSP_MGR=y
-CONFIG_SND_SOC_WCD_SPI=y
-CONFIG_SND_SOC_WCD934X=y
-CONFIG_SND_SOC_WCD934X_MBHC=y
-CONFIG_SND_SOC_WCD934X_DSD=y
+CONFIG_PINCTRL_WCD=m
+CONFIG_SND_SOC_WCD9XXX_V2=m
+CONFIG_SND_SOC_WCD_MBHC=m
+CONFIG_SND_SOC_WSA881X=m
+CONFIG_SND_SOC_WCD_SPI=m
+CONFIG_SND_SOC_WCD934X=m
+CONFIG_SOUNDWIRE_WCD_CTRL=m
+CONFIG_WCD9XXX_CODEC_CORE=m
+CONFIG_MSM_CDC_PINCTRL=m
+CONFIG_SND_SOC_WCD934X_MBHC=m
+CONFIG_SND_SOC_WCD934X_DSD=m
+CONFIG_SND_SOC_MACHINE_SDM845=m
+CONFIG_WCD_DSP_GLINK=m
 CONFIG_MSM_QDSP6V2_CODECS=y
 CONFIG_MSM_ULTRASOUND=y
 CONFIG_MSM_QDSP6_APRV2_GLINK=y
@@ -19,15 +21,10 @@
 CONFIG_MSM_QDSP6_PDR=y
 CONFIG_MSM_QDSP6_NOTIFIER=y
 CONFIG_SND_SOC_MSM_HOSTLESS_PCM=y
-CONFIG_SND_SOC_MSM_QDSP6V2_INTF=y
 CONFIG_SND_SOC_SDM845=y
 CONFIG_MSM_GLINK_SPI_XPRT=y
 CONFIG_SOUNDWIRE=y
-CONFIG_SOUNDWIRE_WCD_CTRL=y
 CONFIG_SND_SOC_QDSP6V2=y
-CONFIG_SND_SOC_MSM_QDSP6V2_INTF=y
-CONFIG_MSM_CDC_PINCTRL=y
-CONFIG_WCD9XXX_CODEC_CORE=y
 CONFIG_SND_SOC_WCD_MBHC_ADC=y
 CONFIG_QTI_PP=y
 CONFIG_SND_HWDEP=y
@@ -35,8 +32,6 @@
 CONFIG_DOLBY_DS2=y
 CONFIG_DOLBY_LICENSE=y
 CONFIG_DTS_SRS_TM=y
-CONFIG_SND_SOC_MACHINE_SDM845=y
 CONFIG_SND_SOC_MSM_STUB=y
-CONFIG_WCD_DSP_GLINK=y
 CONFIG_MSM_AVTIMER=y
 CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=y
diff --git a/dsp/codecs/audio_utils_aio.h b/dsp/codecs/audio_utils_aio.h
index 82374f9..e44f9d9 100644
--- a/dsp/codecs/audio_utils_aio.h
+++ b/dsp/codecs/audio_utils_aio.h
@@ -20,7 +20,6 @@
 #include <linux/sched.h>
 #include <linux/uaccess.h>
 #include <linux/wait.h>
-#include <linux/wakelock.h>
 #include <linux/msm_audio.h>
 #include <linux/debugfs.h>
 #include <linux/list.h>
diff --git a/dsp/q6afe.c b/dsp/q6afe.c
index 0289144..a91e119 100644
--- a/dsp/q6afe.c
+++ b/dsp/q6afe.c
@@ -15,7 +15,6 @@
 #include <linux/kthread.h>
 #include <linux/uaccess.h>
 #include <linux/wait.h>
-#include <linux/wakelock.h>
 #include <linux/jiffies.h>
 #include <linux/sched.h>
 #include <linux/delay.h>
@@ -495,6 +494,7 @@
 	case AFE_PORT_ID_SECONDARY_PCM_RX:
 	case AFE_PORT_ID_TERTIARY_PCM_RX:
 	case AFE_PORT_ID_QUATERNARY_PCM_RX:
+	case AFE_PORT_ID_QUINARY_PCM_RX:
 	case AFE_PORT_ID_PRIMARY_TDM_RX:
 	case AFE_PORT_ID_PRIMARY_TDM_RX_1:
 	case AFE_PORT_ID_PRIMARY_TDM_RX_2:
@@ -527,6 +527,14 @@
 	case AFE_PORT_ID_QUATERNARY_TDM_RX_5:
 	case AFE_PORT_ID_QUATERNARY_TDM_RX_6:
 	case AFE_PORT_ID_QUATERNARY_TDM_RX_7:
+	case AFE_PORT_ID_QUINARY_TDM_RX:
+	case AFE_PORT_ID_QUINARY_TDM_RX_1:
+	case AFE_PORT_ID_QUINARY_TDM_RX_2:
+	case AFE_PORT_ID_QUINARY_TDM_RX_3:
+	case AFE_PORT_ID_QUINARY_TDM_RX_4:
+	case AFE_PORT_ID_QUINARY_TDM_RX_5:
+	case AFE_PORT_ID_QUINARY_TDM_RX_6:
+	case AFE_PORT_ID_QUINARY_TDM_RX_7:
 	case AFE_PORT_ID_USB_RX:
 	case AFE_PORT_ID_INT0_MI2S_RX:
 	case AFE_PORT_ID_INT1_MI2S_RX:
@@ -566,6 +574,7 @@
 	case AFE_PORT_ID_SECONDARY_PCM_TX:
 	case AFE_PORT_ID_TERTIARY_PCM_TX:
 	case AFE_PORT_ID_QUATERNARY_PCM_TX:
+	case AFE_PORT_ID_QUINARY_PCM_TX:
 	case AFE_PORT_ID_PRIMARY_TDM_TX:
 	case AFE_PORT_ID_PRIMARY_TDM_TX_1:
 	case AFE_PORT_ID_PRIMARY_TDM_TX_2:
@@ -598,6 +607,14 @@
 	case AFE_PORT_ID_QUATERNARY_TDM_TX_5:
 	case AFE_PORT_ID_QUATERNARY_TDM_TX_6:
 	case AFE_PORT_ID_QUATERNARY_TDM_TX_7:
+	case AFE_PORT_ID_QUINARY_TDM_TX:
+	case AFE_PORT_ID_QUINARY_TDM_TX_1:
+	case AFE_PORT_ID_QUINARY_TDM_TX_2:
+	case AFE_PORT_ID_QUINARY_TDM_TX_3:
+	case AFE_PORT_ID_QUINARY_TDM_TX_4:
+	case AFE_PORT_ID_QUINARY_TDM_TX_5:
+	case AFE_PORT_ID_QUINARY_TDM_TX_6:
+	case AFE_PORT_ID_QUINARY_TDM_TX_7:
 	case AFE_PORT_ID_USB_TX:
 	case AFE_PORT_ID_INT0_MI2S_TX:
 	case AFE_PORT_ID_INT1_MI2S_TX:
@@ -685,6 +702,8 @@
 	case AFE_PORT_ID_TERTIARY_PCM_TX:
 	case AFE_PORT_ID_QUATERNARY_PCM_RX:
 	case AFE_PORT_ID_QUATERNARY_PCM_TX:
+	case AFE_PORT_ID_QUINARY_PCM_RX:
+	case AFE_PORT_ID_QUINARY_PCM_TX:
 	default:
 		pr_debug("%s: default case 0x%x\n", __func__, port_id);
 		ret_size = SIZEOF_CFG_CMD(afe_param_id_pcm_cfg);
@@ -3071,6 +3090,8 @@
 	case AFE_PORT_ID_TERTIARY_PCM_TX:
 	case AFE_PORT_ID_QUATERNARY_PCM_RX:
 	case AFE_PORT_ID_QUATERNARY_PCM_TX:
+	case AFE_PORT_ID_QUINARY_PCM_RX:
+	case AFE_PORT_ID_QUINARY_PCM_TX:
 		cfg_type = AFE_PARAM_ID_PCM_CONFIG;
 		break;
 	case PRIMARY_I2S_RX:
@@ -3288,6 +3309,10 @@
 		return IDX_AFE_PORT_ID_QUATERNARY_PCM_RX;
 	case AFE_PORT_ID_QUATERNARY_PCM_TX:
 		return IDX_AFE_PORT_ID_QUATERNARY_PCM_TX;
+	case AFE_PORT_ID_QUINARY_PCM_RX:
+		return IDX_AFE_PORT_ID_QUINARY_PCM_RX;
+	case AFE_PORT_ID_QUINARY_PCM_TX:
+		return IDX_AFE_PORT_ID_QUINARY_PCM_TX;
 	case SECONDARY_I2S_RX: return IDX_SECONDARY_I2S_RX;
 	case SECONDARY_I2S_TX: return IDX_SECONDARY_I2S_TX;
 	case MI2S_RX: return IDX_MI2S_RX;
@@ -3481,6 +3506,38 @@
 		return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_7;
 	case AFE_PORT_ID_QUATERNARY_TDM_TX_7:
 		return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_7;
+	case AFE_PORT_ID_QUINARY_TDM_RX:
+		return IDX_AFE_PORT_ID_QUINARY_TDM_RX_0;
+	case AFE_PORT_ID_QUINARY_TDM_TX:
+		return IDX_AFE_PORT_ID_QUINARY_TDM_TX_0;
+	case AFE_PORT_ID_QUINARY_TDM_RX_1:
+		return IDX_AFE_PORT_ID_QUINARY_TDM_RX_1;
+	case AFE_PORT_ID_QUINARY_TDM_TX_1:
+		return IDX_AFE_PORT_ID_QUINARY_TDM_TX_1;
+	case AFE_PORT_ID_QUINARY_TDM_RX_2:
+		return IDX_AFE_PORT_ID_QUINARY_TDM_RX_2;
+	case AFE_PORT_ID_QUINARY_TDM_TX_2:
+		return IDX_AFE_PORT_ID_QUINARY_TDM_TX_2;
+	case AFE_PORT_ID_QUINARY_TDM_RX_3:
+		return IDX_AFE_PORT_ID_QUINARY_TDM_RX_3;
+	case AFE_PORT_ID_QUINARY_TDM_TX_3:
+		return IDX_AFE_PORT_ID_QUINARY_TDM_TX_3;
+	case AFE_PORT_ID_QUINARY_TDM_RX_4:
+		return IDX_AFE_PORT_ID_QUINARY_TDM_RX_4;
+	case AFE_PORT_ID_QUINARY_TDM_TX_4:
+		return IDX_AFE_PORT_ID_QUINARY_TDM_TX_4;
+	case AFE_PORT_ID_QUINARY_TDM_RX_5:
+		return IDX_AFE_PORT_ID_QUINARY_TDM_RX_5;
+	case AFE_PORT_ID_QUINARY_TDM_TX_5:
+		return IDX_AFE_PORT_ID_QUINARY_TDM_TX_5;
+	case AFE_PORT_ID_QUINARY_TDM_RX_6:
+		return IDX_AFE_PORT_ID_QUINARY_TDM_RX_6;
+	case AFE_PORT_ID_QUINARY_TDM_TX_6:
+		return IDX_AFE_PORT_ID_QUINARY_TDM_TX_6;
+	case AFE_PORT_ID_QUINARY_TDM_RX_7:
+		return IDX_AFE_PORT_ID_QUINARY_TDM_RX_7;
+	case AFE_PORT_ID_QUINARY_TDM_TX_7:
+		return IDX_AFE_PORT_ID_QUINARY_TDM_TX_7;
 	case AFE_PORT_ID_INT0_MI2S_RX:
 		return IDX_AFE_PORT_ID_INT0_MI2S_RX;
 	case AFE_PORT_ID_INT0_MI2S_TX:
@@ -3597,6 +3654,8 @@
 	case AFE_PORT_ID_TERTIARY_PCM_TX:
 	case AFE_PORT_ID_QUATERNARY_PCM_RX:
 	case AFE_PORT_ID_QUATERNARY_PCM_TX:
+	case AFE_PORT_ID_QUINARY_PCM_RX:
+	case AFE_PORT_ID_QUINARY_PCM_TX:
 		cfg_type = AFE_PARAM_ID_PCM_CONFIG;
 		break;
 	case SECONDARY_I2S_RX:
@@ -3980,6 +4039,8 @@
 	case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_TX:
 	case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_RX:
 	case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_TX:
+	case AFE_GROUP_DEVICE_ID_QUINARY_TDM_RX:
+	case AFE_GROUP_DEVICE_ID_QUINARY_TDM_TX:
 		cfg_type = AFE_PARAM_ID_GROUP_DEVICE_TDM_CONFIG;
 		break;
 	default:
@@ -5262,6 +5323,8 @@
 	case AFE_PORT_ID_TERTIARY_PCM_TX:
 	case AFE_PORT_ID_QUATERNARY_PCM_RX:
 	case AFE_PORT_ID_QUATERNARY_PCM_TX:
+	case AFE_PORT_ID_QUINARY_PCM_RX:
+	case AFE_PORT_ID_QUINARY_PCM_TX:
 	case SECONDARY_I2S_RX:
 	case SECONDARY_I2S_TX:
 	case MI2S_RX:
@@ -5376,6 +5439,22 @@
 	case AFE_PORT_ID_QUATERNARY_TDM_TX_6:
 	case AFE_PORT_ID_QUATERNARY_TDM_RX_7:
 	case AFE_PORT_ID_QUATERNARY_TDM_TX_7:
+	case AFE_PORT_ID_QUINARY_TDM_RX:
+	case AFE_PORT_ID_QUINARY_TDM_TX:
+	case AFE_PORT_ID_QUINARY_TDM_RX_1:
+	case AFE_PORT_ID_QUINARY_TDM_TX_1:
+	case AFE_PORT_ID_QUINARY_TDM_RX_2:
+	case AFE_PORT_ID_QUINARY_TDM_TX_2:
+	case AFE_PORT_ID_QUINARY_TDM_RX_3:
+	case AFE_PORT_ID_QUINARY_TDM_TX_3:
+	case AFE_PORT_ID_QUINARY_TDM_RX_4:
+	case AFE_PORT_ID_QUINARY_TDM_TX_4:
+	case AFE_PORT_ID_QUINARY_TDM_RX_5:
+	case AFE_PORT_ID_QUINARY_TDM_TX_5:
+	case AFE_PORT_ID_QUINARY_TDM_RX_6:
+	case AFE_PORT_ID_QUINARY_TDM_TX_6:
+	case AFE_PORT_ID_QUINARY_TDM_RX_7:
+	case AFE_PORT_ID_QUINARY_TDM_TX_7:
 	case AFE_PORT_ID_INT0_MI2S_RX:
 	case AFE_PORT_ID_INT1_MI2S_RX:
 	case AFE_PORT_ID_INT2_MI2S_RX:
diff --git a/dsp/rtac.c b/dsp/rtac.c
index 456ac57..84ef835 100644
--- a/dsp/rtac.c
+++ b/dsp/rtac.c
@@ -909,6 +909,14 @@
 		bytes_returned = ((u32 *)rtac_cal[ADM_RTAC_CAL].cal_data.
 			kvaddr)[2] + 3 * sizeof(u32);
 
+		if (bytes_returned > rtac_cal[ADM_RTAC_CAL].
+			map_data.map_size) {
+			pr_err("%s: Invalid data size = %d\n",
+				__func__, bytes_returned);
+			result = -EINVAL;
+			goto err;
+		}
+
 		if (bytes_returned > user_buf_size) {
 			pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n",
 				__func__, user_buf_size, bytes_returned);
@@ -1132,6 +1140,14 @@
 		bytes_returned = ((u32 *)rtac_cal[ASM_RTAC_CAL].cal_data.
 			kvaddr)[2] + 3 * sizeof(u32);
 
+		if (bytes_returned > rtac_cal[ASM_RTAC_CAL].
+			map_data.map_size) {
+			pr_err("%s: Invalid data size = %d\n",
+				__func__, bytes_returned);
+			result = -EINVAL;
+			goto err;
+		}
+
 		if (bytes_returned > user_buf_size) {
 			pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n",
 				__func__, user_buf_size, bytes_returned);
@@ -1392,6 +1408,14 @@
 		bytes_returned = get_resp->param_size +
 				sizeof(struct afe_port_param_data_v2);
 
+		if (bytes_returned > rtac_cal[AFE_RTAC_CAL].
+			map_data.map_size) {
+			pr_err("%s: Invalid data size = %d\n",
+				__func__, bytes_returned);
+			result = -EINVAL;
+			goto err;
+		}
+
 		if (bytes_returned > user_afe_buf.buf_size) {
 			pr_err("%s: user size = 0x%x, returned size = 0x%x\n",
 				__func__, user_afe_buf.buf_size,
@@ -1617,6 +1641,14 @@
 		bytes_returned = ((u32 *)rtac_cal[VOICE_RTAC_CAL].cal_data.
 			kvaddr)[2] + 3 * sizeof(u32);
 
+		if (bytes_returned > rtac_cal[VOICE_RTAC_CAL].
+			map_data.map_size) {
+			pr_err("%s: Invalid data size = %d\n",
+				__func__, bytes_returned);
+			result = -EINVAL;
+			goto err;
+		}
+
 		if (bytes_returned > user_buf_size) {
 			pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n",
 				__func__, user_buf_size, bytes_returned);
diff --git a/dsp/usf.c b/dsp/usf.c
index dfa2097..f75439d 100644
--- a/dsp/usf.c
+++ b/dsp/usf.c
@@ -22,7 +22,6 @@
 #include <linux/uaccess.h>
 #include <linux/time.h>
 #include <linux/kmemleak.h>
-#include <linux/wakelock.h>
 #include <linux/mutex.h>
 #include <dsp/apr_audio-v2.h>
 #include "q6usm.h"
diff --git a/include/dsp/q6afe-v2.h b/include/dsp/q6afe-v2.h
index 7df993e..8fb480b 100644
--- a/include/dsp/q6afe-v2.h
+++ b/include/dsp/q6afe-v2.h
@@ -205,6 +205,25 @@
 	IDX_AFE_PORT_ID_INT5_MI2S_TX,
 	IDX_AFE_PORT_ID_INT6_MI2S_RX,
 	IDX_AFE_PORT_ID_INT6_MI2S_TX,
+	/* IDX 143-> 160 */
+	IDX_AFE_PORT_ID_QUINARY_PCM_RX,
+	IDX_AFE_PORT_ID_QUINARY_PCM_TX,
+	IDX_AFE_PORT_ID_QUINARY_TDM_RX_0,
+	IDX_AFE_PORT_ID_QUINARY_TDM_TX_0,
+	IDX_AFE_PORT_ID_QUINARY_TDM_RX_1,
+	IDX_AFE_PORT_ID_QUINARY_TDM_TX_1,
+	IDX_AFE_PORT_ID_QUINARY_TDM_RX_2,
+	IDX_AFE_PORT_ID_QUINARY_TDM_TX_2,
+	IDX_AFE_PORT_ID_QUINARY_TDM_RX_3,
+	IDX_AFE_PORT_ID_QUINARY_TDM_TX_3,
+	IDX_AFE_PORT_ID_QUINARY_TDM_RX_4,
+	IDX_AFE_PORT_ID_QUINARY_TDM_TX_4,
+	IDX_AFE_PORT_ID_QUINARY_TDM_RX_5,
+	IDX_AFE_PORT_ID_QUINARY_TDM_TX_5,
+	IDX_AFE_PORT_ID_QUINARY_TDM_RX_6,
+	IDX_AFE_PORT_ID_QUINARY_TDM_TX_6,
+	IDX_AFE_PORT_ID_QUINARY_TDM_RX_7,
+	IDX_AFE_PORT_ID_QUINARY_TDM_TX_7,
 	AFE_MAX_PORTS
 };
 
diff --git a/include/soc/swr-wcd.h b/include/soc/swr-wcd.h
index 041b901..f6ff61a 100644
--- a/include/soc/swr-wcd.h
+++ b/include/soc/swr-wcd.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015, 2017 The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -30,6 +30,13 @@
 	u8 *port;
 };
 
+#if IS_ENABLED(CONFIG_SOUNDWIRE_WCD_CTRL)
 extern int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data);
-
+#else /* CONFIG_SOUNDWIRE_WCD_CTRL */
+static inline int swrm_wcd_notify(struct platform_device *pdev, u32 id,
+				  void *data)
+{
+	return 0;
+}
+#endif /* CONFIG_SOUNDWIRE_WCD_CTRL */
 #endif /* _LINUX_SWR_WCD_H */