Merge "dsp: add LDAC encoder support"
diff --git a/Android.mk b/Android.mk
index 18e9263..a95c0da 100644
--- a/Android.mk
+++ b/Android.mk
@@ -6,6 +6,13 @@
 ifeq ($(call is-board-platform-in-list,sdm845 sdm670 qcs605),true)
 $(shell mkdir -p $(UAPI_OUT)/linux;)
 $(shell mkdir -p $(UAPI_OUT)/sound;)
+$(shell rm -rf $(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers)
+$(shell rm -rf $(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers)
+$(shell rm -rf $(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/codecs/Module.symvers)
+$(shell rm -rf $(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers)
+$(shell rm -rf $(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers)
+$(shell rm -rf $(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers)
+$(shell rm -rf $(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/wcd934x/Module.symvers)
 
 include $(MY_LOCAL_PATH)/ipc/Android.mk
 include $(MY_LOCAL_PATH)/dsp/Android.mk
@@ -17,6 +24,8 @@
 endif
 
 ifeq ($(call is-board-platform-in-list,sdm670 qcs605),true)
+$(shell rm -rf $(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/sdm660_cdc/Module.symvers)
+$(shell rm -rf $(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/msm_sdw/Module.symvers)
 include $(MY_LOCAL_PATH)/asoc/codecs/sdm660_cdc/Android.mk
 include $(MY_LOCAL_PATH)/asoc/codecs/msm_sdw/Android.mk
 endif
diff --git a/Makefile b/Makefile
index de65a18..2848799 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@
 export
 endif
 ifeq ($(CONFIG_ARCH_SDM670), y)
-include $(srctree)/techpack/audio/config/sdm670auto.conf
+include $(srctree)/techpack/audio/config/sdm670auto_static.conf
 export
 endif
 ifeq ($(CONFIG_ARCH_SDXPOORWILLS), y)
diff --git a/asoc/Kbuild b/asoc/Kbuild
index eb32e88..e5b8514 100644
--- a/asoc/Kbuild
+++ b/asoc/Kbuild
@@ -1,22 +1,32 @@
 # We can build either as part of a standalone Kernel build or as
 # an external module.  Determine which mechanism is being used
-KERNEL_BUILD := 0
+ifeq ($(MODNAME),)
+	KERNEL_BUILD := 1
+else
+	KERNEL_BUILD := 0
+endif
 
 
-ifeq ($(KERNEL_BUILD), 0)
+ifeq ($(KERNEL_BUILD), 1)
 	# These are configurable via Kconfig for kernel-based builds
 	# Need to explicitly configure for Android-based builds
+	AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.9
+	AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio
+endif
+
+ifeq ($(KERNEL_BUILD), 0)
 	ifeq ($(CONFIG_ARCH_SDM845), y)
 		include $(AUDIO_ROOT)/config/sdm845auto.conf
 		export
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
 	endif
 	ifeq ($(CONFIG_ARCH_SDM670), y)
 		include $(AUDIO_ROOT)/config/sdm670auto.conf
 		export
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
 	endif
 endif
 
-
 # As per target team, build is done as follows:
 # Defconfig : build with default flags
 # Slub      : defconfig  + CONFIG_SLUB_DEBUG := y +
@@ -45,31 +55,31 @@
 
 
 # for SDM6xx sound card driver
-ifeq ($(CONFIG_SND_SOC_SDM670), m)
+ifdef CONFIG_SND_SOC_SDM670
 	MACHINE_OBJS += sdm660-common.o
 endif
 
 # for SDM6xx sound card driver
-ifeq ($(CONFIG_SND_SOC_INT_CODEC), m)
+ifdef CONFIG_SND_SOC_INT_CODEC
 	MACHINE_OBJS += sdm660-internal.o
 endif
 
 # for SDM6xx sound card driver
-ifeq ($(CONFIG_SND_SOC_EXT_CODEC), m)
+ifdef CONFIG_SND_SOC_EXT_CODEC
 	MACHINE_OBJS += sdm660-external.o
 	MACHINE_OBJS += sdm660-ext-dai-links.o
 endif
 
 # for SDM845 sound card driver
-ifeq ($(CONFIG_SND_SOC_MACHINE_SDM845), m)
+ifdef CONFIG_SND_SOC_MACHINE_SDM845
 	MACHINE_OBJS += sdm845.o
 endif
 
-ifeq ($(CONFIG_SND_SOC_CPE), m)
+ifdef CONFIG_SND_SOC_CPE
 	CPE_LSM_OBJS += msm-cpe-lsm.o
 endif
 
-ifeq ($(CONFIG_SND_SOC_QDSP6V2), m)
+ifdef CONFIG_SND_SOC_QDSP6V2
 	PLATFORM_OBJS += msm-audio-effects-q6-v2.o
 	PLATFORM_OBJS += msm-compress-q6-v2.o
 	PLATFORM_OBJS += msm-dai-fe.o
@@ -77,7 +87,6 @@
 	PLATFORM_OBJS += msm-dai-q6-v2.o
 	PLATFORM_OBJS += msm-dai-slim.o
 	PLATFORM_OBJS += msm-dai-stub-v2.o
-	PLATFORM_OBJS += msm-ds2-dap-config.o
 	PLATFORM_OBJS += msm-lsm-client.o
 	PLATFORM_OBJS += msm-pcm-afe-v2.o
 	PLATFORM_OBJS += msm-pcm-dtmf-v2.o
@@ -86,30 +95,32 @@
 	PLATFORM_OBJS += msm-pcm-loopback-v2.o
 	PLATFORM_OBJS += msm-pcm-q6-noirq.o
 	PLATFORM_OBJS += msm-pcm-q6-v2.o
-	PLATFORM_OBJS += msm-pcm-routing-devdep.o
 	PLATFORM_OBJS += msm-pcm-routing-v2.o
 	PLATFORM_OBJS += msm-pcm-voice-v2.o
 	PLATFORM_OBJS += msm-pcm-voip-v2.o
-	PLATFORM_OBJS += msm-qti-pp-config.o
 	PLATFORM_OBJS += msm-transcode-loopback-q6-v2.o
 	PLATFORM_OBJS += platform_init.o
 endif
+ifdef CONFIG_DOLBY_DS2
+	PLATFORM_OBJS += msm-ds2-dap-config.o
+endif
+ifdef CONFIG_DOLBY_LICENSE
+	PLATFORM_OBJS += msm-ds2-dap-config.o
+endif
+ifdef CONFIG_SND_HWDEP
+	PLATFORM_OBJS += msm-pcm-routing-devdep.o
+endif
+ifdef CONFIG_QTI_PP
+	PLATFORM_OBJS += msm-qti-pp-config.o
+endif
 
 LINUX_INC +=	-Iinclude/linux
 
-INCS :=		$(COMMON_INC) \
+INCS +=		$(COMMON_INC) \
 		$(UAPI_INC)
 
-ifeq ($(CONFIG_ARCH_SDM845), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
-endif
-ifeq ($(CONFIG_ARCH_SDM670), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
-endif
-
 EXTRA_CFLAGS += $(INCS)
 
-
 CDEFINES +=	-DANI_LITTLE_BYTE_ENDIAN \
 		-DANI_LITTLE_BIT_ENDIAN \
 		-DDOT11F_LITTLE_ENDIAN_HOST \
@@ -135,12 +146,16 @@
 EXTRA_CFLAGS += -Wheader-guard
 endif
 
-
+ifeq ($(KERNEL_BUILD), 0)
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/wcd934x/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/sdm660_cdc/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/msm_sdw/Module.symvers
+endif
+ifeq ($(KERNEL_BUILD), 1)
+	obj-y += codecs/
+endif
 # Module information used by KBuild framework
 obj-$(CONFIG_SND_SOC_QDSP6V2) += platform_dlkm.o
 platform_dlkm-y := $(PLATFORM_OBJS)
diff --git a/asoc/Makefile b/asoc/Makefile
deleted file mode 100644
index 4d3839d..0000000
--- a/asoc/Makefile
+++ /dev/null
@@ -1,41 +0,0 @@
-# MSM Machine Support
-
-snd-soc-hostless-pcm-objs := msm-pcm-hostless.o
-obj-$(CONFIG_SND_SOC_MSM_HOSTLESS_PCM) += snd-soc-hostless-pcm.o
-
-
-snd-soc-qdsp6v2-objs := msm-dai-fe.o
-obj-$(CONFIG_SND_SOC_QDSP6V2) += snd-soc-qdsp6v2.o
-
-#for CPE drivers
-snd-soc-cpe-objs := msm-cpe-lsm.o
-obj-$(CONFIG_SND_SOC_CPE) += snd-soc-cpe.o
-
-# for MSM8998 sound card driver
-snd-soc-msm8998-objs := msm8998.o
-obj-$(CONFIG_SND_SOC_MACHINE_MSM8998) += snd-soc-msm8998.o
-
-# for SDM670 sound card driver
-snd-soc-sdm670-objs := sdm660-common.o sdm660-internal.o sdm660-external.o sdm660-ext-dai-links.o
-obj-$(CONFIG_SND_SOC_SDM670) += snd-soc-sdm670.o
-
-# for SDM845 sound card driver
-snd-soc-sdm845-objs := sdm845.o
-obj-$(CONFIG_SND_SOC_MACHINE_SDM845) += snd-soc-sdm845.o
-
-snd-soc-qdsp6v2-objs += msm-dai-q6-v2.o msm-pcm-q6-v2.o \
-			msm-pcm-routing-v2.o msm-compress-q6-v2.o \
-			msm-pcm-afe-v2.o msm-pcm-voip-v2.o \
-			msm-pcm-voice-v2.o msm-dai-q6-hdmi-v2.o \
-			msm-lsm-client.o msm-pcm-host-voice-v2.o \
-			msm-audio-effects-q6-v2.o msm-pcm-loopback-v2.o \
-			msm-dai-slim.o msm-transcode-loopback-q6-v2.o msm-pcm-q6-noirq.o
-obj-$(CONFIG_SND_SOC_QDSP6V2) += snd-soc-qdsp6v2.o msm-pcm-dtmf-v2.o \
-				 msm-dai-stub-v2.o
-obj-$(CONFIG_SND_HWDEP) += msm-pcm-routing-devdep.o
-obj-$(CONFIG_DOLBY_DAP) += msm-dolby-dap-config.o
-obj-$(CONFIG_DOLBY_DS2) += msm-ds2-dap-config.o
-obj-$(CONFIG_DOLBY_LICENSE) += msm-ds2-dap-config.o
-obj-$(CONFIG_DTS_SRS_TM) += msm-dts-srs-tm-config.o
-obj-$(CONFIG_QTI_PP) += msm-qti-pp-config.o
-obj-y += codecs/
diff --git a/asoc/codecs/Kbuild b/asoc/codecs/Kbuild
index 83d4da4..1cbd20e 100644
--- a/asoc/codecs/Kbuild
+++ b/asoc/codecs/Kbuild
@@ -1,22 +1,31 @@
 # We can build either as part of a standalone Kernel build or as
 # an external module.  Determine which mechanism is being used
-KERNEL_BUILD := 0
+ifeq ($(MODNAME),)
+	KERNEL_BUILD := 1
+else
+	KERNEL_BUILD := 0
+endif
 
-
-ifeq ($(KERNEL_BUILD), 0)
+ifeq ($(KERNEL_BUILD), 1)
 	# These are configurable via Kconfig for kernel-based builds
 	# Need to explicitly configure for Android-based builds
+	AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.9
+	AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio
+endif
+
+ifeq ($(KERNEL_BUILD), 0)
 	ifeq ($(CONFIG_ARCH_SDM845), y)
 		include $(AUDIO_ROOT)/config/sdm845auto.conf
 		export
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
 	endif
 	ifeq ($(CONFIG_ARCH_SDM670), y)
 		include $(AUDIO_ROOT)/config/sdm670auto.conf
 		export
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
 	endif
 endif
 
-
 # As per target team, build is done as follows:
 # Defconfig : build with default flags
 # Slub      : defconfig  + CONFIG_SLUB_DEBUG := y +
@@ -42,7 +51,7 @@
 COMMON_INC :=	-I$(AUDIO_ROOT)/$(COMMON_DIR)
 
 ############ ASoC Codecs ############
-ifeq ($(CONFIG_WCD9XXX_CODEC_CORE), m)
+ifdef CONFIG_WCD9XXX_CODEC_CORE
 	CORE_OBJS += wcd9xxx-rst.o
 	CORE_OBJS += wcd9xxx-core-init.o
 	CORE_OBJS += wcd9xxx-core.o
@@ -57,7 +66,7 @@
 	CORE_OBJS += wcd934x/wcd934x-tables.o
 endif
 
-ifeq ($(CONFIG_SND_SOC_WCD9XXX_V2), m)
+ifdef CONFIG_SND_SOC_WCD9XXX_V2
 	WCD9XXX_OBJS += wcd9xxx-common-v2.o
 	WCD9XXX_OBJS += wcd9xxx-resmgr-v2.o
 	WCD9XXX_OBJS += wcdcal-hwdep.o
@@ -67,56 +76,50 @@
 	WCD9XXX_OBJS += audio-ext-clk-up.o
 endif
 
-ifeq ($(CONFIG_SND_SOC_WCD9335), m)
+ifdef CONFIG_SND_SOC_WCD9335
 	WCD9335_OBJS += wcd9335.o
 endif
 
-ifeq ($(CONFIG_SND_SOC_WSA881X), m)
+ifdef CONFIG_SND_SOC_WSA881X
 	WSA881X_OBJS += wsa881x.o
 	WSA881X_OBJS += wsa881x-tables.o
 	WSA881X_OBJS += wsa881x-regmap.o
 	WSA881X_OBJS += wsa881x-temp-sensor.o
 endif
 
-ifeq ($(CONFIG_SND_SOC_MSM_STUB), m)
+ifdef CONFIG_SND_SOC_MSM_STUB
 	STUB_OBJS += msm_stub.o
 endif
-ifeq ($(CONFIG_SND_SOC_WCD_SPI), m)
+ifdef CONFIG_SND_SOC_WCD_SPI
 	SPI_OBJS += wcd-spi.o
 endif
 
-ifeq ($(CONFIG_SND_SOC_WCD_CPE), m)
+ifdef CONFIG_SND_SOC_WCD_CPE
 	WCD_CPE_OBJS += wcd_cpe_core.o
 	WCD_CPE_OBJS += wcd_cpe_services.o
 endif
 
-ifeq ($(CONFIG_SND_SOC_WCD_MBHC), m)
+ifdef CONFIG_SND_SOC_WCD_MBHC
 	MBHC_OBJS += wcd-mbhc-v2.o
 endif
 
-ifeq ($(CONFIG_SND_SOC_WCD_MBHC_ADC), m)
+ifdef CONFIG_SND_SOC_WCD_MBHC_ADC
 	MBHC_OBJS += wcd-mbhc-adc.o
 endif
 
-ifeq ($(CONFIG_SND_SOC_WCD_MBHC_LEGACY), m)
+ifdef CONFIG_SND_SOC_WCD_MBHC_LEGACY
 	MBHC_OBJS += wcd-mbhc-legacy.o
 endif
 
-ifeq ($(CONFIG_SND_SOC_MSM_HDMI_CODEC_RX), m)
+ifdef CONFIG_SND_SOC_MSM_HDMI_CODEC_RX
 	HDMICODEC_OBJS += msm_hdmi_codec_rx.o
 endif
 
 LINUX_INC +=	-Iinclude/linux
 
-INCS :=		$(COMMON_INC) \
+INCS +=		$(COMMON_INC) \
 		$(UAPI_INC)
 
-ifeq ($(CONFIG_ARCH_SDM845), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
-endif
-ifeq ($(CONFIG_ARCH_SDM670), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
-endif
 
 EXTRA_CFLAGS += $(INCS)
 
@@ -147,8 +150,16 @@
 endif
 
 
+ifeq ($(KERNEL_BUILD), 0)
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers
+endif
+
+ifeq ($(KERNEL_BUILD), 1)
+	obj-y	+= wcd934x/
+	obj-y	+= sdm660_cdc/
+	obj-y	+= msm_sdw/
+endif
 # Module information used by KBuild framework
 obj-$(CONFIG_WCD9XXX_CODEC_CORE) += wcd_core_dlkm.o
 wcd_core_dlkm-y := $(CORE_OBJS)
diff --git a/asoc/codecs/Makefile b/asoc/codecs/Makefile
deleted file mode 100644
index 9b02c8a..0000000
--- a/asoc/codecs/Makefile
+++ /dev/null
@@ -1,40 +0,0 @@
-snd-soc-wcd9xxx-objs := wcd9xxx-common-v2.o wcd9xxx-resmgr-v2.o \
-			wcdcal-hwdep.o wcd9xxx-soc-init.o wcd-dsp-utils.o \
-			wcd-dsp-mgr.o audio-ext-clk-up.o
-snd-soc-wcd-cpe-objs := wcd_cpe_services.o wcd_cpe_core.o
-snd-soc-wsa881x-objs := wsa881x.o wsa881x-tables.o wsa881x-regmap.o wsa881x-temp-sensor.o
-snd-soc-wcd-mbhc-objs := wcd-mbhc-v2.o
-ifneq (,$(filter $(CONFIG_SND_SOC_WCD_MBHC_LEGACY),y m))
-	snd-soc-wcd-mbhc-objs += wcd-mbhc-legacy.o
-endif
-ifneq (,$(filter $(CONFIG_SND_SOC_WCD_MBHC_ADC),y m))
-	snd-soc-wcd-mbhc-objs += wcd-mbhc-adc.o
-endif
-snd-soc-wcd-spi-objs := wcd-spi.o
-snd-soc-wcd9335-objs := wcd9335.o
-snd-soc-wcd-cpe-objs := wcd_cpe_services.o wcd_cpe_core.o
-
-obj-$(CONFIG_SND_SOC_WCD9335) += snd-soc-wcd9335.o
-obj-$(CONFIG_SND_SOC_WCD_CPE)   += snd-soc-wcd-cpe.o
-obj-$(CONFIG_SND_SOC_WCD934X)	+= wcd934x/
-obj-$(CONFIG_SND_SOC_SDM660_CDC) += sdm660_cdc/
-obj-$(CONFIG_SND_SOC_MSM_SDW) += msm_sdw/
-
-obj-$(CONFIG_SND_SOC_WCD9XXX_V2) += snd-soc-wcd9xxx.o
-obj-$(CONFIG_SND_SOC_WCD_MBHC)  += snd-soc-wcd-mbhc.o
-obj-$(CONFIG_SND_SOC_WSA881X)	+= snd-soc-wsa881x.o
-obj-$(CONFIG_SND_SOC_WCD_SPI)  += snd-soc-wcd-spi.o
-
-snd-soc-msm-stub-objs := msm_stub.o
-obj-$(CONFIG_SND_SOC_MSM_STUB)  += snd-soc-msm-stub.o
-
-wcd-core-objs                  := wcd9xxx-rst.o wcd9xxx-core-init.o \
-				wcd9xxx-core.o wcd9xxx-irq.o \
-				wcd9xxx-slimslave.o wcd9xxx-utils.o \
-				wcd9335-regmap.o wcd9335-tables.o \
-				msm-cdc-pinctrl.o msm-cdc-supply.o
-wcd-core-objs	+= wcd934x/wcd934x-regmap.o
-wcd-core-objs	+= wcd934x/wcd934x-tables.o
-
-obj-$(CONFIG_WCD9XXX_CODEC_CORE) += wcd-core.o
-obj-$(CONFIG_SND_SOC_MSM_HDMI_CODEC_RX) += msm_hdmi_codec_rx.o
diff --git a/asoc/codecs/msm_sdw/Kbuild b/asoc/codecs/msm_sdw/Kbuild
index a55948e..e2b5bc3 100644
--- a/asoc/codecs/msm_sdw/Kbuild
+++ b/asoc/codecs/msm_sdw/Kbuild
@@ -1,22 +1,32 @@
 # We can build either as part of a standalone Kernel build or as
 # an external module.  Determine which mechanism is being used
-KERNEL_BUILD := 0
+ifeq ($(MODNAME),)
+	KERNEL_BUILD := 1
+else
+	KERNEL_BUILD := 0
+endif
 
 
-ifeq ($(KERNEL_BUILD), 0)
+ifeq ($(KERNEL_BUILD), 1)
 	# These are configurable via Kconfig for kernel-based builds
 	# Need to explicitly configure for Android-based builds
+	AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.9
+	AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio
+endif
+
+ifeq ($(KERNEL_BUILD), 0)
 	ifeq ($(CONFIG_ARCH_SDM845), y)
 		include $(AUDIO_ROOT)/config/sdm845auto.conf
 		export
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
 	endif
 	ifeq ($(CONFIG_ARCH_SDM670), y)
 		include $(AUDIO_ROOT)/config/sdm670auto.conf
 		export
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
 	endif
 endif
 
-
 # As per target team, build is done as follows:
 # Defconfig : build with default flags
 # Slub      : defconfig  + CONFIG_SLUB_DEBUG := y +
@@ -44,7 +54,7 @@
 ############ MSM Soundwire ############
 
 # for MSM Soundwire Codec
-ifeq ($(CONFIG_SND_SOC_MSM_SDW), m)
+ifdef CONFIG_SND_SOC_MSM_SDW
 	MSM_SDW_OBJS += msm_sdw_cdc.o
 	MSM_SDW_OBJS += msm_sdw_regmap.o
 	MSM_SDW_OBJS += msm-sdw-tables.o
@@ -53,16 +63,9 @@
 
 LINUX_INC +=	-Iinclude/linux
 
-INCS :=		$(COMMON_INC) \
+INCS +=		$(COMMON_INC) \
 		$(UAPI_INC)
 
-ifeq ($(CONFIG_ARCH_SDM845), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
-endif
-ifeq ($(CONFIG_ARCH_SDM670), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
-endif
-
 EXTRA_CFLAGS += $(INCS)
 
 
@@ -91,11 +94,14 @@
 EXTRA_CFLAGS += -Wheader-guard
 endif
 
+ifeq ($(KERNEL_BUILD), 0)
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers
+endif
+
 # Module information used by KBuild framework
 obj-$(CONFIG_SND_SOC_MSM_SDW) += msm_sdw_dlkm.o
 msm_sdw_dlkm-y := $(MSM_SDW_OBJS)
diff --git a/asoc/codecs/msm_sdw/Makefile b/asoc/codecs/msm_sdw/Makefile
deleted file mode 100644
index 9518f4d..0000000
--- a/asoc/codecs/msm_sdw/Makefile
+++ /dev/null
@@ -1,2 +0,0 @@
-snd-soc-msm-sdw-objs := msm_sdw_cdc.o msm_sdw_regmap.o msm-sdw-tables.o msm_sdw_cdc_utils.o
-obj-$(CONFIG_SND_SOC_MSM_SDW)	+= snd-soc-msm-sdw.o
diff --git a/asoc/codecs/sdm660_cdc/Kbuild b/asoc/codecs/sdm660_cdc/Kbuild
index c1777ee..56122c1 100644
--- a/asoc/codecs/sdm660_cdc/Kbuild
+++ b/asoc/codecs/sdm660_cdc/Kbuild
@@ -1,22 +1,32 @@
 # We can build either as part of a standalone Kernel build or as
 # an external module.  Determine which mechanism is being used
-KERNEL_BUILD := 0
+ifeq ($(MODNAME),)
+	KERNEL_BUILD := 1
+else
+	KERNEL_BUILD := 0
+endif
 
 
-ifeq ($(KERNEL_BUILD), 0)
+ifeq ($(KERNEL_BUILD), 1)
 	# These are configurable via Kconfig for kernel-based builds
 	# Need to explicitly configure for Android-based builds
+	AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.9
+	AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio
+endif
+
+ifeq ($(KERNEL_BUILD), 0)
 	ifeq ($(CONFIG_ARCH_SDM845), y)
 		include $(AUDIO_ROOT)/config/sdm845auto.conf
 		export
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
 	endif
 	ifeq ($(CONFIG_ARCH_SDM670), y)
 		include $(AUDIO_ROOT)/config/sdm670auto.conf
 		export
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
 	endif
 endif
 
-
 # As per target team, build is done as follows:
 # Defconfig : build with default flags
 # Slub      : defconfig  + CONFIG_SLUB_DEBUG := y +
@@ -44,27 +54,20 @@
 ############ SDM660_CDC ############
 
 # for SDM660_CDC Codec
-ifeq ($(CONFIG_SND_SOC_ANALOG_CDC), m)
+ifdef CONFIG_SND_SOC_ANALOG_CDC
 	ANALOG_CDC_OBJS += msm-analog-cdc.o
 	ANALOG_CDC_OBJS += sdm660-cdc-irq.o
 endif
 
-ifeq ($(CONFIG_SND_SOC_DIGITAL_CDC), m)
+ifdef CONFIG_SND_SOC_DIGITAL_CDC
 	DIGITAL_CDC_OBJS += msm-digital-cdc.o
 	DIGITAL_CDC_OBJS += msm-digital-cdc-regmap.o
 endif
 LINUX_INC +=	-Iinclude/linux
 
-INCS :=		$(COMMON_INC) \
+INCS +=		$(COMMON_INC) \
 		$(UAPI_INC)
 
-ifeq ($(CONFIG_ARCH_SDM845), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
-endif
-ifeq ($(CONFIG_ARCH_SDM670), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
-endif
-
 EXTRA_CFLAGS += $(INCS)
 
 
@@ -94,11 +97,14 @@
 endif
 
 
+ifeq ($(KERNEL_BUILD), 0)
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers
+endif
+
 # Module information used by KBuild framework
 obj-$(CONFIG_SND_SOC_ANALOG_CDC) += analog_cdc_dlkm.o
 analog_cdc_dlkm-y := $(ANALOG_CDC_OBJS)
diff --git a/asoc/codecs/sdm660_cdc/Makefile b/asoc/codecs/sdm660_cdc/Makefile
deleted file mode 100644
index 0ebf407..0000000
--- a/asoc/codecs/sdm660_cdc/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-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/wcd934x/Kbuild b/asoc/codecs/wcd934x/Kbuild
index 6bc854c..e46e39d 100644
--- a/asoc/codecs/wcd934x/Kbuild
+++ b/asoc/codecs/wcd934x/Kbuild
@@ -1,22 +1,33 @@
 # We can build either as part of a standalone Kernel build or as
 # an external module.  Determine which mechanism is being used
-KERNEL_BUILD := 0
+ifeq ($(MODNAME),)
+	KERNEL_BUILD := 1
+else
+	KERNEL_BUILD := 0
+endif
 
 
-ifeq ($(KERNEL_BUILD), 0)
+
+ifeq ($(KERNEL_BUILD), 1)
 	# These are configurable via Kconfig for kernel-based builds
 	# Need to explicitly configure for Android-based builds
+	AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.9
+	AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio
+endif
+
+ifeq ($(KERNEL_BUILD), 0)
 	ifeq ($(CONFIG_ARCH_SDM845), y)
 		include $(AUDIO_ROOT)/config/sdm845auto.conf
 		export
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
 	endif
 	ifeq ($(CONFIG_ARCH_SDM670), y)
 		include $(AUDIO_ROOT)/config/sdm670auto.conf
 		export
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
 	endif
 endif
 
-
 # As per target team, build is done as follows:
 # Defconfig : build with default flags
 # Slub      : defconfig  + CONFIG_SLUB_DEBUG := y +
@@ -44,7 +55,7 @@
 ############ WCD934X ############
 
 # for WCD934X Codec
-ifeq ($(CONFIG_SND_SOC_WCD934X), m)
+ifdef CONFIG_SND_SOC_WCD934X
 	WCD934X_OBJS += wcd934x.o
 	WCD934X_OBJS += wcd934x-dsp-cntl.o
 	WCD934X_OBJS += wcd934x-mbhc.o
@@ -53,16 +64,9 @@
 
 LINUX_INC +=	-Iinclude/linux
 
-INCS :=		$(COMMON_INC) \
+INCS +=		$(COMMON_INC) \
 		$(UAPI_INC)
 
-ifeq ($(CONFIG_ARCH_SDM845), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
-endif
-ifeq ($(CONFIG_ARCH_SDM670), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
-endif
-
 EXTRA_CFLAGS += $(INCS)
 
 
@@ -91,12 +95,14 @@
 EXTRA_CFLAGS += -Wheader-guard
 endif
 
-
+ifeq ($(KERNEL_BUILD), 0)
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers
+endif
+
 # Module information used by KBuild framework
 obj-$(CONFIG_SND_SOC_WCD934X) += wcd934x_dlkm.o
 wcd934x_dlkm-y := $(WCD934X_OBJS)
diff --git a/asoc/codecs/wcd934x/Makefile b/asoc/codecs/wcd934x/Makefile
deleted file mode 100644
index 12781f6..0000000
--- a/asoc/codecs/wcd934x/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Makefile for wcd934x codec driver.
-#
-snd-soc-wcd934x-objs := wcd934x.o wcd934x-dsp-cntl.o \
-			wcd934x-mbhc.o wcd934x-dsd.o
-obj-$(CONFIG_SND_SOC_WCD934X) += snd-soc-wcd934x.o
diff --git a/asoc/codecs/wcd934x/wcd934x-mbhc.c b/asoc/codecs/wcd934x/wcd934x-mbhc.c
index 807d4ea..ae147ca 100644
--- a/asoc/codecs/wcd934x/wcd934x-mbhc.c
+++ b/asoc/codecs/wcd934x/wcd934x-mbhc.c
@@ -1043,6 +1043,7 @@
 		return -EINVAL;
 	}
 
+	tavil_mbhc_hs_detect_exit(codec);
 	wcd_mbhc_deinit(wcd_mbhc);
 	ret = wcd_mbhc_init(wcd_mbhc, codec, &mbhc_cb, &intr_ids,
 			    wcd_mbhc_registers, TAVIL_ZDET_SUPPORTED);
diff --git a/asoc/msm-compress-q6-v2.c b/asoc/msm-compress-q6-v2.c
index 1df13af..b5e2827 100644
--- a/asoc/msm-compress-q6-v2.c
+++ b/asoc/msm-compress-q6-v2.c
@@ -4546,7 +4546,7 @@
 	return platform_driver_register(&msm_compr_driver);
 }
 
-void __exit msm_compress_dsp_exit(void)
+void msm_compress_dsp_exit(void)
 {
 	platform_driver_unregister(&msm_compr_driver);
 }
diff --git a/asoc/msm-dai-fe.c b/asoc/msm-dai-fe.c
index 9160a2d..72883eb 100644
--- a/asoc/msm-dai-fe.c
+++ b/asoc/msm-dai-fe.c
@@ -2576,7 +2576,7 @@
 	return platform_driver_register(&msm_fe_dai_driver);
 }
 
-void __exit msm_fe_dai_exit(void)
+void msm_fe_dai_exit(void)
 {
 	platform_driver_unregister(&msm_fe_dai_driver);
 }
diff --git a/asoc/msm-dai-q6-hdmi-v2.c b/asoc/msm-dai-q6-hdmi-v2.c
index eb9f5f5..c061c08 100644
--- a/asoc/msm-dai-q6-hdmi-v2.c
+++ b/asoc/msm-dai-q6-hdmi-v2.c
@@ -543,7 +543,7 @@
 	return platform_driver_register(&msm_dai_q6_hdmi_driver);
 }
 
-void __exit msm_dai_q6_hdmi_exit(void)
+void msm_dai_q6_hdmi_exit(void)
 {
 	platform_driver_unregister(&msm_dai_q6_hdmi_driver);
 }
diff --git a/asoc/msm-dai-q6-v2.c b/asoc/msm-dai-q6-v2.c
index 756882c..bec7fcf 100644
--- a/asoc/msm-dai-q6-v2.c
+++ b/asoc/msm-dai-q6-v2.c
@@ -2430,6 +2430,36 @@
 	return 0;
 }
 
+static int msm_dai_q6_afe_scrambler_mode_get(
+			struct snd_kcontrol *kcontrol,
+			struct snd_ctl_elem_value *ucontrol)
+{
+	struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data;
+
+	if (!dai_data) {
+		pr_err("%s: Invalid dai data\n", __func__);
+		return -EINVAL;
+	}
+	ucontrol->value.integer.value[0] = dai_data->enc_config.scrambler_mode;
+
+	return 0;
+}
+
+static int msm_dai_q6_afe_scrambler_mode_put(
+			struct snd_kcontrol *kcontrol,
+			struct snd_ctl_elem_value *ucontrol)
+{
+	struct msm_dai_q6_dai_data *dai_data = kcontrol->private_data;
+
+	if (!dai_data) {
+		pr_err("%s: Invalid dai data\n", __func__);
+		return -EINVAL;
+	}
+	dai_data->enc_config.scrambler_mode = ucontrol->value.integer.value[0];
+	pr_debug("%s: afe scrambler mode : %d\n",
+		  __func__, dai_data->enc_config.scrambler_mode);
+	return 0;
+}
 
 static const struct snd_kcontrol_new afe_enc_config_controls[] = {
 	{
@@ -2447,6 +2477,10 @@
 	SOC_ENUM_EXT("AFE Input Bit Format", afe_input_bit_format_enum[0],
 		     msm_dai_q6_afe_input_bit_format_get,
 		     msm_dai_q6_afe_input_bit_format_put),
+	SOC_SINGLE_EXT("AFE Scrambler Mode",
+		       0, 0, 1, 0,
+		       msm_dai_q6_afe_scrambler_mode_get,
+		       msm_dai_q6_afe_scrambler_mode_put),
 };
 
 static int msm_dai_q6_slim_rx_drift_info(struct snd_kcontrol *kcontrol,
@@ -2610,6 +2644,9 @@
 				 snd_ctl_new1(&afe_enc_config_controls[2],
 				 dai_data));
 		rc = snd_ctl_add(dai->component->card->snd_card,
+				 snd_ctl_new1(&afe_enc_config_controls[3],
+				 dai_data));
+		rc = snd_ctl_add(dai->component->card->snd_card,
 				snd_ctl_new1(&avd_drift_config_controls[2],
 					dai));
 		break;
@@ -8939,7 +8976,7 @@
 	return rc;
 }
 
-void __exit msm_dai_q6_exit(void)
+void msm_dai_q6_exit(void)
 {
 	platform_driver_unregister(&msm_dai_q6_tdm_driver);
 	platform_driver_unregister(&msm_dai_q6_spdif_driver);
diff --git a/asoc/msm-dai-slim.c b/asoc/msm-dai-slim.c
index 427fd6c..e8bdf13 100644
--- a/asoc/msm-dai-slim.c
+++ b/asoc/msm-dai-slim.c
@@ -653,7 +653,7 @@
 	return rc;
 }
 
-void __exit msm_dai_slim_exit(void)
+void msm_dai_slim_exit(void)
 {
 	slim_driver_unregister(&msm_dai_slim_driver);
 }
diff --git a/asoc/msm-dai-stub-v2.c b/asoc/msm-dai-stub-v2.c
index d4178c8..c8b6b77 100644
--- a/asoc/msm-dai-stub-v2.c
+++ b/asoc/msm-dai-stub-v2.c
@@ -379,7 +379,7 @@
 	return rc;
 }
 
-void __exit msm_dai_stub_exit(void)
+void msm_dai_stub_exit(void)
 {
 	pr_debug("%s:\n", __func__);
 
diff --git a/asoc/msm-ds2-dap-config.c b/asoc/msm-ds2-dap-config.c
index 419da8f..645ecf5 100644
--- a/asoc/msm-ds2-dap-config.c
+++ b/asoc/msm-ds2-dap-config.c
@@ -22,8 +22,6 @@
 #include "msm-pcm-routing-v2.h"
 
 
-#if defined(CONFIG_DOLBY_DS2) || defined(CONFIG_DOLBY_LICENSE)
-
 /* ramp up/down for 30ms    */
 #define DOLBY_SOFT_VOLUME_PERIOD	40
 /* Step value 0ms or 0us */
@@ -2174,144 +2172,3 @@
 	}
 	return rc;
 }
-
-#else
-
-static int msm_ds2_dap_alloc_and_store_cal_data(int dev_map_idx, int path,
-					    int perf_mode)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_free_cal_data(int dev_map_idx)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_send_cal_data(int dev_map_idx)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_can_enable_module(int32_t module_id)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_init_modules_in_topology(int dev_map_idx)
-{
-	return 0;
-}
-
-static bool msm_ds2_dap_check_is_param_modified(int32_t *dap_params_modified,
-				    int32_t idx, int32_t commit)
-{
-	return false;
-}
-
-
-static int msm_ds2_dap_map_device_to_dolby_cache_devices(int32_t device_id)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_update_num_devices(struct dolby_param_data *dolby_data,
-				      int32_t *num_device, int32_t *dev_arr,
-				      int32_t array_size)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_commit_params(struct dolby_param_data *dolby_data,
-				 int commit)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_handle_commands(u32 cmd, void *arg)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_set_param(u32 cmd, void *arg)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_get_param(u32 cmd, void *arg)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_send_end_point(int dev_map_idx, int endp_idx)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_send_cached_params(int dev_map_idx,
-					  int commit)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_set_vspe_vdhe(int dev_map_idx,
-				     bool is_custom_stereo_enabled)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_param_visualizer_control_get(
-			u32 cmd, void *arg,
-			struct msm_pcm_routing_bdai_data *bedais)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_set_security_control(u32 cmd, void *arg)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_update_dev_map_port_id(int32_t device_id, int port_id)
-{
-	return 0;
-}
-
-static int32_t msm_ds2_dap_get_port_id(
-		int32_t device_id, int32_t be_id)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_handle_bypass(struct dolby_param_data *dolby_data)
-{
-	return 0;
-}
-
-static int msm_ds2_dap_handle_bypass_wait(int port_id, int copp_idx,
-					  int wait_time)
-{
-	return 0;
-}
-
-static int dap_set_custom_stereo_onoff(int dev_map_idx,
-					bool is_custom_stereo_enabled)
-{
-	return 0;
-}
-int qti_set_custom_stereo_on(int port_id, int copp_idx,
-			     bool is_custom_stereo_on)
-{
-	return 0;
-}
-int set_custom_stereo_onoff(int dev_map_idx,
-			    bool is_custom_stereo_enabled)
-{
-	return 0;
-}
-int msm_ds2_dap_ioctl_shared(struct snd_hwdep *hw, struct file *file,
-			     u32 cmd, void *arg)
-{
-	return 0;
-}
-#endif /* CONFIG_DOLBY_DS2 || CONFIG_DOLBY_LICENSE */
diff --git a/asoc/msm-lsm-client.c b/asoc/msm-lsm-client.c
index 15cdfb1..f6a5698 100644
--- a/asoc/msm-lsm-client.c
+++ b/asoc/msm-lsm-client.c
@@ -2406,7 +2406,7 @@
 	return platform_driver_register(&msm_lsm_driver);
 }
 
-void __exit msm_lsm_client_exit(void)
+void msm_lsm_client_exit(void)
 {
 	platform_driver_unregister(&msm_lsm_driver);
 }
diff --git a/asoc/msm-pcm-afe-v2.c b/asoc/msm-pcm-afe-v2.c
index f700f0b..77eecb2 100644
--- a/asoc/msm-pcm-afe-v2.c
+++ b/asoc/msm-pcm-afe-v2.c
@@ -910,7 +910,7 @@
 	return platform_driver_register(&msm_afe_driver);
 }
 
-void __exit msm_pcm_afe_exit(void)
+void msm_pcm_afe_exit(void)
 {
 	pr_debug("%s\n", __func__);
 	platform_driver_unregister(&msm_afe_driver);
diff --git a/asoc/msm-pcm-dtmf-v2.c b/asoc/msm-pcm-dtmf-v2.c
index 7bc823b..9953eeb 100644
--- a/asoc/msm-pcm-dtmf-v2.c
+++ b/asoc/msm-pcm-dtmf-v2.c
@@ -585,7 +585,7 @@
 	return platform_driver_register(&msm_pcm_driver);
 }
 
-void __exit msm_pcm_dtmf_exit(void)
+void msm_pcm_dtmf_exit(void)
 {
 	platform_driver_unregister(&msm_pcm_driver);
 }
diff --git a/asoc/msm-pcm-host-voice-v2.c b/asoc/msm-pcm-host-voice-v2.c
index 0c47ec1..fd771df 100644
--- a/asoc/msm-pcm-host-voice-v2.c
+++ b/asoc/msm-pcm-host-voice-v2.c
@@ -1542,7 +1542,7 @@
 	return platform_driver_register(&msm_pcm_driver);
 }
 
-void __exit msm_voice_host_exit(void)
+void msm_voice_host_exit(void)
 {
 	platform_driver_unregister(&msm_pcm_driver);
 }
diff --git a/asoc/msm-pcm-hostless.c b/asoc/msm-pcm-hostless.c
index 90d76b4..e2850a4 100644
--- a/asoc/msm-pcm-hostless.c
+++ b/asoc/msm-pcm-hostless.c
@@ -71,7 +71,7 @@
 	return platform_driver_register(&msm_pcm_hostless_driver);
 }
 
-void __exit msm_pcm_hostless_exit(void)
+void msm_pcm_hostless_exit(void)
 {
 	platform_driver_unregister(&msm_pcm_hostless_driver);
 }
diff --git a/asoc/msm-pcm-loopback-v2.c b/asoc/msm-pcm-loopback-v2.c
index e50a005..1c26d19 100644
--- a/asoc/msm-pcm-loopback-v2.c
+++ b/asoc/msm-pcm-loopback-v2.c
@@ -790,7 +790,7 @@
 	return platform_driver_register(&msm_pcm_driver);
 }
 
-void __exit msm_pcm_loopback_exit(void)
+void msm_pcm_loopback_exit(void)
 {
 	platform_driver_unregister(&msm_pcm_driver);
 }
diff --git a/asoc/msm-pcm-q6-noirq.c b/asoc/msm-pcm-q6-noirq.c
index 307e7a6..dbc6d33 100644
--- a/asoc/msm-pcm-q6-noirq.c
+++ b/asoc/msm-pcm-q6-noirq.c
@@ -1273,7 +1273,7 @@
 	return platform_driver_register(&msm_pcm_driver_noirq);
 }
 
-void __exit msm_pcm_noirq_exit(void)
+void msm_pcm_noirq_exit(void)
 {
 	platform_driver_unregister(&msm_pcm_driver_noirq);
 }
diff --git a/asoc/msm-pcm-q6-v2.c b/asoc/msm-pcm-q6-v2.c
index 0a0e26d..314584e 100644
--- a/asoc/msm-pcm-q6-v2.c
+++ b/asoc/msm-pcm-q6-v2.c
@@ -1873,7 +1873,7 @@
 	return platform_driver_register(&msm_pcm_driver);
 }
 
-void __exit msm_pcm_dsp_exit(void)
+void msm_pcm_dsp_exit(void)
 {
 	platform_driver_unregister(&msm_pcm_driver);
 }
diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c
index 0aed70c..2149c68 100644
--- a/asoc/msm-pcm-routing-v2.c
+++ b/asoc/msm-pcm-routing-v2.c
@@ -3620,6 +3620,10 @@
 		msm_route_ec_ref_rx = 22;
 		ec_ref_port_id = AFE_PORT_ID_INT3_MI2S_TX;
 		break;
+	case 23:
+		msm_route_ec_ref_rx = 23;
+		ec_ref_port_id = AFE_PORT_ID_HDMI_OVER_DP_RX;
+		break;
 	default:
 		msm_route_ec_ref_rx = 0; /* NONE */
 		pr_err("%s EC ref rx %ld not valid\n",
@@ -3642,7 +3646,7 @@
 	"SLIM_5_RX", "SLIM_1_TX", "QUAT_TDM_TX_1",
 	"QUAT_TDM_RX_0", "QUAT_TDM_RX_1", "QUAT_TDM_RX_2", "SLIM_6_RX",
 	"TERT_MI2S_RX", "QUAT_MI2S_RX", "TERT_TDM_TX_0", "USB_AUDIO_RX",
-	"INT0_MI2S_RX", "INT4_MI2S_RX", "INT3_MI2S_TX"};
+	"INT0_MI2S_RX", "INT4_MI2S_RX", "INT3_MI2S_TX", "DISPLAY_PORT"};
 
 static const struct soc_enum msm_route_ec_ref_rx_enum[] = {
 	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ec_ref_rx), ec_ref_rx),
@@ -8014,15 +8018,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_SLIMBUS_0_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_SLIMBUS_0_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("Voice2 Stub", MSM_BACKEND_DAI_SLIMBUS_0_RX,
-	MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("VoLTE Stub", MSM_BACKEND_DAI_SLIMBUS_0_RX,
-	MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_SLIMBUS_0_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8041,15 +8036,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_SLIMBUS_6_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_SLIMBUS_6_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("Voice2 Stub", MSM_BACKEND_DAI_SLIMBUS_6_RX,
-	MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("VoLTE Stub", MSM_BACKEND_DAI_SLIMBUS_6_RX,
-	MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_SLIMBUS_6_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8068,15 +8054,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_USB_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_USB_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("Voice2 Stub", MSM_BACKEND_DAI_USB_RX,
-	MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("VoLTE Stub", MSM_BACKEND_DAI_USB_RX,
-	MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_USB_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8091,16 +8068,28 @@
 	msm_routing_put_voice_mixer),
 };
 
+static const struct snd_kcontrol_new display_port_rx_voice_mixer_controls[] = {
+	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_DISPLAY_PORT_RX,
+	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
+	msm_routing_put_voice_mixer),
+	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_DISPLAY_PORT_RX,
+	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
+	msm_routing_put_voice_mixer),
+	SOC_SINGLE_EXT("QCHAT", MSM_BACKEND_DAI_DISPLAY_PORT_RX,
+	MSM_FRONTEND_DAI_QCHAT, 1, 0, msm_routing_get_voice_mixer,
+	msm_routing_put_voice_mixer),
+	SOC_SINGLE_EXT("VoiceMMode1", MSM_BACKEND_DAI_DISPLAY_PORT_RX,
+	MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer,
+	msm_routing_put_voice_mixer),
+	SOC_SINGLE_EXT("VoiceMMode2", MSM_BACKEND_DAI_DISPLAY_PORT_RX,
+	MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer,
+	msm_routing_put_voice_mixer),
+};
+
 static const struct snd_kcontrol_new bt_sco_rx_voice_mixer_controls[] = {
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_INT_BT_SCO_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_INT_BT_SCO_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("Voice2 Stub", MSM_BACKEND_DAI_INT_BT_SCO_RX,
-	MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_INT_BT_SCO_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8119,9 +8108,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_MI2S_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_MI2S_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_MI2S_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8140,15 +8126,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_PRI_MI2S_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_PRI_MI2S_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("Voice2 Stub", MSM_BACKEND_DAI_PRI_MI2S_RX,
-	MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("VoLTE Stub", MSM_BACKEND_DAI_PRI_MI2S_RX,
-	MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_mixer,
-	msm_routing_put_voice_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_PRI_MI2S_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8203,15 +8180,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("Voice2 Stub", MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
-	MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("VoLTE Stub", MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
-	MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_mixer,
-	msm_routing_put_voice_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8230,15 +8198,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("Voice2 Stub", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
-	MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("VoLTE Stub", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
-	MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_mixer,
-	msm_routing_put_voice_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8257,15 +8216,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_QUINARY_MI2S_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_QUINARY_MI2S_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("Voice2 Stub", MSM_BACKEND_DAI_QUINARY_MI2S_RX,
-	MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("VoLTE Stub", MSM_BACKEND_DAI_QUINARY_MI2S_RX,
-	MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_mixer,
-	msm_routing_put_voice_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_QUINARY_MI2S_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8284,15 +8234,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_AFE_PCM_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_AFE_PCM_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("Voice2 Stub", MSM_BACKEND_DAI_AFE_PCM_RX,
-	MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("VoLTE Stub", MSM_BACKEND_DAI_AFE_PCM_RX,
-	MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_AFE_PCM_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8311,15 +8252,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_AUXPCM_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_AUXPCM_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("Voice2 Stub", MSM_BACKEND_DAI_AUXPCM_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("VoLTE Stub", MSM_BACKEND_DAI_AUXPCM_RX,
-	MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_AUXPCM_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8338,9 +8270,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_SEC_AUXPCM_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_SEC_AUXPCM_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_SEC_AUXPCM_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8359,9 +8288,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_TERT_AUXPCM_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_TERT_AUXPCM_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_TERT_AUXPCM_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8380,9 +8306,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_QUAT_AUXPCM_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_QUAT_AUXPCM_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_QUAT_AUXPCM_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8401,9 +8324,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_QUIN_AUXPCM_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_QUIN_AUXPCM_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_QUIN_AUXPCM_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8422,15 +8342,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_HDMI_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_HDMI_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("Voice2 Stub", MSM_BACKEND_DAI_HDMI_RX,
-	MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("VoLTE Stub", MSM_BACKEND_DAI_HDMI_RX,
-	MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_HDMI_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8449,15 +8360,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_SLIMBUS_7_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_SLIMBUS_7_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("Voice2 Stub", MSM_BACKEND_DAI_SLIMBUS_7_RX,
-	MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("VoLTE Stub", MSM_BACKEND_DAI_SLIMBUS_7_RX,
-	MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_SLIMBUS_7_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8476,15 +8378,6 @@
 	SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_SLIMBUS_8_RX,
 	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_SLIMBUS_8_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("Voice2 Stub", MSM_BACKEND_DAI_SLIMBUS_8_RX,
-	MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("VoLTE Stub", MSM_BACKEND_DAI_SLIMBUS_8_RX,
-	MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
 	SOC_SINGLE_EXT("DTMF", MSM_BACKEND_DAI_SLIMBUS_8_RX,
 	MSM_FRONTEND_DAI_DTMF_RX, 1, 0, msm_routing_get_voice_mixer,
 	msm_routing_put_voice_mixer),
@@ -8506,39 +8399,30 @@
 };
 
 static const struct snd_kcontrol_new stub_rx_mixer_controls[] = {
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_EXTPROC_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("Voice2 Stub", MSM_BACKEND_DAI_EXTPROC_RX,
-	MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("VoLTE Stub", MSM_BACKEND_DAI_EXTPROC_RX,
-	MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
+	SOC_SINGLE_EXT("VoiceMMode1", MSM_BACKEND_DAI_EXTPROC_RX,
+	MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer,
+	msm_routing_put_voice_mixer),
+	SOC_SINGLE_EXT("VoiceMMode2", MSM_BACKEND_DAI_EXTPROC_RX,
+	MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer,
+	msm_routing_put_voice_mixer),
 };
 
 static const struct snd_kcontrol_new slimbus_1_rx_mixer_controls[] = {
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_SLIMBUS_1_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("Voice2 Stub", MSM_BACKEND_DAI_SLIMBUS_1_RX,
-	MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("VoLTE Stub", MSM_BACKEND_DAI_SLIMBUS_1_RX,
-	MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
+	SOC_SINGLE_EXT("VoiceMMode1", MSM_BACKEND_DAI_SLIMBUS_1_RX,
+	MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer,
+	msm_routing_put_voice_mixer),
+	SOC_SINGLE_EXT("VoiceMMode2", MSM_BACKEND_DAI_SLIMBUS_1_RX,
+	MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer,
+	msm_routing_put_voice_mixer),
 };
 
 static const struct snd_kcontrol_new slimbus_3_rx_mixer_controls[] = {
-	SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_SLIMBUS_3_RX,
-	MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("Voice2 Stub", MSM_BACKEND_DAI_SLIMBUS_3_RX,
-	MSM_FRONTEND_DAI_VOICE2_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
-	SOC_SINGLE_EXT("VoLTE Stub", MSM_BACKEND_DAI_SLIMBUS_3_RX,
-	MSM_FRONTEND_DAI_VOLTE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
-	msm_routing_put_voice_stub_mixer),
+	SOC_SINGLE_EXT("VoiceMMode1", MSM_BACKEND_DAI_SLIMBUS_3_RX,
+	MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer,
+	msm_routing_put_voice_mixer),
+	SOC_SINGLE_EXT("VoiceMMode2", MSM_BACKEND_DAI_SLIMBUS_3_RX,
+	MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer,
+	msm_routing_put_voice_mixer),
 };
 
 static const struct snd_kcontrol_new tx_voicemmode1_mixer_controls[] = {
@@ -13552,6 +13436,9 @@
 	SND_SOC_DAPM_MIXER("USB_AUDIO_RX Port Mixer",
 	SND_SOC_NOPM, 0, 0, usb_rx_port_mixer_controls,
 	ARRAY_SIZE(usb_rx_port_mixer_controls)),
+	SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX_Voice Mixer",
+	SND_SOC_NOPM, 0, 0, display_port_rx_voice_mixer_controls,
+	ARRAY_SIZE(display_port_rx_voice_mixer_controls)),
 	/* lsm mixer definitions */
 	SND_SOC_DAPM_MIXER("LSM1 Mixer", SND_SOC_NOPM, 0, 0,
 	lsm1_mixer_controls, ARRAY_SIZE(lsm1_mixer_controls)),
@@ -15001,9 +14888,6 @@
 
 	{"SLIM_0_RX_Voice Mixer", "Voip", "VOIP_DL"},
 	{"SLIM_0_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
-	{"SLIM_0_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
-	{"SLIM_0_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
-	{"SLIM_0_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
 	{"SLIM_0_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
 	{"SLIM_0_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
 	{"SLIM_0_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
@@ -15011,9 +14895,6 @@
 
 	{"SLIM_6_RX_Voice Mixer", "Voip", "VOIP_DL"},
 	{"SLIM_6_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
-	{"SLIM_6_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
-	{"SLIM_6_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
-	{"SLIM_6_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
 	{"SLIM_6_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
 	{"SLIM_6_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
 	{"SLIM_6_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
@@ -15021,21 +14902,23 @@
 
 	{"USB_AUDIO_RX_Voice Mixer", "Voip", "VOIP_DL"},
 	{"USB_AUDIO_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
-	{"USB_AUDIO_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
-	{"USB_AUDIO_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
-	{"USB_AUDIO_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
 	{"USB_AUDIO_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
 	{"USB_AUDIO_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
 	{"USB_AUDIO_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
 	{"USB_AUDIO_RX", NULL, "USB_AUDIO_RX_Voice Mixer"},
 
+	{"DISPLAY_PORT_RX_Voice Mixer", "Voip", "VOIP_DL"},
+	{"DISPLAY_PORT_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
+	{"DISPLAY_PORT_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
+	{"DISPLAY_PORT_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
+	{"DISPLAY_PORT_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
+	{"DISPLAY_PORT", NULL, "DISPLAY_PORT_RX_Voice Mixer"},
+
 	{"INTERNAL_BT_SCO_RX_Voice Mixer", "Voip", "VOIP_DL"},
 	{"INTERNAL_BT_SCO_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
 	{"INTERNAL_BT_SCO_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
 	{"INTERNAL_BT_SCO_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
 	{"INTERNAL_BT_SCO_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
-	{"INTERNAL_BT_SCO_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
-	{"INTERNAL_BT_SCO_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
 	{"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX_Voice Mixer"},
 
 	{"AFE_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
@@ -15047,9 +14930,6 @@
 
 	{"AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
 	{"AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
-	{"AUX_PCM_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
-	{"AUX_PCM_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
-	{"AUX_PCM_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
 	{"AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
 	{"AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
 	{"AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
@@ -15057,7 +14937,6 @@
 
 	{"SEC_AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
 	{"SEC_AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
-	{"SEC_AUX_PCM_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
 	{"SEC_AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
 	{"SEC_AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
 	{"SEC_AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
@@ -15065,7 +14944,6 @@
 
 	{"TERT_AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
 	{"TERT_AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
-	{"TERT_AUX_PCM_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
 	{"TERT_AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
 	{"TERT_AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
 	{"TERT_AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
@@ -15073,7 +14951,6 @@
 
 	{"QUAT_AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
 	{"QUAT_AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
-	{"QUAT_AUX_PCM_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
 	{"QUAT_AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
 	{"QUAT_AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
 	{"QUAT_AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
@@ -15081,7 +14958,6 @@
 
 	{"QUIN_AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
 	{"QUIN_AUX_PCM_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
-	{"QUIN_AUX_PCM_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
 	{"QUIN_AUX_PCM_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
 	{"QUIN_AUX_PCM_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
 	{"QUIN_AUX_PCM_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
@@ -15096,7 +14972,6 @@
 	{"HDMI", NULL, "HDMI_DL_HL"},
 
 	{"MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"},
-	{"MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
 	{"MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
 	{"MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
 	{"MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
@@ -15104,9 +14979,6 @@
 	{"MI2S_RX", NULL, "MI2S_RX_Voice Mixer"},
 
 	{"PRI_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"},
-	{"PRI_MI2S_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
-	{"PRI_MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
-	{"PRI_MI2S_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
 	{"PRI_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
 	{"PRI_MI2S_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
 	{"PRI_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
@@ -15128,9 +15000,6 @@
 	{"INT4_MI2S_RX", NULL, "INT4_MI2S_RX_Voice Mixer"},
 
 	{"TERT_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"},
-	{"TERT_MI2S_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
-	{"TERT_MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
-	{"TERT_MI2S_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
 	{"TERT_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
 	{"TERT_MI2S_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
 	{"TERT_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
@@ -15138,18 +15007,12 @@
 	{"TERT_MI2S_RX", NULL, "TERT_MI2S_RX_Voice Mixer"},
 
 	{"QUAT_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"},
-	{"QUAT_MI2S_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
-	{"QUAT_MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
-	{"QUAT_MI2S_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
 	{"QUAT_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
 	{"QUAT_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
 	{"QUAT_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
 	{"QUAT_MI2S_RX", NULL, "QUAT_MI2S_RX_Voice Mixer"},
 
 	{"QUIN_MI2S_RX_Voice Mixer", "Voip", "VOIP_DL"},
-	{"QUIN_MI2S_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
-	{"QUIN_MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
-	{"QUIN_MI2S_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
 	{"QUIN_MI2S_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
 	{"QUIN_MI2S_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
 	{"QUIN_MI2S_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
@@ -15164,11 +15027,7 @@
 	{"VOC_EXT_EC MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
 	{"VOC_EXT_EC MUX", "QUIN_MI2S_TX", "QUIN_MI2S_TX"},
 	{"VOC_EXT_EC MUX", "SLIM_1_TX",    "SLIMBUS_1_TX"},
-	{"CS-VOICE_UL1", NULL, "VOC_EXT_EC MUX"},
 	{"VOIP_UL", NULL, "VOC_EXT_EC MUX"},
-	{"VoLTE_UL", NULL, "VOC_EXT_EC MUX"},
-	{"VOICE2_UL", NULL, "VOC_EXT_EC MUX"},
-	{"VoWLAN_UL", NULL, "VOC_EXT_EC MUX"},
 	{"VOICEMMODE1_UL", NULL, "VOC_EXT_EC MUX"},
 	{"VOICEMMODE2_UL", NULL, "VOC_EXT_EC MUX"},
 
@@ -15249,6 +15108,16 @@
 	{"AUDIO_REF_EC_UL19 MUX", "TERT_MI2S_TX", "TERT_MI2S_TX"},
 	{"AUDIO_REF_EC_UL19 MUX", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
 
+
+	{"LSM1_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"},
+	{"LSM2_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"},
+	{"LSM3_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"},
+	{"LSM4_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"},
+	{"LSM5_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"},
+	{"LSM6_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"},
+	{"LSM7_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"},
+	{"LSM8_UL_HL", NULL, "AUDIO_REF_EC_UL1 MUX"},
+
 	{"MM_UL1", NULL, "AUDIO_REF_EC_UL1 MUX"},
 	{"MM_UL2", NULL, "AUDIO_REF_EC_UL2 MUX"},
 	{"MM_UL3", NULL, "AUDIO_REF_EC_UL3 MUX"},
@@ -15263,75 +15132,6 @@
 	{"MM_UL18", NULL, "AUDIO_REF_EC_UL18 MUX"},
 	{"MM_UL19", NULL, "AUDIO_REF_EC_UL19 MUX"},
 
-	{"Voice_Tx Mixer", "PRI_TX_Voice", "PRI_I2S_TX"},
-	{"Voice_Tx Mixer", "PRI_MI2S_TX_Voice", "PRI_MI2S_TX"},
-	{"Voice_Tx Mixer", "MI2S_TX_Voice", "MI2S_TX"},
-	{"Voice_Tx Mixer", "TERT_MI2S_TX_Voice", "TERT_MI2S_TX"},
-	{"Voice_Tx Mixer", "SLIM_0_TX_Voice", "SLIMBUS_0_TX"},
-	{"Voice_Tx Mixer", "SLIM_7_TX_Voice", "SLIMBUS_7_TX"},
-	{"Voice_Tx Mixer", "SLIM_8_TX_Voice", "SLIMBUS_8_TX"},
-	{"Voice_Tx Mixer", "USB_AUDIO_TX_Voice", "USB_AUDIO_TX"},
-	{"Voice_Tx Mixer", "INTERNAL_BT_SCO_TX_Voice", "INT_BT_SCO_TX"},
-	{"Voice_Tx Mixer", "AFE_PCM_TX_Voice", "PCM_TX"},
-	{"Voice_Tx Mixer", "AUX_PCM_TX_Voice", "AUX_PCM_TX"},
-	{"Voice_Tx Mixer", "SEC_AUX_PCM_TX_Voice", "SEC_AUX_PCM_TX"},
-	{"Voice_Tx Mixer", "TERT_AUX_PCM_TX_Voice", "TERT_AUX_PCM_TX"},
-	{"Voice_Tx Mixer", "QUAT_AUX_PCM_TX_Voice", "QUAT_AUX_PCM_TX"},
-	{"Voice_Tx Mixer", "QUIN_AUX_PCM_TX_Voice", "QUIN_AUX_PCM_TX"},
-	{"Voice_Tx Mixer", "SEC_MI2S_TX_Voice", "SEC_MI2S_TX"},
-	{"CS-VOICE_UL1", NULL, "Voice_Tx Mixer"},
-
-	{"Voice2_Tx Mixer", "PRI_TX_Voice2", "PRI_I2S_TX"},
-	{"Voice2_Tx Mixer", "PRI_MI2S_TX_Voice2", "PRI_MI2S_TX"},
-	{"Voice2_Tx Mixer", "MI2S_TX_Voice2", "MI2S_TX"},
-	{"Voice2_Tx Mixer", "TERT_MI2S_TX_Voice2", "TERT_MI2S_TX"},
-	{"Voice2_Tx Mixer", "SLIM_0_TX_Voice2", "SLIMBUS_0_TX"},
-	{"Voice2_Tx Mixer", "SLIM_7_TX_Voice2", "SLIMBUS_7_TX"},
-	{"Voice2_Tx Mixer", "SLIM_8_TX_Voice2", "SLIMBUS_8_TX"},
-	{"Voice2_Tx Mixer", "USB_AUDIO_TX_Voice2", "USB_AUDIO_TX"},
-	{"Voice2_Tx Mixer", "INTERNAL_BT_SCO_TX_Voice2", "INT_BT_SCO_TX"},
-	{"Voice2_Tx Mixer", "AFE_PCM_TX_Voice2", "PCM_TX"},
-	{"Voice2_Tx Mixer", "AUX_PCM_TX_Voice2", "AUX_PCM_TX"},
-	{"Voice2_Tx Mixer", "SEC_AUX_PCM_TX_Voice2", "SEC_AUX_PCM_TX"},
-	{"Voice2_Tx Mixer", "TERT_AUX_PCM_TX_Voice2", "TERT_AUX_PCM_TX"},
-	{"Voice2_Tx Mixer", "QUAT_AUX_PCM_TX_Voice2", "QUAT_AUX_PCM_TX"},
-	{"Voice2_Tx Mixer", "QUIN_AUX_PCM_TX_Voice2", "QUIN_AUX_PCM_TX"},
-	{"VOICE2_UL", NULL, "Voice2_Tx Mixer"},
-
-	{"VoLTE_Tx Mixer", "PRI_TX_VoLTE", "PRI_I2S_TX"},
-	{"VoLTE_Tx Mixer", "SLIM_0_TX_VoLTE", "SLIMBUS_0_TX"},
-	{"VoLTE_Tx Mixer", "SLIM_7_TX_VoLTE", "SLIMBUS_7_TX"},
-	{"VoLTE_Tx Mixer", "SLIM_8_TX_VoLTE", "SLIMBUS_8_TX"},
-	{"VoLTE_Tx Mixer", "USB_AUDIO_TX_VoLTE", "USB_AUDIO_TX"},
-	{"VoLTE_Tx Mixer", "INTERNAL_BT_SCO_TX_VoLTE", "INT_BT_SCO_TX"},
-	{"VoLTE_Tx Mixer", "AFE_PCM_TX_VoLTE", "PCM_TX"},
-	{"VoLTE_Tx Mixer", "AUX_PCM_TX_VoLTE", "AUX_PCM_TX"},
-	{"VoLTE_Tx Mixer", "SEC_AUX_PCM_TX_VoLTE", "SEC_AUX_PCM_TX"},
-	{"VoLTE_Tx Mixer", "TERT_AUX_PCM_TX_VoLTE", "TERT_AUX_PCM_TX"},
-	{"VoLTE_Tx Mixer", "QUAT_AUX_PCM_TX_VoLTE", "QUAT_AUX_PCM_TX"},
-	{"VoLTE_Tx Mixer", "QUIN_AUX_PCM_TX_VoLTE", "QUIN_AUX_PCM_TX"},
-	{"VoLTE_Tx Mixer", "MI2S_TX_VoLTE", "MI2S_TX"},
-	{"VoLTE_Tx Mixer", "PRI_MI2S_TX_VoLTE", "PRI_MI2S_TX"},
-	{"VoLTE_Tx Mixer", "TERT_MI2S_TX_VoLTE", "TERT_MI2S_TX"},
-	{"VoLTE_UL", NULL, "VoLTE_Tx Mixer"},
-
-	{"VoWLAN_Tx Mixer", "PRI_TX_VoWLAN", "PRI_I2S_TX"},
-	{"VoWLAN_Tx Mixer", "SLIM_0_TX_VoWLAN", "SLIMBUS_0_TX"},
-	{"VoWLAN_Tx Mixer", "SLIM_7_TX_VoWLAN", "SLIMBUS_7_TX"},
-	{"VoWLAN_Tx Mixer", "SLIM_8_TX_VoWLAN", "SLIMBUS_8_TX"},
-	{"VoWLAN_Tx Mixer", "USB_AUDIO_TX_VoWLAN", "USB_AUDIO_TX"},
-	{"VoWLAN_Tx Mixer", "INTERNAL_BT_SCO_TX_VoWLAN", "INT_BT_SCO_TX"},
-	{"VoWLAN_Tx Mixer", "AFE_PCM_TX_VoWLAN", "PCM_TX"},
-	{"VoWLAN_Tx Mixer", "AUX_PCM_TX_VoWLAN", "AUX_PCM_TX"},
-	{"VoWLAN_Tx Mixer", "SEC_AUX_PCM_TX_VoWLAN", "SEC_AUX_PCM_TX"},
-	{"VoWLAN_Tx Mixer", "TERT_AUX_PCM_TX_VoWLAN", "TERT_AUX_PCM_TX"},
-	{"VoWLAN_Tx Mixer", "QUAT_AUX_PCM_TX_VoWLAN", "QUAT_AUX_PCM_TX"},
-	{"VoWLAN_Tx Mixer", "QUIN_AUX_PCM_TX_VoWLAN", "QUIN_AUX_PCM_TX"},
-	{"VoWLAN_Tx Mixer", "MI2S_TX_VoWLAN", "MI2S_TX"},
-	{"VoWLAN_Tx Mixer", "PRI_MI2S_TX_VoWLAN", "PRI_MI2S_TX"},
-	{"VoWLAN_Tx Mixer", "TERT_MI2S_TX_VoWLAN", "TERT_MI2S_TX"},
-	{"VoWLAN_UL", NULL, "VoWLAN_Tx Mixer"},
-
 	{"VoiceMMode1_Tx Mixer", "PRI_TX_MMode1", "PRI_I2S_TX"},
 	{"VoiceMMode1_Tx Mixer", "PRI_MI2S_TX_MMode1", "PRI_MI2S_TX"},
 	{"VoiceMMode1_Tx Mixer", "MI2S_TX_MMode1", "MI2S_TX"},
@@ -16151,27 +15951,20 @@
 	{"Voice2 Stub Tx Mixer", "QUAT_MI2S_TX", "QUAT_MI2S_TX"},
 	{"VOICE2_STUB_UL", NULL, "Voice2 Stub Tx Mixer"},
 
-	{"STUB_RX Mixer", "Voice Stub", "VOICE_STUB_DL"},
-	{"STUB_RX Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
-	{"STUB_RX Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
+	{"STUB_RX Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
+	{"STUB_RX Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
 	{"STUB_RX", NULL, "STUB_RX Mixer"},
-	{"SLIMBUS_1_RX Mixer", "Voice Stub", "VOICE_STUB_DL"},
-	{"SLIMBUS_1_RX Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
-	{"SLIMBUS_1_RX Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
+
+	{"SLIMBUS_1_RX Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
+	{"SLIMBUS_1_RX Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
 	{"SLIMBUS_1_RX", NULL, "SLIMBUS_1_RX Mixer"},
-	{"AFE_PCM_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
-	{"AFE_PCM_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
-	{"AFE_PCM_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
-	{"SLIMBUS_3_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
-	{"SLIMBUS_3_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
-	{"SLIMBUS_3_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
+
+	{"SLIMBUS_3_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
+	{"SLIMBUS_3_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
 	{"SLIMBUS_3_RX", NULL, "SLIMBUS_3_RX_Voice Mixer"},
 
 	{"SLIM_7_RX_Voice Mixer", "Voip", "VOIP_DL"},
 	{"SLIM_7_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
-	{"SLIM_7_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
-	{"SLIM_7_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
-	{"SLIM_7_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
 	{"SLIM_7_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
 	{"SLIM_7_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
 	{"SLIM_7_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
@@ -16179,9 +15972,6 @@
 
 	{"SLIM_8_RX_Voice Mixer", "Voip", "VOIP_DL"},
 	{"SLIM_8_RX_Voice Mixer", "DTMF", "DTMF_DL_HL"},
-	{"SLIM_8_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
-	{"SLIM_8_RX_Voice Mixer", "Voice2 Stub", "VOICE2_STUB_DL"},
-	{"SLIM_8_RX_Voice Mixer", "VoLTE Stub", "VOLTE_STUB_DL"},
 	{"SLIM_8_RX_Voice Mixer", "QCHAT", "QCHAT_DL"},
 	{"SLIM_8_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
 	{"SLIM_8_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
@@ -17212,7 +17002,7 @@
 	return platform_driver_register(&msm_routing_pcm_driver);
 }
 
-void __exit msm_soc_routing_platform_exit(void)
+void msm_soc_routing_platform_exit(void)
 {
 	msm_routing_delete_cal_data();
 	memset(&be_dai_name_table, 0, sizeof(be_dai_name_table));
diff --git a/asoc/msm-pcm-voice-v2.c b/asoc/msm-pcm-voice-v2.c
index 7b236b4..b82c587 100644
--- a/asoc/msm-pcm-voice-v2.c
+++ b/asoc/msm-pcm-voice-v2.c
@@ -770,7 +770,7 @@
 	return platform_driver_register(&msm_pcm_driver);
 }
 
-void __exit msm_pcm_voice_exit(void)
+void msm_pcm_voice_exit(void)
 {
 	platform_driver_unregister(&msm_pcm_driver);
 }
diff --git a/asoc/msm-pcm-voip-v2.c b/asoc/msm-pcm-voip-v2.c
index 58fc534..02cee29 100644
--- a/asoc/msm-pcm-voip-v2.c
+++ b/asoc/msm-pcm-voip-v2.c
@@ -1704,7 +1704,7 @@
 	return platform_driver_register(&msm_pcm_driver);
 }
 
-void __exit msm_pcm_voip_exit(void)
+void msm_pcm_voip_exit(void)
 {
 	platform_driver_unregister(&msm_pcm_driver);
 }
diff --git a/asoc/msm-transcode-loopback-q6-v2.c b/asoc/msm-transcode-loopback-q6-v2.c
index 94ebbf7..3c8e917 100644
--- a/asoc/msm-transcode-loopback-q6-v2.c
+++ b/asoc/msm-transcode-loopback-q6-v2.c
@@ -958,7 +958,7 @@
 	return platform_driver_register(&msm_transcode_loopback_driver);
 }
 
-void __exit msm_transcode_loopback_exit(void)
+void msm_transcode_loopback_exit(void)
 {
 	mutex_destroy(&transcode_info.lock);
 	platform_driver_unregister(&msm_transcode_loopback_driver);
diff --git a/asoc/sdm845.c b/asoc/sdm845.c
index d75174c..1bc31fb 100644
--- a/asoc/sdm845.c
+++ b/asoc/sdm845.c
@@ -404,7 +404,9 @@
 					"KHZ_32", "KHZ_44P1", "KHZ_48",
 					"KHZ_88P2", "KHZ_96", "KHZ_176P4",
 					"KHZ_192", "KHZ_352P8", "KHZ_384"};
-static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_48"};
+static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16",
+					"KHZ_44P1", "KHZ_48",
+					"KHZ_88P2", "KHZ_96"};
 static const char *const usb_ch_text[] = {"One", "Two", "Three", "Four",
 					   "Five", "Six", "Seven",
 					   "Eight"};
@@ -984,7 +986,16 @@
 	 * value.
 	 */
 	switch (slim_rx_cfg[SLIM_RX_7].sample_rate) {
+	case SAMPLING_RATE_96KHZ:
+		ucontrol->value.integer.value[0] = 5;
+		break;
+	case SAMPLING_RATE_88P2KHZ:
+		ucontrol->value.integer.value[0] = 4;
+		break;
 	case SAMPLING_RATE_48KHZ:
+		ucontrol->value.integer.value[0] = 3;
+		break;
+	case SAMPLING_RATE_44P1KHZ:
 		ucontrol->value.integer.value[0] = 2;
 		break;
 	case SAMPLING_RATE_16KHZ:
@@ -1010,9 +1021,21 @@
 		slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ;
 		break;
 	case 2:
+		slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ;
+		slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ;
+		break;
+	case 3:
 		slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ;
 		slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ;
 		break;
+	case 4:
+		slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ;
+		slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ;
+		break;
+	case 5:
+		slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ;
+		slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ;
+		break;
 	case 0:
 	default:
 		slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ;
diff --git a/config/sdm670auto_static.conf b/config/sdm670auto_static.conf
new file mode 100644
index 0000000..dc55564
--- /dev/null
+++ b/config/sdm670auto_static.conf
@@ -0,0 +1,50 @@
+CONFIG_PINCTRL_LPI=y
+CONFIG_PINCTRL_WCD=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_WCD_CPE=y
+CONFIG_SND_SOC_CPE=y
+CONFIG_SND_SOC_WCD9335=y
+CONFIG_SND_SOC_WCD934X=y
+CONFIG_SND_SOC_WCD934X_MBHC=y
+CONFIG_SND_SOC_WCD934X_DSD=y
+CONFIG_MSM_QDSP6V2_CODECS=y
+CONFIG_MSM_ULTRASOUND=y
+CONFIG_MSM_QDSP6_APRV2_GLINK=y
+CONFIG_MSM_ADSP_LOADER=y
+CONFIG_REGMAP_SWR=y
+CONFIG_MSM_QDSP6_SSR=y
+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_SDM670=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_WCD9XXX_CODEC_CORE=y
+CONFIG_MSM_CDC_PINCTRL=y
+CONFIG_SND_SOC_WCD_MBHC_ADC=y
+CONFIG_SND_SOC_WCD_MBHC_LEGACY=y
+CONFIG_QTI_PP=y
+CONFIG_SND_HWDEP=y
+CONFIG_DTS_EAGLE=y
+CONFIG_DOLBY_DS2=y
+CONFIG_DOLBY_LICENSE=y
+CONFIG_DTS_SRS_TM=y
+CONFIG_SND_SOC_EXT_CODEC=y
+CONFIG_SND_SOC_INT_CODEC=y
+CONFIG_SND_SOC_MSM_STUB=y
+CONFIG_WCD_DSP_GLINK=y
+CONFIG_MSM_AVTIMER=y
+CONFIG_SND_SOC_SDM660_CDC=y
+CONFIG_SND_SOC_ANALOG_CDC=y
+CONFIG_SND_SOC_DIGITAL_CDC=y
+CONFIG_SND_SOC_MSM_SDW=y
+CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=y
diff --git a/dsp/Kbuild b/dsp/Kbuild
index 8772085..306a25a 100644
--- a/dsp/Kbuild
+++ b/dsp/Kbuild
@@ -1,22 +1,33 @@
 # We can build either as part of a standalone Kernel build or as
 # an external module.  Determine which mechanism is being used
-KERNEL_BUILD := 0
+ifeq ($(MODNAME), )
+	KERNEL_BUILD := 1
+else
+	KERNEL_BUILD := 0
+endif
 
-
-ifeq ($(KERNEL_BUILD), 0)
+ifeq ($(KERNEL_BUILD), 1)
 	# These are configurable via Kconfig for kernel-based builds
 	# Need to explicitly configure for Android-based builds
+	AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.9
+	AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio
+endif
+
+ifeq ($(KERNEL_BUILD), 0)
 	ifeq ($(CONFIG_ARCH_SDM845), y)
 		include $(AUDIO_ROOT)/config/sdm845auto.conf
 		export
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
 	endif
 	ifeq ($(CONFIG_ARCH_SDM670), y)
 		include $(AUDIO_ROOT)/config/sdm670auto.conf
 		export
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
 	endif
 endif
 
 
+
 # As per target team, build is done as follows:
 # Defconfig : build with default flags
 # Slub      : defconfig  + CONFIG_SLUB_DEBUG := y +
@@ -43,10 +54,9 @@
 
 ############ QDSP6V2 ############
 
-ifeq ($(CONFIG_SND_SOC_MSM_QDSP6V2_INTF), m)
+ifdef CONFIG_SND_SOC_MSM_QDSP6V2_INTF
 	Q6_OBJS += audio_calibration.o
 	Q6_OBJS += audio_cal_utils.o
-	Q6_OBJS += msm-dts-srs-tm-config.o
 	Q6_OBJS += q6adm.o
 	Q6_OBJS += q6afe.o
 	Q6_OBJS += q6asm.o
@@ -61,34 +71,31 @@
 	Q6_OBJS += avtimer.o
 	Q6_OBJS += q6_init.o
 endif
-ifeq ($(CONFIG_MSM_ADSP_LOADER), m)
+ifdef CONFIG_DTS_SRS_TM
+	Q6_OBJS += msm-dts-srs-tm-config.o
+endif
+
+ifdef CONFIG_MSM_ADSP_LOADER
 ADSP_LOADER_OBJS += adsp-loader.o
 endif
 
-ifeq ($(CONFIG_MSM_QDSP6_NOTIFIER), m)
+ifdef CONFIG_MSM_QDSP6_NOTIFIER
 QDSP6_NOTIFIER_OBJS += audio_notifier.o audio_ssr.o
 endif
 
-ifeq ($(CONFIG_MSM_QDSP6_PDR), m)
+ifdef CONFIG_MSM_QDSP6_PDR
 QDSP6_PDR_OBJS += audio_pdr.o
 endif
 
-ifeq ($(CONFIG_MSM_ULTRASOUND), m)
+ifdef CONFIG_MSM_ULTRASOUND
 USF_OBJS += usf.o usfcdev.o q6usm.o
 endif
 
 LINUX_INC +=	-Iinclude/linux
 
-INCS :=		$(COMMON_INC) \
+INCS +=		$(COMMON_INC) \
 		$(UAPI_INC)
 
-ifeq ($(CONFIG_ARCH_SDM845), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
-endif
-ifeq ($(CONFIG_ARCH_SDM670), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
-endif
-
 EXTRA_CFLAGS += $(INCS)
 
 
@@ -128,7 +135,13 @@
 CDEFINES += -DMULTI_IF_NAME=\"$(CHIP_NAME)\"
 endif
 
+ifeq ($(KERNEL_BUILD), 0)
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers
+endif
+
+ifeq ($(KERNEL_BUILD), 1)
+	obj-y += codecs/
+endif
 
 obj-$(CONFIG_SND_SOC_MSM_QDSP6V2_INTF) += q6_dlkm.o
 q6_dlkm-y := $(Q6_OBJS)
diff --git a/dsp/Makefile b/dsp/Makefile
deleted file mode 100644
index b609df2..0000000
--- a/dsp/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-obj-$(CONFIG_SND_SOC_MSM_QDSP6V2_INTF) += audio_calibration.o audio_cal_utils.o \
-						q6adm.o q6afe.o q6asm.o q6audio-v2.o q6voice.o q6core.o \
-						rtac.o q6lsm.o audio_slimslave.o adsp_err.o msm_audio_ion.o
-obj-$(CONFIG_MSM_ADSP_LOADER) += adsp-loader.o
-obj-$(CONFIG_MSM_QDSP6_SSR) += audio_ssr.o
-obj-$(CONFIG_MSM_QDSP6_PDR) += audio_pdr.o
-obj-$(CONFIG_MSM_QDSP6_NOTIFIER) += audio_notifier.o
-obj-$(CONFIG_MSM_ULTRASOUND) += usf.o usfcdev.o q6usm.o
-obj-$(CONFIG_MSM_AVTIMER) += avtimer.o
-obj-$(CONFIG_MSM_QDSP6V2_CODECS)  += codecs/
diff --git a/dsp/adsp_err.c b/dsp/adsp_err.c
index 7ad80dc..e34d76b 100644
--- a/dsp/adsp_err.c
+++ b/dsp/adsp_err.c
@@ -167,7 +167,7 @@
 
 #endif
 
-void __exit adsp_err_exit(void)
+void adsp_err_exit(void)
 {
 	return;
 }
diff --git a/dsp/audio_calibration.c b/dsp/audio_calibration.c
index f812c98..c895fa7 100644
--- a/dsp/audio_calibration.c
+++ b/dsp/audio_calibration.c
@@ -609,7 +609,7 @@
 	return misc_register(&audio_cal_misc);
 }
 
-void __exit audio_cal_exit(void)
+void audio_cal_exit(void)
 {
 	int i = 0;
 	struct list_head *ptr, *next;
diff --git a/dsp/audio_slimslave.c b/dsp/audio_slimslave.c
index f9e9cdc..25866d1 100644
--- a/dsp/audio_slimslave.c
+++ b/dsp/audio_slimslave.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2014, 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
@@ -165,7 +165,7 @@
 	return slim_driver_register(&audio_slimslave_driver);
 }
 
-void __exit audio_slimslave_exit(void)
+void audio_slimslave_exit(void)
 {
 
 }
diff --git a/dsp/avtimer.c b/dsp/avtimer.c
index 184e0e9..b6833ed 100644
--- a/dsp/avtimer.c
+++ b/dsp/avtimer.c
@@ -535,7 +535,7 @@
 	return rc;
 }
 
-void __exit avtimer_exit(void)
+void avtimer_exit(void)
 {
 	platform_driver_unregister(&dev_avtimer_driver);
 }
diff --git a/dsp/codecs/Kbuild b/dsp/codecs/Kbuild
index 683f599..13b2399 100644
--- a/dsp/codecs/Kbuild
+++ b/dsp/codecs/Kbuild
@@ -1,22 +1,32 @@
 # We can build either as part of a standalone Kernel build or as
 # an external module.  Determine which mechanism is being used
-KERNEL_BUILD := 0
+ifeq ($(MODNAME), )
+	KERNEL_BUILD := 1
+else
+	KERNEL_BUILD := 0
+endif
 
-
-ifeq ($(KERNEL_BUILD), 0)
+ifeq ($(KERNEL_BUILD), 1)
 	# These are configurable via Kconfig for kernel-based builds
 	# Need to explicitly configure for Android-based builds
+	AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.9
+	AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio
+endif
+
+ifeq ($(KERNEL_BUILD), 0)
 	ifeq ($(CONFIG_ARCH_SDM845), y)
 		include $(AUDIO_ROOT)/config/sdm845auto.conf
 		export
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
+
 	endif
 	ifeq ($(CONFIG_ARCH_SDM670), y)
 		include $(AUDIO_ROOT)/config/sdm670auto.conf
 		export
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
 	endif
 endif
 
-
 # As per target team, build is done as follows:
 # Defconfig : build with default flags
 # Slub      : defconfig  + CONFIG_SLUB_DEBUG := y +
@@ -43,7 +53,7 @@
 
 ############ Native Enc/Dec ############
 
-ifeq ($(CONFIG_MSM_QDSP6V2_CODECS), m)
+ifdef CONFIG_MSM_QDSP6V2_CODECS
 	NATIVE_OBJS += q6audio_v2.o q6audio_v2_aio.o
 	NATIVE_OBJS += audio_utils_aio.o
 	NATIVE_OBJS += audio_utils.o
@@ -74,16 +84,9 @@
 
 LINUX_INC +=	-Iinclude/linux
 
-INCS :=		$(COMMON_INC) \
+INCS +=		$(COMMON_INC) \
 		$(UAPI_INC)
 
-ifeq ($(CONFIG_ARCH_SDM845), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
-endif
-ifeq ($(CONFIG_ARCH_SDM670), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
-endif
-
 EXTRA_CFLAGS += $(INCS)
 
 
@@ -112,17 +115,9 @@
 EXTRA_CFLAGS += -Wheader-guard
 endif
 
+ifeq ($(KERNEL_BUILD), 0)
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers
-# If the module name is not "wlan", then the define MULTI_IF_NAME to be the
-# same a the QCA CHIP name. The host driver will then append MULTI_IF_NAME to
-# any string that must be unique for all instances of the driver on the system.
-# This allows multiple instances of the driver with different module names.
-# If the module name is wlan, leave MULTI_IF_NAME undefined and the code will
-# treat the driver as the primary driver.
-ifneq ($(MODNAME), qdsp6v2)
-CHIP_NAME ?= $(MODNAME)
-CDEFINES += -DMULTI_IF_NAME=\"$(CHIP_NAME)\"
 endif
 
 # Module information used by KBuild framework
diff --git a/dsp/codecs/Makefile b/dsp/codecs/Makefile
deleted file mode 100644
index f905219..0000000
--- a/dsp/codecs/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-obj-$(CONFIG_MSM_QDSP6V2_CODECS) += aac_in.o qcelp_in.o evrc_in.o amrnb_in.o g711mlaw_in.o g711alaw_in.o audio_utils.o
-obj-$(CONFIG_MSM_QDSP6V2_CODECS) += audio_wma.o audio_wmapro.o audio_aac.o audio_multi_aac.o audio_alac.o audio_ape.o audio_utils_aio.o
-obj-$(CONFIG_MSM_QDSP6V2_CODECS) += q6audio_v2.o q6audio_v2_aio.o
-obj-$(CONFIG_MSM_QDSP6V2_CODECS) += audio_g711mlaw.o audio_g711alaw.o
-obj-$(CONFIG_MSM_QDSP6V2_CODECS)  += audio_mp3.o audio_amrnb.o audio_amrwb.o audio_amrwbplus.o audio_evrc.o audio_qcelp.o amrwb_in.o audio_hwacc_effects.o
diff --git a/dsp/codecs/aac_in.c b/dsp/codecs/aac_in.c
index 5c07141..e10fbee 100644
--- a/dsp/codecs/aac_in.c
+++ b/dsp/codecs/aac_in.c
@@ -707,7 +707,7 @@
 	return misc_register(&audio_aac_in_misc);
 }
 
-void __exit aac_in_exit(void)
+void aac_in_exit(void)
 {
 	misc_deregister(&audio_aac_in_misc);
 }
diff --git a/dsp/codecs/amrnb_in.c b/dsp/codecs/amrnb_in.c
index d9a019d..4e35860 100644
--- a/dsp/codecs/amrnb_in.c
+++ b/dsp/codecs/amrnb_in.c
@@ -399,7 +399,7 @@
 	return misc_register(&audio_amrnb_in_misc);
 }
 
-void __exit amrnb_in_exit(void)
+void amrnb_in_exit(void)
 {
 	misc_deregister(&audio_amrnb_in_misc);
 }
diff --git a/dsp/codecs/amrwb_in.c b/dsp/codecs/amrwb_in.c
index d1d4ab7..ce9dc45 100644
--- a/dsp/codecs/amrwb_in.c
+++ b/dsp/codecs/amrwb_in.c
@@ -397,7 +397,7 @@
 	return misc_register(&audio_amrwb_in_misc);
 }
 
-void __exit amrwb_in_exit(void)
+void amrwb_in_exit(void)
 {
 	misc_deregister(&audio_amrwb_in_misc);
 }
diff --git a/dsp/codecs/audio_aac.c b/dsp/codecs/audio_aac.c
index ea7506f..c742f72 100644
--- a/dsp/codecs/audio_aac.c
+++ b/dsp/codecs/audio_aac.c
@@ -473,7 +473,7 @@
 	return ret;
 }
 
-void __exit audio_aac_exit(void)
+void audio_aac_exit(void)
 {
 	mutex_destroy(&audio_aac_ws_mgr.ws_lock);
 	misc_deregister(&audio_aac_misc);
diff --git a/dsp/codecs/audio_alac.c b/dsp/codecs/audio_alac.c
index 50a0bf7..cfb3087 100644
--- a/dsp/codecs/audio_alac.c
+++ b/dsp/codecs/audio_alac.c
@@ -432,7 +432,7 @@
 	return ret;
 }
 
-void __exit audio_alac_exit(void)
+void audio_alac_exit(void)
 {
 	mutex_destroy(&audio_alac_ws_mgr.ws_lock);
 	misc_deregister(&audio_alac_misc);
diff --git a/dsp/codecs/audio_amrnb.c b/dsp/codecs/audio_amrnb.c
index 0417742..1b5dd94 100644
--- a/dsp/codecs/audio_amrnb.c
+++ b/dsp/codecs/audio_amrnb.c
@@ -223,7 +223,7 @@
 	return ret;
 }
 
-void __exit audio_amrnb_exit(void)
+void audio_amrnb_exit(void)
 {
 	mutex_destroy(&audio_amrnb_ws_mgr.ws_lock);
 	misc_deregister(&audio_amrnb_misc);
diff --git a/dsp/codecs/audio_amrwb.c b/dsp/codecs/audio_amrwb.c
index 091bee4..1408782 100644
--- a/dsp/codecs/audio_amrwb.c
+++ b/dsp/codecs/audio_amrwb.c
@@ -228,7 +228,7 @@
 	return ret;
 }
 
-void __exit audio_amrwb_exit(void)
+void audio_amrwb_exit(void)
 {
 	mutex_destroy(&audio_amrwb_ws_mgr.ws_lock);
 	misc_deregister(&audio_amrwb_misc);
diff --git a/dsp/codecs/audio_amrwbplus.c b/dsp/codecs/audio_amrwbplus.c
index 566aee7..9d6c118 100644
--- a/dsp/codecs/audio_amrwbplus.c
+++ b/dsp/codecs/audio_amrwbplus.c
@@ -394,7 +394,7 @@
 	return ret;
 }
 
-void __exit audio_amrwbplus_exit(void)
+void audio_amrwbplus_exit(void)
 {
 	mutex_destroy(&audio_amrwbplus_ws_mgr.ws_lock);
 	misc_deregister(&audio_amrwbplus_misc);
diff --git a/dsp/codecs/audio_ape.c b/dsp/codecs/audio_ape.c
index b11f83e..3df6347 100644
--- a/dsp/codecs/audio_ape.c
+++ b/dsp/codecs/audio_ape.c
@@ -356,7 +356,7 @@
 	return ret;
 }
 
-void __exit audio_ape_exit(void)
+void audio_ape_exit(void)
 {
 	mutex_destroy(&audio_ape_ws_mgr.ws_lock);
 	misc_deregister(&audio_ape_misc);
diff --git a/dsp/codecs/audio_evrc.c b/dsp/codecs/audio_evrc.c
index 78bbde6..6cddc9c 100644
--- a/dsp/codecs/audio_evrc.c
+++ b/dsp/codecs/audio_evrc.c
@@ -181,7 +181,7 @@
 	return ret;
 }
 
-void __exit audio_evrc_exit(void)
+void audio_evrc_exit(void)
 {
 	mutex_destroy(&audio_evrc_ws_mgr.ws_lock);
 	misc_deregister(&audio_evrc_misc);
diff --git a/dsp/codecs/audio_g711alaw.c b/dsp/codecs/audio_g711alaw.c
index a6e0a6e..6382616 100644
--- a/dsp/codecs/audio_g711alaw.c
+++ b/dsp/codecs/audio_g711alaw.c
@@ -387,7 +387,7 @@
 	return ret;
 }
 
-void __exit audio_g711alaw_exit(void)
+void audio_g711alaw_exit(void)
 {
 	mutex_destroy(&audio_g711_ws_mgr.ws_lock);
 	misc_deregister(&audio_g711alaw_misc);
diff --git a/dsp/codecs/audio_g711mlaw.c b/dsp/codecs/audio_g711mlaw.c
index 2a2598c..9994aab 100644
--- a/dsp/codecs/audio_g711mlaw.c
+++ b/dsp/codecs/audio_g711mlaw.c
@@ -386,7 +386,7 @@
 	return ret;
 }
 
-void __exit audio_g711mlaw_exit(void)
+void audio_g711mlaw_exit(void)
 {
 	mutex_destroy(&audio_g711_ws_mgr.ws_lock);
 	misc_deregister(&audio_g711mlaw_misc);
diff --git a/dsp/codecs/audio_hwacc_effects.c b/dsp/codecs/audio_hwacc_effects.c
index cd54b90..f66164b 100644
--- a/dsp/codecs/audio_hwacc_effects.c
+++ b/dsp/codecs/audio_hwacc_effects.c
@@ -772,7 +772,7 @@
 	return misc_register(&audio_effects_misc);
 }
 
-void __exit audio_effects_exit(void)
+void audio_effects_exit(void)
 {
 	misc_deregister(&audio_effects_misc);
 }
diff --git a/dsp/codecs/audio_mp3.c b/dsp/codecs/audio_mp3.c
index 81e8486..4435f3e 100644
--- a/dsp/codecs/audio_mp3.c
+++ b/dsp/codecs/audio_mp3.c
@@ -185,7 +185,7 @@
 	return ret;
 }
 
-void __exit audio_mp3_exit(void)
+void audio_mp3_exit(void)
 {
 	mutex_destroy(&audio_mp3_ws_mgr.ws_lock);
 	misc_deregister(&audio_mp3_misc);
diff --git a/dsp/codecs/audio_multi_aac.c b/dsp/codecs/audio_multi_aac.c
index c3e616a..93b1f50 100644
--- a/dsp/codecs/audio_multi_aac.c
+++ b/dsp/codecs/audio_multi_aac.c
@@ -111,7 +111,14 @@
 			pr_err("cmd media format block failed\n");
 			break;
 		}
-		rc = q6asm_set_encdec_chan_map(audio->ac, 2);
+
+		/* Fall back to the default number of channels
+		 * if aac_cfg.ch_cfg is not between 1-6
+		 */
+		if ((aac_cfg.ch_cfg == 0) || (aac_cfg.ch_cfg > 6))
+			aac_cfg.ch_cfg = 2;
+
+		rc = q6asm_set_encdec_chan_map(audio->ac, aac_cfg.ch_cfg);
 		if (rc < 0) {
 			pr_err("%s: cmd set encdec_chan_map failed\n",
 				__func__);
@@ -520,7 +527,7 @@
 	return ret;
 }
 
-void __exit audio_multiaac_exit(void)
+void audio_multiaac_exit(void)
 {
 	mutex_destroy(&audio_multiaac_ws_mgr.ws_lock);
 	misc_deregister(&audio_multiaac_misc);
diff --git a/dsp/codecs/audio_qcelp.c b/dsp/codecs/audio_qcelp.c
index 8690294..4b23bac 100644
--- a/dsp/codecs/audio_qcelp.c
+++ b/dsp/codecs/audio_qcelp.c
@@ -188,7 +188,7 @@
 	return ret;
 }
 
-void __exit audio_qcelp_exit(void)
+void audio_qcelp_exit(void)
 {
 	mutex_destroy(&audio_qcelp_ws_mgr.ws_lock);
 	misc_deregister(&audio_qcelp_misc);
diff --git a/dsp/codecs/audio_wma.c b/dsp/codecs/audio_wma.c
index 975dc0b..ef9c8c6 100644
--- a/dsp/codecs/audio_wma.c
+++ b/dsp/codecs/audio_wma.c
@@ -342,7 +342,7 @@
 	return ret;
 }
 
-void __exit audio_wma_exit(void)
+void audio_wma_exit(void)
 {
 	mutex_destroy(&audio_wma_ws_mgr.ws_lock);
 	misc_deregister(&audio_wma_misc);
diff --git a/dsp/codecs/audio_wmapro.c b/dsp/codecs/audio_wmapro.c
index 3ce4cdc..2182618 100644
--- a/dsp/codecs/audio_wmapro.c
+++ b/dsp/codecs/audio_wmapro.c
@@ -415,7 +415,7 @@
 	return ret;
 }
 
-void __exit audio_wmapro_exit(void)
+void audio_wmapro_exit(void)
 {
 	mutex_destroy(&audio_wmapro_ws_mgr.ws_lock);
 	misc_deregister(&audio_wmapro_misc);
diff --git a/dsp/codecs/evrc_in.c b/dsp/codecs/evrc_in.c
index 158ff6f..15f08e7 100644
--- a/dsp/codecs/evrc_in.c
+++ b/dsp/codecs/evrc_in.c
@@ -407,7 +407,7 @@
 	return misc_register(&audio_evrc_in_misc);
 }
 
-void __exit evrc_in_exit(void)
+void evrc_in_exit(void)
 {
 	misc_deregister(&audio_evrc_in_misc);
 }
diff --git a/dsp/codecs/g711alaw_in.c b/dsp/codecs/g711alaw_in.c
index bd49bc9..c668b48 100644
--- a/dsp/codecs/g711alaw_in.c
+++ b/dsp/codecs/g711alaw_in.c
@@ -379,7 +379,7 @@
 	return misc_register(&audio_g711alaw_in_misc);
 }
 
-void __exit g711alaw_in_exit(void)
+void g711alaw_in_exit(void)
 {
 	misc_deregister(&audio_g711alaw_in_misc);
 }
diff --git a/dsp/codecs/g711mlaw_in.c b/dsp/codecs/g711mlaw_in.c
index d646bd1..2f20c13 100644
--- a/dsp/codecs/g711mlaw_in.c
+++ b/dsp/codecs/g711mlaw_in.c
@@ -382,7 +382,7 @@
 	return misc_register(&audio_g711mlaw_in_misc);
 }
 
-void __exit g711mlaw_in_exit(void)
+void g711mlaw_in_exit(void)
 {
 	misc_deregister(&audio_g711mlaw_in_misc);
 }
diff --git a/dsp/codecs/qcelp_in.c b/dsp/codecs/qcelp_in.c
index 050c95f..be09ea4 100644
--- a/dsp/codecs/qcelp_in.c
+++ b/dsp/codecs/qcelp_in.c
@@ -407,7 +407,7 @@
 	return misc_register(&audio_qcelp_in_misc);
 }
 
-void __exit qcelp_in_exit(void)
+void qcelp_in_exit(void)
 {
 	misc_deregister(&audio_qcelp_in_misc);
 }
diff --git a/dsp/msm_audio_ion.c b/dsp/msm_audio_ion.c
index ca9505f..1138290 100644
--- a/dsp/msm_audio_ion.c
+++ b/dsp/msm_audio_ion.c
@@ -917,7 +917,7 @@
 	return platform_driver_register(&msm_audio_ion_driver);
 }
 
-void __exit msm_audio_ion_exit(void)
+void msm_audio_ion_exit(void)
 {
 	platform_driver_unregister(&msm_audio_ion_driver);
 }
diff --git a/dsp/q6adm.c b/dsp/q6adm.c
index 77c2897..78ce2b8 100644
--- a/dsp/q6adm.c
+++ b/dsp/q6adm.c
@@ -5246,7 +5246,7 @@
 	return 0;
 }
 
-void __exit adm_exit(void)
+void adm_exit(void)
 {
 	mutex_destroy(&dts_srs_lock);
 	adm_delete_cal_data();
diff --git a/dsp/q6afe.c b/dsp/q6afe.c
index f80d271..34c8629 100644
--- a/dsp/q6afe.c
+++ b/dsp/q6afe.c
@@ -2961,7 +2961,8 @@
 static int q6afe_send_enc_config(u16 port_id,
 				 union afe_enc_config_data *cfg, u32 format,
 				 union afe_port_config afe_config,
-				 u16 afe_in_channels, u16 afe_in_bit_width)
+				 u16 afe_in_channels, u16 afe_in_bit_width,
+				 u32 scrambler_mode)
 {
 	struct afe_audioif_config_command config;
 	int index;
@@ -3059,6 +3060,20 @@
 	}
 
 	config.param.payload_size =
+		payload_size + sizeof(config.port.enc_set_scrambler_param);
+	pr_debug("%s:sending AFE_ENCODER_PARAM_ID_ENABLE_SCRAMBLING mode= %d to DSP payload = %d\n",
+		  __func__, scrambler_mode, config.param.payload_size);
+	config.pdata.param_id = AFE_ENCODER_PARAM_ID_ENABLE_SCRAMBLING;
+	config.pdata.param_size = sizeof(config.port.enc_set_scrambler_param);
+	config.port.enc_set_scrambler_param.enable_scrambler = scrambler_mode;
+	ret = afe_apr_send_pkt(&config, &this_afe.wait[index]);
+	if (ret) {
+		pr_err("%s: AFE_ENCODER_PARAM_ID_ENABLE_SCRAMBLING for port 0x%x failed %d\n",
+			__func__, port_id, ret);
+		goto exit;
+	}
+
+	config.param.payload_size =
 			payload_size + sizeof(config.port.media_type);
 	config.pdata.param_size = sizeof(config.port.media_type);
 
@@ -3102,7 +3117,8 @@
 
 static int __afe_port_start(u16 port_id, union afe_port_config *afe_config,
 			    u32 rate, u16 afe_in_channels, u16 afe_in_bit_width,
-			    union afe_enc_config_data *cfg, u32 enc_format)
+			    union afe_enc_config_data *cfg, u32 enc_format,
+			    u32 scrambler_mode)
 {
 	struct afe_audioif_config_command config;
 	int ret = 0;
@@ -3365,7 +3381,8 @@
 					__func__, enc_format);
 		ret = q6afe_send_enc_config(port_id, cfg, enc_format,
 					    *afe_config, afe_in_channels,
-					    afe_in_bit_width);
+					    afe_in_bit_width,
+					    scrambler_mode);
 		if (ret) {
 			pr_err("%s: AFE encoder config for port 0x%x failed %d\n",
 				__func__, port_id, ret);
@@ -3418,7 +3435,7 @@
 		   u32 rate)
 {
 	return __afe_port_start(port_id, afe_config, rate,
-				0, 0, NULL, ASM_MEDIA_FMT_NONE);
+				0, 0, NULL, ASM_MEDIA_FMT_NONE, 0);
 }
 EXPORT_SYMBOL(afe_port_start);
 
@@ -3441,7 +3458,8 @@
 {
 	return __afe_port_start(port_id, afe_config, rate,
 				afe_in_channels, afe_in_bit_width,
-				&enc_cfg->data, enc_cfg->format);
+				&enc_cfg->data, enc_cfg->format,
+				enc_cfg->scrambler_mode);
 }
 EXPORT_SYMBOL(afe_port_start_v2);
 
@@ -7584,7 +7602,7 @@
 	return 0;
 }
 
-void __exit afe_exit(void)
+void afe_exit(void)
 {
 	afe_delete_cal_data();
 
diff --git a/dsp/q6asm.c b/dsp/q6asm.c
index 4e988ee..d6774f4 100644
--- a/dsp/q6asm.c
+++ b/dsp/q6asm.c
@@ -3541,7 +3541,6 @@
 	if (ac->port[dir].buf) {
 		pr_err("%s: Buffer already allocated\n", __func__);
 		rc = -EINVAL;
-		mutex_unlock(&ac->cmd_lock);
 		goto done;
 	}
 
@@ -3564,7 +3563,6 @@
 		pr_err("%s: Audio ION alloc is failed, rc = %d\n", __func__,
 				rc);
 		kfree(buf_circ);
-		mutex_unlock(&ac->cmd_lock);
 		goto done;
 	}
 
@@ -3590,8 +3588,8 @@
 			msm_audio_populate_upper_32_bits(buf_circ->phys);
 	open->map_region_circ_buf.mem_size_bytes = bytes_to_alloc;
 
-	mutex_unlock(&ac->cmd_lock);
 done:
+	mutex_unlock(&ac->cmd_lock);
 	return rc;
 }
 
@@ -10286,7 +10284,7 @@
 	return 0;
 }
 
-void __exit q6asm_exit(void)
+void q6asm_exit(void)
 {
 	q6asm_delete_cal_data();
 }
diff --git a/dsp/q6core.c b/dsp/q6core.c
index b807862..5e09faa 100644
--- a/dsp/q6core.c
+++ b/dsp/q6core.c
@@ -1105,7 +1105,7 @@
 	return 0;
 }
 
-void __exit core_exit(void)
+void core_exit(void)
 {
 	mutex_destroy(&q6core_lcl.cmd_lock);
 	mutex_destroy(&q6core_lcl.ver_lock);
diff --git a/dsp/q6lsm.c b/dsp/q6lsm.c
index e34bff9..2a98dc7 100644
--- a/dsp/q6lsm.c
+++ b/dsp/q6lsm.c
@@ -2376,7 +2376,7 @@
 	return 0;
 }
 
-void __exit q6lsm_exit(void)
+void q6lsm_exit(void)
 {
 	lsm_delete_cal_data();
 }
diff --git a/dsp/q6voice.c b/dsp/q6voice.c
index 985e959..d5f280e 100644
--- a/dsp/q6voice.c
+++ b/dsp/q6voice.c
@@ -36,6 +36,7 @@
 #define CMD_STATUS_FAIL 1
 #define NUM_CHANNELS_MONO 1
 #define NUM_CHANNELS_STEREO 2
+#define NUM_CHANNELS_THREE 3
 #define NUM_CHANNELS_QUAD 4
 #define CVP_VERSION_2 2
 #define GAIN_Q14_FORMAT(a) (a << 14)
@@ -8640,6 +8641,11 @@
 				v->dev_tx.channel_mapping[0] = PCM_CHANNEL_FL;
 				v->dev_tx.channel_mapping[1] = PCM_CHANNEL_FR;
 			} else if (v->dev_tx.no_of_channels ==
+							NUM_CHANNELS_THREE) {
+				v->dev_tx.channel_mapping[0] = PCM_CHANNEL_FL;
+				v->dev_tx.channel_mapping[1] = PCM_CHANNEL_FR;
+				v->dev_tx.channel_mapping[2] = PCM_CHANNEL_FC;
+			} else if (v->dev_tx.no_of_channels ==
 							NUM_CHANNELS_QUAD) {
 				v->dev_tx.channel_mapping[0] = PCM_CHANNEL_FL;
 				v->dev_tx.channel_mapping[1] = PCM_CHANNEL_FR;
@@ -9606,7 +9612,7 @@
 }
 
 
-void __exit voice_exit(void)
+void voice_exit(void)
 {
 	voice_delete_cal_data();
 	free_cal_map_table();
diff --git a/dsp/rtac.c b/dsp/rtac.c
index 806bbc5..43c69cc 100644
--- a/dsp/rtac.c
+++ b/dsp/rtac.c
@@ -1949,7 +1949,7 @@
 	return -ENOMEM;
 }
 
-void __exit rtac_exit(void)
+void rtac_exit(void)
 {
 	kzfree(rtac_adm_buffer);
 	kzfree(rtac_asm_buffer);
diff --git a/include/dsp/apr_audio-v2.h b/include/dsp/apr_audio-v2.h
index bc17632..4cef82e 100644
--- a/include/dsp/apr_audio-v2.h
+++ b/include/dsp/apr_audio-v2.h
@@ -3119,6 +3119,12 @@
 #define AFE_ENCODER_PARAM_ID_ENC_FMT_ID         0x0001322B
 
 /*
+ * Encoder scrambler parameter for the #AVS_MODULE_ID_ENCODER module.
+ * This parameter cannot be set runtime.
+ */
+#define AFE_ENCODER_PARAM_ID_ENABLE_SCRAMBLING         0x0001323C
+
+/*
  * Data format to send compressed data
  * is transmitted/received over Slimbus lines.
  */
@@ -3496,6 +3502,7 @@
 
 struct afe_enc_config {
 	u32 format;
+	u32 scrambler_mode;
 	union afe_enc_config_data data;
 };
 
@@ -3519,6 +3526,18 @@
 	uint32_t enc_packetizer_id;
 };
 
+/*
+ * Payload of the AVS_ENCODER_PARAM_ID_ENABLE_SCRAMBLING parameter.
+ */
+struct avs_enc_set_scrambler_param_t {
+	/*
+	 *  Supported values:
+	 *  1 : enable scrambler
+	 *  0 : disable scrambler
+	 */
+	uint32_t enable_scrambler;
+};
+
 union afe_port_config {
 	struct afe_param_id_pcm_cfg               pcm;
 	struct afe_param_id_i2s_cfg               i2s;
@@ -3537,6 +3556,7 @@
 	struct afe_port_media_type_t              media_type;
 	struct afe_enc_cfg_blk_param_t            enc_blk_param;
 	struct avs_enc_packetizer_id_param_t      enc_pkt_id_param;
+	struct avs_enc_set_scrambler_param_t      enc_set_scrambler_param;
 } __packed;
 
 struct afe_audioif_config_command_no_payload {
diff --git a/ipc/Kbuild b/ipc/Kbuild
index b729f90..92760fb 100644
--- a/ipc/Kbuild
+++ b/ipc/Kbuild
@@ -1,25 +1,41 @@
 # We can build either as part of a standalone Kernel build or as
 # an external module.  Determine which mechanism is being used
-KERNEL_BUILD := 0
+ifeq ($(MODNAME),)
+	KERNEL_BUILD := 1
+else
+	KERNEL_BUILD := 0
+endif
 
-TARGET_KERNEL_VERSION := 4.4
+TARGET_KERNEL_VERSION := 4.9
+
+# These are configurable via Kconfig for kernel-based builds
+# Need to explicitly configure for Android-based builds
+ifeq ($(CONFIG_ARCH_SDM845), y)
+	TARGET_KERNEL_VERSION := 4.9
+endif
+ifeq ($(CONFIG_ARCH_SDM670), y)
+	TARGET_KERNEL_VERSION := 4.9
+endif
+
+KDIR := $(TOP)/kernel/msm-$(TARGET_KERNEL_VERSION)
+
+ifeq ($(KERNEL_BUILD), 1)
+	AUDIO_ROOT := $(KDIR)/techpack/audio
+endif
 
 ifeq ($(KERNEL_BUILD), 0)
-	# These are configurable via Kconfig for kernel-based builds
-	# Need to explicitly configure for Android-based builds
 	ifeq ($(CONFIG_ARCH_SDM845), y)
 		include $(AUDIO_ROOT)/config/sdm845auto.conf
 		export
-		TARGET_KERNEL_VERSION := 4.9
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
 	endif
 	ifeq ($(CONFIG_ARCH_SDM670), y)
 		include $(AUDIO_ROOT)/config/sdm670auto.conf
 		export
-		TARGET_KERNEL_VERSION := 4.9
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
 	endif
 endif
 
-
 # As per target team, build is done as follows:
 # Defconfig : build with default flags
 # Slub      : defconfig  + CONFIG_SLUB_DEBUG := y +
@@ -46,34 +62,27 @@
 
 ############ IPC ############
 
-ifeq ($(CONFIG_MSM_QDSP6_APRV2_GLINK), m)
+ifdef CONFIG_MSM_QDSP6_APRV2_GLINK
 APRV_GLINK += apr.o
 APRV_GLINK += apr_v2.o
 APRV_GLINK += apr_tal_glink.o
 endif
 
-ifeq ($(CONFIG_MSM_QDSP6_APRV3_GLINK), m)
+ifdef CONFIG_MSM_QDSP6_APRV3_GLINK
 APRV_GLINK += apr.o
 APRV_GLINK += apr_v3.o
 APRV_GLINK += apr_tal_glink.o
 endif
 
-ifeq ($(CONFIG_WCD_DSP_GLINK), m)
+ifdef CONFIG_WCD_DSP_GLINK
 WDSP_GLINK += wcd-dsp-glink.o
 endif
 
 LINUX_INC +=	-Iinclude/linux
 
-INCS :=		$(COMMON_INC) \
+INCS +=		$(COMMON_INC) \
 		$(UAPI_INC)
 
-ifeq ($(CONFIG_ARCH_SDM845), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
-endif
-ifeq ($(CONFIG_ARCH_SDM670), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
-endif
-
 EXTRA_CFLAGS += $(INCS)
 
 
@@ -89,6 +98,8 @@
 
 KBUILD_CPPFLAGS += $(CDEFINES)
 
+ifeq ($(KERNEL_BUILD), 0)
+
 HEADER_INSTALL_DIR := $(TOP)/kernel/msm-$(TARGET_KERNEL_VERSION)/scripts
 UAPI_OUT := $(OUT)/obj/vendor/qcom/opensource/audio-kernel/include
 $(shell $(HEADER_INSTALL_DIR)/headers_install.sh $(UAPI_OUT)/linux/ $(AUDIO_ROOT)/include/uapi/linux/ avtimer.h;)
@@ -118,6 +129,10 @@
 $(shell $(HEADER_INSTALL_DIR)/headers_install.sh $(UAPI_OUT)/sound/ $(AUDIO_ROOT)/include/uapi/sound/ voice_params.h;)
 $(shell $(HEADER_INSTALL_DIR)/headers_install.sh $(UAPI_OUT)/sound/ $(AUDIO_ROOT)/include/uapi/sound/ wcd-dsp-glink.h;)
 
+KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers
+
+endif
+
 # Currently, for versions of gcc which support it, the kernel Makefile
 # is disabling the maybe-uninitialized warning.  Re-enable it for the
 # AUDIO driver.  Note that we must use EXTRA_CFLAGS here so that it
@@ -141,9 +156,9 @@
 CDEFINES += -DMULTI_IF_NAME=\"$(CHIP_NAME)\"
 endif
 
-KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers
 # Module information used by KBuild framework
 obj-$(CONFIG_MSM_QDSP6_APRV2_GLINK) += apr_dlkm.o
+obj-$(CONFIG_MSM_QDSP6_APRV3_GLINK) += apr_dlkm.o
 apr_dlkm-y := $(APRV_GLINK)
 
 obj-$(CONFIG_WCD_DSP_GLINK) += wglink_dlkm.o
diff --git a/ipc/Makefile b/ipc/Makefile
deleted file mode 100644
index 6938915..0000000
--- a/ipc/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-obj-$(CONFIG_MSM_QDSP6_APRV2_GLINK) += apr.o apr_v2.o apr_tal_glink.o
-obj-$(CONFIG_MSM_QDSP6_APRV3_GLINK) += apr.o apr_v3.o apr_tal_glink.o
-obj-$(CONFIG_WCD_DSP_GLINK) += wcd-dsp-glink.o
diff --git a/ipc/apr.c b/ipc/apr.c
index dd2a63b..d202994 100644
--- a/ipc/apr.c
+++ b/ipc/apr.c
@@ -717,9 +717,10 @@
 	}
 
 	temp_port = ((data.dest_port >> 8) * 8) + (data.dest_port & 0xFF);
-	pr_debug("port = %d t_port = %d\n", data.src_port, temp_port);
-	if (c_svc->port_cnt && c_svc->port_fn[temp_port])
-		c_svc->port_fn[temp_port](&data,  c_svc->port_priv[temp_port]);
+	if (((temp_port >= 0) && (temp_port < APR_MAX_PORTS))
+		&& (c_svc->port_cnt && c_svc->port_fn[temp_port]))
+		c_svc->port_fn[temp_port](&data,
+			c_svc->port_priv[temp_port]);
 	else if (c_svc->fn)
 		c_svc->fn(&data, c_svc->priv);
 	else
diff --git a/soc/Kbuild b/soc/Kbuild
index 45b77e9..c9cf31b 100644
--- a/soc/Kbuild
+++ b/soc/Kbuild
@@ -1,22 +1,31 @@
 # We can build either as part of a standalone Kernel build or as
 # an external module.  Determine which mechanism is being used
-KERNEL_BUILD := 0
+ifeq ($(MODNAME),)
+	KERNEL_BUILD := 1
+else
+	KERNEL_BUILD := 0
+endif
 
-
-ifeq ($(KERNEL_BUILD), 0)
+ifeq ($(KERNEL_BUILD), 1)
 	# These are configurable via Kconfig for kernel-based builds
 	# Need to explicitly configure for Android-based builds
+	AUDIO_BLD_DIR := $(ANDROID_BUILD_TOP)/kernel/msm-4.9
+	AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio
+endif
+
+ifeq ($(KERNEL_BUILD), 0)
 	ifeq ($(CONFIG_ARCH_SDM845), y)
 		include $(AUDIO_ROOT)/config/sdm845auto.conf
 		export
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
 	endif
 	ifeq ($(CONFIG_ARCH_SDM670), y)
 		include $(AUDIO_ROOT)/config/sdm670auto.conf
 		export
+		INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
 	endif
 endif
 
-
 # As per target team, build is done as follows:
 # Defconfig : build with default flags
 # Slub      : defconfig  + CONFIG_SLUB_DEBUG := y +
@@ -44,37 +53,30 @@
 ############ SoC Modules ############
 
 # for pinctrl WCD driver
-ifeq ($(CONFIG_PINCTRL_WCD), m)
+ifdef CONFIG_PINCTRL_WCD
 	PINCTRL_WCD_OBJS += pinctrl-wcd.o
 endif
 
 # for pinctrl LPI driver
-ifeq ($(CONFIG_PINCTRL_LPI), m)
+ifdef CONFIG_PINCTRL_LPI
 	PINCTRL_LPI_OBJS += pinctrl-lpi.o
 endif
 
 # for soundwire driver
-ifeq ($(CONFIG_SOUNDWIRE_WCD_CTRL), m)
+ifdef CONFIG_SOUNDWIRE_WCD_CTRL
 	SWR_CTRL_OBJS += swr-wcd-ctrl.o
 endif
 
-ifeq ($(CONFIG_SOUNDWIRE), m)
+ifdef CONFIG_SOUNDWIRE
 	SWR_OBJS += regmap-swr.o
 	SWR_OBJS += soundwire.o
 endif
 
 LINUX_INC +=	-Iinclude/linux
 
-INCS :=		$(COMMON_INC) \
+INCS +=		$(COMMON_INC) \
 		$(UAPI_INC)
 
-ifeq ($(CONFIG_ARCH_SDM845), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm845autoconf.h
-endif
-ifeq ($(CONFIG_ARCH_SDM670), y)
-INCS    +=  -include $(AUDIO_ROOT)/config/sdm670autoconf.h
-endif
-
 EXTRA_CFLAGS += $(INCS)
 
 
@@ -90,7 +92,10 @@
 
 KBUILD_CPPFLAGS += $(CDEFINES)
 
+ifeq ($(KERNEL_BUILD), 0)
 KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers
+endif
+
 # Currently, for versions of gcc which support it, the kernel Makefile
 # is disabling the maybe-uninitialized warning.  Re-enable it for the
 # AUDIO driver.  Note that we must use EXTRA_CFLAGS here so that it
diff --git a/soc/Makefile b/soc/Makefile
deleted file mode 100644
index c563e76..0000000
--- a/soc/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-
-obj-$(CONFIG_REGMAP_SWR) += regmap-swr.o
-obj-$(CONFIG_PINCTRL_WCD)	+= pinctrl-wcd.o
-obj-$(CONFIG_PINCTRL_LPI)	+= pinctrl-lpi.o
-obj-$(CONFIG_SOUNDWIRE)			+= soundwire.o
-obj-$(CONFIG_SOUNDWIRE_WCD_CTRL)	+= swr-wcd-ctrl.o