Snap for 4736748 from 9c021b9497ed602257c54549ff5f796e2afae2d0 to pi-release

Change-Id: I25e89b8a77a3071ad88783e9fd4af09ee7e3393f
diff --git a/hal/Android.mk b/hal/Android.mk
index 3dd408a..ac6ea74 100644
--- a/hal/Android.mk
+++ b/hal/Android.mk
@@ -132,6 +132,10 @@
     LOCAL_CFLAGS += -DEXTERNAL_BT_SUPPORTED
 endif
 
+ifeq ($(strip $(AUDIO_FEATURE_FLICKER_SENSOR_INPUT)),true)
+    LOCAL_CFLAGS += -DFLICKER_SENSOR_INPUT
+endif
+
 ifeq ($(strip $(AUDIO_FEATURE_NO_AUDIO_OUT)),true)
     LOCAL_CFLAGS += -DNO_AUDIO_OUT
 endif
diff --git a/hal/audio_extn/a2dp.c b/hal/audio_extn/a2dp.c
index 6f278c2..3eebab7 100644
--- a/hal/audio_extn/a2dp.c
+++ b/hal/audio_extn/a2dp.c
@@ -76,7 +76,8 @@
 #define ENC_FMT_SBC                "sbc"
 
 // System properties used for A2DP Offload
-#define SYSPROP_A2DP_OFFLOAD_ENABLED   "persist.vendor.bluetooth.a2dp_offload.enable"
+#define SYSPROP_A2DP_OFFLOAD_SUPPORTED "ro.bluetooth.a2dp_offload.supported"
+#define SYSPROP_A2DP_OFFLOAD_DISABLED  "persist.bluetooth.a2dp_offload.disabled"
 #define SYSPROP_A2DP_CODEC_LATENCIES   "vendor.audio.a2dp.codec.latency"
 
 // Default encoder bit width
@@ -226,8 +227,8 @@
     bool a2dp_suspended;
     /* Number of active sessions on A2DP output */
     int  a2dp_total_active_session_request;
-    /* Flag to denote whether A2DP offload is supported */
-    bool is_a2dp_offload_supported;
+    /* Flag to denote whether A2DP offload is enabled */
+    bool is_a2dp_offload_enabled;
     /* Flag to denote whether codec reconfiguration/soft handoff is in progress */
     bool is_handoff_in_progress;
     /* Flag to denote whether APTX Dual Mono encoder is supported */
@@ -522,10 +523,12 @@
 
 static void update_offload_codec_support()
 {
-    a2dp.is_a2dp_offload_supported =
-            property_get_bool(SYSPROP_A2DP_OFFLOAD_ENABLED, false);
-    ALOGD("%s: A2DP offload supported = %d",
-                   __func__, a2dp.is_a2dp_offload_supported);
+    a2dp.is_a2dp_offload_enabled =
+            property_get_bool(SYSPROP_A2DP_OFFLOAD_SUPPORTED, false) &&
+            !property_get_bool(SYSPROP_A2DP_OFFLOAD_DISABLED, false);
+
+    ALOGD("%s: A2DP offload enabled = %d", __func__,
+          a2dp.is_a2dp_offload_enabled);
 }
 
 static int stop_abr()
@@ -1461,7 +1464,7 @@
      struct audio_usecase *uc_info;
      struct listnode *node;
 
-     if (a2dp.is_a2dp_offload_supported == false) {
+     if (a2dp.is_a2dp_offload_enabled == false) {
         ALOGV("%s: No supported encoders identified,ignoring A2DP setparam", __func__);
         return;
      }
@@ -1579,7 +1582,7 @@
         goto exit;
 
     if ((a2dp.bt_state != A2DP_STATE_DISCONNECTED) &&
-        (a2dp.is_a2dp_offload_supported) &&
+        (a2dp.is_a2dp_offload_enabled) &&
         (a2dp.audio_check_a2dp_ready))
            ret = a2dp.audio_check_a2dp_ready();
 
@@ -1598,7 +1601,7 @@
   a2dp.bt_lib_handle = NULL;
   a2dp_common_init();
   a2dp.enc_sampling_rate = 48000;
-  a2dp.is_a2dp_offload_supported = false;
+  a2dp.is_a2dp_offload_enabled = false;
   a2dp.is_handoff_in_progress = false;
   a2dp.is_aptx_dual_mono_supported = false;
   reset_a2dp_enc_config_params();
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 66c72fb..8f1cba9 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -1312,6 +1312,44 @@
     return 0;
 }
 
+static void configure_flicker_sensor_input(struct mixer *mixer)
+{
+    struct mixer_ctl *ctl;
+    const char* ctl1 = "AIF3_CAP Mixer SLIM TX2";
+    int setting1 = 1;
+    const char* ctl2 = "CDC_IF TX2 MUX";
+    const char* setting2 = "DEC2";
+    const char* ctl3 = "SLIM_1_TX Channels";
+    const char* setting3 = "One";
+    const char* ctl4 = "ADC MUX2";
+    const char* setting4 = "AMIC";
+    const char* ctl5 = "AMIC MUX2";
+    const char* setting5 = "ADC1";
+    const char* ctl6 = "DEC2 Volume";
+    int setting6 = 84;
+    const char* ctl7 = "MultiMedia2 Mixer SLIM_1_TX";
+    int setting7 = 1;
+    const char* ctl8 = "SLIM_1_TX SampleRate";
+    const char* setting8 = "KHZ_8";
+
+    ctl = mixer_get_ctl_by_name(mixer, ctl1);
+    mixer_ctl_set_value(ctl, 0, setting1);
+    ctl = mixer_get_ctl_by_name(mixer, ctl2);
+    mixer_ctl_set_enum_by_string(ctl, setting2);
+    ctl = mixer_get_ctl_by_name(mixer, ctl3);
+    mixer_ctl_set_enum_by_string(ctl, setting3);
+    ctl = mixer_get_ctl_by_name(mixer, ctl4);
+    mixer_ctl_set_enum_by_string(ctl, setting4);
+    ctl = mixer_get_ctl_by_name(mixer, ctl5);
+    mixer_ctl_set_enum_by_string(ctl, setting5);
+    ctl = mixer_get_ctl_by_name(mixer, ctl6);
+    mixer_ctl_set_value(ctl, 0, setting6);
+    ctl = mixer_get_ctl_by_name(mixer, ctl7);
+    mixer_ctl_set_value(ctl, 0, setting7);
+    ctl = mixer_get_ctl_by_name(mixer, ctl8);
+    mixer_ctl_set_enum_by_string(ctl, setting8);
+}
+
 void *platform_init(struct audio_device *adev)
 {
     char value[PROPERTY_VALUE_MAX];
@@ -1523,6 +1561,10 @@
             ALOGV("%s: Could not find the symbol acdb_loader_send_gain_dep_cal from %s",
                   __func__, LIB_ACDB_LOADER);
 
+#if defined (FLICKER_SENSOR_INPUT)
+        configure_flicker_sensor_input(adev->mixer);
+#endif
+
 #if defined (PLATFORM_MSM8994) || (PLATFORM_MSM8996) || (PLATFORM_MSM8998) || (PLATFORM_SDM845)
         acdb_init_v2_cvd_t acdb_init_local;
         acdb_init_local = (acdb_init_v2_cvd_t)dlsym(my_data->acdb_handle,