Merge "st-hal: Update custom config data for merged sound model usecases"
diff --git a/sound_trigger_hw.c b/sound_trigger_hw.c
index 2506887..030be52 100644
--- a/sound_trigger_hw.c
+++ b/sound_trigger_hw.c
@@ -876,6 +876,7 @@
                 st_session_pause(p_ses);
             }
         }
+        platform_stdev_reset_backend_cfg(stdev->platform);
         list_for_each(p_ses_node, &stdev->sound_model_list) {
             p_ses = node_to_item(p_ses_node, st_session_t, list_node);
             if (p_ses && p_ses->exec_mode == ST_EXEC_MODE_ADSP) {
@@ -1125,6 +1126,7 @@
                 st_session_pause(p_ses);
             }
         }
+        platform_stdev_reset_backend_cfg(stdev->platform);
         list_for_each(p_ses_node, &stdev->sound_model_list) {
             p_ses = node_to_item(p_ses_node, st_session_t, list_node);
             if (p_ses && p_ses->exec_mode == ST_EXEC_MODE_ADSP) {
@@ -1998,6 +2000,7 @@
     }
 
     st_session->sm_type = sound_model->type;
+    stdev->lpi_enable = st_hw_check_lpi_support(stdev, NULL);
     st_hw_check_and_set_lpi_mode(st_session);
 
     /* CPE DRAM can only be accessed by single client, i.e. Apps or CPE,
@@ -2118,7 +2121,7 @@
     }
 
     struct st_vendor_info *stopped_v_info = stopped_ses->vendor_uuid_info;
-    ALOGD("%s:[%d] v_info %p", __func__, stopped_ses->sm_handle, stopped_v_info);
+    ALOGV("%s:[%d] v_info %p", __func__, stopped_ses->sm_handle, stopped_v_info);
 
     stopped_ses_channel_count =
         platform_stdev_get_backend_channel_count(stdev->platform,
@@ -2144,7 +2147,7 @@
                       (st_session_is_active(ses) == false) &&
                       (st_session_is_buffering(ses) == false);
         if (is_stopped) {
-            ALOGV("%s:[%d]ses is stopped, ignore", __func__, ses->sm_handle);
+            ALOGV("%s:[%d] is stopped, ignore", __func__, ses->sm_handle);
             continue;
         }
 
diff --git a/sound_trigger_platform.c b/sound_trigger_platform.c
index c048569..c5b7189 100644
--- a/sound_trigger_platform.c
+++ b/sound_trigger_platform.c
@@ -101,6 +101,7 @@
 #define ST_PARAM_KEY_CHANNEL_COUNT "channel_count"
 #define ST_PARAM_KEY_IN_CHANNELS "in_channels"
 #define ST_PARAM_KEY_IN_CHANNELS_LPI "in_channels_lpi"
+#define ST_PARAM_KEY_LPI_MODE "lpi_mode"
 #define ST_PARAM_KEY_OUT_CHANNELS "out_channels"
 #define ST_PARAM_KEY_ADM_CFG_PROFILE "adm_cfg_profile"
 #define ST_PARAM_KEY_CAPTURE_DEVICE "capture_device"
@@ -2216,6 +2217,19 @@
                 goto err_exit;
             }
         }
+
+        lsm_params->lpi_enable = ST_PLATFORM_LPI_NONE;
+        err = str_parms_get_str(parms, ST_PARAM_KEY_LPI_MODE,
+                                str_value, sizeof(str_value));
+        if (err >= 0) {
+            str_parms_del(parms, ST_PARAM_KEY_LPI_MODE);
+            if (!strncasecmp(str_value, "NON_LPI", sizeof("NON_LPI")))
+                lsm_params->lpi_enable = ST_PLATFORM_LPI_DISABLE;
+            else if (!strncasecmp(str_value, "LPI", sizeof("LPI")))
+                lsm_params->lpi_enable = ST_PLATFORM_LPI_ENABLE;
+            else
+                ALOGE("%s: invalid lpi_mode set: %s", __func__, str_value);
+        }
     }
 
     list_add_tail(&sm_info->lsm_usecase_list, &lsm_params->list_node);
@@ -3972,27 +3986,27 @@
                 channel_count = my_data->codec_backend_cfg.channel_count;
             }
             if (channel_count == SOUND_TRIGGER_CHANNEL_MODE_OCT) {
-                if (my_data->codec_backend_cfg.lpi_enable)
+                if (my_data->stdev->lpi_enable)
                     st_device = ST_DEVICE_HANDSET_8MIC_LPI;
                 else
                     st_device = ST_DEVICE_HANDSET_8MIC;
             } else if (channel_count == SOUND_TRIGGER_CHANNEL_MODE_HEX) {
-                if (my_data->codec_backend_cfg.lpi_enable)
+                if (my_data->stdev->lpi_enable)
                     st_device = ST_DEVICE_HANDSET_6MIC_LPI;
                 else
                     st_device = ST_DEVICE_HANDSET_6MIC;
             } else if (channel_count == SOUND_TRIGGER_CHANNEL_MODE_QUAD) {
-                if (my_data->codec_backend_cfg.lpi_enable)
+                if (my_data->stdev->lpi_enable)
                     st_device = ST_DEVICE_HANDSET_QMIC_LPI;
                 else
                     st_device = ST_DEVICE_HANDSET_QMIC;
             } else if (channel_count == SOUND_TRIGGER_CHANNEL_MODE_TRI) {
-                if (my_data->codec_backend_cfg.lpi_enable)
+                if (my_data->stdev->lpi_enable)
                     st_device = ST_DEVICE_HANDSET_TMIC_LPI;
                 else
                     st_device = ST_DEVICE_HANDSET_TMIC;
             } else if (channel_count == SOUND_TRIGGER_CHANNEL_MODE_STEREO) {
-                if (my_data->codec_backend_cfg.lpi_enable)
+                if (my_data->stdev->lpi_enable)
                     st_device = ST_DEVICE_HANDSET_DMIC_LPI;
                 else
                     st_device = ST_DEVICE_HANDSET_DMIC;
@@ -4973,7 +4987,8 @@
    void* platform,
    struct st_vendor_info* v_info,
    struct st_lsm_params** lsm_usecase,
-   st_exec_mode_t exec_mode
+   st_exec_mode_t exec_mode,
+   bool lpi_enable
 )
 {
     struct st_lsm_params *usecase = NULL;
@@ -4999,7 +5014,12 @@
         usecase = node_to_item(lsm_node, struct st_lsm_params, list_node);
         if (usecase->exec_mode == exec_mode) {
             if (my_data->xml_version >= PLATFORM_XML_VERSION_0x0105) {
-                if (capture_device == usecase->capture_device) {
+                if (capture_device == usecase->capture_device &&
+                    (usecase->lpi_enable == ST_PLATFORM_LPI_NONE ||
+                     (lpi_enable && usecase->lpi_enable ==
+                      ST_PLATFORM_LPI_ENABLE) ||
+                     (!lpi_enable && usecase->lpi_enable ==
+                      ST_PLATFORM_LPI_DISABLE))) {
                     *lsm_usecase = usecase;
                     v_info->in_channels = usecase->in_channels;
                     v_info->fluence_type = usecase->fluence_type;
diff --git a/sound_trigger_platform.h b/sound_trigger_platform.h
index c6543d3..cd415ac 100644
--- a/sound_trigger_platform.h
+++ b/sound_trigger_platform.h
@@ -276,6 +276,12 @@
     ST_SHARED_BUF_RAW,
 } st_shared_buf_fmt_t;
 
+typedef enum {
+    ST_PLATFORM_LPI_NONE,
+    ST_PLATFORM_LPI_ENABLE,
+    ST_PLATFORM_LPI_DISABLE
+} st_platform_lpi_enable_t;
+
 struct st_lsm_params {
     struct listnode list_node;
     st_exec_mode_t exec_mode;
@@ -287,6 +293,7 @@
     st_profile_type_t adm_cfg_profile;
     audio_devices_t capture_device;
     st_fluence_type_t fluence_type;
+    st_platform_lpi_enable_t lpi_enable;
 };
 
 struct st_gcs_params {
@@ -308,12 +315,6 @@
     ST_SS_USECASE_TYPE_LSM
 } st_ss_usecase_type_t;
 
-typedef enum {
-    ST_PLATFORM_LPI_NONE,
-    ST_PLATFORM_LPI_ENABLE,
-    ST_PLATFORM_LPI_DISABLE
-} st_platform_lpi_enable_t;
-
 struct st_ss_usecase {
     union {
         struct st_arm_ss_params *arm;
@@ -689,7 +690,8 @@
    void* platform,
    struct st_vendor_info* v_info,
    struct st_lsm_params** lsm_usecase,
-   st_exec_mode_t exec_mode
+   st_exec_mode_t exec_mode,
+   bool lpi_enable
 );
 
 int platform_stdev_get_xml_version(void* platform);
diff --git a/st_hw_common.c b/st_hw_common.c
index 4bacc65..14230c4 100644
--- a/st_hw_common.c
+++ b/st_hw_common.c
@@ -294,9 +294,7 @@
                 (st_ses->vendor_uuid_info->lpi_enable &&
                 is_projected_lpi_budget_available(st_ses->stdev, stc_ses));
         } else {
-            st_ses->hw_ses_adsp->lpi_enable =
-                (st_ses->stdev->platform_lpi_enable ==
-                 ST_PLATFORM_LPI_ENABLE) ? true: false;
+            st_ses->hw_ses_adsp->lpi_enable = st_ses->stdev->lpi_enable;
         }
     }
     pthread_mutex_unlock(&st_ses->lock);
diff --git a/st_hw_session_lsm.c b/st_hw_session_lsm.c
index 6a01641..a49adb5 100644
--- a/st_hw_session_lsm.c
+++ b/st_hw_session_lsm.c
@@ -2064,7 +2064,7 @@
         return -ENODEV;
 
     platform_get_lsm_usecase(p_ses->stdev->platform, v_info,
-                             &p_lsm_ses->lsm_usecase, p_ses->exec_mode);
+        &p_lsm_ses->lsm_usecase, p_ses->exec_mode, p_ses->lpi_enable);
     if (!p_lsm_ses->lsm_usecase) {
         ALOGE("%s: couldn't get lsm usecase", __func__);
         goto sm_error;
@@ -2986,7 +2986,7 @@
         return -ENODEV;
 
     platform_get_lsm_usecase(p_ses->stdev->platform, v_info,
-                             &p_lsm_ses->lsm_usecase, p_ses->exec_mode);
+        &p_lsm_ses->lsm_usecase, p_ses->exec_mode, p_ses->lpi_enable);
     if (!p_lsm_ses->lsm_usecase) {
         ALOGE("%s: couldn't get lsm usecase", __func__);
         goto sm_error;
@@ -3819,7 +3819,7 @@
     capture_device = platform_stdev_get_capture_device(p_ses->stdev->platform);
 
     platform_get_lsm_usecase(p_ses->stdev->platform, v_info,
-        &p_lsm_ses->lsm_usecase, p_ses->exec_mode);
+        &p_lsm_ses->lsm_usecase, p_ses->exec_mode, p_ses->lpi_enable);
     if (!p_lsm_ses->lsm_usecase) {
         ALOGE("%s: failed to allocate lsm usecase for the session", __func__);
         return -ENODEV;
diff --git a/st_session.c b/st_session.c
index dc3cf6b..46924c7 100644
--- a/st_session.c
+++ b/st_session.c
@@ -261,7 +261,6 @@
         ALOGV("%s: string array[%d] %p", __func__, i, (*arr)[i]);
 }
 
-
 static int merge_sound_models(struct sound_trigger_device *stdev,
     unsigned int num_models, listen_model_type *in_models[],
     listen_model_type *out_model)
@@ -6250,7 +6249,7 @@
     stc_ses->state = ST_STATE_IDLE;
 
     if (st_ses) { /* Could get freed if other client exists */
-        st_ses ->vendor_uuid_info = v_info;
+        st_ses->vendor_uuid_info = v_info;
         st_ses->exec_mode = exec_mode;
         st_ses->sm_handle = sm_handle;
         st_ses->lab_fp = NULL;