Merge "config: remove USB devices in policy config file"
diff --git a/configs/kona/kona.mk b/configs/kona/kona.mk
index a8efc6c..ef11052 100644
--- a/configs/kona/kona.mk
+++ b/configs/kona/kona.mk
@@ -77,8 +77,10 @@
 AUDIO_FEATURE_ENABLED_BATTERY_LISTENER := true
 ##AUDIO_FEATURE_FLAGS
 
+ifneq ($(strip $(TARGET_USES_RRO)), true)
 #Audio Specific device overlays
 DEVICE_PACKAGE_OVERLAYS += vendor/qcom/opensource/audio-hal/primary-hal/configs/common/overlay
+endif
 
 PRODUCT_COPY_FILES += \
     vendor/qcom/opensource/audio-hal/primary-hal/configs/kona/audio_io_policy.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_io_policy.conf \
diff --git a/configs/kona/mixer_paths_mtp.xml b/configs/kona/mixer_paths_mtp.xml
index fbde6bf..6aedccf 100644
--- a/configs/kona/mixer_paths_mtp.xml
+++ b/configs/kona/mixer_paths_mtp.xml
@@ -301,7 +301,9 @@
     <ctl name="EAR_RDAC Switch" value="0" />
     <ctl name="HPHL_RDAC Switch" value="0" />
     <ctl name="HPHR_RDAC Switch" value="0" />
+    <ctl name="AUX_RDAC Switch" value="0" />
     <ctl name="RDAC3_MUX" value="ZERO" />
+    <ctl name="RX_EAR Mode" value="OFF" />
 
     <!-- TX Controls -->
     <ctl name="TX_CDC_DMA_TX_3 Channels" value="One" />
@@ -370,8 +372,13 @@
     <ctl name="COMP7 Switch" value="0" />
     <ctl name="COMP8 Switch" value="0" />
 
-    <!-- Headphone Default mode - AB -->
-    <ctl name="RX HPH Mode" value="CLS_AB" />
+    <!-- Headphone class-H mode -->
+    <ctl name="RX_HPH_PWR_MODE" value="ULP" />
+    <ctl name="RX HPH Mode" value="CLS_H_ULP" />
+
+    <!-- TX HDR AMIC Default connections -->
+    <ctl name="TX HDR12" value="0" />
+    <ctl name="TX HDR34" value="0" />
 
     <!-- IIR/voice anc -->
     <ctl name="IIR0 Band1" id ="0" value="268435456" />
@@ -1655,7 +1662,7 @@
     <!-- These are actual sound device specific mixer settings -->
     <path name="amic2">
         <ctl name="TX DEC0 MUX" value="SWR_MIC" />
-        <ctl name="TX SMIC MUX0" value="ADC2" />
+        <ctl name="TX SMIC MUX0" value="ADC1" />
         <ctl name="TX_CDC_DMA_TX_3 Channels" value="One" />
         <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
         <ctl name="ADC2_MIXER Switch" value="1" />
@@ -1780,11 +1787,11 @@
     </path>
 
     <path name="speaker-mic">
-        <path name="dmic3" />
+        <path name="dmic5" />
     </path>
 
     <path name="speaker-mic-liquid">
-        <path name="dmic3" />
+        <path name="dmic5" />
     </path>
 
     <path name="speaker-mic-sbc">
@@ -1842,7 +1849,7 @@
     </path>
 
     <path name="handset-mic">
-        <path name="dmic3" />
+        <path name="dmic1" />
     </path>
 
     <path name="headphones">
@@ -1853,6 +1860,8 @@
         <ctl name="RX INT1_1 MIX1 INP0" value="RX1" />
         <ctl name="RX INT0 DEM MUX" value="CLSH_DSM_OUT" />
         <ctl name="RX INT1 DEM MUX" value="CLSH_DSM_OUT" />
+        <ctl name="RX_HPH_PWR_MODE" value="LOHIFI" />
+        <ctl name="RX HPH Mode" value="CLS_H_LOHIFI" />
         <ctl name="RX_COMP1 Switch" value="1" />
         <ctl name="RX_COMP2 Switch" value="1" />
         <ctl name="HPHL_COMP Switch" value="1" />
@@ -2015,17 +2024,17 @@
     <path name="handset-dmic-endfire">
         <ctl name="TX_CDC_DMA_TX_3 Channels" value="Two" />
         <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
-        <ctl name="TX DMIC MUX0" value="DMIC2" />
+        <ctl name="TX DMIC MUX0" value="DMIC0" />
         <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
-        <ctl name="TX DMIC MUX1" value="DMIC3" />
+        <ctl name="TX DMIC MUX1" value="DMIC2" />
     </path>
 
     <path name="speaker-dmic-endfire">
         <ctl name="TX_CDC_DMA_TX_3 Channels" value="Two" />
         <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
-        <ctl name="TX DMIC MUX0" value="DMIC2" />
+        <ctl name="TX DMIC MUX0" value="DMIC0" />
         <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
-        <ctl name="TX DMIC MUX1" value="DMIC3" />
+        <ctl name="TX DMIC MUX1" value="DMIC4" />
     </path>
 
     <path name="dmic-endfire">
@@ -2094,7 +2103,7 @@
         <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
         <ctl name="TX DMIC MUX0" value="DMIC0" />
         <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
-        <ctl name="TX DMIC MUX1" value="DMIC2" />
+        <ctl name="TX DMIC MUX1" value="DMIC4" />
     </path>
 
     <path name="dmic-broadside">
@@ -2110,11 +2119,11 @@
     <path name="three-mic">
         <ctl name="TX_CDC_DMA_TX_3 Channels" value="Three" />
         <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
-        <ctl name="TX DMIC MUX0" value="DMIC2" />
+        <ctl name="TX DMIC MUX0" value="DMIC3" />
         <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
         <ctl name="TX DMIC MUX1" value="DMIC0" />
         <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
-        <ctl name="TX DMIC MUX2" value="DMIC3" />
+        <ctl name="TX DMIC MUX2" value="DMIC2" />
     </path>
 
     <path name="speaker-tmic">
@@ -2137,11 +2146,11 @@
         <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
         <ctl name="TX DMIC MUX0" value="DMIC0" />
         <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
-        <ctl name="TX DMIC MUX1" value="DMIC2" />
+        <ctl name="TX DMIC MUX1" value="DMIC1" />
         <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
-        <ctl name="TX DMIC MUX2" value="DMIC3" />
+        <ctl name="TX DMIC MUX2" value="DMIC2" />
         <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
-        <ctl name="TX DMIC MUX3" value="DMIC1" />
+        <ctl name="TX DMIC MUX3" value="DMIC4" />
     </path>
 
     <path name="speaker-qmic-liquid">
diff --git a/configs/kona/mixer_paths_qrd.xml b/configs/kona/mixer_paths_qrd.xml
index a888aab..f6c2eeb 100644
--- a/configs/kona/mixer_paths_qrd.xml
+++ b/configs/kona/mixer_paths_qrd.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<!-- Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.    -->
+<!-- Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.    -->
 <!--                                                                        -->
 <!-- Redistribution and use in source and binary forms, with or without     -->
 <!-- modification, are permitted provided that the following conditions are -->
@@ -301,7 +301,9 @@
     <ctl name="EAR_RDAC Switch" value="0" />
     <ctl name="HPHL_RDAC Switch" value="0" />
     <ctl name="HPHR_RDAC Switch" value="0" />
+    <ctl name="AUX_RDAC Switch" value="0" />
     <ctl name="RDAC3_MUX" value="ZERO" />
+    <ctl name="RX_EAR Mode" value="OFF" />
 
     <!-- TX Controls -->
     <ctl name="TX_CDC_DMA_TX_3 Channels" value="One" />
@@ -370,8 +372,13 @@
     <ctl name="COMP7 Switch" value="0" />
     <ctl name="COMP8 Switch" value="0" />
 
-    <!-- Headphone Default mode - AB -->
-    <ctl name="RX HPH Mode" value="CLS_AB" />
+    <!-- Headphone class-H mode  -->
+    <ctl name="RX_HPH_PWR_MODE" value="ULP" />
+    <ctl name="RX HPH Mode" value="CLS_H_ULP" />
+
+    <!-- TX HDR AMIC Default connections -->
+    <ctl name="TX HDR12" value="0" />
+    <ctl name="TX HDR34" value="0" />
 
     <!-- IIR/voice anc -->
     <ctl name="IIR0 Band1" id ="0" value="268435456" />
@@ -1979,7 +1986,7 @@
 
     <path name="amic2">
         <ctl name="TX DEC0 MUX" value="SWR_MIC" />
-        <ctl name="TX SMIC MUX0" value="ADC2" />
+        <ctl name="TX SMIC MUX0" value="ADC1" />
         <ctl name="TX_CDC_DMA_TX_3 Channels" value="One" />
         <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
         <ctl name="ADC2_MIXER Switch" value="1" />
@@ -2034,24 +2041,24 @@
 
     <path name="speaker">
         <ctl name="WSA_CDC_DMA_RX_0 Channels" value="One" />
-        <ctl name="WSA RX0 MUX" value="AIF1_PB" />
-        <ctl name="WSA_RX0 INP0" value="RX0" />
-        <ctl name="WSA_COMP1 Switch" value="1" />
-        <ctl name="SpkrLeft COMP Switch" value="1" />
-        <ctl name="SpkrLeft BOOST Switch" value="1" />
-        <ctl name="SpkrLeft VISENSE Switch" value="1" />
-        <ctl name="SpkrLeft SWR DAC_Port Switch" value="1" />
+        <ctl name="WSA RX1 MUX" value="AIF1_PB" />
+        <ctl name="WSA_RX1 INP0" value="RX1" />
+        <ctl name="WSA_COMP2 Switch" value="1" />
+        <ctl name="SpkrRight COMP Switch" value="1" />
+        <ctl name="SpkrRight BOOST Switch" value="1" />
+        <ctl name="SpkrRight VISENSE Switch" value="1" />
+        <ctl name="SpkrRight SWR DAC_Port Switch" value="1" />
     </path>
 
     <path name="speaker-mono">
         <ctl name="WSA_CDC_DMA_RX_0 Channels" value="One" />
