hal: Add support for voice over pcie

Add support for voice over pcie from hal.

CRs-fixed: 2642312
Change-Id: Ib047755d4f4eef8e643f348dab9f72983a960c65
diff --git a/hal/msm8974/hw_info.c b/hal/msm8974/hw_info.c
index 709c69c..d1a5cee 100644
--- a/hal/msm8974/hw_info.c
+++ b/hal/msm8974/hw_info.c
@@ -514,6 +514,9 @@
     } else if (strstr(snd_card_name, "hana55")) {
         strlcpy(hw_info->name, "msmnile", sizeof(hw_info->name));
         hw_info->is_stereo_spkr = false;
+    } else if (strstr(snd_card_name, "pcie")) {
+        strlcpy(hw_info->name, "msmnile", sizeof(hw_info->name));
+        hw_info->is_stereo_spkr = false;
     } else {
         ALOGW("%s: Not a msmnile device", __func__);
     }
@@ -812,6 +815,7 @@
         update_hardware_info_sdx(hw_info, snd_card_name);
     } else if (strstr(snd_card_name, "pahu") || strstr(snd_card_name, "tavil") ||
             strstr(snd_card_name, "hana55") ||
+            strstr(snd_card_name, "pcie") ||
             strstr(snd_card_name, "sa8155")) {
         ALOGV("MSMNILE - variant soundcard");
         update_hardware_info_msmnile(hw_info, snd_card_name);
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 5a48cf7..0c4b8d3 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -71,6 +71,7 @@
 #define PLATFORM_INFO_XML_PATH_I2S "/etc/audio_platform_info_extcodec.xml"
 #define PLATFORM_INFO_XML_PATH_WSA  "/etc/audio_platform_info_wsa.xml"
 #define PLATFORM_INFO_XML_PATH_TDM  "/etc/audio_platform_info_tdm.xml"
+#define PLATFORM_INFO_XML_PATH_PCIE  "/etc/audio_platform_info_pcie.xml"
 #else
 #define PLATFORM_INFO_XML_PATH_INTCODEC  "/vendor/etc/audio_platform_info_intcodec.xml"
 #define PLATFORM_INFO_XML_PATH_SKUSH "/vendor/etc/audio_platform_info_skush.xml"
@@ -82,6 +83,7 @@
 #define PLATFORM_INFO_XML_PATH_I2S "/vendor/etc/audio_platform_info_i2s.xml"
 #define PLATFORM_INFO_XML_PATH_WSA  "/vendor/etc/audio_platform_info_wsa.xml"
 #define PLATFORM_INFO_XML_PATH_TDM  "/vendor/etc/audio_platform_info_tdm.xml"
+#define PLATFORM_INFO_XML_PATH_PCIE  "/vendor/etc/audio_platform_info_pcie.xml"
 #endif
 
 #include <linux/msm_audio.h>
@@ -3232,6 +3234,9 @@
     else if (!strncmp(snd_card_name, "qcs405-tdm-snd-card",
                sizeof("qcs405-tdm-snd-card")))
         platform_info_init(PLATFORM_INFO_XML_PATH_TDM, my_data, PLATFORM);
+    else if (!strncmp(snd_card_name, "sm8150-pcie-snd-card",
+               sizeof("sm8150-pcie-snd-card")))
+        platform_info_init(PLATFORM_INFO_XML_PATH_PCIE, my_data, PLATFORM);
     else if (my_data->is_internal_codec)
         platform_info_init(PLATFORM_INFO_XML_PATH_INTCODEC, my_data, PLATFORM);
     else {
@@ -3414,6 +3419,8 @@
         !strncmp("sm6150", platform, sizeof("sm6150")) ||
         (!strncmp("msmnile", platform, sizeof("msmnile")) &&
          !strncmp("sm8150-hana55-snd-card", snd_card_name, sizeof("sm8150-hana55-snd-card"))) ||
+        (!strncmp("msmnile", platform, sizeof("msmnile")) &&
+         !strncmp("sm8150-pcie-snd-card", snd_card_name, sizeof("sm8150-pcie-snd-card"))) ||
         !strncmp("sdx", platform, sizeof("sdx")) ||
         !strncmp("sdm845", platform, sizeof("sdm845"))) &&
         ( !strncmp("mdm", baseband, (sizeof("mdm")-1)) ||
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index ebffc3f..da33147 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -601,6 +601,8 @@
 #elif PLATFORM_AUTO
 #define HOST_LESS_RX_ID 41
 #define HOST_LESS_TX_ID 42
+#define PCIE_HOST_LESS_RX_ID 47
+#define PCIE_HOST_LESS_TX_ID 48
 #define VOICE_CALL_PCM_DEVICE 8
 #define VOICE2_CALL_PCM_DEVICE -1
 #define VOLTE_CALL_PCM_DEVICE -1
@@ -609,6 +611,8 @@
 #else
 #define HOST_LESS_RX_ID 44
 #define HOST_LESS_TX_ID 45
+#define PCIE_HOST_LESS_RX_ID 47
+#define PCIE_HOST_LESS_TX_ID 48
 #define VOICE_CALL_PCM_DEVICE 2
 #define VOICE2_CALL_PCM_DEVICE 22
 #define VOLTE_CALL_PCM_DEVICE 14
diff --git a/hal/voice.c b/hal/voice.c
index a30b06b..f1e2c47 100644
--- a/hal/voice.c
+++ b/hal/voice.c
@@ -57,16 +57,43 @@
      * symbols. Voice call is handled by MDM and apps processor talks to
      * MDM through CSD Client
      */
-    char * snd_card_name;
+    char *snd_card_name = NULL;
     char baseband[100];
     snd_card_name = strdup(mixer_get_name(adev->mixer));
+    if (!snd_card_name)
+        return 0;
     property_get("ro.baseband", baseband, "");
-    if ((!strncmp("hana55", snd_card_name, sizeof("hana55"))) &&
+    if (((!strncmp("hana55", snd_card_name, sizeof("hana55"))) &&
+        ( !strncmp("mdm", baseband, (sizeof("mdm")-1)) ||
+          !strncmp("sdx", baseband, (sizeof("sdx")-1)))) ||
+        ((!strncmp("sm8150-pcie-snd-card", snd_card_name, sizeof("sm8150-pcie-snd-card"))) &&
+        ( !strncmp("mdm", baseband, (sizeof("mdm")-1)) ||
+          !strncmp("sdx", baseband, (sizeof("sdx")-1))))) {
+         return 1;
+    } else {
+         return 0;
+    }
+}
+
+static bool voice_update_pcm_config(struct audio_device *adev)
+{
+    /* If platform is apq8084 and baseband is MDM, load CSD Client specific
+     * symbols. Voice call is handled by MDM and apps processor talks to
+     * MDM through CSD Client
+     */
+    char *snd_card_name = NULL;
+    char baseband[100];
+    snd_card_name = strdup(mixer_get_name(adev->mixer));
+    if (!snd_card_name)
+        return 0;
+    property_get("ro.baseband", baseband, "");
+    if ((!strncmp("sm8150-pcie-snd-card", snd_card_name, sizeof("sm8150-pcie-snd-card"))) &&
         ( !strncmp("mdm", baseband, (sizeof("mdm")-1)) ||
           !strncmp("sdx", baseband, (sizeof("sdx")-1)))) {
          return 1;
-    } else
+    } else {
          return 0;
+    }
 }
 
 static struct voice_session *voice_get_session_from_use_case(struct audio_device *adev,
@@ -256,6 +283,11 @@
     uc_info->stream.out = adev->current_call_output;
     uc_info->devices = adev->current_call_output->devices;
 
+    if (voice_update_pcm_config(adev)) {
+        sample_rate = 48000;
+        voice_config.rate = 48000;
+    }
+
     if (popcount(uc_info->devices) == 2) {
         ALOGE("%s: Invalid combo device(%#x) for voice call", __func__,
               uc_info->devices);
@@ -283,6 +315,11 @@
         pcm_dev_loopback_tx_id = HOST_LESS_TX_ID;
     }
 
+    if (voice_update_pcm_config(adev)) {
+        pcm_dev_loopback_rx_id = PCIE_HOST_LESS_RX_ID;
+        pcm_dev_loopback_tx_id = PCIE_HOST_LESS_TX_ID;
+    }
+
     pcm_dev_rx_id = platform_get_pcm_device_id(uc_info->id, PCM_PLAYBACK);
     pcm_dev_tx_id = platform_get_pcm_device_id(uc_info->id, PCM_CAPTURE);