Added qcom bluetooth init script
diff --git a/device.mk b/device.mk
index 539e3de..3d3296d 100644
--- a/device.mk
+++ b/device.mk
@@ -138,6 +138,7 @@
     init.mdm.sh \
     init.qcom.audio.sh \
     init.qcom.bms.sh \
+    init.qcom.bt.sh \
     init.qcom.class_core.sh \
     init.qcom.early_boot.sh \
     init.qcom.factory.sh \
diff --git a/rootdir/Android.mk b/rootdir/Android.mk
index 9e7b259..de7d5a4 100644
--- a/rootdir/Android.mk
+++ b/rootdir/Android.mk
@@ -141,7 +141,7 @@
 LOCAL_MODULE_TAGS  := optional eng

 LOCAL_MODULE_CLASS := ETC

 LOCAL_SRC_FILES    := etc/$(LOCAL_MODULE)

-LOCAL_MODULE_PATH  := $(TARGET_ROOT_OUT)

+LOCAL_MODULE_PATH  := $(TARGET_ROOT_OUT)/etc

 include $(BUILD_PREBUILT)

 

 ######################

@@ -211,7 +211,17 @@
 LOCAL_MODULE_TAGS  := optional eng

 LOCAL_MODULE_CLASS := ETC

 LOCAL_SRC_FILES    := ../recovery/$(LOCAL_MODULE)

-LOCAL_MODULE_PATH  := $(TARGET_RECOVERY_ROOT_OUT)/etc

+LOCAL_MODULE_PATH  := $(TARGET_ROOT_OUT)/etc

+include $(BUILD_PREBUILT)

+

+######################

+### init.qcom.bt.sh

+include $(CLEAR_VARS)

+LOCAL_MODULE       := init.qcom.bt.sh

+LOCAL_MODULE_TAGS  := optional eng

+LOCAL_MODULE_CLASS := ETC

+LOCAL_SRC_FILES    := etc/$(LOCAL_MODULE)

+LOCAL_MODULE_PATH  := $(TARGET_ROOT_OUT)/etc

 include $(BUILD_PREBUILT)

 

 ######################

