Promotion of fm.lnx.2.1-00024.

CRs      Change ID                                   Subject
--------------------------------------------------------------------------------------------------------------
1082673   I8317c6e82fe4844970e84e929e2c6328284c6ca9   Reset slimbus port on AUDIOFOCUS LOSS
1082673   I4b69ae76a33fcdeb497239aae9c35362272bcbfc   FM: Add check for soc type

Change-Id: I9cc3ee634058234c82e5d9204abbcaa7fd26c67d
CRs-Fixed: 1082673
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index 5744d96..7f6775b 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -219,6 +219,7 @@
    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 RESET_SLIMBUS_DATA_PORT = 1;
 
    private static Object mNotchFilterLock = new Object();
 
@@ -1596,6 +1597,7 @@
               switch (msg.arg1) {
                   case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                       Log.v(LOGTAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT");
+                      mReceiver.EnableSlimbus(RESET_SLIMBUS_DATA_PORT);
                       if (true == isFmRecordingOn())
                           stopRecording();
                   case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
@@ -1608,6 +1610,8 @@
                   case AudioManager.AUDIOFOCUS_LOSS:
                       Log.v(LOGTAG, "AudioFocus: received AUDIOFOCUS_LOSS");
                       //intentional fall through.
+                      mReceiver.EnableSlimbus(RESET_SLIMBUS_DATA_PORT);
+
                       if (mSpeakerPhoneOn) {
                          mSpeakerDisableHandler.removeCallbacks(mSpeakerDisableTask);
                          mSpeakerDisableHandler.postDelayed(mSpeakerDisableTask, 0);
diff --git a/helium/radio-helium-commands.h b/helium/radio-helium-commands.h
index c5dfba9..46ed651 100644
--- a/helium/radio-helium-commands.h
+++ b/helium/radio-helium-commands.h
@@ -115,5 +115,8 @@
     HCI_FM_HELIUM_AUDIO_MODE,
     HCI_FM_HELIUM_RMSSI,
     HCI_FM_HELIUM_AUDIO_MUTE,
+
+    /*FM VSC command to enable/disable slimbus data port*/
+    HCI_FM_HELIUM_AUDIO = 0x00980940,
 };
 #endif /* __RADIO_CHEROKEE_COMMANDS_H */
diff --git a/helium/radio-helium.h b/helium/radio-helium.h
index 070dafa..200e006 100644
--- a/helium/radio-helium.h
+++ b/helium/radio-helium.h
@@ -245,6 +245,7 @@
 #define HCI_OCF_FM_RDS_RT_REQ               0x0008
 #define HCI_OCF_FM_RDS_PS_REQ               0x0009
 
+#define HCI_OCF_FM_ENABLE_SLIMBUS           (0x000E)
 
 /* HCI common control commands opcode */
 #define HCI_OCF_FM_TUNE_STATION_REQ         0x0001
@@ -1231,6 +1232,7 @@
 int hci_fm_default_data_write_req(struct hci_fm_def_data_wr_req * data_wrt);
 int hci_fm_get_station_dbg_param_req();
 int hci_fm_get_station_cmd_param_req();
+int hci_fm_enable_slimbus(uint8_t enable);
 
 struct fm_hal_t {
     struct radio_helium_device *radio;
diff --git a/helium/radio_helium_hal.c b/helium/radio_helium_hal.c
index 742f051..8672513 100644
--- a/helium/radio_helium_hal.c
+++ b/helium/radio_helium_hal.c
@@ -1604,6 +1604,10 @@
              ALOGI("%s: command sent sucessfully", __func__, val);
          }
          break;
+    case HCI_FM_HELIUM_AUDIO:
+         ALOGE("%s slimbus port", val ? "enable" : "disable");
+         ret = hci_fm_enable_slimbus(val);
+         break;
     default:
         ALOGE("%s:%s: Not a valid FM CMD!!", LOG_TAG, __func__);
         ret = 0;
diff --git a/helium/radio_helium_hal_cmds.c b/helium/radio_helium_hal_cmds.c
index 520ec12..b783c53 100644
--- a/helium/radio_helium_hal_cmds.c
+++ b/helium/radio_helium_hal_cmds.c
@@ -461,3 +461,13 @@
                                   HCI_OCF_FM_LOW_PASS_FILTER_CTRL);
     return send_fm_cmd_pkt(opcode, sizeof(enable_lpf), &enable_lpf);
 }
