FM: Slimbus sequence changes made independent of the chipset.

Make Slimbus sequence generic on cherokee builds with N
AND O release

Change-Id: I477c3e80def5efa6c17dd043245963646398b6e7
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index ab78098..6f0c3a6 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -100,6 +100,8 @@
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
 import android.os.IBinder.DeathRecipient;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
 
 
 /**
@@ -126,6 +128,8 @@
    private BroadcastReceiver mRecordTimeoutListener = null;
    private BroadcastReceiver mDelayedServiceStopListener = null;
    private BroadcastReceiver mAudioBecomeNoisyListener = null;
+   private SharedPreferences mPref = null;
+   private Editor mEditor = null;
    private boolean mOverA2DP = false;
    private BroadcastReceiver mFmMediaButtonListener;
    private BroadcastReceiver mAirplaneModeChanged;
@@ -229,9 +233,9 @@
    private static final int FM_OFF_FROM_APPLICATION = 1;
    private static final int FM_OFF_FROM_ANTENNA = 2;
    private static final int RADIO_TIMEOUT = 1500;
+   private static final int FW_TIMEOUT = 200;
    private static final int DISABLE_SLIMBUS_DATA_PORT = 0;
    private static final int ENABLE_SLIMBUS_DATA_PORT = 1;
-   private static final int ENABLE_SLIMBUS_CLOCK_DATA = 2;
 
    private static Object mNotchFilterLock = new Object();
 
@@ -246,6 +250,8 @@
       super.onCreate();
 
       mFmA2dpDisabled = SystemProperties.getBoolean("vendor.fm.a2dp.conc.disabled",false);
+      mPref = getApplicationContext().getSharedPreferences("SlimbusPref", MODE_PRIVATE);
+      mEditor = mPref.edit();
       mPrefs = new FmSharedPreferences(this);
       mCallbacks = null;
       TelephonyManager tmgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
@@ -943,7 +949,7 @@
       if (isFmOn()) {
           setLowPowerMode(false);
           startFM();
-          if (mReceiver.isCherokeeChip())
+          if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true)))
               mReceiver.EnableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
       }
    }
@@ -1665,12 +1671,13 @@
                           Log.v(LOGTAG, "Focus Loss/TLoss - Disabling speaker");
                           AudioSystem.setForceUse(AudioSystem.FOR_MEDIA, AudioSystem.FORCE_NONE);
                       }
-                      if (mReceiver != null)
+                      if (mReceiver != null && (mReceiver.isCherokeeChip()))
                           mReceiver.EnableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
                       if (true == mPlaybackInProgress) {
                           stopFM();
                       }
-                      if (mReceiver != null)
+
+                      if ((mReceiver != null) && mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true)))
                           mReceiver.EnableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
                       mStoppedOnFocusLoss = true;
                       break;
@@ -1687,7 +1694,8 @@
                       }
 
                       //intentional fall through.
-                      mReceiver.EnableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
+                      if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true)))
+                          mReceiver.EnableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
 
                       if (true == isFmRecordingOn())
                           stopRecording();
@@ -1711,8 +1719,8 @@
 
                       if(false == mPlaybackInProgress)
                           startFM();
-
-                      mReceiver.EnableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
+                      if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true)))
+                          mReceiver.EnableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
                       mSession.setActive(true);
                       break;
                   default:
@@ -2253,6 +2261,28 @@
        return status;
    }
 
+   private boolean waitForFWEvent() {
+       boolean status = false;
+
+       synchronized (mEventWaitLock) {
+           Log.d(LOGTAG, "waiting for FW event");
+           try {
+               if (mEventReceived == false)
+                   mEventWaitLock.wait(FW_TIMEOUT);
+               if (mEventReceived == true) {
+                   status = true;
+               }
+           } catch (IllegalMonitorStateException e) {
+               Log.e(LOGTAG, "Exception caught while waiting for event");
+               e.printStackTrace();
+           } catch (InterruptedException ex) {
+               Log.e(LOGTAG, "Exception caught while waiting for event");
+               ex.printStackTrace();
+           }
+       }
+       return status;
+   }
+
    private boolean fmTurnOnSequence () {
        boolean bStatus = false;
        // This sets up the FM radio device
@@ -2268,6 +2298,9 @@
        mEventReceived = false;
        bStatus = mReceiver.enable(FmSharedPreferences.getFMConfiguration(), this);
 
+       if (mReceiver.isCherokeeChip()) {
+           bStatus = waitForEvent();
+       }
        if (isSpeakerEnabled()) {
            setAudioPath(false);
        } else {
@@ -2331,6 +2364,16 @@
          return bStatus;
    }
 
+   private boolean checkForFwResponse(){
+       Log.d(LOGTAG, "checkForFwResponse");
+       boolean bStatus = false;
+       // Send command to enable FM core
+       mEventReceived = false;
+       mReceiver.EnableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
+       bStatus = waitForFWEvent();
+       return bStatus;
+   }
+
   /*
    * Turn ON FM: Powers up FM hardware, and initializes the FM module
    *                                                                                 .
@@ -2338,17 +2381,6 @@
    */
    private boolean fmTurnOnSequenceCherokee () {
        boolean bStatus = false;
-
-       // Send command to power up SB slave block
-       mEventReceived = false;
-       mReceiver.EnableSlimbus(ENABLE_SLIMBUS_CLOCK_DATA);
-       bStatus = waitForEvent();
-
-       // Send command to enable FM core
-       mEventReceived = false;
-       mReceiver.EnableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
-       bStatus = waitForEvent();
-
        AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        if ((audioManager != null) & (false == mPlaybackInProgress)) {
            Log.d(LOGTAG, "mAudioManager.setFmRadioOn = true \n" );
@@ -2456,10 +2488,21 @@
          else
          {
            if (mReceiver.isCherokeeChip()) {
-               bStatus = fmTurnOnSequenceCherokee();
-           } else {
+               if ((mPref.getBoolean("SLIMBUS_SEQ", true)) ) {
+                   bStatus = checkForFwResponse();
+                   if (bStatus) {
+                       bStatus = fmTurnOnSequenceCherokee();
+                   } else {
+                       mEditor.putBoolean("SLIMBUS_SEQ", false);
+                       mEditor.commit();
+                       bStatus = fmTurnOnSequence();
+                   }
+               } else {
+                   bStatus = fmTurnOnSequence();
+               }
+         } else {
                bStatus = fmTurnOnSequence();
-           }
+         }
            /* reset SSR flag */
            mIsSSRInProgressFromActivity = false;
          }
@@ -4092,7 +4135,7 @@
 
    private void requestFocus() {
        Log.d(LOGTAG, "++requestFocus");
-       if (mReceiver.isCherokeeChip()) {
+       if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true))) {
            requestFocusImplCherokee();
        } else {
            requestFocusImpl();
diff --git a/helium/radio_helium_hal.c b/helium/radio_helium_hal.c
index 7d04cb4..2fd849a 100644
--- a/helium/radio_helium_hal.c
+++ b/helium/radio_helium_hal.c
@@ -57,6 +57,7 @@
 static uint32_t station_param_mask_flag;
 static uint32_t station_dbg_param_mask_flag;
 uint64_t flag;
+static int slimbus_flag = 0;
 struct fm_hal_t *hal = NULL;
 
 #define LOG_TAG "radio_helium"
@@ -79,6 +80,8 @@
         return;
     }
     rsp = (struct hci_fm_conf_rsp *)ev_rsp;