-        <ctl name="WSA RX0 MUX" value="AIF1_PB" />
-        <ctl name="WSA_RX0 INP0" value="RX0" />
-        <ctl name="WSA_COMP1 Switch" value="1" />
-        <ctl name="SpkrLeft COMP Switch" value="1" />
-        <ctl name="SpkrLeft BOOST Switch" value="1" />
-        <ctl name="SpkrLeft VISENSE Switch" value="1" />
-        <ctl name="SpkrLeft SWR DAC_Port Switch" value="1" />
+        <ctl name="WSA RX1 MUX" value="AIF1_PB" />
+        <ctl name="WSA_RX1 INP0" value="RX1" />
+        <ctl name="WSA_COMP2 Switch" value="1" />
+        <ctl name="SpkrRight COMP Switch" value="1" />
+        <ctl name="SpkrRight BOOST Switch" value="1" />
+        <ctl name="SpkrRight VISENSE Switch" value="1" />
+        <ctl name="SpkrRight SWR DAC_Port Switch" value="1" />
     </path>
 
     <path name="speaker-mono-2">
@@ -2086,7 +2093,7 @@
     </path>
 
     <path name="speaker-mic">
-        <path name="amic3" />
+        <path name="dmic2" />
     </path>
 
     <path name="speaker-protected">
@@ -2106,7 +2113,11 @@
     </path>
 
     <path name="voice-speaker-2-protected">
-        <path name="voice-speaker-protected" />
+        <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_2" value="1" />
+        <ctl name="WSA_CDC_DMA_0 TX Format" value="PACKED_16B" />
+        <path name="speaker-mono-2" />
+        <ctl name="VI_FEED_TX Channels" value="One" />
+        <ctl name="WSA_RX_0_VI_FB_RCH_MUX" value="WSA_CDC_DMA_TX_0" />
     </path>
 
     <path name="voice-speaker-stereo-protected">
@@ -2129,10 +2140,11 @@
         <ctl name="RX INT0 DEM MUX" value="CLSH_DSM_OUT" />
         <ctl name="EAR_RDAC Switch" value="1" />
         <ctl name="RDAC3_MUX" value="RX1" />
+        <ctl name="RX_EAR Mode" value="ON" />
     </path>
 
     <path name="handset-mic">
-        <path name="amic1" />
+        <path name="dmic2" />
     </path>
 
     <path name="headphones">
@@ -2143,6 +2155,8 @@
         <ctl name="RX INT1_1 MIX1 INP0" value="RX1" />
         <ctl name="RX INT0 DEM MUX" value="CLSH_DSM_OUT" />
         <ctl name="RX INT1 DEM MUX" value="CLSH_DSM_OUT" />
+        <ctl name="RX_HPH_PWR_MODE" value="LOHIFI" />
+        <ctl name="RX HPH Mode" value="CLS_H_LOHIFI" />
         <ctl name="RX_COMP1 Switch" value="1" />
         <ctl name="RX_COMP2 Switch" value="1" />
         <ctl name="HPHL_COMP Switch" value="1" />
@@ -2157,9 +2171,13 @@
     </path>
 
     <path name="hph-highquality-mode">
+        <ctl name="RX_HPH_PWR_MODE" value="LOHIFI" />
+        <ctl name="RX HPH Mode" value="CLS_H_LOHIFI" />
     </path>
 
     <path name="hph-lowpower-mode">
+        <ctl name="RX_HPH_PWR_MODE" value="ULP" />
+        <ctl name="RX HPH Mode" value="CLS_H_ULP" />
     </path>
 
     <path name="true-native-mode">
@@ -2265,15 +2283,10 @@
     <!-- Dual MIC devices -->
     <path name="handset-dmic-endfire">
         <ctl name="TX_CDC_DMA_TX_3 Channels" value="Two" />
-        <ctl name="TX DEC0 MUX" value="SWR_MIC" />
-        <ctl name="TX SMIC MUX0" value="ADC0" />
         <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
-        <ctl name="ADC1_MIXER Switch" value="1" />
-        <ctl name="TX DEC1 MUX" value="SWR_MIC" />
-        <ctl name="TX SMIC MUX1" value="ADC2" />
+        <ctl name="TX DMIC MUX0" value="DMIC1" />
         <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
-        <ctl name="ADC2_MIXER Switch" value="1" />
-        <ctl name="ADC2 MUX" value="INP3" />
+        <ctl name="TX DMIC MUX0" value="DMIC3" />
     </path>
 
     <path name="speaker-dmic-endfire">
@@ -2333,6 +2346,7 @@
         <ctl name="RX INT0_1 MIX1 INP0" value="RX0" />
         <ctl name="RX INT0 DEM MUX" value="CLSH_DSM_OUT" />
         <ctl name="RX_COMP1 Switch" value="1" />
+        <ctl name="HPHL_COMP Switch" value="1" />
         <ctl name="HPHL_RDAC Switch" value="1" />
     </path>
 
@@ -2356,7 +2370,7 @@
     </path>
 
     <path name="voice-tty-vco-handset-mic">
-        <path name="amic3" />
+        <path name="dmic3" />
     </path>
 
     <path name="unprocessed-handset-mic">
diff --git a/configs/kona/sound_trigger_mixer_paths.xml b/configs/kona/sound_trigger_mixer_paths.xml
index 10488c2..d0dbd38 100644
--- a/configs/kona/sound_trigger_mixer_paths.xml
+++ b/configs/kona/sound_trigger_mixer_paths.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.       -->
+<!--- Copyright (c) 2014-2019, The Linux Foundation. All rights reserved.       -->
 <!---                                                                           -->
 <!--- Redistribution and use in source and binary forms, with or without        -->
 <!--- modification, are permitted provided that the following conditions are    -->
@@ -262,7 +262,10 @@
     <path name="listen-ape-headset-mic">
         <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
         <ctl name="VA DEC0 MUX" value="SWR_MIC" />
-        <ctl name="VA SMIC MUX0" value="ADC2" />
+        <ctl name="VA SMIC MUX0" value="ADC1" />
+        <ctl name="ADC2 Volume" value="62" />
+        <ctl name="ADC2_MIXER Switch" value="1" />
+        <ctl name="ADC2 MUX" value="INP2" />
     </path>
 
     <path name="echo-reference">
diff --git a/configs/kona/sound_trigger_platform_info.xml b/configs/kona/sound_trigger_platform_info.xml
index 18f15ff..09ebdce 100644
--- a/configs/kona/sound_trigger_platform_info.xml
+++ b/configs/kona/sound_trigger_platform_info.xml
@@ -40,9 +40,7 @@
         <param max_ape_sessions="8" />
         <param enable_failure_detection="false" />
         <param support_device_switch="false" />
-        <!-- Transition will only occur if execution_type="DYNAMIC" -->
-        <param transit_to_adsp_on_playback="false" />
-        <param transit_to_adsp_on_battery_charging="false" />
+        <param transit_to_non_lpi_on_battery_charging="false" />
         <!-- Below backend params must match with port used in mixer path file -->
         <!-- param used to configure backend sample rate, format and channels -->
         <param backend_port_name="VA_CDC_DMA_TX_0" />
@@ -50,6 +48,7 @@
         <param backend_dai_name="VA_CDC_DMA_TX_0" />
         <!-- Param used to indicate if SVA has dedicated SLIM ports -->
         <param dedicated_sva_path="true" />
+        <param disable_lpi_budget="true" />
     </common_config>
     <acdb_ids>
         <param DEVICE_HANDSET_MIC_APE="100" />
@@ -212,6 +211,7 @@
         <param sample_rate="16000" />
         <param bit_width="16" />
         <param out_channels="1"/> <!-- Module output channels -->
+        <param lpi_enable="true" />
         <lsm_usecase>
             <param capture_device="HANDSET" />
             <!-- adm_cfg_profile should match with the one defined under adm_config -->
@@ -259,9 +259,52 @@
         <param vendor_uuid="9f6ad62a-1f0b-11e7-87c5-40a8f03d3f15" />
         <param execution_type="ADSP" /> <!-- value: "ADSP" "DYNAMIC" -->
         <param library="none" />