+int hci_fm_enable_slimbus(uint8_t val) {
+    ALOGE("%s", __func__);
+    uint16_t opcode = 0;
+
+    opcode = hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ,
+                                HCI_OCF_FM_ENABLE_SLIMBUS);
+
+    ALOGE("%s:val = %d, uint8 val = %d", __func__, val, (uint8_t)val);
+    return send_fm_cmd_pkt(opcode , sizeof(val), &val);
+}
diff --git a/jni/FmConst.h b/jni/FmConst.h
index 26eb616..e37160f 100644
--- a/jni/FmConst.h
+++ b/jni/FmConst.h
@@ -153,6 +153,8 @@
     V4L2_CID_PRV_IRIS_LOWER_BAND,
     V4L2_CID_PRV_IRIS_AUDIO_MODE,
     V4L2_CID_PRV_IRIS_RMSSI,
+
+    V4L2_CID_PRV_ENABLE_SLIMBUS = 0x00980940,
 };
 
 #endif
diff --git a/jni/android_hardware_fm.cpp b/jni/android_hardware_fm.cpp
index b5b0a5e..a780cbe 100644
--- a/jni/android_hardware_fm.cpp
+++ b/jni/android_hardware_fm.cpp
@@ -1498,6 +1498,17 @@
     return FM_JNI_SUCCESS;
 }
 
+static jint android_hardware_fmradio_FmReceiverJNI_enableSlimbusNative
+ (JNIEnv * env, jobject thiz, jint fd, jint val)
+{
+    ALOGD("%s: val = %d\n", __func__, val);
+    int err = JNI_ERR;
+#ifdef FM_SOC_TYPE_CHEROKEE
+    err = vendor_interface->set_fm_ctrl(V4L2_CID_PRV_ENABLE_SLIMBUS, val);
+#endif
+    return err;
+}
+
 static void classInitNative(JNIEnv* env, jclass clazz) {
 
     ALOGI("ClassInit native called \n");
@@ -1644,6 +1655,8 @@
             (void*)android_hardware_fmradio_FmReceiverJNI_setSpurDataNative},
         { "configurePerformanceParams", "(I)V",
              (void*)android_hardware_fmradio_FmReceiverJNI_configurePerformanceParams},
+        { "enableSlimbus", "(II)I",
+             (void*)android_hardware_fmradio_FmReceiverJNI_enableSlimbusNative},
 };
 
 int register_android_hardware_fm_fmradio(JNIEnv* env)
diff --git a/qcom/fmradio/FmReceiver.java b/qcom/fmradio/FmReceiver.java
index af7191a..b15d512 100644
--- a/qcom/fmradio/FmReceiver.java
+++ b/qcom/fmradio/FmReceiver.java
@@ -2974,7 +2974,7 @@
            case TelephonyManager.NETWORK_TYPE_UMTS:
                if ((mEnableLpfUmts  & RatConf) == mEnableLpfUmts ) {
                    Log.v (TAG, "set LPF for net_type: " + Integer.toString(net_type));
-				   Log.v (TAG,  "enable:" + enable);
+                   Log.v (TAG,  "enable:" + enable);
                    mControl.enableLPF(sFd, enable);
                }
                break;
@@ -3079,4 +3079,8 @@
                break;
        }
    }
+   public void EnableSlimbus(int enable) {
+       Log.d(TAG, "EnableSlimbus :enable =" + enable);
+       mControl.enableSlimbus(sFd, enable);
+   }
 }
diff --git a/qcom/fmradio/FmReceiverJNI.java b/qcom/fmradio/FmReceiverJNI.java
index c5835ff..d9fa79a 100644
--- a/qcom/fmradio/FmReceiverJNI.java
+++ b/qcom/fmradio/FmReceiverJNI.java
@@ -547,4 +547,5 @@
      */
     static native int setSpurDataNative(int fd, short  buff[], int len);
     static native void configurePerformanceParams(int fd);
+    static native int enableSlimbus(int fd, int val);
 }
diff --git a/qcom/fmradio/FmRxControls.java b/qcom/fmradio/FmRxControls.java
index 7b9fb7c..a3eba2a 100644
--- a/qcom/fmradio/FmRxControls.java
+++ b/qcom/fmradio/FmRxControls.java
@@ -786,4 +786,13 @@
          return true;
       }
    }
+   public boolean enableSlimbus(int fd, int enable) {
+       int ret;
+       Log.d(TAG, "enableSlimbus : enable = " + enable);
+       ret = FmReceiverJNI.enableSlimbus(fd, enable);
+       if (ret == 0)
+           return true;
+       else
+           return false;
+   }
 }