diff --git a/rootdir/etc/init.qcom.bt.sh b/rootdir/etc/init.qcom.bt.sh
new file mode 100644
index 0000000..1a9f031
--- /dev/null
+++ b/rootdir/etc/init.qcom.bt.sh
@@ -0,0 +1,357 @@
+#!/system/bin/sh
+# Copyright (c) 2009-2013, The Linux Foundation. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in the
+#       documentation and/or other materials provided with the distribution.
+#     * Neither the name of The Linux Foundation nor
+#       the names of its contributors may be used to endorse or promote
+#       products derived from this software without specific prior written
+#       permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+#Read the arguments passed to the script
+config="$1"
+
+BLUETOOTH_SLEEP_PATH=/proc/bluetooth/sleep/proto
+LOG_TAG="qcom-bluetooth"
+LOG_NAME="${0}:"
+
+hciattach_pid=""
+
+loge ()
+{
+  /system/bin/log -t $LOG_TAG -p e "$LOG_NAME $@"
+}
+
+logi ()
+{
+  /system/bin/log -t $LOG_TAG -p i "$LOG_NAME $@"
+}
+
+failed ()
+{
+  loge "$1: exit code $2"
+  exit $2
+}
+
+program_bdaddr ()
+{
+  /system/bin/btnvtool -O
+  logi "Bluetooth Address programmed successfully"
+}
+
+#
+# enable bluetooth profiles dynamically
+#
+config_bt ()
+{
+  baseband=`getprop ro.baseband`
+  target=`getprop ro.board.platform`
+  if [ -f /sys/devices/soc0/soc_id ]; then
+    soc_hwid=`cat /sys/devices/soc0/soc_id`
+  else
+    soc_hwid=`cat /sys/devices/system/soc/soc0/id`
+  fi
+  btsoc=`getprop qcom.bluetooth.soc`
+
+  case $baseband in
+    "apq")
+        setprop ro.qualcomm.bluetooth.opp true
+        setprop ro.qualcomm.bluetooth.ftp true
+        setprop ro.qualcomm.bluetooth.nap false
+        setprop ro.bluetooth.sap false
+        setprop ro.bluetooth.dun false
+        # For MPQ as baseband is same for both
+        case $soc_hwid in
+          "130")
+              setprop ro.qualcomm.bluetooth.hsp true
+              setprop ro.qualcomm.bluetooth.hfp true
+              setprop ro.qualcomm.bluetooth.pbap false
+              setprop ro.qualcomm.bluetooth.map false
+              ;;
+          *)
+              setprop ro.qualcomm.bluetooth.hsp false
+              setprop ro.qualcomm.bluetooth.hfp false
+              setprop ro.qualcomm.bluetooth.pbap true
+              setprop ro.qualcomm.bluetooth.map true
+              ;;
+        esac
+        ;;
+    "mdm" | "svlte2a" | "svlte1" | "csfb")
+        setprop ro.qualcomm.bluetooth.opp true
+        setprop ro.qualcomm.bluetooth.hfp true
+        setprop ro.qualcomm.bluetooth.hsp true
+        setprop ro.qualcomm.bluetooth.pbap true
+        setprop ro.qualcomm.bluetooth.ftp true
+        setprop ro.qualcomm.bluetooth.map true
+        setprop ro.qualcomm.bluetooth.nap true
+        setprop ro.bluetooth.sap true
+        case $target in
+          "apq8084")
+              setprop ro.bluetooth.dun true
+              logi "Enabling BT-DUN for APQ8084"
+              ;;
+          *)
+              setprop ro.bluetooth.dun false
+              ;;
+        esac
+        ;;
+    "msm")
+        setprop ro.qualcomm.bluetooth.opp true
+        setprop ro.qualcomm.bluetooth.hfp true
+        setprop ro.qualcomm.bluetooth.hsp true
+        setprop ro.qualcomm.bluetooth.pbap true
+        setprop ro.qualcomm.bluetooth.ftp true
+        setprop ro.qualcomm.bluetooth.nap true
+        setprop ro.bluetooth.sap true
+        setprop ro.bluetooth.dun true
+        case $btsoc in
+          "ath3k")
+              setprop ro.qualcomm.bluetooth.map false
+              ;;
+          *)
+              setprop ro.qualcomm.bluetooth.map true
+              ;;
+        esac
+        ;;
+    *)
+        setprop ro.qualcomm.bluetooth.opp true
+        setprop ro.qualcomm.bluetooth.hfp true
+        setprop ro.qualcomm.bluetooth.hsp true
+        setprop ro.qualcomm.bluetooth.pbap true
+        setprop ro.qualcomm.bluetooth.ftp true
+        setprop ro.qualcomm.bluetooth.map true
+        setprop ro.qualcomm.bluetooth.nap true
+        setprop ro.bluetooth.sap true
+        setprop ro.bluetooth.dun true
+        ;;
+  esac
+
+  #Enable Bluetooth Profiles specific to target Dynamically
+  case $target in
+    "msm8960")
+       if [ "$btsoc" != "ath3k" ] && [ "$soc_hwid" != "130" ]
+       then
+           setprop ro.bluetooth.hfp.ver 1.6
+           setprop ro.qualcomm.bt.hci_transport smd
+       fi
+       ;;
+    "msm8974" | "msm8226" | "msm8610" | "msm8916" | "msm8909" )
+       if [ "$btsoc" != "ath3k" ]
+       then
+           setprop ro.bluetooth.hfp.ver 1.6
+           setprop ro.qualcomm.bt.hci_transport smd
+       fi
+       ;;
+    "apq8084" | "mpq8092" | "msm8994" )
+       if [ "$btsoc" != "rome" ]
+       then
+           setprop ro.qualcomm.bt.hci_transport smd
+       elif [ "$btsoc" = "rome" ]
+       then
+           setprop ro.bluetooth.hfp.ver 1.6
+       fi
+       ;;
+    *)
+       ;;
+  esac
+
+if [ -f /system/etc/bluetooth/stack.conf ]; then
+stack=`cat /system/etc/bluetooth/stack.conf`
+fi
+
+case "$stack" in
+    "bluez")
+	   logi "Bluetooth stack is $stack"
+	   setprop ro.qc.bluetooth.stack $stack
+	   reason=`getprop vold.decrypt`
+	   case "$reason" in
+	       "trigger_restart_framework")
+	           start dbus
+	           ;;
+	   esac
+        ;;
+    *)
+	   logi "Bluetooth stack is Bluedroid"
+        ;;
+esac
+
+}
+
+start_hciattach ()
+{
+  /system/bin/hciattach -n $BTS_DEVICE $BTS_TYPE $BTS_BAUD &
+  hciattach_pid=$!
+  logi "start_hciattach: pid = $hciattach_pid"
+  echo 1 > $BLUETOOTH_SLEEP_PATH
+}
+
+kill_hciattach ()
+{
+  echo 0 > $BLUETOOTH_SLEEP_PATH
+  logi "kill_hciattach: pid = $hciattach_pid"
+  ## careful not to kill zero or null!
+  kill -TERM $hciattach_pid
+  # this shell doesn't exit now -- wait returns for normal exit
+}
+
+logi "init.qcom.bt.sh config = $config"
+case "$config" in
+    "onboot")
+        program_bdaddr
+        config_bt
+        exit 0
+        ;;
+    *)
+        ;;
+esac
+
+# mimic hciattach options parsing -- maybe a waste of effort
+USAGE="hciattach [-n] [-p] [-b] [-t timeout] [-s initial_speed] <tty> <type | id> [speed] [flow|noflow] [bdaddr]"
+
+while getopts "blnpt:s:" f
+do
+  case $f in
+  b | l | n | p)  opt_flags="$opt_flags -$f" ;;
+  t)      timeout=$OPTARG;;
+  s)      initial_speed=$OPTARG;;
+  \?)     echo $USAGE; exit 1;;
+  esac
+done
+shift $(($OPTIND-1))
+
+# Note that "hci_qcomm_init -e" prints expressions to set the shell variables
+# BTS_DEVICE, BTS_TYPE, BTS_BAUD, and BTS_ADDRESS.
+
+#Selectively Disable sleep
+BOARD=`getprop ro.board.platform`
+STACK=`getprop ro.qc.bluetooth.stack`
+
+# BR/EDR & LE power class configurations
+POWER_CLASS=`getprop qcom.bt.dev_power_class`
+LE_POWER_CLASS=`getprop qcom.bt.le_dev_pwr_class`
+
+# BR/EDR RF power backoff
+POWER_BACKOFF=`getprop qcom.bt.dev_power_backoff`
+
+#find the transport type
+TRANSPORT=`getprop ro.qualcomm.bt.hci_transport`
+logi "Transport : $TRANSPORT"
+case $STACK in
+    "bluez")
+       logi "** Bluez stack **"
+    ;;
+    *)
+       logi "** Bluedroid stack **"
+       setprop bluetooth.status off
+    ;;
+esac
+
+
+case $POWER_CLASS in
+  1) PWR_CLASS="-p 0" ;
+     logi "Power Class: 1";;
+  2) PWR_CLASS="-p 1" ;
+     logi "Power Class: 2";;
+  3) PWR_CLASS="-p 2" ;
+     logi "Power Class: CUSTOM";;
+  *) PWR_CLASS="";
+     logi "Power Class: Ignored. Default(1) used (1-CLASS1/2-CLASS2/3-CUSTOM)";
+     logi "Power Class: To override, Before turning BT ON; setprop qcom.bt.dev_power_class <1 or 2 or 3>";;
+esac
+
+case $LE_POWER_CLASS in
+  1) LE_PWR_CLASS="-P 0" ;
+     logi "LE Power Class: 1";;
+  2) LE_PWR_CLASS="-P 1" ;
+     logi "LE Power Class: 2";;
+  3) LE_PWR_CLASS="-P 2" ;
+     logi "LE Power Class: CUSTOM";;
+  *) LE_PWR_CLASS="-P 1";
+     logi "LE Power Class: Ignored. Default(2) used (1-CLASS1/2-CLASS2/3-CUSTOM)";
+     logi "LE Power Class: To override, Before turning BT ON; setprop qcom.bt.le_dev_pwr_class <1 or 2 or 3>";;
+esac
+
+case $POWER_BACKOFF in
+   0) POWER_BACKOFF="-k 0" ;
+      logi "Power Backoff: 0";;
+   1) POWER_BACKOFF="-k 1" ;
+      logi "Power Backoff: 1";;
+   2) POWER_BACKOFF="-k 2" ;
+      logi "Power Backoff: 2";;
+   3) POWER_BACKOFF="-k 3" ;
+      logi "Power Backoff: 3";;
+   *) POWER_BACKOFF="";
+      logi "Power Backoff: Ignored. Configuration in source code will be used";
+esac
+
+eval $(/system/bin/hci_qcomm_init -e $PWR_CLASS $LE_PWR_CLASS $POWER_BACKOFF && echo "exit_code_hci_qcomm_init=0" || echo "exit_code_hci_qcomm_init=1")
+
+case $exit_code_hci_qcomm_init in
+  0) logi "Bluetooth QSoC firmware download succeeded, $BTS_DEVICE $BTS_TYPE $BTS_BAUD $BTS_ADDRESS";;
+  *) failed "Bluetooth QSoC firmware download failed" $exit_code_hci_qcomm_init;
+     case $STACK in
+         "bluez")
+            logi "** Bluez stack **"
+         ;;
+         *)
+            logi "** Bluedroid stack **"
+            setprop bluetooth.status off
+        ;;
+     esac
+
+     exit $exit_code_hci_qcomm_init;;
+esac
+
+# init does SIGTERM on ctl.stop for service
+trap "kill_hciattach" TERM INT
+
+case $TRANSPORT in
+    "smd")
+       case $STACK in
+           "bluez")
+              logi "** Bluez stack **"
+              echo 1 > /sys/module/hci_smd/parameters/hcismd_set
+           ;;
+           *)
+              logi "** Bluedroid stack **"
+              setprop bluetooth.status on
+           ;;
+       esac
+     ;;
+     *)
+        logi "start hciattach"
+        start_hciattach
+        case $STACK in
+            "bluez")
+               logi "Bluetooth is turning On with Bluez stack "
+            ;;
+            *)
+               logi "** Bluedroid stack **"
+               setprop bluetooth.status on
+            ;;
+        esac
+
+        wait $hciattach_pid
+        logi "Bluetooth stopped"
+     ;;
+esac
+
+exit 0