+        <param max_ape_phrases="1" />
+        <param max_ape_users="1" />
+        <!-- Profile specific data which the algorithm can support -->
+        <param sample_rate="16000" />
+        <param bit_width="16" />
+        <param out_channels="1"/> <!-- Module output channels -->
+        <param lpi_enable="true" />
+        <lsm_usecase>
+            <param capture_device="HANDSET" />
+            <!-- adm_cfg_profile should match with the one defined under adm_config -->
+            <!-- Set it to NONE if LSM directly connects to AFE -->
+            <param adm_cfg_profile="NONE" />
+            <!-- fluence_type: "FLUENCE_MIC", "FLUENCE_DMIC", "FLUENCE_TMIC"   -->
+            <!-- "FLUENCE_QMIC". Param value is valid when adm_cfg_profile -->
+            <!-- is FFECNS -->
+            <param fluence_type="NONE" />
+            <param execution_mode="ADSP" />
+            <param app_type="3" /> <!-- app type used in ACDB -->
+            <param in_channels="1"/> <!-- Module input channels -->
+            <param load_sound_model_ids="0x18000001, 0x0, 0x00012C14" />
+            <param unload_sound_model_ids="0x18000001, 0x0, 0x00012C15" />
+            <param confidence_levels_ids="0x18000001, 0x0, 0x00012C07" />
+            <param operation_mode_ids="0x18000001, 0x0, 0x00012C02" />
+            <param polling_enable_ids="0x18000001, 0x0, 0x00012C1B" />
+            <param custom_config_ids="0x18000001, 0x0, 0x00012C20" />
+        </lsm_usecase>
+        <lsm_usecase>
+            <param capture_device="HEADSET" />
+            <param adm_cfg_profile="NONE" />
+            <param fluence_type="NONE" />
+            <param execution_mode="ADSP" />
+            <param app_type="3" /> <!-- app type used in ACDB -->
+            <param in_channels="1"/> <!-- Module input channels -->
+            <param load_sound_model_ids="0x18000001, 0x0, 0x00012C14" />
+            <param unload_sound_model_ids="0x18000001, 0x0, 0x00012C15" />
+            <param confidence_levels_ids="0x18000001, 0x0, 0x00012C07" />
+            <param operation_mode_ids="0x18000001, 0x0, 0x00012C02" />
+            <param polling_enable_ids="0x18000001, 0x0, 0x00012C1B" />
+            <param custom_config_ids="0x18000001, 0x0, 0x00012C20" />
+        </lsm_usecase>
+
+        <!-- format: "ADPCM_packet" or "PCM_packet" !-->
+        <!-- transfer_mode: "FTRT" or "RT" -->
         <!--  kw_duration is in milli seconds. It is valid only for FTRT
             transfer mode -->
-        <param capture_keyword="MULAW_raw, FTRT, 5000" />
+        <param capture_keyword="PCM_raw, FTRT, 5000" />
         <param client_capture_read_delay="2000" />
     </sound_model_config>
 
diff --git a/configs/msmnile_au/audio_platform_info.xml b/configs/msmnile_au/audio_platform_info.xml
index d74e1a3..1dbaac1 100644
--- a/configs/msmnile_au/audio_platform_info.xml
+++ b/configs/msmnile_au/audio_platform_info.xml
@@ -26,12 +26,12 @@
 <!-- IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                          -->
 <audio_platform_info>
     <acdb_ids>
-        <device name="SND_DEVICE_OUT_HANDSET" acdb_id="60"/>
-        <device name="SND_DEVICE_OUT_SPEAKER" acdb_id="60"/>
-        <device name="SND_DEVICE_OUT_HEADPHONES" acdb_id="60"/>
+        <device name="SND_DEVICE_OUT_HANDSET" acdb_id="78"/>
+        <device name="SND_DEVICE_OUT_SPEAKER" acdb_id="78"/>
+        <device name="SND_DEVICE_OUT_HEADPHONES" acdb_id="78"/>
         <device name="SND_DEVICE_OUT_BT_SCO" acdb_id="94"/>
         <device name="SND_DEVICE_OUT_BT_SCO_WB" acdb_id="94"/>
-        <device name="SND_DEVICE_OUT_BT_A2DP" acdb_id="60"/>
+        <device name="SND_DEVICE_OUT_BT_A2DP" acdb_id="78"/>
         <device name="SND_DEVICE_OUT_VOICE_HANDSET" acdb_id="94"/>
         <device name="SND_DEVICE_OUT_VOICE_SPEAKER" acdb_id="94"/>
         <device name="SND_DEVICE_IN_HANDSET_MIC" acdb_id="11"/>
diff --git a/configs/msmnile_au/mixer_paths_adp.xml b/configs/msmnile_au/mixer_paths_adp.xml
index e8f2540..78f815a 100644
--- a/configs/msmnile_au/mixer_paths_adp.xml
+++ b/configs/msmnile_au/mixer_paths_adp.xml
@@ -1616,9 +1616,11 @@
     <path name="hfp-sco headphones">
     </path>
 
-   <path name="hfp-sco-wb">
+    <path name="hfp-sco-wb">
+        <ctl name="PRIM_AUX_PCM_TX SampleRate" value="KHZ_16" />
+        <ctl name="PRIM_AUX_PCM_RX SampleRate" value="KHZ_16" />
         <path name="hfp-sco" />
-   </path>
+    </path>
 
     <path name="hfp-sco-wb headphones">
         <path name="hfp-sco headphones" />
diff --git a/configs/msmnile_au/mixer_paths_custom.xml b/configs/msmnile_au/mixer_paths_custom.xml
index 3376223..774ec65 100644
--- a/configs/msmnile_au/mixer_paths_custom.xml
+++ b/configs/msmnile_au/mixer_paths_custom.xml
@@ -576,7 +576,7 @@
     </path>
 
     <path name="deep-buffer-playback">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia1" value="1" />
     </path>
 
@@ -639,7 +639,7 @@
     </path>
 
     <path name="low-latency-playback">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia5" value="1" />
     </path>
 
@@ -706,7 +706,7 @@
     </path>
 
     <path name="audio-ull-playback">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia8" value="1" />
     </path>
 
@@ -772,7 +772,7 @@
     </path>
 
     <path name="compress-offload-playback">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia4" value="1" />
     </path>
 
@@ -847,7 +847,7 @@
     </path>
 
     <path name="compress-offload-playback2">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia7" value="1" />
     </path>
 
@@ -914,7 +914,7 @@
     </path>
 
     <path name="compress-offload-playback3">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia10" value="1" />
     </path>
 
@@ -981,7 +981,7 @@
     </path>
 
     <path name="compress-offload-playback4">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia11" value="1" />
     </path>
 
@@ -1049,7 +1049,7 @@
     </path>
 
     <path name="compress-offload-playback5">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia12" value="1" />
     </path>
 
@@ -1116,7 +1116,7 @@
     </path>
 
     <path name="compress-offload-playback6">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia13" value="1" />
     </path>
 
@@ -1183,7 +1183,7 @@
     </path>
 
     <path name="compress-offload-playback7">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia14" value="1" />
     </path>
 
@@ -1250,7 +1250,7 @@
     </path>
 
     <path name="compress-offload-playback8">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia15" value="1" />
     </path>
 
@@ -1317,7 +1317,7 @@
     </path>
 
     <path name="compress-offload-playback9">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia16" value="1" />
     </path>
 
@@ -1612,9 +1612,11 @@
     <path name="hfp-sco headphones">
     </path>
 
-   <path name="hfp-sco-wb">
+    <path name="hfp-sco-wb">
+        <ctl name="PRIM_AUX_PCM_TX SampleRate" value="KHZ_16" />
+        <ctl name="PRIM_AUX_PCM_RX SampleRate" value="KHZ_16" />
         <path name="hfp-sco" />
-   </path>
+    </path>
 
     <path name="hfp-sco-wb headphones">
         <path name="hfp-sco headphones" />
@@ -1753,6 +1755,7 @@
 
     <!-- VoIP Rx settings -->
     <path name="audio-playback-voip">
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia10" value="1" />
     </path>
 
@@ -2611,8 +2614,6 @@
     </path>
 
     <path name="bt-a2dp">
-        <ctl name="BT SampleRate" value="KHZ_48" />
-        <ctl name="AFE Input Channels" value="Two" />
         <ctl name="SLIM7_RX ADM Channels" value="Two" />
     </path>
 
diff --git a/configs/msmsteppe_au/audio_platform_info.xml b/configs/msmsteppe_au/audio_platform_info.xml
index 590b697..1b49031 100644
--- a/configs/msmsteppe_au/audio_platform_info.xml
+++ b/configs/msmsteppe_au/audio_platform_info.xml
@@ -27,12 +27,12 @@
 <!-- IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                          -->
 <audio_platform_info>
     <acdb_ids>
-        <device name="SND_DEVICE_OUT_HANDSET" acdb_id="41"/>
-        <device name="SND_DEVICE_OUT_SPEAKER" acdb_id="41"/>
-        <device name="SND_DEVICE_OUT_HEADPHONES" acdb_id="41"/>
+        <device name="SND_DEVICE_OUT_HANDSET" acdb_id="78"/>
+        <device name="SND_DEVICE_OUT_SPEAKER" acdb_id="78"/>
+        <device name="SND_DEVICE_OUT_HEADPHONES" acdb_id="78"/>
         <device name="SND_DEVICE_OUT_BT_SCO" acdb_id="94"/>
         <device name="SND_DEVICE_OUT_BT_SCO_WB" acdb_id="94"/>
-        <device name="SND_DEVICE_OUT_BT_A2DP" acdb_id="41"/>
+        <device name="SND_DEVICE_OUT_BT_A2DP" acdb_id="78"/>
         <device name="SND_DEVICE_OUT_VOICE_HANDSET" acdb_id="94"/>
         <device name="SND_DEVICE_OUT_VOICE_SPEAKER" acdb_id="94"/>
         <device name="SND_DEVICE_IN_HANDSET_MIC" acdb_id="11"/>
diff --git a/configs/msmsteppe_au/mixer_paths_adp.xml b/configs/msmsteppe_au/mixer_paths_adp.xml
index 2e47684..432f50c 100644
--- a/configs/msmsteppe_au/mixer_paths_adp.xml
+++ b/configs/msmsteppe_au/mixer_paths_adp.xml
@@ -319,6 +319,10 @@
     <ctl name="SEC_TDM_RX_0 Audio Mixer MultiMedia9" value="0" />
     <ctl name="MultiMedia9 Mixer TERT_TDM_TX_0" value="0" />
 
+    <path name="dummy-hostless">
+        <ctl name="SEC_TDM_RX_7 Port Mixer TERT_TDM_TX_7" value="1" />
+    </path>
+
     <!-- Codec controls -->
     <!-- WSA controls -->
     <ctl name="SpkrLeft COMP Switch" value="0" />
@@ -577,7 +581,7 @@
     </path>
 
     <path name="deep-buffer-playback">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia1" value="1" />
     </path>
 
