hal: add changes to support RAS

Receiver Aided Stereo(RAS) is a feature to support stereo
playback over receiver and speaker. Add new RAS property
and device to support this feature.

Change-Id: I8cd62a352b2847d6068285ea84e2d8f85e931619
diff --git a/configs/msm8998/msm8998.mk b/configs/msm8998/msm8998.mk
index 6a03696..88abb3a 100644
--- a/configs/msm8998/msm8998.mk
+++ b/configs/msm8998/msm8998.mk
@@ -56,6 +56,7 @@
 AUDIO_FEATURE_ENABLED_SOURCE_TRACKING := true
 AUDIO_FEATURE_ENABLED_GEF_SUPPORT := true
 BOARD_SUPPORTS_QAHW := true
+AUDIO_FEATURE_ENABLED_RAS := true
 ##AUDIO_FEATURE_FLAGS
 
 #Audio Specific device overlays
@@ -130,6 +131,10 @@
 PRODUCT_PROPERTY_OVERRIDES += \
 tunnel.audio.encode=false
 
+#Disable RAS Feature by default
+PRODUCT_PROPERTY_OVERRIDES += \
+persist.audio.ras.enabled=false
+
 #Buffer size in kbytes for compress offload playback
 PRODUCT_PROPERTY_OVERRIDES += \
 audio.offload.buffer.size.kb=32
diff --git a/hal/Android.mk b/hal/Android.mk
index 0ab0b9e..4b41346 100644
--- a/hal/Android.mk
+++ b/hal/Android.mk
@@ -79,6 +79,10 @@
     LOCAL_CFLAGS += -DHIFI_AUDIO_ENABLED
 endif
 
+ifeq ($(strip $(AUDIO_FEATURE_ENABLED_RAS)),true)
+    LOCAL_CFLAGS += -DRAS_ENABLED
+endif
+
 ifeq ($(strip $(AUDIO_FEATURE_ENABLED_VBAT_MONITOR)),true)
     LOCAL_CFLAGS += -DVBAT_MONITOR_ENABLED
 endif
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index d50bea5..f159083 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
  * Not a Contribution.
  *
  * Copyright (C) 2013 The Android Open Source Project
@@ -65,6 +65,7 @@
     bool hpx_enabled;
     bool vbat_enabled;
     bool hifi_audio_enabled;
+    bool ras_enabled;
 };
 
 static struct audio_extn_module aextnmod;
@@ -381,6 +382,23 @@
 }
 #endif
 
+#ifdef RAS_ENABLED
+bool audio_extn_is_ras_enabled(void)
+{
+    ALOGD("%s: status: %d", __func__, aextnmod.ras_enabled);
+    return (aextnmod.ras_enabled ? true: false);
+}
+
+bool audio_extn_can_use_ras(void)
+{
+    if (property_get_bool("persist.audio.ras.enabled", false))
+        aextnmod.ras_enabled = 1;
+
+    ALOGD("%s: ras.enabled property is set to %d", __func__, aextnmod.ras_enabled);
+    return (aextnmod.ras_enabled ? true: false);
+}
+#endif
+
 #ifndef ANC_HEADSET_ENABLED
 #define audio_extn_set_anc_parameters(adev, parms)       (0)
 #else
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 77e03ca..6526f4f 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -135,6 +135,14 @@
 bool audio_extn_can_use_vbat(void);
 #endif
 
+#ifndef RAS_ENABLED
+#define audio_extn_is_ras_enabled()                      (0)
+#define audio_extn_can_use_ras()                         (0)
+#else
+bool audio_extn_is_ras_enabled(void);
+bool audio_extn_can_use_ras(void);
+#endif
+
 #ifndef HIFI_AUDIO_ENABLED
 #define audio_extn_is_hifi_audio_enabled()               (0)
 #define audio_extn_is_hifi_audio_supported()             (0)
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 80f869c..74c429b 100755
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -401,6 +401,8 @@
     [SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = "speaker-protected-vbat",
     [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = "voice-speaker-protected-vbat",
     [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = "voice-speaker-2-protected-vbat",
+    [SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS] = "speaker-protected",
+    [SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS] = "speaker-protected-vbat",
 
     /* Capture sound devices */
     [SND_DEVICE_IN_HANDSET_MIC] = "handset-mic",
@@ -528,7 +530,8 @@
     [SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = 124,
     [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = 101,
     [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = 101,
-
+    [SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS] = 134,
+    [SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS] = 134,
     [SND_DEVICE_IN_HANDSET_MIC] = 4,
     [SND_DEVICE_IN_HANDSET_MIC_EXTERNAL] = 4,
     [SND_DEVICE_IN_HANDSET_MIC_AEC] = 106,
@@ -656,6 +659,8 @@
     {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT)},
     {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT)},
     {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT)},
+    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS)},
+    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS)},
     {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC)},
     {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_EXTERNAL)},
     {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC)},
@@ -1765,6 +1770,17 @@
     else
         platform_info_init(PLATFORM_INFO_XML_PATH, my_data);
 
+    if (audio_extn_can_use_ras()) {
+        if (property_get_bool("persist.speaker.prot.enable", false)) {
+            platform_set_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED,
+                           acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS]);
+            platform_set_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT,
+                           acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS]);
+        } else {
+            ALOGD("%s: RAS Feature should be enabled with Speaker Protection", __func__);
+        }
+    }
+
     /* 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
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index 4279060..731d81c 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
  * Not a Contribution.
  *
  * Copyright (C) 2013 The Android Open Source Project
@@ -130,6 +130,8 @@
     SND_DEVICE_OUT_SPEAKER_WSA,
     SND_DEVICE_OUT_VOICE_SPEAKER_WSA,
     SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA,
+    SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS,
+    SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS,
     SND_DEVICE_OUT_END,
 
     /*