+    if (!slimbus_flag)
+        hal->jni_cb->thread_evt_cb(0);
     radio_hci_req_complete(rsp->status);
     hal->jni_cb->enabled_cb();
     if (rsp->status == FM_HC_STATUS_SUCCESS)
@@ -412,7 +415,8 @@
 
 static void hci_cc_enable_slimbus_rsp(char *ev_buff)
 {
-    ALOGV("%s status %d", __func__, ev_buff[0]);
+    ALOGD("%s status %d", __func__, ev_buff[0]);
+    slimbus_flag = 1;
     hal->jni_cb->thread_evt_cb(0);
     hal->jni_cb->enable_slimbus_cb(ev_buff[0]);
 }
diff --git a/jni/android_hardware_fm.cpp b/jni/android_hardware_fm.cpp
index 06d03ce..7895e4c 100644
--- a/jni/android_hardware_fm.cpp
+++ b/jni/android_hardware_fm.cpp
@@ -87,6 +87,7 @@
 char *FM_LIBRARY_NAME = "fm_helium.so";
 char *FM_LIBRARY_SYMBOL_NAME = "FM_HELIUM_LIB_INTERFACE";
 void *lib_handle;
+static int slimbus_flag = 0;
 
 typedef void (*enb_result_cb)();
 typedef void (*tune_rsp_cb)(int Freq);
@@ -167,10 +168,19 @@
 void fm_enabled_cb() {
     ALOGD("Entered %s", __func__);
 
-    if (!checkCallbackThread())
-        return;
+    if (slimbus_flag) {
+        if (!checkCallbackThread())
+            return;
 
-    mCallbackEnv->CallVoidMethod(mCallbacksObj, method_enableCallback);
+        mCallbackEnv->CallVoidMethod(mCallbacksObj, method_enableCallback);
+    } else {
+        if (mCallbackEnv != NULL) {
+            ALOGE("javaObjectRef creating");
+            jobject javaObjectRef =  mCallbackEnv->NewObject(javaClassRef, method_enableCallback);
+            mCallbacksObj = javaObjectRef;
+            ALOGE("javaObjectRef = %p mCallbackobject =%p \n",javaObjectRef,mCallbacksObj);
+        }
+    }
     ALOGD("exit  %s", __func__);
 }
 
@@ -541,6 +551,7 @@
         return;
 
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_enableSlimbusCallback, status);
+    slimbus_flag = 1;
     ALOGV("--fm_enable_slimbus_cb");
 }