@@ -640,7 +644,7 @@
     </path>
 
     <path name="low-latency-playback">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia5" value="1" />
     </path>
 
@@ -707,7 +711,7 @@
     </path>
 
     <path name="audio-ull-playback">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia8" value="1" />
     </path>
 
@@ -773,7 +777,7 @@
     </path>
 
     <path name="compress-offload-playback">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia4" value="1" />
     </path>
 
@@ -848,7 +852,7 @@
     </path>
 
     <path name="compress-offload-playback2">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia7" value="1" />
     </path>
 
@@ -915,7 +919,7 @@
     </path>
 
     <path name="compress-offload-playback3">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia10" value="1" />
     </path>
 
@@ -982,7 +986,7 @@
     </path>
 
     <path name="compress-offload-playback4">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia11" value="1" />
     </path>
 
@@ -1050,7 +1054,7 @@
     </path>
 
     <path name="compress-offload-playback5">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia12" value="1" />
     </path>
 
@@ -1117,7 +1121,7 @@
     </path>
 
     <path name="compress-offload-playback6">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia13" value="1" />
     </path>
 
@@ -1184,7 +1188,7 @@
     </path>
 
     <path name="compress-offload-playback7">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia14" value="1" />
     </path>
 
@@ -1251,7 +1255,7 @@
     </path>
 
     <path name="compress-offload-playback8">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia15" value="1" />
     </path>
 
@@ -1318,7 +1322,7 @@
     </path>
 
     <path name="compress-offload-playback9">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia16" value="1" />
     </path>
 
@@ -1613,9 +1617,11 @@
     <path name="hfp-sco headphones">
     </path>
 
-   <path name="hfp-sco-wb">
+    <path name="hfp-sco-wb">
+        <ctl name="PRIM_AUX_PCM_TX SampleRate" value="KHZ_16" />
+        <ctl name="PRIM_AUX_PCM_RX SampleRate" value="KHZ_16" />
         <path name="hfp-sco" />
-   </path>
+    </path>
 
     <path name="hfp-sco-wb headphones">
         <path name="hfp-sco headphones" />
@@ -1754,6 +1760,7 @@
 
     <!-- VoIP Rx settings -->
     <path name="audio-playback-voip">
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia10" value="1" />
     </path>
 
diff --git a/configs/msmsteppe_au/mixer_paths_custom.xml b/configs/msmsteppe_au/mixer_paths_custom.xml
index d701121..f9257d2 100644
--- a/configs/msmsteppe_au/mixer_paths_custom.xml
+++ b/configs/msmsteppe_au/mixer_paths_custom.xml
@@ -577,7 +577,7 @@
     </path>
 
     <path name="deep-buffer-playback">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia1" value="1" />
     </path>
 
@@ -640,7 +640,7 @@
     </path>
 
     <path name="low-latency-playback">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia5" value="1" />
     </path>
 
@@ -707,7 +707,7 @@
     </path>
 
     <path name="audio-ull-playback">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia8" value="1" />
     </path>
 
@@ -773,7 +773,7 @@
     </path>
 
     <path name="compress-offload-playback">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia4" value="1" />
     </path>
 
@@ -848,7 +848,7 @@
     </path>
 
     <path name="compress-offload-playback2">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia7" value="1" />
     </path>
 
@@ -915,7 +915,7 @@
     </path>
 
     <path name="compress-offload-playback3">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia10" value="1" />
     </path>
 
@@ -982,7 +982,7 @@
     </path>
 
     <path name="compress-offload-playback4">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia11" value="1" />
     </path>
 
@@ -1050,7 +1050,7 @@
     </path>
 
     <path name="compress-offload-playback5">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia12" value="1" />
     </path>
 
@@ -1117,7 +1117,7 @@
     </path>
 
     <path name="compress-offload-playback6">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia13" value="1" />
     </path>
 
@@ -1184,7 +1184,7 @@
     </path>
 
     <path name="compress-offload-playback7">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia14" value="1" />
     </path>
 
@@ -1251,7 +1251,7 @@
     </path>
 
     <path name="compress-offload-playback8">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia15" value="1" />
     </path>
 
@@ -1318,7 +1318,7 @@
     </path>
 
     <path name="compress-offload-playback9">
-        <ctl name="TERT_TDM_RX_0 Channels" value="Two" />
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia16" value="1" />
     </path>
 
@@ -1613,9 +1613,11 @@
     <path name="hfp-sco headphones">
     </path>
 
-   <path name="hfp-sco-wb">
+    <path name="hfp-sco-wb">
+        <ctl name="PRIM_AUX_PCM_TX SampleRate" value="KHZ_16" />
+        <ctl name="PRIM_AUX_PCM_RX SampleRate" value="KHZ_16" />
         <path name="hfp-sco" />
-   </path>
+    </path>
 
     <path name="hfp-sco-wb headphones">
         <path name="hfp-sco headphones" />
@@ -1754,6 +1756,7 @@
 
     <!-- VoIP Rx settings -->
     <path name="audio-playback-voip">
+        <ctl name="TERT_TDM_RX_0 Channels" value="Six" />
         <ctl name="TERT_TDM_RX_0 Audio Mixer MultiMedia10" value="1" />
     </path>
 
@@ -2612,8 +2615,6 @@
     </path>
 
     <path name="bt-a2dp">
-        <ctl name="BT SampleRate" value="KHZ_48" />
-        <ctl name="AFE Input Channels" value="Two" />
         <ctl name="SLIM7_RX ADM Channels" value="Two" />
     </path>
 
diff --git a/hal/Android.mk b/hal/Android.mk
index 53a2247..7cab96f 100644
--- a/hal/Android.mk
+++ b/hal/Android.mk
@@ -72,6 +72,7 @@
 endif
 ifneq ($(filter kona,$(TARGET_BOARD_PLATFORM)),)
   LOCAL_CFLAGS := -DPLATFORM_KONA
+  LOCAL_CFLAGS += -DMAX_TARGET_SPECIFIC_CHANNEL_CNT="4"
 endif
 ifneq ($(filter $(MSMSTEPPE) ,$(TARGET_BOARD_PLATFORM)),)
   LOCAL_CFLAGS := -DPLATFORM_MSMSTEPPE
@@ -358,7 +359,6 @@
     libdl \
     libaudioutils \
     libexpat \
-    libqti_vndfwk_detect \
     libhwbinder \
     libhidlbase \
     libhidltransport \
diff --git a/hal/ahal_config_helper.cpp b/hal/ahal_config_helper.cpp
index 92bb520..63f44ab 100644
--- a/hal/ahal_config_helper.cpp
+++ b/hal/ahal_config_helper.cpp
@@ -74,6 +74,12 @@
             true,        /* FLUENCE */
             true,        /* CUSTOM_STEREO */
             true,        /* ANC_HEADSET */
+            true,        /* SPKR_PROT */
+            true,        /* FM_POWER_OPT */
+            false,       /* EXTERNAL_QDSP */
+            false,       /* EXTERNAL_SPEAKER */
+            false,       /* EXTERNAL_SPEAKER_TFA */
+            false,       /* HWDEP_CAL */
             false,       /* DSM_FEEDBACK */
             true,        /* USB_OFFLOAD */
             false,       /* USB_OFFLOAD_BURST_MODE */
@@ -102,6 +108,12 @@
             false,       /* FLUENCE */
             false,       /* CUSTOM_STEREO */
             false,       /* ANC_HEADSET */
+            true,        /* SPKR_PROT */
+            false,       /* FM_POWER_OPT */
+            true,        /* EXTERNAL_QDSP */
+            true,        /* EXTERNAL_SPEAKER */
+            false,       /* EXTERNAL_SPEAKER_TFA */
+            true,        /* HWDEP_CAL */
             false,       /* DSM_FEEDBACK */
             true,        /* USB_OFFLOAD */
             false,       /* USB_OFFLOAD_BURST_MODE */
diff --git a/hal/ahal_config_helper.h b/hal/ahal_config_helper.h
index 6e19bfa..32f575c 100644
--- a/hal/ahal_config_helper.h
+++ b/hal/ahal_config_helper.h
@@ -46,6 +46,12 @@
     bool fluence_enabled;
     bool custom_stereo_enabled;
     bool anc_headset_enabled;
+    bool spkr_prot_enabled;
+    bool fm_power_opt_enabled;
+    bool ext_qdsp_enabled;
+    bool ext_spkr_enabled;
+    bool ext_spkr_tfa_enabled;
+    bool hwdep_cal_enabled;
     bool dsm_feedback_enabled;
     bool usb_offload_enabled;
     bool usb_offload_burst_mode;
diff --git a/hal/audio_extn/Android.mk b/hal/audio_extn/Android.mk
index 57ce7a1..3f341b1 100644
--- a/hal/audio_extn/Android.mk
+++ b/hal/audio_extn/Android.mk
@@ -373,8 +373,7 @@
     libtinycompress \
     libaudioroute \
     libdl \
-    libexpat \
-    libqti_vndfwk_detect
+    libexpat
 
 LOCAL_C_INCLUDES := \
     $(PRIMARY_HAL_PATH) \
diff --git a/hal/audio_extn/a2dp.c b/hal/audio_extn/a2dp.c
index e1f902e..90199cf 100644
--- a/hal/audio_extn/a2dp.c
+++ b/hal/audio_extn/a2dp.c
@@ -33,7 +33,6 @@
 #include <log/log.h>
 #include <dlfcn.h>
 #include <pthread.h>
-#include <vndfwk-detect.h>
 #include "audio_hw.h"
 #include "platform.h"
 #include "platform_api.h"
@@ -142,6 +141,19 @@
 #define CH_MONO                         1
 #define SOURCE 0
 #define SINK   1
+#define UNINITIALIZED -1
+
+#ifdef __LP64__
+#define VNDK_FWK_LIB_PATH "/vendor/lib64/libqti_vndfwk_detect.so"
+#else
+#define VNDK_FWK_LIB_PATH "/vendor/lib/libqti_vndfwk_detect.so"
+#endif
+
+static void *vndk_fwk_lib_handle = NULL;
+static int is_running_with_enhanced_fwk = UNINITIALIZED;
+
+typedef int (*vndk_fwk_isVendorEnhancedFwk_t)();
+static vndk_fwk_isVendorEnhancedFwk_t vndk_fwk_isVendorEnhancedFwk;
 
 /*
  * Below enum values are extended from audio_base.h to
@@ -810,6 +822,26 @@
     return -ENOSYS;
 }
 
+static int check_if_enhanced_fwk() {
+
+    int is_enhanced_fwk = 1;
+    //dlopen lib
+    vndk_fwk_lib_handle = dlopen(VNDK_FWK_LIB_PATH, RTLD_NOW);
+    if (vndk_fwk_lib_handle != NULL) {
+        vndk_fwk_isVendorEnhancedFwk = (vndk_fwk_isVendorEnhancedFwk_t)
+                    dlsym(vndk_fwk_lib_handle, "isRunningWithVendorEnhancedFramework");
+        if (vndk_fwk_isVendorEnhancedFwk == NULL) {
+            ALOGW("%s: VNDK_FWK_LIB not found, defaulting to enhanced_fwk configuration",
+                                                                            __func__);
+            is_enhanced_fwk = 1;
+        } else {
+            is_enhanced_fwk = vndk_fwk_isVendorEnhancedFwk();
+        }
+    }
+    ALOGV("%s: vndk_fwk_isVendorEnhancedFwk=%d", __func__, is_enhanced_fwk);
+    return is_enhanced_fwk;
+}
+
 /* API to open BT IPC library to start IPC communication for BT Source*/
 static void open_a2dp_source()
 {
@@ -817,7 +849,9 @@
 
     ALOGD(" Open A2DP source start ");
     if (a2dp.bt_lib_source_handle == NULL) {
-        if(!isRunningWithVendorEnhancedFramework()) {
+        if (is_running_with_enhanced_fwk == UNINITIALIZED)
+            is_running_with_enhanced_fwk = check_if_enhanced_fwk();
+        if (!is_running_with_enhanced_fwk) {
             ALOGD(" Requesting for BT lib handle");
             a2dp.bt_lib_source_handle = dlopen(BT_IPC_SOURCE_LIB_NAME, RTLD_NOW);
             if (a2dp.bt_lib_source_handle == NULL) {
@@ -865,7 +899,7 @@
         if (a2dp.bt_state_source == A2DP_STATE_DISCONNECTED) {
             ALOGD("calling BT stream open");
             ret = a2dp.audio_source_open();
-            if(ret != 0) {
+            if (ret != 0) {
                 ALOGE("Failed to open source stream for a2dp: status %d", ret);
                 goto init_fail;
             }
@@ -880,10 +914,14 @@
     }
 
 init_fail:
-    if(ret != 0 && (a2dp.bt_lib_source_handle != NULL)) {
+    if (ret != 0 && (a2dp.bt_lib_source_handle != NULL)) {
         dlclose(a2dp.bt_lib_source_handle);
         a2dp.bt_lib_source_handle = NULL;
     }
+    if (vndk_fwk_lib_handle != NULL) {
+        dlclose(vndk_fwk_lib_handle);
+        vndk_fwk_lib_handle = NULL;
+    }
 }
 
 /* API to open BT IPC library to start IPC communication for BT Sink*/
@@ -922,7 +960,7 @@
 
     if (a2dp.bt_state_source != A2DP_STATE_DISCONNECTED) {
         ALOGD("calling BT source stream close");
-        if(a2dp.audio_source_close() == false)
+        if (a2dp.audio_source_close() == false)
             ALOGE("failed close a2dp source control path from BT library");
     }
     a2dp.a2dp_source_started = false;
@@ -954,7 +992,7 @@
 
     if (a2dp.bt_state_sink != A2DP_STATE_DISCONNECTED) {
         ALOGD("calling BT sink stream close");
-        if(a2dp.audio_source_close() == false)
+        if (a2dp.audio_source_close() == false)
             ALOGE("failed close a2dp sink control path from BT library");
     }
     a2dp.a2dp_sink_started = false;
@@ -1140,7 +1178,7 @@
     bool is_configured = false;
     int ret = 0;
 
-    if(aac_bt_cfg == NULL)
+    if (aac_bt_cfg == NULL)
         return false;
 
     ctl_dec_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_SINK_DEC_CONFIG_BLOCK);
@@ -1342,7 +1380,7 @@
     bool is_configured = false;
     int ret = 0;
 
-    if(sbc_bt_cfg == NULL)
+    if (sbc_bt_cfg == NULL)
         goto fail;
 
     ctl_dec_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_SINK_DEC_CONFIG_BLOCK);
@@ -1437,7 +1475,7 @@
     bool is_configured = false;
     int ret = 0;
 
-    if(sbc_bt_cfg == NULL)
+    if (sbc_bt_cfg == NULL)
         return false;
 
    ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
@@ -1504,7 +1542,7 @@
 {
     int ret = 0;
 
-    if(aptx_dsp_cfg == NULL || aptx_bt_cfg == NULL) {
+    if (aptx_dsp_cfg == NULL || aptx_bt_cfg == NULL) {
         ALOGE("Invalid param, aptx_dsp_cfg %p aptx_bt_cfg %p",
               aptx_dsp_cfg, aptx_bt_cfg);
         return -EINVAL;
@@ -1592,7 +1630,7 @@
 {
     int ret = 0;
 
-    if(aptx_dsp_cfg == NULL || aptx_bt_cfg == NULL) {
+    if (aptx_dsp_cfg == NULL || aptx_bt_cfg == NULL) {
         ALOGE("Invalid param, aptx_dsp_cfg %p aptx_bt_cfg %p",
               aptx_dsp_cfg, aptx_bt_cfg);
         return -EINVAL;
@@ -1648,7 +1686,7 @@
 {
     int ret = 0;
 
-    if(aptx_dsp_cfg == NULL || aptx_bt_cfg == NULL) {
+    if (aptx_dsp_cfg == NULL || aptx_bt_cfg == NULL) {
         ALOGE("Invalid param, aptx_dsp_cfg %p aptx_bt_cfg %p",
               aptx_dsp_cfg, aptx_bt_cfg);
         return -EINVAL;
@@ -1685,7 +1723,7 @@
     int ret = 0;
     int sample_rate_backup;
 
-    if(aptx_bt_cfg == NULL)
+    if (aptx_bt_cfg == NULL)
         return false;
 
     ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
@@ -1697,7 +1735,7 @@
 #ifndef LINUX_ENABLED
     struct aptx_enc_cfg_t aptx_dsp_cfg;
     struct aptx_ad_enc_cfg_t aptx_ad_dsp_cfg;
-    if(a2dp.is_aptx_adaptive) {
+    if (a2dp.is_aptx_adaptive) {
         mixer_size = sizeof(struct aptx_ad_enc_cfg_t);
         ret = update_aptx_ad_dsp_config(&aptx_ad_dsp_cfg, aptx_bt_cfg);
         sample_rate_backup = aptx_ad_dsp_cfg.custom_cfg.sample_rate;
@@ -1711,7 +1749,7 @@
         goto fail;
     }
 
-    if(a2dp.is_aptx_adaptive) {
+    if (a2dp.is_aptx_adaptive) {
         ret = mixer_ctl_set_array(ctl_enc_data, (void *)&aptx_ad_dsp_cfg,
                               mixer_size);
     } else {
@@ -1736,9 +1774,9 @@
         goto fail;
     }
 #ifndef LINUX_ENABLED //Temporarily disabled for LE, need to take care while doing VT FR
-    if(a2dp.is_aptx_adaptive)
+    if (a2dp.is_aptx_adaptive)
         ret = a2dp_set_bit_format(aptx_bt_cfg->ad_cfg->bits_per_sample);
-    else if(a2dp.is_aptx_dual_mono_supported)
+    else if (a2dp.is_aptx_dual_mono_supported)
         ret = a2dp_set_bit_format(aptx_bt_cfg->dual_mono_cfg->bits_per_sample);
     else
         ret = a2dp_set_bit_format(aptx_bt_cfg->default_cfg->bits_per_sample);
@@ -1754,7 +1792,7 @@
         a2dp.bt_encoder_format = CODEC_TYPE_APTX;
 fail:
     /*restore sample rate */
-    if(!is_configured)
+    if (!is_configured)
         a2dp.enc_sampling_rate = sample_rate_backup;
     return is_configured;
 }
@@ -1772,7 +1810,7 @@
     bool is_configured = false;
     int ret = 0;
 
-    if(aptx_bt_cfg == NULL)
+    if (aptx_bt_cfg == NULL)
         return false;
 
     ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
@@ -1941,7 +1979,7 @@
     struct celt_enc_cfg_t celt_dsp_cfg;
     bool is_configured = false;
     int ret = 0;
-    if(celt_bt_cfg == NULL)
+    if (celt_bt_cfg == NULL)
         return false;
 
     ctl_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
@@ -2002,7 +2040,7 @@
     struct ldac_enc_cfg_t ldac_dsp_cfg;
     bool is_configured = false;
     int ret = 0;
-    if(ldac_bt_cfg == NULL)
+    if (ldac_bt_cfg == NULL)
         return false;
 
     ldac_enc_data = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_CONFIG_BLOCK);
@@ -2176,13 +2214,13 @@
 
     ALOGD("a2dp_start_playback start");
 
-    if(!(a2dp.bt_lib_source_handle && a2dp.audio_source_start
+    if (!(a2dp.bt_lib_source_handle && a2dp.audio_source_start
        && a2dp.audio_get_enc_config)) {
         ALOGE("a2dp handle is not identified, Ignoring start playback request");
         return -ENOSYS;
     }
 
-    if(a2dp.a2dp_source_suspended == true) {
+    if (a2dp.a2dp_source_suspended == true) {
         //session will be restarted after suspend completion
         ALOGD("a2dp start requested during suspend state");
         return -ENOSYS;
@@ -2197,7 +2235,7 @@
            ALOGE("BT controller start failed");
            a2dp.a2dp_source_started = false;
         } else {
-           if(configure_a2dp_encoder_format() == true) {
+           if (configure_a2dp_encoder_format() == true) {
                 a2dp.a2dp_source_started = true;
                 ret = 0;
                 ALOGD("Start playback successful to BT library");
@@ -2271,7 +2309,7 @@
 
     ALOGD("a2dp_start_capture start");
 
-    if(!(a2dp.bt_lib_sink_handle && a2dp.audio_sink_start
+    if (!(a2dp.bt_lib_sink_handle && a2dp.audio_sink_start
        && a2dp.audio_get_dec_config)) {
         ALOGE("a2dp handle is not identified, Ignoring start capture request");
         return -ENOSYS;
@@ -2287,12 +2325,12 @@
            a2dp.a2dp_sink_started = false;
         } else {
 
-           if(!a2dp_sink_is_ready()) {
+           if (!a2dp_sink_is_ready()) {
                 ALOGD("Wait for capture ready not successful");
                 ret = -ETIMEDOUT;
            }
 
-           if(configure_a2dp_sink_decoder_format() == true) {
+           if (configure_a2dp_sink_decoder_format() == true) {
                 a2dp.a2dp_sink_started = true;
                 ret = 0;
                 ALOGD("Start capture successful to BT library");
@@ -2311,7 +2349,7 @@
 
     if (a2dp.a2dp_sink_started) {
         if (a2dp_set_backend_cfg(SINK) == true) {
-        	a2dp.a2dp_sink_total_active_session_requests++;
+            a2dp.a2dp_sink_total_active_session_requests++;
         }
     }
 
@@ -2412,7 +2450,7 @@
     int ret =0;
 
     ALOGV("a2dp_stop_playback start");
-    if(!(a2dp.bt_lib_source_handle && a2dp.audio_source_stop)) {
+    if (!(a2dp.bt_lib_source_handle && a2dp.audio_source_stop)) {
         ALOGE("a2dp handle is not identified, Ignoring stop request");
         return -ENOSYS;
     }
@@ -2438,7 +2476,7 @@
         a2dp.a2dp_source_started = false;
         a2dp_reset_backend_cfg(SOURCE);
     }
-    if(!a2dp.a2dp_source_total_active_session_requests)
+    if (!a2dp.a2dp_source_total_active_session_requests)
        a2dp.a2dp_source_started = false;
     ALOGD("Stop A2DP playback, total active sessions :%d",
           a2dp.a2dp_source_total_active_session_requests);
@@ -2450,7 +2488,7 @@
     int ret =0;
 
     ALOGV("a2dp_stop_capture start");
-    if(!(a2dp.bt_lib_sink_handle && a2dp.audio_sink_stop)) {
+    if (!(a2dp.bt_lib_sink_handle && a2dp.audio_sink_stop)) {
         ALOGE("a2dp handle is not identified, Ignoring stop request");
         return -ENOSYS;
     }
@@ -2468,7 +2506,7 @@
         reset_a2dp_sink_dec_config_params();
         a2dp_reset_backend_cfg(SINK);
     }
-    if(!a2dp.a2dp_sink_total_active_session_requests)
+    if (!a2dp.a2dp_sink_total_active_session_requests)
        a2dp.a2dp_source_started = false;
     ALOGD("Stop A2DP capture, total active sessions :%d",
           a2dp.a2dp_sink_total_active_session_requests);
@@ -2482,7 +2520,7 @@
      struct audio_usecase *uc_info;
      struct listnode *node;
 
-     if(a2dp.is_a2dp_offload_supported == false) {
+     if (a2dp.is_a2dp_offload_supported == false) {
         ALOGV("no supported encoders identified,ignoring a2dp setparam");
         status = -EINVAL;
         goto param_handled;
@@ -2522,9 +2560,9 @@
      ret = str_parms_get_str(parms, "TwsChannelConfig", value, sizeof(value));
      if (ret>=0) {
          ALOGD("Setting tws channel mode to %s",value);
-         if(!(strncmp(value,"mono",strlen(value))))
+         if (!(strncmp(value,"mono",strlen(value))))
             a2dp.is_tws_mono_mode_on = true;
-         else if(!(strncmp(value,"dual-mono",strlen(value))))
+         else if (!(strncmp(value,"dual-mono",strlen(value))))
             a2dp.is_tws_mono_mode_on = false;
          audio_a2dp_update_tws_channel_mode();
      goto param_handled;
@@ -2553,13 +2591,13 @@
                 }
                 reset_a2dp_enc_config_params();
                 reset_a2dp_source_dec_config_params();
-                if(a2dp.audio_source_suspend)
+                if (a2dp.audio_source_suspend)
                    a2dp.audio_source_suspend();
             } else if (a2dp.a2dp_source_suspended == true) {
                 ALOGD("Resetting a2dp suspend state");
                 struct audio_usecase *uc_info;
                 struct listnode *node;
-                if(a2dp.clear_source_a2dpsuspend_flag)
+                if (a2dp.clear_source_a2dpsuspend_flag)
                     a2dp.clear_source_a2dpsuspend_flag();
                 a2dp.a2dp_source_suspended = false;
                 /*
@@ -2575,7 +2613,7 @@
                  */
                 if (a2dp.a2dp_source_total_active_session_requests > 0) {
                     ALOGD(" Calling IPC lib start post suspend state");
-                    if(a2dp.audio_source_start) {
+                    if (a2dp.audio_source_start) {
                         ret =  a2dp.audio_source_start();
                         if (ret != 0) {
                             ALOGE("BT controller start failed");
@@ -2687,7 +2725,10 @@
   a2dp.a2dp_sink_started = false;
   a2dp.bt_state_sink = A2DP_STATE_DISCONNECTED;
   a2dp.a2dp_sink_total_active_session_requests = 0;
-  if (isRunningWithVendorEnhancedFramework())
+
+  if (is_running_with_enhanced_fwk == UNINITIALIZED)
+      is_running_with_enhanced_fwk = check_if_enhanced_fwk();
+  if (is_running_with_enhanced_fwk)
       open_a2dp_sink();
 
   a2dp.is_a2dp_offload_supported = false;
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index 8e52e11..440f1d8 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -67,7 +67,7 @@
 #define MAX_NUM_CHANNELS 8
 #define Q14_GAIN_UNITY 0x4000
 
-static bool is_running_on_stock_version = true;
+static int is_running_vendor_enhanced_fwk = 1;
 static bool is_compress_meta_data_enabled = false;
 
 struct snd_card_split cur_snd_card_split = {
@@ -1130,13 +1130,14 @@
 
 void spkr_prot_feature_init(bool is_feature_enabled)
 {
-    ALOGD("%s: Called with feature %s", __func__, is_feature_enabled?"Enabled":"NOT Enabled");
+    ALOGD("%s: Called with feature %s, is_running_with_enhanced_fwk %d", __func__,
+            is_feature_enabled?"Enabled":"NOT Enabled", is_running_vendor_enhanced_fwk);
     if (is_feature_enabled) {
         //dlopen lib
-        if (is_running_on_stock_version)
-            spkr_prot_lib_handle = dlopen(CIRRUS_SPKR_PROT_LIB_PATH, RTLD_NOW);
-        else
+        if (is_running_vendor_enhanced_fwk)
             spkr_prot_lib_handle = dlopen(SPKR_PROT_LIB_PATH, RTLD_NOW);
+        else
+            spkr_prot_lib_handle = dlopen(CIRRUS_SPKR_PROT_LIB_PATH, RTLD_NOW);
 
         if (spkr_prot_lib_handle == NULL) {
             ALOGE("%s: dlopen failed", __func__);
@@ -2328,8 +2329,6 @@
 
 void audio_extn_init(struct audio_device *adev)
 {
-    //fix-me: check running on vendor enhanced build
-    //is_running_on_stock_version = !isRunningWithVendorEnhancedFramework();
     aextnmod.anc_enabled = 0;
     aextnmod.aanc_enabled = 0;
     aextnmod.custom_stereo_enabled = 0;
@@ -3699,8 +3698,9 @@
 }
 
 // END: A2DP_OFFLOAD =====================================================================
-void audio_extn_feature_init()
+void audio_extn_feature_init(int is_running_with_enhanced_fwk)
 {
+    is_running_vendor_enhanced_fwk = is_running_with_enhanced_fwk;
     for(int index = 0; index < VOICE_START; index++)
     {
         bool enable = audio_feature_manager_is_feature_enabled(index);
@@ -3733,6 +3733,7 @@
                 break;
             case KPI_OPTIMIZE:
                 kpi_optimize_feature_init(enable);
+                break;
             case USB_OFFLOAD:
                 usb_offload_feature_init(enable);
                 break;
@@ -3763,6 +3764,24 @@
             case ANC_HEADSET:
                 anc_headset_feature_init(enable);
                 break;
+            case SPKR_PROT:
+                spkr_prot_feature_init(enable);
+                break;
+            case FM_POWER_OPT_FEATURE:
+                fm_feature_init(enable);
+                break;
+            case EXTERNAL_QDSP:
+                external_qdsp_feature_init(enable);
+                break;
+            case EXTERNAL_SPEAKER:
+                external_speaker_feature_init(enable);
+                break;
+            case EXTERNAL_SPEAKER_TFA:
+                external_speaker_tfa_feature_init(enable);
+                break;
+            case HWDEP_CAL:
+                hwdep_cal_feature_init(enable);
+                break;
             default:
                 break;
         }
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 158370a..3503fd6 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -228,7 +228,7 @@
 
 // call at adev init
 void audio_extn_init(struct audio_device *adev);
-void audio_extn_feature_init();
+void audio_extn_feature_init(int is_running_with_enhanced_fwk);
 //START: SND_MONITOR_FEATURE ===========================================
 void snd_mon_feature_init (bool is_feature_enabled);
 typedef void (* snd_mon_cb)(void * stream, struct str_parms * parms);
diff --git a/hal/audio_extn/audio_feature_manager.c b/hal/audio_extn/audio_feature_manager.c
index bf92bd6..bc996a2 100644
--- a/hal/audio_extn/audio_feature_manager.c
+++ b/hal/audio_extn/audio_feature_manager.c
@@ -33,10 +33,10 @@
 #include <stdlib.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <dlfcn.h>
 #include <cutils/properties.h>
 #include <log/log.h>
 #include <unistd.h>
-#include <vndfwk-detect.h>
 #include "audio_hw.h"
 #include "audio_extn.h"
 #include "voice_extn.h"
@@ -44,14 +44,48 @@
 
 extern AHalValues* confValues;
 
+#ifdef __LP64__
+#define VNDK_FWK_LIB_PATH "/vendor/lib64/libqti_vndfwk_detect.so"
+#else
+#define VNDK_FWK_LIB_PATH "/vendor/lib/libqti_vndfwk_detect.so"
+#endif
+
+static void *vndk_fwk_lib_handle = NULL;
+
+typedef int (*vndk_fwk_isVendorEnhancedFwk_t)();
+static vndk_fwk_isVendorEnhancedFwk_t vndk_fwk_isVendorEnhancedFwk;
+
+
+
 void audio_feature_manager_init()
 {
-    ALOGV("%s: Enter", __func__);
-    audio_extn_ahal_config_helper_init(
-                isRunningWithVendorEnhancedFramework());
+    ALOGD("%s: Enter", __func__);
+    int is_running_with_enhanced_fwk = 0;
+
+    //dlopen lib
+    vndk_fwk_lib_handle = dlopen(VNDK_FWK_LIB_PATH, RTLD_NOW);
+    if (vndk_fwk_lib_handle != NULL) {
+        vndk_fwk_isVendorEnhancedFwk = (vndk_fwk_isVendorEnhancedFwk_t)
+                    dlsym(vndk_fwk_lib_handle, "isRunningWithVendorEnhancedFramework");
+        if (vndk_fwk_isVendorEnhancedFwk == NULL) {
+            ALOGW("%s: VNDK_FWK_LIB not found, defaulting to enhanced_fwk configuration",
+                                                                            __func__);
+            is_running_with_enhanced_fwk = 1;
+        } else {
+            is_running_with_enhanced_fwk = vndk_fwk_isVendorEnhancedFwk();
+        }
+    }
+
+    ALOGD("%s: vndk_fwk_isVendorEnhancedFwk=%d", __func__, is_running_with_enhanced_fwk);
+    audio_extn_ahal_config_helper_init(is_running_with_enhanced_fwk);
     confValues = audio_extn_get_feature_values();
-    audio_extn_feature_init();
-    voice_extn_feature_init();
+    audio_extn_feature_init(is_running_with_enhanced_fwk);
+    voice_extn_feature_init(is_running_with_enhanced_fwk);
+
+    if (vndk_fwk_lib_handle != NULL) {
+        dlclose(vndk_fwk_lib_handle);
+        vndk_fwk_lib_handle = NULL;
+    }
 }
 
 bool audio_feature_manager_is_feature_enabled(audio_ext_feature feature)
@@ -99,6 +133,18 @@
             return confValues->custom_stereo_enabled;
         case ANC_HEADSET:
             return confValues->anc_headset_enabled;
+        case SPKR_PROT:
+             return confValues->spkr_prot_enabled;
+        case FM_POWER_OPT_FEATURE:
+             return confValues->fm_power_opt_enabled;
+        case EXTERNAL_QDSP:
+             return confValues->ext_qdsp_enabled;
+        case EXTERNAL_SPEAKER:
+             return confValues->ext_spkr_enabled;
+        case EXTERNAL_SPEAKER_TFA:
+             return confValues->ext_spkr_tfa_enabled;
+        case HWDEP_CAL:
+             return confValues->hwdep_cal_enabled;
         case DSM_FEEDBACK:
             return confValues->dsm_feedback_enabled;
         case USB_OFFLOAD:
diff --git a/hal/audio_extn/audio_feature_manager.h b/hal/audio_extn/audio_feature_manager.h
index 8433db0..5e84db0 100644
--- a/hal/audio_extn/audio_feature_manager.h
+++ b/hal/audio_extn/audio_feature_manager.h
@@ -55,6 +55,12 @@
     USB_OFFLOAD_SIDETONE_VOLM,
     A2DP_OFFLOAD,
     VBAT,
+    SPKR_PROT,
+    FM_POWER_OPT_FEATURE,
+    EXTERNAL_QDSP,
+    EXTERNAL_SPEAKER,
+    EXTERNAL_SPEAKER_TFA,
+    HWDEP_CAL,
     COMPRESS_METADATA_NEEDED,
     VOICE_START = COMPRESS_METADATA_NEEDED,
     COMPRESS_VOIP,
diff --git a/hal/audio_extn/ext_hw_plugin.c b/hal/audio_extn/ext_hw_plugin.c
index 1336ae8..a24f5c6 100644
--- a/hal/audio_extn/ext_hw_plugin.c
+++ b/hal/audio_extn/ext_hw_plugin.c
@@ -47,6 +47,11 @@
 typedef int32_t (*audio_hal_plugin_send_msg_t)(audio_hal_plugin_msg_type_t,
                                            void *, uint32_t);
 
+struct hostless_module {
+    struct pcm *pcm_tx;
+    struct pcm *pcm_rx;
+};
+
 struct ext_hw_plugin_data {
     struct audio_device           *adev;
     void                          *plugin_handle;
@@ -57,23 +62,32 @@
     snd_device_t                   out_snd_dev[AUDIO_HAL_PLUGIN_USECASE_MAX];
     snd_device_t                   in_snd_dev[AUDIO_HAL_PLUGIN_USECASE_MAX];
     bool                           mic_mute;
+    struct hostless_module         adev_hostless;
 };
 
 /* This can be defined in platform specific file or use compile flag */
 #define LIB_PLUGIN_DRIVER "libaudiohalplugin.so"
 
-/* Note: Due to ADP H/W design, SoC TERT/SEC TDM CLK and FSYNC lines are both connected
- * with CODEC and a single master is needed to provide consistent CLK and FSYNC to slaves,
- * hence configuring SoC TERT TDM as single master and bring up a dummy hostless from TERT
- * to SEC to ensure both slave SoC SEC TDM and CODEC are driven upon system boot. */
-static void audio_extn_ext_hw_plugin_enable_adev_hostless(struct audio_device *adev)
+/* Note: Due to ADP H/W design, SoC TERT/SEC TDM CLK and FSYNC lines are 
+ * both connected with CODEC and a single master is needed to provide
+ * consistent CLK and FSYNC to slaves, hence configuring SoC TERT TDM as
+ * single master and bring up a dummy hostless from TERT to SEC to ensure
+ * both slave SoC SEC TDM and CODEC are driven upon system boot. */
+static void audio_extn_ext_hw_plugin_enable_adev_hostless(void *plugin)
 {
+    struct ext_hw_plugin_data *my_plugin =
+        (struct ext_hw_plugin_data *)plugin;
+    char mixer_path[MIXER_PATH_MAX_LENGTH];
+
     ALOGI("%s: Enable TERT -> SEC Hostless", __func__);
 
-    char mixer_path[MIXER_PATH_MAX_LENGTH];
     strlcpy(mixer_path, "dummy-hostless", MIXER_PATH_MAX_LENGTH);
     ALOGD("%s: apply mixer and update path: %s", __func__, mixer_path);
-    audio_route_apply_and_update_path(adev->audio_route, mixer_path);
+    if (audio_route_apply_and_update_path(my_plugin->adev->audio_route,
+            mixer_path)) {
+        ALOGE("%s: %s not supported, continue", __func__, mixer_path);
+        return;
+    }
 
     /* TERT TDM TX 7 HOSTLESS to SEC TDM RX 7 HOSTLESS */
     int pcm_dev_rx = 48, pcm_dev_tx = 49;
@@ -88,31 +102,51 @@
         .avail_min = 0,
     };
 
-    struct pcm *pcm_tx = pcm_open(adev->snd_card,
+    my_plugin->adev_hostless.pcm_tx = pcm_open(my_plugin->adev->snd_card,
                                    pcm_dev_tx,
                                    PCM_IN, &pcm_config_lb);
-    if (pcm_tx && !pcm_is_ready(pcm_tx)) {
-        ALOGE("%s: %s", __func__, pcm_get_error(pcm_tx));
+    if (my_plugin->adev_hostless.pcm_tx &&
+        !pcm_is_ready(my_plugin->adev_hostless.pcm_tx)) {
+        ALOGE("%s: %s", __func__,
+            pcm_get_error(my_plugin->adev_hostless.pcm_tx));
         return;
     }
-    struct pcm *pcm_rx = pcm_open(adev->snd_card,
+    my_plugin->adev_hostless.pcm_rx = pcm_open(my_plugin->adev->snd_card,
                                    pcm_dev_rx,
                                    PCM_OUT, &pcm_config_lb);
-    if (pcm_rx && !pcm_is_ready(pcm_rx)) {
-        ALOGE("%s: %s", __func__, pcm_get_error(pcm_rx));
+    if (my_plugin->adev_hostless.pcm_rx &&
+        !pcm_is_ready(my_plugin->adev_hostless.pcm_rx)) {
+        ALOGE("%s: %s", __func__,
+            pcm_get_error(my_plugin->adev_hostless.pcm_rx));
         return;
     }
 
-    if (pcm_start(pcm_tx) < 0) {
+    if (pcm_start(my_plugin->adev_hostless.pcm_tx) < 0) {
         ALOGE("%s: pcm start for pcm tx failed", __func__);
         return;
     }
-    if (pcm_start(pcm_rx) < 0) {
+    if (pcm_start(my_plugin->adev_hostless.pcm_rx) < 0) {
         ALOGE("%s: pcm start for pcm rx failed", __func__);
         return;
     }
 }
 
+static void audio_extn_ext_hw_plugin_disable_adev_hostless(void *plugin)
+{
+    struct ext_hw_plugin_data *my_plugin = (struct ext_hw_plugin_data *)plugin;
+
+    ALOGI("%s: Disable TERT -> SEC Hostless", __func__);
+
+    if (my_plugin->adev_hostless.pcm_tx) {
+        pcm_close(my_plugin->adev_hostless.pcm_tx);
+        my_plugin->adev_hostless.pcm_tx = NULL;
+    }
+    if (my_plugin->adev_hostless.pcm_rx) {
+        pcm_close(my_plugin->adev_hostless.pcm_rx);
+        my_plugin->adev_hostless.pcm_rx = NULL;
+    }
+}
+
 void* audio_extn_ext_hw_plugin_init(struct audio_device *adev)
 {
     int32_t ret = 0;
@@ -165,7 +199,7 @@
         }
     }
 
-    audio_extn_ext_hw_plugin_enable_adev_hostless(adev);
+    audio_extn_ext_hw_plugin_enable_adev_hostless(my_plugin);
 
     my_plugin->mic_mute = false;
     return my_plugin;
@@ -187,6 +221,8 @@
         return -EINVAL;
     }
 
+    audio_extn_ext_hw_plugin_disable_adev_hostless(my_plugin);
+
     if (my_plugin->audio_hal_plugin_deinit) {
         ret = my_plugin->audio_hal_plugin_deinit();
         if (ret) {
diff --git a/hal/audio_extn/spkr_protection.c b/hal/audio_extn/spkr_protection.c
index 7a6e1c1..1e394a4 100644
--- a/hal/audio_extn/spkr_protection.c
+++ b/hal/audio_extn/spkr_protection.c
@@ -935,6 +935,10 @@
         total_time = (handle.v_vali_wait_time + handle.v_vali_vali_time);
         ts.tv_sec += (total_time/1000);
         ts.tv_nsec += ((total_time%1000) * 1000000);
+        if (ts.tv_nsec >= 1000000000) {
+            ts.tv_nsec -= 1000000000;
+            ts.tv_sec += 1;
+        }
     }
     pthread_mutex_lock(&handle.mutex_spkr_prot);
     pthread_mutex_unlock(&adev->lock);
@@ -1748,12 +1752,14 @@
     if (!handle.v_vali_vali_time)
         handle.v_vali_vali_time = SPKR_V_VALI_DEFAULT_VALI_TIME;/*set default if not setparam */
     set_spkr_prot_v_vali_cfg(handle.v_vali_wait_time, handle.v_vali_vali_time);
+    pthread_mutex_lock(&adev->lock);
     ret = spkr_calibrate(SPKR_V_VALI_TEMP_MASK,
                          SPKR_V_VALI_TEMP_MASK);/*use 0xfffe as temp to initiate v_vali*/
+    pthread_mutex_unlock(&adev->lock);
     if (ret)
         ALOGE("%s: failed, retry again\n", __func__);
-    pthread_exit(0);
     handle.trigger_v_vali = false;
+    pthread_exit(0);
     return NULL;
 }
 
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 9fb93d5..cf7c9f5 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1255,7 +1255,8 @@
             disable_asrc_mode(adev);
             audio_route_apply_and_update_path(adev->audio_route, "hph-lowpower-mode");
         }
-        if ((snd_device == SND_DEVICE_IN_HANDSET_6MIC) &&
+        if (((snd_device == SND_DEVICE_IN_HANDSET_6MIC) ||
+            (snd_device == SND_DEVICE_IN_HANDSET_QMIC)) &&
             (audio_extn_ffv_get_stream() == adev->active_input)) {
             ALOGD("%s: deinit ec ref loopback", __func__);
             audio_extn_ffv_deinit_ec_ref_loopback(adev, snd_device);
@@ -3847,6 +3848,12 @@
     if (out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) {
         send_offload_cmd_l(out, OFFLOAD_CMD_ERROR);
     }
+
+    if (is_offload_usecase(out->usecase) && out->card_status == CARD_STATUS_OFFLINE) {
+        ALOGD("Setting previous card status if offline");
+        out->prev_card_status_offline = true;
+    }
+
     pthread_mutex_unlock(&out->lock);
 
     return status;
@@ -5142,6 +5149,9 @@
              */
             ALOGE(" ERROR: sound card not active, return error");
             ret = -EINVAL;
+        } else if (out->prev_card_status_offline) {
+            ALOGE("ERROR: previously sound card was offline,return error");
+            ret = -EINVAL;
         } else {
             ret = 0;
             adjust_frames_for_device_delay(out, dsp_frames);
@@ -5244,7 +5254,10 @@
         } else if (out->card_status == CARD_STATUS_OFFLINE) {
             *frames = out->written;
             clock_gettime(CLOCK_MONOTONIC, timestamp);
-            ret = 0;
+            if (is_offload_usecase(out->usecase))
+                ret = -EINVAL;
+            else
+                ret = 0;
         }
     }
     pthread_mutex_unlock(&out->lock);
@@ -6379,6 +6392,7 @@
     out->hal_output_suspend_supported = 0;
     out->dynamic_pm_qos_config_supported = 0;
     out->set_dual_mono = false;
+    out->prev_card_status_offline = false;
 
     if ((flags & AUDIO_OUTPUT_FLAG_BD) &&
         (property_get_bool("vendor.audio.matrix.limiter.enable", false)))
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index 23306de..fa7a325 100644
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -371,6 +371,7 @@
     mix_matrix_params_t pan_scale_params;
     mix_matrix_params_t downmix_params;
     bool set_dual_mono;
+    bool prev_card_status_offline;
 
     error_log_t *error_log;
 };
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 9bb3ce5..164dc5a 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -6396,7 +6396,7 @@
      * Handset and speaker may have diffrent backend. Check if the device is speaker or handset,
      * and these devices are restricited to 48kHz.
      */
-    if ((platform_get_backend_index(snd_device) == DEFAULT_CODEC_BACKEND) &&
+    if (!codec_device_supports_native_playback(usecase->devices) &&
         (platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, snd_device) ||
          platform_check_backends_match(SND_DEVICE_OUT_HANDSET, snd_device))) {
         sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index a609de1..2ce1d6d 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -7370,7 +7370,9 @@
      * Handset and speaker may have diffrent backend. Check if the device is speaker or handset,
      * and these devices are restricited to 48kHz.
      */
-    if (platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, snd_device)) {
+    if (!codec_device_supports_native_playback(usecase->devices) &&
+        (platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, snd_device) ||
+         platform_check_backends_match(SND_DEVICE_OUT_HANDSET, snd_device))) {
         int bw = platform_get_snd_device_bit_width(SND_DEVICE_OUT_SPEAKER);
         if ((-ENOSYS != bw) && (bit_width > (uint32_t)bw)) {
             bit_width = (uint32_t)bw;
diff --git a/hal/voice_extn/voice_extn.c b/hal/voice_extn/voice_extn.c
index 8ab7b1e..aaed913 100644
--- a/hal/voice_extn/voice_extn.c
+++ b/hal/voice_extn/voice_extn.c
@@ -86,6 +86,7 @@
 
 static bool voice_extn_compress_voip_enabled = false;
 static bool voice_extn_dynamic_ecns_feature_enabled = false;
+static int voice_extn_is_running_vendor_enhanced_fwk = 1;
 
 int voice_extn_is_call_state_active(struct audio_device *adev, bool *is_call_active);
 
@@ -402,8 +403,9 @@
     return voice_extn_dynamic_ecns_feature_enabled;
 }
 
-void voice_extn_feature_init()
+void voice_extn_feature_init(int is_running_with_enhanced_fwk)
 {
+    voice_extn_is_running_vendor_enhanced_fwk = is_running_with_enhanced_fwk;
     for(int index = VOICE_START; index < MAX_SUPPORTED_FEATURE; index++)
     {
         bool enable = audio_feature_manager_is_feature_enabled(index);
diff --git a/hal/voice_extn/voice_extn.h b/hal/voice_extn/voice_extn.h
index 51afe47..d45114b 100644
--- a/hal/voice_extn/voice_extn.h
+++ b/hal/voice_extn/voice_extn.h
@@ -88,7 +88,7 @@
 bool voice_extn_compress_voip_is_format_supported(audio_format_t format);
 bool voice_extn_compress_voip_is_config_supported(struct audio_config *config);
 bool voice_extn_compress_voip_is_started(struct audio_device *adev);
-void voice_extn_feature_init();
+void voice_extn_feature_init(int is_running_with_enhanced_fwk);
 void compr_voip_feature_init(bool is_feature_enabled);
 bool voice_extn_is_compress_voip_supported();
 void dynamic_ecns_feature_init(bool is_feature_enabled);