diff --git a/libbt/Android.mk b/libbt/Android.mk
deleted file mode 100644
index 62cad46..0000000
--- a/libbt/Android.mk
+++ /dev/null
@@ -1,48 +0,0 @@
-$(warning "wink:device/common/libbt E")
-LOCAL_PATH := $(call my-dir)
-
-ifneq ($(BOARD_HAVE_BLUETOOTH_BCM),)
-
-include $(CLEAR_VARS)
-
-BDROID_DIR := $(TOP_DIR)external/bluetooth/bluedroid
-
-LOCAL_SRC_FILES := \
-        src/bt_vendor_brcm.c \
-        src/hardware.c \
-        src/userial_vendor.c \
-        src/upio.c \
-        src/conf.c
-
-LOCAL_C_INCLUDES += \
-        $(LOCAL_PATH)/include \
-        $(BDROID_DIR)/hci/include
-
-LOCAL_SHARED_LIBRARIES := \
-        libcutils
-
-LOCAL_MODULE := libbt-vendor
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_OWNER := broadcom
-LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_SHARED_LIBRARIES)
-
-include $(LOCAL_PATH)/vnd_buildcfg.mk
-
-include $(BUILD_SHARED_LIBRARY)
-
-ifeq ($(TARGET_PRODUCT), full_maguro)
-    include $(LOCAL_PATH)/conf/samsung/maguro/Android.mk
-endif
-ifeq ($(TARGET_PRODUCT), full_crespo)
-    include $(LOCAL_PATH)/conf/samsung/crespo/Android.mk
-endif
-ifeq ($(TARGET_PRODUCT), full_crespo4g)
-    include $(LOCAL_PATH)/conf/samsung/crespo4g/Android.mk
-endif
-ifeq ($(TARGET_PRODUCT), full_wingray)
-    include $(LOCAL_PATH)/conf/moto/wingray/Android.mk
-endif
-
-endif # BOARD_HAVE_BLUETOOTH_BCM
-$(warning "wink:device/common/libbt X")
diff --git a/libbt/conf/asus/grouper/Android.mk b/libbt/conf/asus/grouper/Android.mk
deleted file mode 100644
index 974e213..0000000
--- a/libbt/conf/asus/grouper/Android.mk
+++ /dev/null
@@ -1,14 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := bt_vendor.conf
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/bluetooth
-
-LOCAL_MODULE_TAGS := eng
-
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-
-include $(BUILD_PREBUILT)
-
diff --git a/libbt/conf/asus/grouper/bt_vendor.conf b/libbt/conf/asus/grouper/bt_vendor.conf
deleted file mode 100644
index 94fa0cd..0000000
--- a/libbt/conf/asus/grouper/bt_vendor.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-# UART device port where Bluetooth controller is attached
-UartPort = /dev/ttyHS2
-
-# Firmware patch file location
-FwPatchFilePath = /etc/firmware/
diff --git a/libbt/conf/moto/wingray/Android.mk b/libbt/conf/moto/wingray/Android.mk
deleted file mode 100644
index 974e213..0000000
--- a/libbt/conf/moto/wingray/Android.mk
+++ /dev/null
@@ -1,14 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := bt_vendor.conf
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/bluetooth
-
-LOCAL_MODULE_TAGS := eng
-
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-
-include $(BUILD_PREBUILT)
-
diff --git a/libbt/conf/moto/wingray/bt_vendor.conf b/libbt/conf/moto/wingray/bt_vendor.conf
deleted file mode 100644
index 94fa0cd..0000000
--- a/libbt/conf/moto/wingray/bt_vendor.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-# UART device port where Bluetooth controller is attached
-UartPort = /dev/ttyHS2
-
-# Firmware patch file location
-FwPatchFilePath = /etc/firmware/
diff --git a/libbt/conf/samsung/crespo/Android.mk b/libbt/conf/samsung/crespo/Android.mk
deleted file mode 100644
index 974e213..0000000
--- a/libbt/conf/samsung/crespo/Android.mk
+++ /dev/null
@@ -1,14 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := bt_vendor.conf
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/bluetooth
-
-LOCAL_MODULE_TAGS := eng
-
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-
-include $(BUILD_PREBUILT)
-
diff --git a/libbt/conf/samsung/crespo/bt_vendor.conf b/libbt/conf/samsung/crespo/bt_vendor.conf
deleted file mode 100644
index 1f471ca..0000000
--- a/libbt/conf/samsung/crespo/bt_vendor.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-# UART device port where Bluetooth controller is attached
-UartPort = /dev/s3c2410_serial0
-
-# Firmware patch file location
-FwPatchFilePath = /vendor/firmware/
diff --git a/libbt/conf/samsung/crespo4g/Android.mk b/libbt/conf/samsung/crespo4g/Android.mk
deleted file mode 100644
index 974e213..0000000
--- a/libbt/conf/samsung/crespo4g/Android.mk
+++ /dev/null
@@ -1,14 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := bt_vendor.conf
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/bluetooth
-
-LOCAL_MODULE_TAGS := eng
-
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-
-include $(BUILD_PREBUILT)
-
diff --git a/libbt/conf/samsung/crespo4g/bt_vendor.conf b/libbt/conf/samsung/crespo4g/bt_vendor.conf
deleted file mode 100644
index 1f471ca..0000000
--- a/libbt/conf/samsung/crespo4g/bt_vendor.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-# UART device port where Bluetooth controller is attached
-UartPort = /dev/s3c2410_serial0
-
-# Firmware patch file location
-FwPatchFilePath = /vendor/firmware/
diff --git a/libbt/conf/samsung/maguro/Android.mk b/libbt/conf/samsung/maguro/Android.mk
deleted file mode 100644
index 974e213..0000000
--- a/libbt/conf/samsung/maguro/Android.mk
+++ /dev/null
@@ -1,14 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := bt_vendor.conf
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/bluetooth
-
-LOCAL_MODULE_TAGS := eng
-
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-
-include $(BUILD_PREBUILT)
-
diff --git a/libbt/conf/samsung/maguro/bt_vendor.conf b/libbt/conf/samsung/maguro/bt_vendor.conf
deleted file mode 100644
index d5547eb..0000000
--- a/libbt/conf/samsung/maguro/bt_vendor.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-# UART device port where Bluetooth controller is attached
-UartPort = /dev/ttyO1
-
-# Firmware patch file location
-FwPatchFilePath = /vendor/firmware/
diff --git a/libbt/include/bt_vendor_brcm.h b/libbt/include/bt_vendor_brcm.h
deleted file mode 100644
index 2ecc21e..0000000
--- a/libbt/include/bt_vendor_brcm.h
+++ /dev/null
@@ -1,334 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2009-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Filename:      bt_vendor_brcm.h
- *
- *  Description:   A wrapper header file of bt_vendor_lib.h
- *
- *                 Contains definitions specific for interfacing with Broadcom
- *                 Bluetooth chipsets
- *
- ******************************************************************************/
-
-#ifndef BT_VENDOR_BRCM_H
-#define BT_VENDOR_BRCM_H
-
-#include "bt_vendor_lib.h"
-#include "vnd_buildcfg.h"
-
-/******************************************************************************
-**  Constants & Macros
-******************************************************************************/
-
-#ifndef FALSE
-#define FALSE  0
-#endif
-
-#ifndef TRUE
-#define TRUE   (!FALSE)
-#endif
-
-#ifndef VENDOR_LIB_RUNTIME_TUNING_ENABLED
-#define VENDOR_LIB_RUNTIME_TUNING_ENABLED   FALSE
-#endif
-
-/* Run-time configuration file */
-#ifndef VENDOR_LIB_CONF_FILE
-#define VENDOR_LIB_CONF_FILE "/etc/bluetooth/bt_vendor.conf"
-#endif
-
-/* Device port name where Bluetooth controller attached */
-#ifndef BLUETOOTH_UART_DEVICE_PORT
-#define BLUETOOTH_UART_DEVICE_PORT      "/dev/ttyO1"    /* maguro */
-#endif
-
-/* Location of firmware patch files */
-#ifndef FW_PATCHFILE_LOCATION
-#define FW_PATCHFILE_LOCATION "/vendor/firmware/"  /* maguro */
-#endif
-
-#ifndef UART_TARGET_BAUD_RATE
-#define UART_TARGET_BAUD_RATE           3000000
-#endif
-
-/* The millisecond delay pauses on HCI transport after firmware patches
- * were downloaded. This gives some time for firmware to restart with
- * patches before host attempts to send down any HCI commands.
- *
- * Note: It has been discovered that BCM43241B0 needs at least 200ms
- * settlement delay in here. Without the delay, a Hardware Error event
- * from BCM43241B0 had been seen in HCI upstream path right after the
- * host sent the HCI_VSC_SET_BDADDR commad to the controller at higher
- * baud.
- */
-#ifndef FW_PATCH_SETTLEMENT_DELAY_MS
-#define FW_PATCH_SETTLEMENT_DELAY_MS          0
-#endif
-
-/* sleep mode
-
-    0: disable
-    1: UART with Host wake/BT wake out of band signals
-*/
-#ifndef LPM_SLEEP_MODE
-#define LPM_SLEEP_MODE                  1
-#endif
-
-/* Host Stack Idle Threshold in 300ms or 25ms 
-
-  In sleep mode 1, this is the number of firmware loops executed with no
-    activity before the Host wake line is deasserted. Activity includes HCI
-    traffic excluding certain sleep mode commands and the presence of SCO
-    connections if the "Allow Host Sleep During SCO" flag is not set to 1.
-    Each count of this parameter is roughly equivalent to 300ms or 25ms.
-*/
-#ifndef LPM_IDLE_THRESHOLD
-#define LPM_IDLE_THRESHOLD              1
-#endif
-
-/* Host Controller Idle Threshold in 300ms or 25ms
-
-    This is the number of firmware loops executed with no activity before the
-    HC is considered idle. Depending on the mode, HC may then attempt to sleep.
-    Activity includes HCI traffic excluding certain sleep mode commands and
-    the presence of ACL/SCO connections.
-*/
-#ifndef LPM_HC_IDLE_THRESHOLD
-#define LPM_HC_IDLE_THRESHOLD           1
-#endif
-
-/* BT_WAKE Polarity - 0=Active Low, 1= Active High */
-#ifndef LPM_BT_WAKE_POLARITY
-#define LPM_BT_WAKE_POLARITY            1    /* maguro */
-#endif
-
-/* HOST_WAKE Polarity - 0=Active Low, 1= Active High */
-#ifndef LPM_HOST_WAKE_POLARITY
-#define LPM_HOST_WAKE_POLARITY          1    /* maguro */
-#endif
-
-/* LPM_ALLOW_HOST_SLEEP_DURING_SCO
-
-    When this flag is set to 0, the host is not allowed to sleep while
-    an SCO is active. In sleep mode 1, the device will keep the host
-    wake line asserted while an SCO is active.
-    When this flag is set to 1, the host can sleep while an SCO is active.
-    This flag should only be set to 1 if SCO traffic is directed to the PCM
-    interface.
-*/
-#ifndef LPM_ALLOW_HOST_SLEEP_DURING_SCO
-#define LPM_ALLOW_HOST_SLEEP_DURING_SCO 1
-#endif
-
-/* LPM_COMBINE_SLEEP_MODE_AND_LPM
-
-    In Mode 0, always set byte 7 to 0. In sleep mode 1, device always
-    requires permission to sleep between scans / periodic inquiries regardless
-    of the setting of this byte. In sleep mode 1, if byte is set, device must
-    have "permission" to sleep during the low power modes of sniff, hold, and
-    park. If byte is not set, device can sleep without permission during these
-    modes. Permission to sleep in Mode 1 is obtained if the BT_WAKE signal is
-    not asserted.
-*/
-#ifndef LPM_COMBINE_SLEEP_MODE_AND_LPM
-#define LPM_COMBINE_SLEEP_MODE_AND_LPM  1
-#endif
-
-/* LPM_ENABLE_UART_TXD_TRI_STATE
-
-    When set to 0, the device will not tristate its UART TX line before going
-    to sleep.
-    When set to 1, the device will tristate its UART TX line before going to
-    sleep.
-*/
-#ifndef LPM_ENABLE_UART_TXD_TRI_STATE
-#define LPM_ENABLE_UART_TXD_TRI_STATE   0
-#endif
-
-/* LPM_PULSED_HOST_WAKE
-*/
-#ifndef LPM_PULSED_HOST_WAKE
-#define LPM_PULSED_HOST_WAKE            0
-#endif
-
-/* LPM_IDLE_TIMEOUT_MULTIPLE
-
-    The multiple factor of host stack idle threshold in 300ms/25ms
-*/
-#ifndef LPM_IDLE_TIMEOUT_MULTIPLE
-#define LPM_IDLE_TIMEOUT_MULTIPLE       10
-#endif
-
-/* BT_WAKE_VIA_USERIAL_IOCTL
-
-    Use userial ioctl function to control BT_WAKE signal
-*/
-#ifndef BT_WAKE_VIA_USERIAL_IOCTL
-#define BT_WAKE_VIA_USERIAL_IOCTL       FALSE
-#endif
-
-
-/* SCO_CFG_INCLUDED
-
-    Do SCO configuration by default. If the firmware patch had been embedded
-    with desired SCO configuration, set this FALSE to bypass configuration
-    from host software.
-*/
-#ifndef SCO_CFG_INCLUDED
-#define SCO_CFG_INCLUDED                TRUE
-#endif
-
-#ifndef SCO_USE_I2S_INTERFACE
-#define SCO_USE_I2S_INTERFACE           FALSE
-#endif
-
-#if (SCO_USE_I2S_INTERFACE == TRUE)
-#define SCO_I2SPCM_PARAM_SIZE           4
-
-/* SCO_I2SPCM_IF_MODE - 0=Disable, 1=Enable */
-#ifndef SCO_I2SPCM_IF_MODE
-#define SCO_I2SPCM_IF_MODE              1
-#endif
-
-/* SCO_I2SPCM_IF_ROLE - 0=Slave, 1=Master */
-#ifndef SCO_I2SPCM_IF_ROLE
-#define SCO_I2SPCM_IF_ROLE              1
-#endif
-
-/* SCO_I2SPCM_IF_SAMPLE_RATE
-
-    0 : 8K
-    1 : 16K
-    2 : 4K
-*/
-#ifndef SCO_I2SPCM_IF_SAMPLE_RATE
-#define SCO_I2SPCM_IF_SAMPLE_RATE       0
-#endif
-
-/* SCO_I2SPCM_IF_CLOCK_RATE
-
-    0 : 128K
-    1 : 256K
-    2 : 512K
-    3 : 1024K
-    4 : 2048K
-*/
-#ifndef SCO_I2SPCM_IF_CLOCK_RATE
-#define SCO_I2SPCM_IF_CLOCK_RATE        1
-#endif
-#endif // SCO_USE_I2S_INTERFACE
-
-
-#define SCO_PCM_PARAM_SIZE              5
-
-/* SCO_PCM_ROUTING
-
-    0 : PCM
-    1 : Transport
-    2 : Codec
-    3 : I2S
-*/
-#ifndef SCO_PCM_ROUTING
-#define SCO_PCM_ROUTING                 0
-#endif
-
-/* SCO_PCM_IF_CLOCK_RATE
-
-    0 : 128K
-    1 : 256K
-    2 : 512K
-    3 : 1024K
-    4 : 2048K
-*/
-#ifndef SCO_PCM_IF_CLOCK_RATE
-#define SCO_PCM_IF_CLOCK_RATE           4
-#endif
-
-/* SCO_PCM_IF_FRAME_TYPE - 0=Short, 1=Long */
-#ifndef SCO_PCM_IF_FRAME_TYPE
-#define SCO_PCM_IF_FRAME_TYPE           0
-#endif
-
-/* SCO_PCM_IF_SYNC_MODE - 0=Slave, 1=Master */
-#ifndef SCO_PCM_IF_SYNC_MODE
-#define SCO_PCM_IF_SYNC_MODE            0
-#endif
-
-/* SCO_PCM_IF_CLOCK_MODE - 0=Slave, 1=Master */
-#ifndef SCO_PCM_IF_CLOCK_MODE
-#define SCO_PCM_IF_CLOCK_MODE           0
-#endif
-
-#define PCM_DATA_FORMAT_PARAM_SIZE      5
-
-/* PCM_DATA_FMT_SHIFT_MODE
-
-    0 : MSB first
-    1 : LSB first
-*/
-#ifndef PCM_DATA_FMT_SHIFT_MODE
-#define PCM_DATA_FMT_SHIFT_MODE         0
-#endif
-
-/* PCM_DATA_FMT_FILL_BITS
-
-    Specifies the value with which to fill unused bits
-    if Fill_Method is set to programmable
-*/
-#ifndef PCM_DATA_FMT_FILL_BITS
-#define PCM_DATA_FMT_FILL_BITS          0
-#endif
-
-/* PCM_DATA_FMT_FILL_METHOD
-
-    0 : 0's
-    1 : 1's
-    2 : Signed
-    3 : Programmable
-*/
-#ifndef PCM_DATA_FMT_FILL_METHOD
-#define PCM_DATA_FMT_FILL_METHOD        3
-#endif
-
-/* PCM_DATA_FMT_FILL_NUM
-
-    Specifies the number of bits to be filled
-*/
-#ifndef PCM_DATA_FMT_FILL_NUM
-#define PCM_DATA_FMT_FILL_NUM           3
-#endif
-
-/* PCM_DATA_FMT_JUSTIFY_MODE
-
-    0 : Left justify (fill data shifted out last)
-    1 : Right justify (fill data shifted out first)
-*/
-#ifndef PCM_DATA_FMT_JUSTIFY_MODE
-#define PCM_DATA_FMT_JUSTIFY_MODE       0
-#endif
-
-/******************************************************************************
-**  Extern variables and functions
-******************************************************************************/
-
-extern bt_vendor_callbacks_t *bt_vendor_cbacks;
-
-#endif /* BT_VENDOR_BRCM_H */
-
diff --git a/libbt/include/upio.h b/libbt/include/upio.h
deleted file mode 100644
index 32920e6..0000000
--- a/libbt/include/upio.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2009-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Filename:      upio.h
- *
- *  Description:   Contains definitions used for I/O controls
- *
- ******************************************************************************/
-
-#ifndef UPIO_H
-#define UPIO_H
-
-/******************************************************************************
-**  Constants & Macros
-******************************************************************************/
-
-#define UPIO_BT_POWER_OFF 0
-#define UPIO_BT_POWER_ON  1
-
-/* UPIO signals */
-enum {
-    UPIO_BT_WAKE = 0,
-    UPIO_HOST_WAKE,
-    UPIO_MAX_COUNT
-};
-
-/* UPIO assertion/deassertion */
-enum {
-    UPIO_UNKNOWN = 0,
-    UPIO_DEASSERT,
-    UPIO_ASSERT
-};
-
-/******************************************************************************
-**  Extern variables and functions
-******************************************************************************/
-
-/******************************************************************************
-**  Functions
-******************************************************************************/
-
-/*******************************************************************************
-**
-** Function        upio_init
-**
-** Description     Initialization
-**
-** Returns         None
-**
-*******************************************************************************/
-void upio_init(void);
-
-/*******************************************************************************
-**
-** Function        upio_cleanup
-**
-** Description     Clean up
-**
-** Returns         None
-**
-*******************************************************************************/
-void upio_cleanup(void);
-
-/*******************************************************************************
-**
-** Function        upio_set_bluetooth_power
-**
-** Description     Interact with low layer driver to set Bluetooth power
-**                 on/off.
-**
-** Returns         0  : SUCCESS or Not-Applicable
-**                 <0 : ERROR
-**
-*******************************************************************************/
-int upio_set_bluetooth_power(int on);
-
-/*******************************************************************************
-**
-** Function        upio_set
-**
-** Description     Set i/o based on polarity
-**
-** Returns         None
-**
-*******************************************************************************/
-void upio_set(uint8_t pio, uint8_t action, uint8_t polarity);
-
-#endif /* UPIO_H */
-
diff --git a/libbt/include/userial_vendor.h b/libbt/include/userial_vendor.h
deleted file mode 100644
index 8e8b84f..0000000
--- a/libbt/include/userial_vendor.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2009-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Filename:      userial_vendor.h
- *
- *  Description:   Contains vendor-specific definitions used in serial port
- *                 controls
- *
- ******************************************************************************/
-
-#ifndef USERIAL_VENDOR_H
-#define USERIAL_VENDOR_H
-
-#include "bt_vendor_brcm.h"
-#include "userial.h"
-
-/******************************************************************************
-**  Constants & Macros
-******************************************************************************/
-
-/**** baud rates ****/
-#define USERIAL_BAUD_300        0
-#define USERIAL_BAUD_600        1
-#define USERIAL_BAUD_1200       2
-#define USERIAL_BAUD_2400       3
-#define USERIAL_BAUD_9600       4
-#define USERIAL_BAUD_19200      5
-#define USERIAL_BAUD_57600      6
-#define USERIAL_BAUD_115200     7
-#define USERIAL_BAUD_230400     8
-#define USERIAL_BAUD_460800     9
-#define USERIAL_BAUD_921600     10
-#define USERIAL_BAUD_1M         11
-#define USERIAL_BAUD_1_5M       12
-#define USERIAL_BAUD_2M         13
-#define USERIAL_BAUD_3M         14
-#define USERIAL_BAUD_4M         15
-#define USERIAL_BAUD_AUTO       16
-
-/**** Data Format ****/
-/* Stop Bits */
-#define USERIAL_STOPBITS_1      1
-#define USERIAL_STOPBITS_1_5    (1<<1)
-#define USERIAL_STOPBITS_2      (1<<2)
-
-/* Parity Bits */
-#define USERIAL_PARITY_NONE     (1<<3)
-#define USERIAL_PARITY_EVEN     (1<<4)
-#define USERIAL_PARITY_ODD      (1<<5)
-
-/* Data Bits */
-#define USERIAL_DATABITS_5      (1<<6)
-#define USERIAL_DATABITS_6      (1<<7)
-#define USERIAL_DATABITS_7      (1<<8)
-#define USERIAL_DATABITS_8      (1<<9)
-
-
-#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
-/* These are the ioctl values used for bt_wake ioctl via UART driver. you may
- * need to redefine them on you platform!
- * Logically they need to be unique and not colide with existing uart ioctl's.
- */
-#ifndef USERIAL_IOCTL_BT_WAKE_ASSERT
-#define USERIAL_IOCTL_BT_WAKE_ASSERT   0x8003
-#endif
-#ifndef USERIAL_IOCTL_BT_WAKE_DEASSERT
-#define USERIAL_IOCTL_BT_WAKE_DEASSERT 0x8004
-#endif
-#ifndef USERIAL_IOCTL_BT_WAKE_GET_ST
-#define USERIAL_IOCTL_BT_WAKE_GET_ST   0x8005
-#endif
-#endif // (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
-
-/******************************************************************************
-**  Type definitions
-******************************************************************************/
-
-/* Structure used to configure serial port during open */
-typedef struct
-{
-    uint16_t fmt;       /* Data format */
-    uint8_t  baud;      /* Baud rate */
-} tUSERIAL_CFG;
-
-typedef enum {
-#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
-    USERIAL_OP_ASSERT_BT_WAKE,
-    USERIAL_OP_DEASSERT_BT_WAKE,
-    USERIAL_OP_GET_BT_WAKE_STATE,
-#endif
-    USERIAL_OP_NOP,
-} userial_vendor_ioctl_op_t;
-
-/******************************************************************************
-**  Extern variables and functions
-******************************************************************************/
-
-/******************************************************************************
-**  Functions
-******************************************************************************/
-
-/*******************************************************************************
-**
-** Function        userial_vendor_init
-**
-** Description     Initialize userial vendor-specific control block
-**
-** Returns         None
-**
-*******************************************************************************/
-void userial_vendor_init(void);
-
-/*******************************************************************************
-**
-** Function        userial_vendor_open
-**
-** Description     Open the serial port with the given configuration
-**
-** Returns         device fd
-**
-*******************************************************************************/
-int userial_vendor_open(tUSERIAL_CFG *p_cfg);
-
-/*******************************************************************************
-**
-** Function        userial_vendor_close
-**
-** Description     Conduct vendor-specific close work
-**
-** Returns         None
-**
-*******************************************************************************/
-void userial_vendor_close(void);
-
-/*******************************************************************************
-**
-** Function        userial_vendor_set_baud
-**
-** Description     Set new baud rate
-**
-** Returns         None
-**
-*******************************************************************************/
-void userial_vendor_set_baud(uint8_t userial_baud);
-
-/*******************************************************************************
-**
-** Function        userial_vendor_ioctl
-**
-** Description     ioctl inteface
-**
-** Returns         None
-**
-*******************************************************************************/
-void userial_vendor_ioctl(userial_vendor_ioctl_op_t op, void *p_data);
-
-#endif /* USERIAL_VENDOR_H */
-
diff --git a/libbt/include/vnd_crespo.txt b/libbt/include/vnd_crespo.txt
deleted file mode 100644
index 3596b6f..0000000
--- a/libbt/include/vnd_crespo.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-BLUETOOTH_UART_DEVICE_PORT = "/dev/s3c2410_serial0"
-FW_PATCHFILE_LOCATION = "/vendor/firmware/"
-BT_WAKE_VIA_USERIAL_IOCTL = TRUE
-LPM_IDLE_TIMEOUT_MULTIPLE = 5
-SCO_PCM_IF_CLOCK_RATE = 0
-BTVND_DBG = FALSE
-BTHW_DBG = TRUE
-VNDUSERIAL_DBG = FALSE
-UPIO_DBG = FALSE
diff --git a/libbt/include/vnd_crespo4g.txt b/libbt/include/vnd_crespo4g.txt
deleted file mode 100644
index 3596b6f..0000000
--- a/libbt/include/vnd_crespo4g.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-BLUETOOTH_UART_DEVICE_PORT = "/dev/s3c2410_serial0"
-FW_PATCHFILE_LOCATION = "/vendor/firmware/"
-BT_WAKE_VIA_USERIAL_IOCTL = TRUE
-LPM_IDLE_TIMEOUT_MULTIPLE = 5
-SCO_PCM_IF_CLOCK_RATE = 0
-BTVND_DBG = FALSE
-BTHW_DBG = TRUE
-VNDUSERIAL_DBG = FALSE
-UPIO_DBG = FALSE
diff --git a/libbt/include/vnd_generic.txt b/libbt/include/vnd_generic.txt
deleted file mode 100644
index 43e790c..0000000
--- a/libbt/include/vnd_generic.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyO1"
-FW_PATCHFILE_LOCATION = "/vendor/firmware/"
-BT_WAKE_VIA_USERIAL_IOCTL = TRUE
-LPM_IDLE_TIMEOUT_MULTIPLE = 5
-SCO_USE_I2S_INTERFACE = TRUE
-BTVND_DBG = FALSE
-BTHW_DBG = TRUE
-VNDUSERIAL_DBG = FALSE
-UPIO_DBG = FALSE
diff --git a/libbt/include/vnd_generic_x86.txt b/libbt/include/vnd_generic_x86.txt
deleted file mode 100644
index 43e790c..0000000
--- a/libbt/include/vnd_generic_x86.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyO1"
-FW_PATCHFILE_LOCATION = "/vendor/firmware/"
-BT_WAKE_VIA_USERIAL_IOCTL = TRUE
-LPM_IDLE_TIMEOUT_MULTIPLE = 5
-SCO_USE_I2S_INTERFACE = TRUE
-BTVND_DBG = FALSE
-BTHW_DBG = TRUE
-VNDUSERIAL_DBG = FALSE
-UPIO_DBG = FALSE
diff --git a/libbt/include/vnd_grouper.txt b/libbt/include/vnd_grouper.txt
deleted file mode 100755
index 3667e65..0000000
--- a/libbt/include/vnd_grouper.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyHS2"
-FW_PATCHFILE_LOCATION = "/etc/firmware/"
-BT_WAKE_VIA_USERIAL_IOCTL = TRUE
-LPM_IDLE_TIMEOUT_MULTIPLE = 5
-BTVND_DBG = FALSE
-BTHW_DBG = TRUE
-VNDUSERIAL_DBG = FALSE
-UPIO_DBG = FALSE
-SCO_PCM_IF_CLOCK_RATE = 2
diff --git a/libbt/include/vnd_maguro.txt b/libbt/include/vnd_maguro.txt
deleted file mode 100644
index 43e790c..0000000
--- a/libbt/include/vnd_maguro.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyO1"
-FW_PATCHFILE_LOCATION = "/vendor/firmware/"
-BT_WAKE_VIA_USERIAL_IOCTL = TRUE
-LPM_IDLE_TIMEOUT_MULTIPLE = 5
-SCO_USE_I2S_INTERFACE = TRUE
-BTVND_DBG = FALSE
-BTHW_DBG = TRUE
-VNDUSERIAL_DBG = FALSE
-UPIO_DBG = FALSE
diff --git a/libbt/include/vnd_mako.txt b/libbt/include/vnd_mako.txt
deleted file mode 100644
index 43e790c..0000000
--- a/libbt/include/vnd_mako.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyO1"
-FW_PATCHFILE_LOCATION = "/vendor/firmware/"
-BT_WAKE_VIA_USERIAL_IOCTL = TRUE
-LPM_IDLE_TIMEOUT_MULTIPLE = 5
-SCO_USE_I2S_INTERFACE = TRUE
-BTVND_DBG = FALSE
-BTHW_DBG = TRUE
-VNDUSERIAL_DBG = FALSE
-UPIO_DBG = FALSE
diff --git a/libbt/include/vnd_manta.txt b/libbt/include/vnd_manta.txt
deleted file mode 100644
index 53f9542..0000000
--- a/libbt/include/vnd_manta.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-BLUETOOTH_UART_DEVICE_PORT = "/dev/ttySAC0"
-FW_PATCHFILE_LOCATION = "/vendor/firmware/"
-UART_TARGET_BAUD_RATE = 921600
-BT_WAKE_VIA_USERIAL_IOCTL = TRUE
-LPM_IDLE_TIMEOUT_MULTIPLE = 5
-BTVND_DBG = FALSE
-BTHW_DBG = TRUE
-VNDUSERIAL_DBG = FALSE
-UPIO_DBG = FALSE
diff --git a/libbt/include/vnd_phantasm.txt b/libbt/include/vnd_phantasm.txt
deleted file mode 100644
index 43e790c..0000000
--- a/libbt/include/vnd_phantasm.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyO1"
-FW_PATCHFILE_LOCATION = "/vendor/firmware/"
-BT_WAKE_VIA_USERIAL_IOCTL = TRUE
-LPM_IDLE_TIMEOUT_MULTIPLE = 5
-SCO_USE_I2S_INTERFACE = TRUE
-BTVND_DBG = FALSE
-BTHW_DBG = TRUE
-VNDUSERIAL_DBG = FALSE
-UPIO_DBG = FALSE
diff --git a/libbt/include/vnd_stingray.txt b/libbt/include/vnd_stingray.txt
deleted file mode 100755
index 3667e65..0000000
--- a/libbt/include/vnd_stingray.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyHS2"
-FW_PATCHFILE_LOCATION = "/etc/firmware/"
-BT_WAKE_VIA_USERIAL_IOCTL = TRUE
-LPM_IDLE_TIMEOUT_MULTIPLE = 5
-BTVND_DBG = FALSE
-BTHW_DBG = TRUE
-VNDUSERIAL_DBG = FALSE
-UPIO_DBG = FALSE
-SCO_PCM_IF_CLOCK_RATE = 2
diff --git a/libbt/include/vnd_toro.txt b/libbt/include/vnd_toro.txt
deleted file mode 100644
index 43e790c..0000000
--- a/libbt/include/vnd_toro.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyO1"
-FW_PATCHFILE_LOCATION = "/vendor/firmware/"
-BT_WAKE_VIA_USERIAL_IOCTL = TRUE
-LPM_IDLE_TIMEOUT_MULTIPLE = 5
-SCO_USE_I2S_INTERFACE = TRUE
-BTVND_DBG = FALSE
-BTHW_DBG = TRUE
-VNDUSERIAL_DBG = FALSE
-UPIO_DBG = FALSE
diff --git a/libbt/include/vnd_tuna.txt b/libbt/include/vnd_tuna.txt
deleted file mode 100644
index 43e790c..0000000
--- a/libbt/include/vnd_tuna.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyO1"
-FW_PATCHFILE_LOCATION = "/vendor/firmware/"
-BT_WAKE_VIA_USERIAL_IOCTL = TRUE
-LPM_IDLE_TIMEOUT_MULTIPLE = 5
-SCO_USE_I2S_INTERFACE = TRUE
-BTVND_DBG = FALSE
-BTHW_DBG = TRUE
-VNDUSERIAL_DBG = FALSE
-UPIO_DBG = FALSE
diff --git a/libbt/include/vnd_wingray.txt b/libbt/include/vnd_wingray.txt
deleted file mode 100755
index 3667e65..0000000
--- a/libbt/include/vnd_wingray.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyHS2"
-FW_PATCHFILE_LOCATION = "/etc/firmware/"
-BT_WAKE_VIA_USERIAL_IOCTL = TRUE
-LPM_IDLE_TIMEOUT_MULTIPLE = 5
-BTVND_DBG = FALSE
-BTHW_DBG = TRUE
-VNDUSERIAL_DBG = FALSE
-UPIO_DBG = FALSE
-SCO_PCM_IF_CLOCK_RATE = 2
diff --git a/libbt/src/bt_vendor_brcm.c b/libbt/src/bt_vendor_brcm.c
deleted file mode 100644
index d17baa2..0000000
--- a/libbt/src/bt_vendor_brcm.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2009-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Filename:      bt_vendor_brcm.c
- *
- *  Description:   Broadcom vendor specific library implementation
- *
- ******************************************************************************/
-
-#define LOG_TAG "bt_vendor"
-
-#include <utils/Log.h>
-#include "bt_vendor_brcm.h"
-#include "upio.h"
-#include "userial_vendor.h"
-
-#ifndef BTVND_DBG
-#define BTVND_DBG FALSE
-#endif
-
-#if (BTVND_DBG == TRUE)
-#define BTVNDDBG(param, ...) {ALOGD(param, ## __VA_ARGS__);}
-#else
-#define BTVNDDBG(param, ...) {}
-#endif
-
-/******************************************************************************
-**  Externs
-******************************************************************************/
-
-void hw_config_start(void);
-uint8_t hw_lpm_enable(uint8_t turn_on);
-uint32_t hw_lpm_get_idle_timeout(void);
-void hw_lpm_set_wake_state(uint8_t wake_assert);
-#if (SCO_CFG_INCLUDED == TRUE)
-void hw_sco_config(void);
-#endif
-void vnd_load_conf(const char *p_path);
-
-/******************************************************************************
-**  Variables
-******************************************************************************/
-
-bt_vendor_callbacks_t *bt_vendor_cbacks = NULL;
-uint8_t vnd_local_bd_addr[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-
-/******************************************************************************
-**  Local type definitions
-******************************************************************************/
-
-/******************************************************************************
-**  Static Variables
-******************************************************************************/
-
-static const tUSERIAL_CFG userial_init_cfg =
-{
-    (USERIAL_DATABITS_8 | USERIAL_PARITY_NONE | USERIAL_STOPBITS_1),
-    USERIAL_BAUD_115200
-};
-
-/******************************************************************************
-**  Functions
-******************************************************************************/
-
-/*****************************************************************************
-**
-**   BLUETOOTH VENDOR INTERFACE LIBRARY FUNCTIONS
-**
-*****************************************************************************/
-
-static int init(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr)
-{
-    ALOGI("init");
-
-    if (p_cb == NULL)
-    {
-        ALOGE("init failed with no user callbacks!");
-        return -1;
-    }
-
-#if (VENDOR_LIB_RUNTIME_TUNING_ENABLED == TRUE)
-    ALOGW("*****************************************************************");
-    ALOGW("*****************************************************************");
-    ALOGW("** Warning - BT Vendor Lib is loaded in debug tuning mode!");
-    ALOGW("**");
-    ALOGW("** If this is not intentional, rebuild libbt-vendor.so ");
-    ALOGW("** with VENDOR_LIB_RUNTIME_TUNING_ENABLED=FALSE and ");
-    ALOGW("** check if any run-time tuning parameters needed to be");
-    ALOGW("** carried to the build-time configuration accordingly.");
-    ALOGW("*****************************************************************");
-    ALOGW("*****************************************************************");
-#endif
-
-    userial_vendor_init();
-    upio_init();
-
-    vnd_load_conf(VENDOR_LIB_CONF_FILE);
-
-    /* store reference to user callbacks */
-    bt_vendor_cbacks = (bt_vendor_callbacks_t *) p_cb;
-
-    /* This is handed over from the stack */
-    memcpy(vnd_local_bd_addr, local_bdaddr, 6);
-
-    return 0;
-}
-
-
-/** Requested operations */
-static int op(bt_vendor_opcode_t opcode, void *param)
-{
-    int retval = 0;
-
-    BTVNDDBG("op for %d", opcode);
-
-    switch(opcode)
-    {
-        case BT_VND_OP_POWER_CTRL:
-            {
-                int *state = (int *) param;
-                if (*state == BT_VND_PWR_OFF)
-                    upio_set_bluetooth_power(UPIO_BT_POWER_OFF);
-                else if (*state == BT_VND_PWR_ON)
-                    upio_set_bluetooth_power(UPIO_BT_POWER_ON);
-            }
-            break;
-
-        case BT_VND_OP_FW_CFG:
-            {
-                hw_config_start();
-            }
-            break;
-
-        case BT_VND_OP_SCO_CFG:
-            {
-#if (SCO_CFG_INCLUDED == TRUE)
-                hw_sco_config();
-#else
-                retval = -1;
-#endif
-            }
-            break;
-
-        case BT_VND_OP_USERIAL_OPEN:
-            {
-                int (*fd_array)[] = (int (*)[]) param;
-                int fd, idx;
-                fd = userial_vendor_open((tUSERIAL_CFG *) &userial_init_cfg);
-                if (fd != -1)
-                {
-                    for (idx=0; idx < CH_MAX; idx++)
-                        (*fd_array)[idx] = fd;
-
-                    retval = 1;
-                }
-                /* retval contains numbers of open fd of HCI channels */
-            }
-            break;
-
-        case BT_VND_OP_USERIAL_CLOSE:
-            {
-                userial_vendor_close();
-            }
-            break;
-
-        case BT_VND_OP_GET_LPM_IDLE_TIMEOUT:
-            {
-                uint32_t *timeout_ms = (uint32_t *) param;
-                *timeout_ms = hw_lpm_get_idle_timeout();
-            }
-            break;
-
-        case BT_VND_OP_LPM_SET_MODE:
-            {
-                uint8_t *mode = (uint8_t *) param;
-                retval = hw_lpm_enable(*mode);
-            }
-            break;
-
-        case BT_VND_OP_LPM_WAKE_SET_STATE:
-            {
-                uint8_t *state = (uint8_t *) param;
-                uint8_t wake_assert = (state == BT_VND_LPM_WAKE_ASSERT) ? \
-                                        TRUE : FALSE;
-
-                hw_lpm_set_wake_state(wake_assert);
-            }
-            break;
-    }
-
-    return retval;
-}
-
-/** Closes the interface */
-static void cleanup( void )
-{
-    BTVNDDBG("cleanup");
-
-    upio_cleanup();
-
-    bt_vendor_cbacks = NULL;
-}
-
-// Entry point of DLib
-const bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = {
-    sizeof(bt_vendor_interface_t),
-    init,
-    op,
-    cleanup
-};
diff --git a/libbt/src/conf.c b/libbt/src/conf.c
deleted file mode 100644
index 39ac12e..0000000
--- a/libbt/src/conf.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2009-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Filename:      conf.c
- *
- *  Description:   Contains functions to conduct run-time module configuration
- *                 based on entries present in the .conf file
- *
- ******************************************************************************/
-
-#define LOG_TAG "bt_vnd_conf"
-
-#include <utils/Log.h>
-#include <string.h>
-#include "bt_vendor_brcm.h"
-
-/******************************************************************************
-**  Externs
-******************************************************************************/
-int userial_set_port(char *p_conf_name, char *p_conf_value, int param);
-int hw_set_patch_file_path(char *p_conf_name, char *p_conf_value, int param);
-int hw_set_patch_file_name(char *p_conf_name, char *p_conf_value, int param);
-#if (VENDOR_LIB_RUNTIME_TUNING_ENABLED == TRUE)
-int hw_set_patch_settlement_delay(char *p_conf_name, char *p_conf_value, int param);
-#endif
-
-
-/******************************************************************************
-**  Local type definitions
-******************************************************************************/
-
-#define CONF_COMMENT '#'
-#define CONF_DELIMITERS " =\n\r\t"
-#define CONF_VALUES_DELIMITERS "=\n\r\t"
-#define CONF_MAX_LINE_LEN 255
-
-typedef int (conf_action_t)(char *p_conf_name, char *p_conf_value, int param);
-
-typedef struct {
-    const char *conf_entry;
-    conf_action_t *p_action;
-    int param;
-} conf_entry_t;
-
-/******************************************************************************
-**  Static variables
-******************************************************************************/
-
-/*
- * Current supported entries and corresponding action functions
- */
-static const conf_entry_t conf_table[] = {
-    {"UartPort", userial_set_port, 0},
-    {"FwPatchFilePath", hw_set_patch_file_path, 0},
-    {"FwPatchFileName", hw_set_patch_file_name, 0},
-#if (VENDOR_LIB_RUNTIME_TUNING_ENABLED == TRUE)
-    {"FwPatchSettlementDelay", hw_set_patch_settlement_delay, 0},
-#endif
-    {(const char *) NULL, NULL, 0}
-};
-
-/*****************************************************************************
-**   CONF INTERFACE FUNCTIONS
-*****************************************************************************/
-
-/*******************************************************************************
-**
-** Function        vnd_load_conf
-**
-** Description     Read conf entry from p_path file one by one and call
-**                 the corresponding config function
-**
-** Returns         None
-**
-*******************************************************************************/
-void vnd_load_conf(const char *p_path)
-{
-    FILE    *p_file;
-    char    *p_name;
-    char    *p_value;
-    conf_entry_t    *p_entry;
-    char    line[CONF_MAX_LINE_LEN+1]; /* add 1 for \0 char */
-
-    ALOGI("Attempt to load conf from %s", p_path);
-
-    if ((p_file = fopen(p_path, "r")) != NULL)
-    {
-        /* read line by line */
-        while (fgets(line, CONF_MAX_LINE_LEN+1, p_file) != NULL)
-        {
-            if (line[0] == CONF_COMMENT)
-                continue;
-
-            p_name = strtok(line, CONF_DELIMITERS);
-
-            if (NULL == p_name)
-            {
-                continue;
-            }
-
-            p_value = strtok(NULL, CONF_DELIMITERS);
-
-            if (NULL == p_value)
-            {
-                ALOGW("vnd_load_conf: missing value for name: %s", p_name);
-                continue;
-            }
-
-            p_entry = (conf_entry_t *)conf_table;
-
-            while (p_entry->conf_entry != NULL)
-            {
-                if (strcmp(p_entry->conf_entry, (const char *)p_name) == 0)
-                {
-                    p_entry->p_action(p_name, p_value, p_entry->param);
-                    break;
-                }
-
-                p_entry++;
-            }
-        }
-
-        fclose(p_file);
-    }
-    else
-    {
-        ALOGI( "vnd_load_conf file >%s< not found", p_path);
-    }
-}
-
diff --git a/libbt/src/hardware.c b/libbt/src/hardware.c
deleted file mode 100644
index a6868e1..0000000
--- a/libbt/src/hardware.c
+++ /dev/null
@@ -1,1155 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2009-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Filename:      hardware.c
- *
- *  Description:   Contains controller-specific functions, like
- *                      firmware patch download
- *                      low power mode operations
- *
- ******************************************************************************/
-
-#define LOG_TAG "bt_hwcfg"
-
-#include <utils/Log.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <signal.h>
-#include <time.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <ctype.h>
-#include <cutils/properties.h>
-#include <stdlib.h>
-#include "bt_hci_bdroid.h"
-#include "bt_vendor_brcm.h"
-#include "userial.h"
-#include "userial_vendor.h"
-#include "upio.h"
-
-/******************************************************************************
-**  Constants & Macros
-******************************************************************************/
-
-#ifndef BTHW_DBG
-#define BTHW_DBG FALSE
-#endif
-
-#if (BTHW_DBG == TRUE)
-#define BTHWDBG(param, ...) {ALOGD(param, ## __VA_ARGS__);}
-#else
-#define BTHWDBG(param, ...) {}
-#endif
-
-#define FW_PATCHFILE_EXTENSION      ".hcd"
-#define FW_PATCHFILE_EXTENSION_LEN  4
-#define FW_PATCHFILE_PATH_MAXLEN    248 /* Local_Name length of return of
-                                           HCI_Read_Local_Name */
-
-#define HCI_CMD_MAX_LEN             258
-
-#define HCI_RESET                               0x0C03
-#define HCI_VSC_WRITE_UART_CLOCK_SETTING        0xFC45
-#define HCI_VSC_UPDATE_BAUDRATE                 0xFC18
-#define HCI_READ_LOCAL_NAME                     0x0C14
-#define HCI_VSC_DOWNLOAD_MINIDRV                0xFC2E
-#define HCI_VSC_WRITE_BD_ADDR                   0xFC01
-#define HCI_VSC_WRITE_SLEEP_MODE                0xFC27
-#define HCI_VSC_WRITE_SCO_PCM_INT_PARAM         0xFC1C
-#define HCI_VSC_WRITE_PCM_DATA_FORMAT_PARAM     0xFC1E
-#define HCI_VSC_WRITE_I2SPCM_INTERFACE_PARAM    0xFC6D
-#define HCI_VSC_LAUNCH_RAM                      0xFC4E
-
-#define HCI_EVT_CMD_CMPL_STATUS_RET_BYTE        5
-#define HCI_EVT_CMD_CMPL_LOCAL_NAME_STRING      6
-#define HCI_EVT_CMD_CMPL_OPCODE                 3
-#define LPM_CMD_PARAM_SIZE                      12
-#define UPDATE_BAUDRATE_CMD_PARAM_SIZE          6
-#define HCI_CMD_PREAMBLE_SIZE                   3
-#define HCD_REC_PAYLOAD_LEN_BYTE                2
-#define BD_ADDR_LEN                             6
-#define LOCAL_NAME_BUFFER_LEN                   32
-#define LOCAL_BDADDR_PATH_BUFFER_LEN            256
-
-#define STREAM_TO_UINT16(u16, p) {u16 = ((uint16_t)(*(p)) + (((uint16_t)(*((p) + 1))) << 8)); (p) += 2;}
-#define UINT16_TO_STREAM(p, u16) {*(p)++ = (uint8_t)(u16); *(p)++ = (uint8_t)((u16) >> 8);}
-#define UINT32_TO_STREAM(p, u32) {*(p)++ = (uint8_t)(u32); *(p)++ = (uint8_t)((u32) >> 8); *(p)++ = (uint8_t)((u32) >> 16); *(p)++ = (uint8_t)((u32) >> 24);}
-
-/******************************************************************************
-**  Local type definitions
-******************************************************************************/
-
-/* Hardware Configuration State */
-enum {
-    HW_CFG_START = 1,
-    HW_CFG_SET_UART_CLOCK,
-    HW_CFG_SET_UART_BAUD_1,
-    HW_CFG_READ_LOCAL_NAME,
-    HW_CFG_DL_MINIDRIVER,
-    HW_CFG_DL_FW_PATCH,
-    HW_CFG_SET_UART_BAUD_2,
-    HW_CFG_SET_BD_ADDR
-};
-
-/* h/w config control block */
-typedef struct
-{
-    uint8_t state;                          /* Hardware configuration state */
-    int     fw_fd;                          /* FW patch file fd */
-    uint8_t f_set_baud_2;                   /* Baud rate switch state */
-    char    local_chip_name[LOCAL_NAME_BUFFER_LEN];
-} bt_hw_cfg_cb_t;
-
-/* low power mode parameters */
-typedef struct
-{
-    uint8_t sleep_mode;                     /* 0(disable),1(UART),9(H5) */
-    uint8_t host_stack_idle_threshold;      /* Unit scale 300ms/25ms */
-    uint8_t host_controller_idle_threshold; /* Unit scale 300ms/25ms */
-    uint8_t bt_wake_polarity;               /* 0=Active Low, 1= Active High */
-    uint8_t host_wake_polarity;             /* 0=Active Low, 1= Active High */
-    uint8_t allow_host_sleep_during_sco;
-    uint8_t combine_sleep_mode_and_lpm;
-    uint8_t enable_uart_txd_tri_state;      /* UART_TXD Tri-State */
-    uint8_t sleep_guard_time;               /* sleep guard time in 12.5ms */
-    uint8_t wakeup_guard_time;              /* wakeup guard time in 12.5ms */
-    uint8_t txd_config;                     /* TXD is high in sleep state */
-    uint8_t pulsed_host_wake;               /* pulsed host wake if mode = 1 */
-} bt_lpm_param_t;
-
-/* Firmware re-launch settlement time */
-typedef struct {
-    const char *chipset_name;
-    const uint32_t delay_time;
-} fw_settlement_entry_t;
-
-
-/******************************************************************************
-**  Externs
-******************************************************************************/
-
-void hw_config_cback(void *p_evt_buf);
-extern uint8_t vnd_local_bd_addr[BD_ADDR_LEN];
-
-
-/******************************************************************************
-**  Static variables
-******************************************************************************/
-
-static char fw_patchfile_path[256] = FW_PATCHFILE_LOCATION;
-static char fw_patchfile_name[128] = { 0 };
-#if (VENDOR_LIB_RUNTIME_TUNING_ENABLED == TRUE)
-static int fw_patch_settlement_delay = -1;
-#endif
-
-static bt_hw_cfg_cb_t hw_cfg_cb;
-
-static bt_lpm_param_t lpm_param =
-{
-    LPM_SLEEP_MODE,
-    LPM_IDLE_THRESHOLD,
-    LPM_HC_IDLE_THRESHOLD,
-    LPM_BT_WAKE_POLARITY,
-    LPM_HOST_WAKE_POLARITY,
-    LPM_ALLOW_HOST_SLEEP_DURING_SCO,
-    LPM_COMBINE_SLEEP_MODE_AND_LPM,
-    LPM_ENABLE_UART_TXD_TRI_STATE,
-    0,  /* not applicable */
-    0,  /* not applicable */
-    0,  /* not applicable */
-    LPM_PULSED_HOST_WAKE
-};
-
-#if (!defined(SCO_USE_I2S_INTERFACE) || (SCO_USE_I2S_INTERFACE == FALSE))
-static uint8_t bt_sco_param[SCO_PCM_PARAM_SIZE] =
-{
-    SCO_PCM_ROUTING,
-    SCO_PCM_IF_CLOCK_RATE,
-    SCO_PCM_IF_FRAME_TYPE,
-    SCO_PCM_IF_SYNC_MODE,
-    SCO_PCM_IF_CLOCK_MODE
-};
-
-static uint8_t bt_pcm_data_fmt_param[PCM_DATA_FORMAT_PARAM_SIZE] =
-{
-    PCM_DATA_FMT_SHIFT_MODE,
-    PCM_DATA_FMT_FILL_BITS,
-    PCM_DATA_FMT_FILL_METHOD,
-    PCM_DATA_FMT_FILL_NUM,
-    PCM_DATA_FMT_JUSTIFY_MODE
-};
-#else
-static uint8_t bt_sco_param[SCO_I2SPCM_PARAM_SIZE] =
-{
-    SCO_I2SPCM_IF_MODE,
-    SCO_I2SPCM_IF_ROLE,
-    SCO_I2SPCM_IF_SAMPLE_RATE,
-    SCO_I2SPCM_IF_CLOCK_RATE
-};
-#endif
-
-/*
- * The look-up table of recommended firmware settlement delay (milliseconds) on
- * known chipsets.
- */
-static const fw_settlement_entry_t fw_settlement_table[] = {
-    {"BCM43241", 200},
-    {(const char *) NULL, 100}  // Giving the generic fw settlement delay setting.
-};
-
-/******************************************************************************
-**  Static functions
-******************************************************************************/
-
-/******************************************************************************
-**  Controller Initialization Static Functions
-******************************************************************************/
-
-/*******************************************************************************
-**
-** Function        look_up_fw_settlement_delay
-**
-** Description     If FW_PATCH_SETTLEMENT_DELAY_MS has not been explicitly
-**                 re-defined in the platform specific build-time configuration
-**                 file, we will search into the look-up table for a
-**                 recommended firmware settlement delay value.
-**
-**                 Although the settlement time might be also related to board
-**                 configurations such as the crystal clocking speed.
-**
-** Returns         Firmware settlement delay
-**
-*******************************************************************************/
-uint32_t look_up_fw_settlement_delay (void)
-{
-    uint32_t ret_value;
-    fw_settlement_entry_t *p_entry;
-
-    if (FW_PATCH_SETTLEMENT_DELAY_MS > 0)
-    {
-        ret_value = FW_PATCH_SETTLEMENT_DELAY_MS;
-    }
-#if (VENDOR_LIB_RUNTIME_TUNING_ENABLED == TRUE)
-    else if (fw_patch_settlement_delay >= 0)
-    {
-        ret_value = fw_patch_settlement_delay;
-    }
-#endif
-    else
-    {
-        p_entry = (fw_settlement_entry_t *)fw_settlement_table;
-
-        while (p_entry->chipset_name != NULL)
-        {
-            if (strstr(hw_cfg_cb.local_chip_name, p_entry->chipset_name)!=NULL)
-            {
-                break;
-            }
-
-            p_entry++;
-        }
-
-        ret_value = p_entry->delay_time;
-    }
-
-    BTHWDBG( "Settlement delay -- %d ms", ret_value);
-
-    return (ret_value);
-}
-
-/*******************************************************************************
-**
-** Function        ms_delay
-**
-** Description     sleep unconditionally for timeout milliseconds
-**
-** Returns         None
-**
-*******************************************************************************/
-void ms_delay (uint32_t timeout)
-{
-    struct timespec delay;
-    int err;
-
-    if (timeout == 0)
-        return;
-
-    delay.tv_sec = timeout / 1000;
-    delay.tv_nsec = 1000 * 1000 * (timeout%1000);
-
-    /* [u]sleep can't be used because it uses SIGALRM */
-    do {
-        err = nanosleep(&delay, &delay);
-    } while (err < 0 && errno ==EINTR);
-}
-
-/*******************************************************************************
-**
-** Function        line_speed_to_userial_baud
-**
-** Description     helper function converts line speed number into USERIAL baud
-**                 rate symbol
-**
-** Returns         unit8_t (USERIAL baud symbol)
-**
-*******************************************************************************/
-uint8_t line_speed_to_userial_baud(uint32_t line_speed)
-{
-    uint8_t baud;
-
-    if (line_speed == 4000000)
-        baud = USERIAL_BAUD_4M;
-    else if (line_speed == 3000000)
-        baud = USERIAL_BAUD_3M;
-    else if (line_speed == 2000000)
-        baud = USERIAL_BAUD_2M;
-    else if (line_speed == 1000000)
-        baud = USERIAL_BAUD_1M;
-    else if (line_speed == 921600)
-        baud = USERIAL_BAUD_921600;
-    else if (line_speed == 460800)
-        baud = USERIAL_BAUD_460800;
-    else if (line_speed == 230400)
-        baud = USERIAL_BAUD_230400;
-    else if (line_speed == 115200)
-        baud = USERIAL_BAUD_115200;
-    else if (line_speed == 57600)
-        baud = USERIAL_BAUD_57600;
-    else if (line_speed == 19200)
-        baud = USERIAL_BAUD_19200;
-    else if (line_speed == 9600)
-        baud = USERIAL_BAUD_9600;
-    else if (line_speed == 1200)
-        baud = USERIAL_BAUD_1200;
-    else if (line_speed == 600)
-        baud = USERIAL_BAUD_600;
-    else
-    {
-        ALOGE( "userial vendor: unsupported baud speed %d", line_speed);
-        baud = USERIAL_BAUD_115200;
-    }
-
-    return baud;
-}
-
-
-/*******************************************************************************
-**
-** Function         hw_strncmp
-**
-** Description      Used to compare two strings in caseless
-**
-** Returns          0: match, otherwise: not match
-**
-*******************************************************************************/
-static int hw_strncmp (const char *p_str1, const char *p_str2, const int len)
-{
-    int i;
-
-    if (!p_str1 || !p_str2)
-        return (1);
-
-    for (i = 0; i < len; i++)
-    {
-        if (toupper(p_str1[i]) != toupper(p_str2[i]))
-            return (i+1);
-    }
-
-    return 0;
-}
-
-/*******************************************************************************
-**
-** Function         hw_config_findpatch
-**
-** Description      Search for a proper firmware patch file
-**                  The selected firmware patch file name with full path
-**                  will be stored in the input string parameter, i.e.
-**                  p_chip_id_str, when returns.
-**
-** Returns          TRUE when found the target patch file, otherwise FALSE
-**
-*******************************************************************************/
-static uint8_t hw_config_findpatch(char *p_chip_id_str)
-{
-    DIR *dirp;
-    struct dirent *dp;
-    int filenamelen;
-    uint8_t retval = FALSE;
-
-    BTHWDBG("Target name = [%s]", p_chip_id_str);
-
-    if (strlen(fw_patchfile_name)> 0)
-    {
-        /* If specific filepath and filename have been given in run-time
-         * configuration /etc/bluetooth/bt_vendor.conf file, we will use them
-         * to concatenate the filename to open rather than searching a file
-         * matching to chipset name in the fw_patchfile_path folder.
-         */
-        sprintf(p_chip_id_str, "%s", fw_patchfile_path);
-        if (fw_patchfile_path[strlen(fw_patchfile_path)- 1] != '/')
-        {
-            strcat(p_chip_id_str, "/");
-        }
-        strcat(p_chip_id_str, fw_patchfile_name);
-
-        ALOGI("FW patchfile: %s", p_chip_id_str);
-        return TRUE;
-    }
-
-    if ((dirp = opendir(fw_patchfile_path)) != NULL)
-    {
-        /* Fetch next filename in patchfile directory */
-        while ((dp = readdir(dirp)) != NULL)
-        {
-            /* Check if filename starts with chip-id name */
-            if ((hw_strncmp(dp->d_name, p_chip_id_str, strlen(p_chip_id_str)) \
-                ) == 0)
-            {
-                /* Check if it has .hcd extenstion */
-                filenamelen = strlen(dp->d_name);
-                if ((filenamelen >= FW_PATCHFILE_EXTENSION_LEN) &&
-                    ((hw_strncmp(
-                          &dp->d_name[filenamelen-FW_PATCHFILE_EXTENSION_LEN], \
-                          FW_PATCHFILE_EXTENSION, \
-                          FW_PATCHFILE_EXTENSION_LEN) \
-                     ) == 0))
-                {
-                    ALOGI("Found patchfile: %s/%s", \
-                        fw_patchfile_path, dp->d_name);
-
-                    /* Make sure length does not exceed maximum */
-                    if ((filenamelen + strlen(fw_patchfile_path)) > \
-                         FW_PATCHFILE_PATH_MAXLEN)
-                    {
-                        ALOGE("Invalid patchfile name (too long)");
-                    }
-                    else
-                    {
-                        memset(p_chip_id_str, 0, FW_PATCHFILE_PATH_MAXLEN);
-                        /* Found patchfile. Store location and name */
-                        strcpy(p_chip_id_str, fw_patchfile_path);
-                        if (fw_patchfile_path[ \
-                            strlen(fw_patchfile_path)- 1 \
-                            ] != '/')
-                        {
-                            strcat(p_chip_id_str, "/");
-                        }
-                        strcat(p_chip_id_str, dp->d_name);
-                        retval = TRUE;
-                    }
-                    break;
-                }
-            }
-        }
-
-        closedir(dirp);
-
-        if (retval == FALSE)
-        {
-            /* Try again chip name without revision info */
-
-            int len = strlen(p_chip_id_str);
-            char *p = p_chip_id_str + len - 1;
-
-            /* Scan backward and look for the first alphabet
-               which is not M or m
-            */
-            while (len > 3) // BCM****
-            {
-                if ((isdigit(*p)==0) && (*p != 'M') && (*p != 'm'))
-                    break;
-
-                p--;
-                len--;
-            }
-
-            if (len > 3)
-            {
-                *p = 0;
-                retval = hw_config_findpatch(p_chip_id_str);
-            }
-        }
-    }
-    else
-    {
-        ALOGE("Could not open %s", fw_patchfile_path);
-    }
-
-    return (retval);
-}
-
-/*******************************************************************************
-**
-** Function         hw_config_set_bdaddr
-**
-** Description      Program controller's Bluetooth Device Address
-**
-** Returns          TRUE, if valid address is sent
-**                  FALSE, otherwise
-**
-*******************************************************************************/
-static uint8_t hw_config_set_bdaddr(HC_BT_HDR *p_buf)
-{
-    uint8_t retval = FALSE;
-    uint8_t *p = (uint8_t *) (p_buf + 1);
-
-    ALOGI("Setting local bd addr to %02X:%02X:%02X:%02X:%02X:%02X",
-        vnd_local_bd_addr[0], vnd_local_bd_addr[1], vnd_local_bd_addr[2],
-        vnd_local_bd_addr[3], vnd_local_bd_addr[4], vnd_local_bd_addr[5]);
-
-    UINT16_TO_STREAM(p, HCI_VSC_WRITE_BD_ADDR);
-    *p++ = BD_ADDR_LEN; /* parameter length */
-    *p++ = vnd_local_bd_addr[5];
-    *p++ = vnd_local_bd_addr[4];
-    *p++ = vnd_local_bd_addr[3];
-    *p++ = vnd_local_bd_addr[2];
-    *p++ = vnd_local_bd_addr[1];
-    *p = vnd_local_bd_addr[0];
-
-    p_buf->len = HCI_CMD_PREAMBLE_SIZE + BD_ADDR_LEN;
-    hw_cfg_cb.state = HW_CFG_SET_BD_ADDR;
-
-    retval = bt_vendor_cbacks->xmit_cb(HCI_VSC_WRITE_BD_ADDR, p_buf, \
-                                 hw_config_cback);
-
-    return (retval);
-}
-
-/*******************************************************************************
-**
-** Function         hw_config_cback
-**
-** Description      Callback function for controller configuration
-**
-** Returns          None
-**
-*******************************************************************************/
-void hw_config_cback(void *p_mem)
-{
-    HC_BT_HDR *p_evt_buf = (HC_BT_HDR *) p_mem;
-    char        *p_name, *p_tmp;
-    uint8_t     *p, status;
-    uint16_t    opcode;
-    HC_BT_HDR  *p_buf=NULL;
-    uint8_t     is_proceeding = FALSE;
-    int         i;
-
-    status = *((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_STATUS_RET_BYTE);
-    p = (uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OPCODE;
-    STREAM_TO_UINT16(opcode,p);
-
-    /* Ask a new buffer big enough to hold any HCI commands sent in here */
-    if ((status == 0) && bt_vendor_cbacks)
-        p_buf = (HC_BT_HDR *) bt_vendor_cbacks->alloc(BT_HC_HDR_SIZE + \
-                                                       HCI_CMD_MAX_LEN);
-
-    if (p_buf != NULL)
-    {
-        p_buf->event = MSG_STACK_TO_HC_HCI_CMD;
-        p_buf->offset = 0;
-        p_buf->len = 0;
-        p_buf->layer_specific = 0;
-
-        p = (uint8_t *) (p_buf + 1);
-
-        switch (hw_cfg_cb.state)
-        {
-            case HW_CFG_SET_UART_BAUD_1:
-                /* update baud rate of host's UART port */
-                ALOGI("bt vendor lib: set UART baud %i", UART_TARGET_BAUD_RATE);
-                userial_vendor_set_baud( \
-                    line_speed_to_userial_baud(UART_TARGET_BAUD_RATE) \
-                );
-
-                /* read local name */
-                UINT16_TO_STREAM(p, HCI_READ_LOCAL_NAME);
-                *p = 0; /* parameter length */
-
-                p_buf->len = HCI_CMD_PREAMBLE_SIZE;
-                hw_cfg_cb.state = HW_CFG_READ_LOCAL_NAME;
-
-                is_proceeding = bt_vendor_cbacks->xmit_cb(HCI_READ_LOCAL_NAME, \
-                                                    p_buf, hw_config_cback);
-                break;
-
-            case HW_CFG_READ_LOCAL_NAME:
-                p_tmp = p_name = (char *) (p_evt_buf + 1) + \
-                         HCI_EVT_CMD_CMPL_LOCAL_NAME_STRING;
-
-                for (i=0; (i < LOCAL_NAME_BUFFER_LEN)||(*(p_name+i) != 0); i++)
-                    *(p_name+i) = toupper(*(p_name+i));
-
-                if ((p_name = strstr(p_name, "BCM")) != NULL)
-                {
-                    strncpy(hw_cfg_cb.local_chip_name, p_name, \
-                            LOCAL_NAME_BUFFER_LEN-1);
-                }
-                else
-                {
-                    strncpy(hw_cfg_cb.local_chip_name, "UNKNOWN", \
-                            LOCAL_NAME_BUFFER_LEN-1);
-                    p_name = p_tmp;
-                }
-
-                hw_cfg_cb.local_chip_name[LOCAL_NAME_BUFFER_LEN-1] = 0;
-
-                BTHWDBG("Chipset %s", hw_cfg_cb.local_chip_name);
-
-                if ((status = hw_config_findpatch(p_name)) == TRUE)
-                {
-                    if ((hw_cfg_cb.fw_fd = open(p_name, O_RDONLY)) == -1)
-                    {
-                        ALOGE("vendor lib preload failed to open [%s]", p_name);
-                    }
-                    else
-                    {
-                        /* vsc_download_minidriver */
-                        UINT16_TO_STREAM(p, HCI_VSC_DOWNLOAD_MINIDRV);
-                        *p = 0; /* parameter length */
-
-                        p_buf->len = HCI_CMD_PREAMBLE_SIZE;
-                        hw_cfg_cb.state = HW_CFG_DL_MINIDRIVER;
-
-                        is_proceeding = bt_vendor_cbacks->xmit_cb( \
-                                            HCI_VSC_DOWNLOAD_MINIDRV, p_buf, \
-                                            hw_config_cback);
-                    }
-                }
-                else
-                {
-                    ALOGE( \
-                    "vendor lib preload failed to locate firmware patch file" \
-                    );
-                }
-
-                if (is_proceeding == FALSE)
-                {
-                    is_proceeding = hw_config_set_bdaddr(p_buf);
-                }
-                break;
-
-            case HW_CFG_DL_MINIDRIVER:
-                /* give time for placing firmware in download mode */
-                ms_delay(50);
-                hw_cfg_cb.state = HW_CFG_DL_FW_PATCH;
-                /* fall through intentionally */
-            case HW_CFG_DL_FW_PATCH:
-                p_buf->len = read(hw_cfg_cb.fw_fd, p, HCI_CMD_PREAMBLE_SIZE);
-                if (p_buf->len > 0)
-                {
-                    if ((p_buf->len < HCI_CMD_PREAMBLE_SIZE) || \
-                        (opcode == HCI_VSC_LAUNCH_RAM))
-                    {
-                        ALOGW("firmware patch file might be altered!");
-                    }
-                    else
-                    {
-                        p_buf->len += read(hw_cfg_cb.fw_fd, \
-                                           p+HCI_CMD_PREAMBLE_SIZE,\
-                                           *(p+HCD_REC_PAYLOAD_LEN_BYTE));
-                        STREAM_TO_UINT16(opcode,p);
-                        is_proceeding = bt_vendor_cbacks->xmit_cb(opcode, \
-                                                p_buf, hw_config_cback);
-                        break;
-                    }
-                }
-
-                close(hw_cfg_cb.fw_fd);
-                hw_cfg_cb.fw_fd = -1;
-
-                /* Normally the firmware patch configuration file
-                 * sets the new starting baud rate at 115200.
-                 * So, we need update host's baud rate accordingly.
-                 */
-                ALOGI("bt vendor lib: set UART baud 115200");
-                userial_vendor_set_baud(USERIAL_BAUD_115200);
-
-                /* Next, we would like to boost baud rate up again
-                 * to desired working speed.
-                 */
-                hw_cfg_cb.f_set_baud_2 = TRUE;
-
-                /* Check if we need to pause a few hundred milliseconds
-                 * before sending down any HCI command.
-                 */
-                ms_delay(look_up_fw_settlement_delay());
-
-                /* fall through intentionally */
-            case HW_CFG_START:
-                if (UART_TARGET_BAUD_RATE > 3000000)
-                {
-                    /* set UART clock to 48MHz */
-                    UINT16_TO_STREAM(p, HCI_VSC_WRITE_UART_CLOCK_SETTING);
-                    *p++ = 1; /* parameter length */
-                    *p = 1; /* (1,"UART CLOCK 48 MHz")(2,"UART CLOCK 24 MHz") */
-
-                    p_buf->len = HCI_CMD_PREAMBLE_SIZE + 1;
-                    hw_cfg_cb.state = HW_CFG_SET_UART_CLOCK;
-
-                    is_proceeding = bt_vendor_cbacks->xmit_cb( \
-                                        HCI_VSC_WRITE_UART_CLOCK_SETTING, \
-                                        p_buf, hw_config_cback);
-                    break;
-                }
-                /* fall through intentionally */
-            case HW_CFG_SET_UART_CLOCK:
-                /* set controller's UART baud rate to 3M */
-                UINT16_TO_STREAM(p, HCI_VSC_UPDATE_BAUDRATE);
-                *p++ = UPDATE_BAUDRATE_CMD_PARAM_SIZE; /* parameter length */
-                *p++ = 0; /* encoded baud rate */
-                *p++ = 0; /* use encoded form */
-                UINT32_TO_STREAM(p, UART_TARGET_BAUD_RATE);
-
-                p_buf->len = HCI_CMD_PREAMBLE_SIZE + \
-                             UPDATE_BAUDRATE_CMD_PARAM_SIZE;
-                hw_cfg_cb.state = (hw_cfg_cb.f_set_baud_2) ? \
-                            HW_CFG_SET_UART_BAUD_2 : HW_CFG_SET_UART_BAUD_1;
-
-                is_proceeding = bt_vendor_cbacks->xmit_cb(HCI_VSC_UPDATE_BAUDRATE, \
-                                                    p_buf, hw_config_cback);
-                break;
-
-            case HW_CFG_SET_UART_BAUD_2:
-                /* update baud rate of host's UART port */
-                ALOGI("bt vendor lib: set UART baud %i", UART_TARGET_BAUD_RATE);
-                userial_vendor_set_baud( \
-                    line_speed_to_userial_baud(UART_TARGET_BAUD_RATE) \
-                );
-
-                if ((is_proceeding = hw_config_set_bdaddr(p_buf)) == TRUE)
-                    break;
-
-                /* fall through intentionally */
-            case HW_CFG_SET_BD_ADDR:
-                ALOGI("vendor lib fwcfg completed");
-                bt_vendor_cbacks->dealloc(p_buf);
-                bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_SUCCESS);
-
-                hw_cfg_cb.state = 0;
-
-                if (hw_cfg_cb.fw_fd != -1)
-                {
-                    close(hw_cfg_cb.fw_fd);
-                    hw_cfg_cb.fw_fd = -1;
-                }
-
-                is_proceeding = TRUE;
-                break;
-        } // switch(hw_cfg_cb.state)
-    } // if (p_buf != NULL)
-
-    /* Free the RX event buffer */
-    if (bt_vendor_cbacks)
-        bt_vendor_cbacks->dealloc(p_evt_buf);
-
-    if (is_proceeding == FALSE)
-    {
-        ALOGE("vendor lib fwcfg aborted!!!");
-        if (bt_vendor_cbacks)
-        {
-            if (p_buf != NULL)
-                bt_vendor_cbacks->dealloc(p_buf);
-
-            bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_FAIL);
-        }
-
-        if (hw_cfg_cb.fw_fd != -1)
-        {
-            close(hw_cfg_cb.fw_fd);
-            hw_cfg_cb.fw_fd = -1;
-        }
-
-        hw_cfg_cb.state = 0;
-    }
-}
-
-/******************************************************************************
-**   LPM Static Functions
-******************************************************************************/
-
-/*******************************************************************************
-**
-** Function         hw_lpm_ctrl_cback
-**
-** Description      Callback function for lpm enable/disable rquest
-**
-** Returns          None
-**
-*******************************************************************************/
-void hw_lpm_ctrl_cback(void *p_mem)
-{
-    HC_BT_HDR *p_evt_buf = (HC_BT_HDR *) p_mem;
-    bt_vendor_op_result_t status = BT_VND_OP_RESULT_FAIL;
-
-    if (*((uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_STATUS_RET_BYTE) == 0)
-    {
-        status = BT_VND_OP_RESULT_SUCCESS;
-    }
-
-    if (bt_vendor_cbacks)
-    {
-        bt_vendor_cbacks->lpm_cb(status);
-        bt_vendor_cbacks->dealloc(p_evt_buf);
-    }
-}
-
-
-#if (SCO_CFG_INCLUDED == TRUE)
-/*****************************************************************************
-**   SCO Configuration Static Functions
-*****************************************************************************/
-
-/*******************************************************************************
-**
-** Function         hw_sco_cfg_cback
-**
-** Description      Callback function for SCO configuration rquest
-**
-** Returns          None
-**
-*******************************************************************************/
-void hw_sco_cfg_cback(void *p_mem)
-{
-    HC_BT_HDR *p_evt_buf = (HC_BT_HDR *) p_mem;
-    uint8_t     *p;
-    uint16_t    opcode;
-    HC_BT_HDR  *p_buf=NULL;
-
-    p = (uint8_t *)(p_evt_buf + 1) + HCI_EVT_CMD_CMPL_OPCODE;
-    STREAM_TO_UINT16(opcode,p);
-
-    /* Free the RX event buffer */
-    if (bt_vendor_cbacks)
-        bt_vendor_cbacks->dealloc(p_evt_buf);
-
-#if (!defined(SCO_USE_I2S_INTERFACE) || (SCO_USE_I2S_INTERFACE == FALSE))
-    if (opcode == HCI_VSC_WRITE_SCO_PCM_INT_PARAM)
-    {
-        uint8_t ret = FALSE;
-
-        /* Ask a new buffer to hold WRITE_PCM_DATA_FORMAT_PARAM command */
-        if (bt_vendor_cbacks)
-            p_buf = (HC_BT_HDR *) bt_vendor_cbacks->alloc(BT_HC_HDR_SIZE + \
-                                                HCI_CMD_PREAMBLE_SIZE + \
-                                                PCM_DATA_FORMAT_PARAM_SIZE);
-        if (p_buf)
-        {
-            p_buf->event = MSG_STACK_TO_HC_HCI_CMD;
-            p_buf->offset = 0;
-            p_buf->layer_specific = 0;
-            p_buf->len = HCI_CMD_PREAMBLE_SIZE + PCM_DATA_FORMAT_PARAM_SIZE;
-
-            p = (uint8_t *) (p_buf + 1);
-            UINT16_TO_STREAM(p, HCI_VSC_WRITE_PCM_DATA_FORMAT_PARAM);
-            *p++ = PCM_DATA_FORMAT_PARAM_SIZE;
-            memcpy(p, &bt_pcm_data_fmt_param, PCM_DATA_FORMAT_PARAM_SIZE);
-
-            if ((ret = bt_vendor_cbacks->xmit_cb(HCI_VSC_WRITE_PCM_DATA_FORMAT_PARAM,\
-                                           p_buf, hw_sco_cfg_cback)) == FALSE)
-            {
-                bt_vendor_cbacks->dealloc(p_buf);
-            }
-            else
-                return;
-        }
-    }
-#endif  // !SCO_USE_I2S_INTERFACE
-
-if (bt_vendor_cbacks)
-    bt_vendor_cbacks->scocfg_cb(BT_VND_OP_RESULT_SUCCESS);
-}
-#endif // SCO_CFG_INCLUDED
-
-/*****************************************************************************
-**   Hardware Configuration Interface Functions
-*****************************************************************************/
-
-
-/*******************************************************************************
-**
-** Function        hw_config_start
-**
-** Description     Kick off controller initialization process
-**
-** Returns         None
-**
-*******************************************************************************/
-void hw_config_start(void)
-{
-    HC_BT_HDR  *p_buf = NULL;
-    uint8_t     *p;
-
-    hw_cfg_cb.state = 0;
-    hw_cfg_cb.fw_fd = -1;
-    hw_cfg_cb.f_set_baud_2 = FALSE;
-
-    /* Start from sending HCI_RESET */
-
-    if (bt_vendor_cbacks)
-    {
-        p_buf = (HC_BT_HDR *) bt_vendor_cbacks->alloc(BT_HC_HDR_SIZE + \
-                                                       HCI_CMD_PREAMBLE_SIZE);
-    }
-
-    if (p_buf)
-    {
-        p_buf->event = MSG_STACK_TO_HC_HCI_CMD;
-        p_buf->offset = 0;
-        p_buf->layer_specific = 0;
-        p_buf->len = HCI_CMD_PREAMBLE_SIZE;
-
-        p = (uint8_t *) (p_buf + 1);
-        UINT16_TO_STREAM(p, HCI_RESET);
-        *p = 0; /* parameter length */
-
-        hw_cfg_cb.state = HW_CFG_START;
-
-        bt_vendor_cbacks->xmit_cb(HCI_RESET, p_buf, hw_config_cback);
-    }
-    else
-    {
-        if (bt_vendor_cbacks)
-        {
-            ALOGE("vendor lib fw conf aborted [no buffer]");
-            bt_vendor_cbacks->fwcfg_cb(BT_VND_OP_RESULT_FAIL);
-        }
-    }
-}
-
-/*******************************************************************************
-**
-** Function        hw_lpm_enable
-**
-** Description     Enalbe/Disable LPM
-**
-** Returns         TRUE/FALSE
-**
-*******************************************************************************/
-uint8_t hw_lpm_enable(uint8_t turn_on)
-{
-    HC_BT_HDR  *p_buf = NULL;
-    uint8_t     *p;
-    uint8_t     ret = FALSE;
-
-    if (bt_vendor_cbacks)
-        p_buf = (HC_BT_HDR *) bt_vendor_cbacks->alloc(BT_HC_HDR_SIZE + \
-                                                       HCI_CMD_PREAMBLE_SIZE + \
-                                                       LPM_CMD_PARAM_SIZE);
-
-    if (p_buf)
-    {
-        p_buf->event = MSG_STACK_TO_HC_HCI_CMD;
-        p_buf->offset = 0;
-        p_buf->layer_specific = 0;
-        p_buf->len = HCI_CMD_PREAMBLE_SIZE + LPM_CMD_PARAM_SIZE;
-
-        p = (uint8_t *) (p_buf + 1);
-        UINT16_TO_STREAM(p, HCI_VSC_WRITE_SLEEP_MODE);
-        *p++ = LPM_CMD_PARAM_SIZE; /* parameter length */
-
-        if (turn_on)
-        {
-            memcpy(p, &lpm_param, LPM_CMD_PARAM_SIZE);
-        }
-        else
-        {
-            memset(p, 0, LPM_CMD_PARAM_SIZE);
-        }
-
-        if ((ret = bt_vendor_cbacks->xmit_cb(HCI_VSC_WRITE_SLEEP_MODE, p_buf, \
-                                        hw_lpm_ctrl_cback)) == FALSE)
-        {
-            bt_vendor_cbacks->dealloc(p_buf);
-        }
-    }
-
-    if ((ret == FALSE) && bt_vendor_cbacks)
-        bt_vendor_cbacks->lpm_cb(BT_VND_OP_RESULT_FAIL);
-
-    return ret;
-}
-
-/*******************************************************************************
-**
-** Function        hw_lpm_get_idle_timeout
-**
-** Description     Calculate idle time based on host stack idle threshold
-**
-** Returns         idle timeout value
-**
-*******************************************************************************/
-uint32_t hw_lpm_get_idle_timeout(void)
-{
-    uint32_t timeout_ms;
-
-    /* set idle time to be LPM_IDLE_TIMEOUT_MULTIPLE times of
-     * host stack idle threshold (in 300ms/25ms)
-     */
-    timeout_ms = (uint32_t)lpm_param.host_stack_idle_threshold \
-                            * LPM_IDLE_TIMEOUT_MULTIPLE;
-
-    if (strstr(hw_cfg_cb.local_chip_name, "BCM4325") != NULL)
-        timeout_ms *= 25; // 12.5 or 25 ?
-    else
-        timeout_ms *= 300;
-
-    return timeout_ms;
-}
-
-/*******************************************************************************
-**
-** Function        hw_lpm_set_wake_state
-**
-** Description     Assert/Deassert BT_WAKE
-**
-** Returns         None
-**
-*******************************************************************************/
-void hw_lpm_set_wake_state(uint8_t wake_assert)
-{
-    uint8_t state = (wake_assert) ? UPIO_ASSERT : UPIO_DEASSERT;
-
-    upio_set(UPIO_BT_WAKE, state, lpm_param.bt_wake_polarity);
-}
-
-#if (SCO_CFG_INCLUDED == TRUE)
-/*******************************************************************************
-**
-** Function         hw_sco_config
-**
-** Description      Configure SCO related hardware settings
-**
-** Returns          None
-**
-*******************************************************************************/
-void hw_sco_config(void)
-{
-    HC_BT_HDR  *p_buf = NULL;
-    uint8_t     *p, ret;
-
-#if (!defined(SCO_USE_I2S_INTERFACE) || (SCO_USE_I2S_INTERFACE == FALSE))
-    uint16_t cmd_u16 = HCI_CMD_PREAMBLE_SIZE + SCO_PCM_PARAM_SIZE;
-#else
-    uint16_t cmd_u16 = HCI_CMD_PREAMBLE_SIZE + SCO_I2SPCM_PARAM_SIZE;
-#endif
-
-    if (bt_vendor_cbacks)
-        p_buf = (HC_BT_HDR *) bt_vendor_cbacks->alloc(BT_HC_HDR_SIZE+cmd_u16);
-
-    if (p_buf)
-    {
-        p_buf->event = MSG_STACK_TO_HC_HCI_CMD;
-        p_buf->offset = 0;
-        p_buf->layer_specific = 0;
-        p_buf->len = cmd_u16;
-
-        p = (uint8_t *) (p_buf + 1);
-#if (!defined(SCO_USE_I2S_INTERFACE) || (SCO_USE_I2S_INTERFACE == FALSE))
-        UINT16_TO_STREAM(p, HCI_VSC_WRITE_SCO_PCM_INT_PARAM);
-        *p++ = SCO_PCM_PARAM_SIZE;
-        memcpy(p, &bt_sco_param, SCO_PCM_PARAM_SIZE);
-        cmd_u16 = HCI_VSC_WRITE_SCO_PCM_INT_PARAM;
-        ALOGI("SCO PCM configure {%d, %d, %d, %d, %d}",
-           bt_sco_param[0], bt_sco_param[1], bt_sco_param[2], bt_sco_param[3], \
-           bt_sco_param[4]);
-
-#else
-        UINT16_TO_STREAM(p, HCI_VSC_WRITE_I2SPCM_INTERFACE_PARAM);
-        *p++ = SCO_I2SPCM_PARAM_SIZE;
-        memcpy(p, &bt_sco_param, SCO_I2SPCM_PARAM_SIZE);
-        cmd_u16 = HCI_VSC_WRITE_I2SPCM_INTERFACE_PARAM;
-        ALOGI("SCO over I2SPCM interface {%d, %d, %d, %d}",
-           bt_sco_param[0], bt_sco_param[1], bt_sco_param[2], bt_sco_param[3]);
-#endif
-
-        if ((ret=bt_vendor_cbacks->xmit_cb(cmd_u16, p_buf, hw_sco_cfg_cback)) \
-             == FALSE)
-        {
-            bt_vendor_cbacks->dealloc(p_buf);
-        }
-        else
-            return;
-    }
-
-    if (bt_vendor_cbacks)
-    {
-        ALOGE("vendor lib scocfg aborted");
-        bt_vendor_cbacks->scocfg_cb(BT_VND_OP_RESULT_FAIL);
-    }
-}
-#endif  // SCO_CFG_INCLUDED
-
-/*******************************************************************************
-**
-** Function        hw_set_patch_file_path
-**
-** Description     Set the location of firmware patch file
-**
-** Returns         0 : Success
-**                 Otherwise : Fail
-**
-*******************************************************************************/
-int hw_set_patch_file_path(char *p_conf_name, char *p_conf_value, int param)
-{
-
-    strcpy(fw_patchfile_path, p_conf_value);
-
-    return 0;
-}
-
-/*******************************************************************************
-**
-** Function        hw_set_patch_file_name
-**
-** Description     Give the specific firmware patch filename
-**
-** Returns         0 : Success
-**                 Otherwise : Fail
-**
-*******************************************************************************/
-int hw_set_patch_file_name(char *p_conf_name, char *p_conf_value, int param)
-{
-
-    strcpy(fw_patchfile_name, p_conf_value);
-
-    return 0;
-}
-
-#if (VENDOR_LIB_RUNTIME_TUNING_ENABLED == TRUE)
-/*******************************************************************************
-**
-** Function        hw_set_patch_settlement_delay
-**
-** Description     Give the specific firmware patch settlement time in milliseconds
-**
-** Returns         0 : Success
-**                 Otherwise : Fail
-**
-*******************************************************************************/
-int hw_set_patch_settlement_delay(char *p_conf_name, char *p_conf_value, int param)
-{
-    fw_patch_settlement_delay = atoi(p_conf_value);
-
-    return 0;
-}
-#endif  //VENDOR_LIB_RUNTIME_TUNING_ENABLED
-
diff --git a/libbt/src/upio.c b/libbt/src/upio.c
deleted file mode 100644
index d32f334..0000000
--- a/libbt/src/upio.c
+++ /dev/null
@@ -1,298 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2009-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Filename:      upio.c
- *
- *  Description:   Contains I/O functions, like
- *                      rfkill control
- *                      BT_WAKE/HOST_WAKE control
- *
- ******************************************************************************/
-
-#define LOG_TAG "bt_upio"
-
-#include <utils/Log.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <cutils/properties.h>
-#include "bt_vendor_brcm.h"
-#include "upio.h"
-#include "userial_vendor.h"
-
-/******************************************************************************
-**  Constants & Macros
-******************************************************************************/
-
-#ifndef UPIO_DBG
-#define UPIO_DBG FALSE
-#endif
-
-#if (UPIO_DBG == TRUE)
-#define UPIODBG(param, ...) {ALOGD(param, ## __VA_ARGS__);}
-#else
-#define UPIODBG(param, ...) {}
-#endif
-
-/******************************************************************************
-**  Local type definitions
-******************************************************************************/
-
-/******************************************************************************
-**  Static variables
-******************************************************************************/
-
-static uint8_t upio_state[UPIO_MAX_COUNT];
-static int rfkill_id = -1;
-static int bt_emul_enable = 0;
-static char *rfkill_state_path = NULL;
-
-/******************************************************************************
-**  Static functions
-******************************************************************************/
-
-/* for friendly debugging outpout string */
-static char *lpm_state[] = {
-    "UNKNOWN",
-    "de-asserted",
-    "asserted"
-};
-
-/*****************************************************************************
-**   Bluetooth On/Off Static Functions
-*****************************************************************************/
-static int is_emulator_context(void)
-{
-    char value[PROPERTY_VALUE_MAX];
-
-    property_get("ro.kernel.qemu", value, "0");
-    UPIODBG("is_emulator_context : %s", value);
-    if (strcmp(value, "1") == 0) {
-        return 1;
-    }
-    return 0;
-}
-
-static int is_rfkill_disabled(void)
-{
-    char value[PROPERTY_VALUE_MAX];
-
-    property_get("ro.rfkilldisabled", value, "0");
-    UPIODBG("is_rfkill_disabled ? [%s]", value);
-
-    if (strcmp(value, "1") == 0) {
-        return UPIO_BT_POWER_ON;
-    }
-
-    return UPIO_BT_POWER_OFF;
-}
-
-static int init_rfkill()
-{
-    char path[64];
-    char buf[16];
-    int fd, sz, id;
-
-    if (is_rfkill_disabled())
-        return -1;
-
-    for (id = 0; ; id++)
-    {
-        snprintf(path, sizeof(path), "/sys/class/rfkill/rfkill%d/type", id);
-        fd = open(path, O_RDONLY);
-        if (fd < 0)
-        {
-            ALOGE("init_rfkill : open(%s) failed: %s (%d)\n", \
-                 path, strerror(errno), errno);
-            return -1;
-        }
-
-        sz = read(fd, &buf, sizeof(buf));
-        close(fd);
-
-        if (sz >= 9 && memcmp(buf, "bluetooth", 9) == 0)
-        {
-            rfkill_id = id;
-            break;
-        }
-    }
-
-    asprintf(&rfkill_state_path, "/sys/class/rfkill/rfkill%d/state", rfkill_id);
-    return 0;
-}
-
-/*****************************************************************************
-**   LPM Static Functions
-*****************************************************************************/
-
-/*****************************************************************************
-**   UPIO Interface Functions
-*****************************************************************************/
-
-/*******************************************************************************
-**
-** Function        upio_init
-**
-** Description     Initialization
-**
-** Returns         None
-**
-*******************************************************************************/
-void upio_init(void)
-{
-    memset(upio_state, UPIO_UNKNOWN, UPIO_MAX_COUNT);
-}
-
-/*******************************************************************************
-**
-** Function        upio_cleanup
-**
-** Description     Clean up
-**
-** Returns         None
-**
-*******************************************************************************/
-void upio_cleanup(void)
-{
-}
-
-/*******************************************************************************
-**
-** Function        upio_set_bluetooth_power
-**
-** Description     Interact with low layer driver to set Bluetooth power
-**                 on/off.
-**
-** Returns         0  : SUCCESS or Not-Applicable
-**                 <0 : ERROR
-**
-*******************************************************************************/
-int upio_set_bluetooth_power(int on)
-{
-    int sz;
-    int fd = -1;
-    int ret = -1;
-    char buffer = '0';
-
-    switch(on)
-    {
-        case UPIO_BT_POWER_OFF:
-            buffer = '0';
-            break;
-
-        case UPIO_BT_POWER_ON:
-            buffer = '1';
-            break;
-    }
-
-    if (is_emulator_context())
-    {
-        /* if new value is same as current, return -1 */
-        if (bt_emul_enable == on)
-            return ret;
-
-        UPIODBG("set_bluetooth_power [emul] %d", on);
-
-        bt_emul_enable = on;
-        return 0;
-    }
-
-    /* check if we have rfkill interface */
-    if (is_rfkill_disabled())
-        return 0;
-
-    if (rfkill_id == -1)
-    {
-        if (init_rfkill())
-            return ret;
-    }
-
-    fd = open(rfkill_state_path, O_WRONLY);
-
-    if (fd < 0)
-    {
-        ALOGE("set_bluetooth_power : open(%s) for write failed: %s (%d)",
-            rfkill_state_path, strerror(errno), errno);
-        return ret;
-    }
-
-    sz = write(fd, &buffer, 1);
-
-    if (sz < 0) {
-        ALOGE("set_bluetooth_power : write(%s) failed: %s (%d)",
-            rfkill_state_path, strerror(errno),errno);
-    }
-    else
-        ret = 0;
-
-    if (fd >= 0)
-        close(fd);
-
-    return ret;
-}
-
-
-/*******************************************************************************
-**
-** Function        upio_set
-**
-** Description     Set i/o based on polarity
-**
-** Returns         None
-**
-*******************************************************************************/
-void upio_set(uint8_t pio, uint8_t action, uint8_t polarity)
-{
-    int rc;
-
-    switch (pio)
-    {
-        case UPIO_BT_WAKE:
-
-            if (upio_state[UPIO_BT_WAKE] == action)
-            {
-                UPIODBG("BT_WAKE is %s already", lpm_state[action]);
-                return;
-            }
-
-            upio_state[UPIO_BT_WAKE] = action;
-
-            /****************************************
-             * !!! TODO !!!
-             *
-             * === Custom Porting Required ===
-             *
-             * Platform dependent user-to-kernel
-             * interface is required to set output
-             * state of physical BT_WAKE pin.
-             ****************************************/
-#if (BT_WAKE_VIA_USERIAL_IOCTL == TRUE)
-            userial_vendor_ioctl( ( (action==UPIO_ASSERT) ? \
-                      USERIAL_OP_ASSERT_BT_WAKE : USERIAL_OP_DEASSERT_BT_WAKE),\
-                      NULL);
-#endif
-            break;
-
-        case UPIO_HOST_WAKE:
-            UPIODBG("upio_set: UPIO_HOST_WAKE");
-            break;
-    }
-}
-
-
diff --git a/libbt/src/userial_vendor.c b/libbt/src/userial_vendor.c
deleted file mode 100755
index 1a745b5..0000000
--- a/libbt/src/userial_vendor.c
+++ /dev/null
@@ -1,361 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2009-2012 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- *  Filename:      userial_vendor.c
- *
- *  Description:   Contains vendor-specific userial functions
- *
- ******************************************************************************/
-
-#define LOG_TAG "bt_userial_vendor"
-
-#include <utils/Log.h>
-#include <termios.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <stdio.h>
-#include "bt_vendor_brcm.h"
-#include "userial.h"
-#include "userial_vendor.h"
-
-/******************************************************************************
-**  Constants & Macros
-******************************************************************************/
-
-#ifndef VNDUSERIAL_DBG
-#define VNDUSERIAL_DBG FALSE
-#endif
-
-#if (VNDUSERIAL_DBG == TRUE)
-#define VNDUSERIALDBG(param, ...) {ALOGD(param, ## __VA_ARGS__);}
-#else
-#define VNDUSERIALDBG(param, ...) {}
-#endif
-
-#define VND_PORT_NAME_MAXLEN    256
-
-/******************************************************************************
-**  Local type definitions
-******************************************************************************/
-
-/* vendor serial control block */
-typedef struct
-{
-    int fd;                     /* fd to Bluetooth device */
-    struct termios termios;     /* serial terminal of BT port */
-    char port_name[VND_PORT_NAME_MAXLEN];
-} vnd_userial_cb_t;
-
-/******************************************************************************
-**  Static variables
-******************************************************************************/
-
-static vnd_userial_cb_t vnd_userial;
-
-/*****************************************************************************
-**   Helper Functions
-*****************************************************************************/
-
-/*******************************************************************************
-**
-** Function        userial_to_tcio_baud
-**
-** Description     helper function converts USERIAL baud rates into TCIO
-**                  conforming baud rates
-**
-** Returns         TRUE/FALSE
-**
-*******************************************************************************/
-uint8_t userial_to_tcio_baud(uint8_t cfg_baud, uint32_t *baud)
-{
-    if (cfg_baud == USERIAL_BAUD_115200)
-        *baud = B115200;
-    else if (cfg_baud == USERIAL_BAUD_4M)
-        *baud = B4000000;
-    else if (cfg_baud == USERIAL_BAUD_3M)
-        *baud = B3000000;
-    else if (cfg_baud == USERIAL_BAUD_2M)
-        *baud = B2000000;
-    else if (cfg_baud == USERIAL_BAUD_1M)
-        *baud = B1000000;
-    else if (cfg_baud == USERIAL_BAUD_921600)
-        *baud = B921600;
-    else if (cfg_baud == USERIAL_BAUD_460800)
-        *baud = B460800;
-    else if (cfg_baud == USERIAL_BAUD_230400)
-        *baud = B230400;
-    else if (cfg_baud == USERIAL_BAUD_57600)
-        *baud = B57600;
-    else if (cfg_baud == USERIAL_BAUD_19200)
-        *baud = B19200;
-    else if (cfg_baud == USERIAL_BAUD_9600)
-        *baud = B9600;
-    else if (cfg_baud == USERIAL_BAUD_1200)
-        *baud = B1200;
-    else if (cfg_baud == USERIAL_BAUD_600)
-        *baud = B600;
-    else
-    {
-        ALOGE( "userial vendor open: unsupported baud idx %i", cfg_baud);
-        *baud = B115200;
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
-/*******************************************************************************
-**
-** Function        userial_ioctl_init_bt_wake
-**
-** Description     helper function to set the open state of the bt_wake if ioctl
-**                  is used. it should not hurt in the rfkill case but it might
-**                  be better to compile it out.
-**
-** Returns         none
-**
-*******************************************************************************/
-void userial_ioctl_init_bt_wake(int fd)
-{
-    uint32_t bt_wake_state;
-
-    /* assert BT_WAKE through ioctl */
-    ioctl(fd, USERIAL_IOCTL_BT_WAKE_ASSERT, NULL);
-    ioctl(fd, USERIAL_IOCTL_BT_WAKE_GET_ST, &bt_wake_state);
-    VNDUSERIALDBG("userial_ioctl_init_bt_wake read back BT_WAKE state=%i", \
-               bt_wake_state);
-}
-#endif // (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
-
-
-/*****************************************************************************
-**   Userial Vendor API Functions
-*****************************************************************************/
-
-/*******************************************************************************
-**
-** Function        userial_vendor_init
-**
-** Description     Initialize userial vendor-specific control block
-**
-** Returns         None
-**
-*******************************************************************************/
-void userial_vendor_init(void)
-{
-    vnd_userial.fd = -1;
-    snprintf(vnd_userial.port_name, VND_PORT_NAME_MAXLEN, "%s", \
-            BLUETOOTH_UART_DEVICE_PORT);
-}
-
-/*******************************************************************************
-**
-** Function        userial_vendor_open
-**
-** Description     Open the serial port with the given configuration
-**
-** Returns         device fd
-**
-*******************************************************************************/
-int userial_vendor_open(tUSERIAL_CFG *p_cfg)
-{
-    uint32_t baud;
-    uint8_t data_bits;
-    uint16_t parity;
-    uint8_t stop_bits;
-
-    vnd_userial.fd = -1;
-
-    if (!userial_to_tcio_baud(p_cfg->baud, &baud))
-    {
-        return -1;
-    }
-
-    if(p_cfg->fmt & USERIAL_DATABITS_8)
-        data_bits = CS8;
-    else if(p_cfg->fmt & USERIAL_DATABITS_7)
-        data_bits = CS7;
-    else if(p_cfg->fmt & USERIAL_DATABITS_6)
-        data_bits = CS6;
-    else if(p_cfg->fmt & USERIAL_DATABITS_5)
-        data_bits = CS5;
-    else
-    {
-        ALOGE("userial vendor open: unsupported data bits");
-        return -1;
-    }
-
-    if(p_cfg->fmt & USERIAL_PARITY_NONE)
-        parity = 0;
-    else if(p_cfg->fmt & USERIAL_PARITY_EVEN)
-        parity = PARENB;
-    else if(p_cfg->fmt & USERIAL_PARITY_ODD)
-        parity = (PARENB | PARODD);
-    else
-    {
-        ALOGE("userial vendor open: unsupported parity bit mode");
-        return -1;
-    }
-
-    if(p_cfg->fmt & USERIAL_STOPBITS_1)
-        stop_bits = 0;
-    else if(p_cfg->fmt & USERIAL_STOPBITS_2)
-        stop_bits = CSTOPB;
-    else
-    {
-        ALOGE("userial vendor open: unsupported stop bits");
-        return -1;
-    }
-
-    ALOGI("userial vendor open: opening %s", vnd_userial.port_name);
-
-    if ((vnd_userial.fd = open(vnd_userial.port_name, O_RDWR)) == -1)
-    {
-        ALOGE("userial vendor open: unable to open %s", vnd_userial.port_name);
-        return -1;
-    }
-
-    tcflush(vnd_userial.fd, TCIOFLUSH);
-
-    tcgetattr(vnd_userial.fd, &vnd_userial.termios);
-    cfmakeraw(&vnd_userial.termios);
-    vnd_userial.termios.c_cflag |= (CRTSCTS | stop_bits);
-    tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios);
-    tcflush(vnd_userial.fd, TCIOFLUSH);
-
-    tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios);
-    tcflush(vnd_userial.fd, TCIOFLUSH);
-    tcflush(vnd_userial.fd, TCIOFLUSH);
-
-    /* set input/output baudrate */
-    cfsetospeed(&vnd_userial.termios, baud);
-    cfsetispeed(&vnd_userial.termios, baud);
-    tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios);
-
-#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
-    userial_ioctl_init_bt_wake(vnd_userial.fd);
-#endif
-
-    ALOGI("device fd = %d open", vnd_userial.fd);
-
-    return vnd_userial.fd;
-}
-
-/*******************************************************************************
-**
-** Function        userial_vendor_close
-**
-** Description     Conduct vendor-specific close work
-**
-** Returns         None
-**
-*******************************************************************************/
-void userial_vendor_close(void)
-{
-    int result;
-
-    if (vnd_userial.fd == -1)
-        return;
-
-#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
-    /* de-assert bt_wake BEFORE closing port */
-    ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_DEASSERT, NULL);
-#endif
-
-    ALOGI("device fd = %d close", vnd_userial.fd);
-
-    if ((result = close(vnd_userial.fd)) < 0)
-        ALOGE( "close(fd:%d) FAILED result:%d", vnd_userial.fd, result);
-
-    vnd_userial.fd = -1;
-}
-
-/*******************************************************************************
-**
-** Function        userial_vendor_set_baud
-**
-** Description     Set new baud rate
-**
-** Returns         None
-**
-*******************************************************************************/
-void userial_vendor_set_baud(uint8_t userial_baud)
-{
-    uint32_t tcio_baud;
-
-    userial_to_tcio_baud(userial_baud, &tcio_baud);
-
-    cfsetospeed(&vnd_userial.termios, tcio_baud);
-    cfsetispeed(&vnd_userial.termios, tcio_baud);
-    tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios);
-}
-
-/*******************************************************************************
-**
-** Function        userial_vendor_ioctl
-**
-** Description     ioctl inteface
-**
-** Returns         None
-**
-*******************************************************************************/
-void userial_vendor_ioctl(userial_vendor_ioctl_op_t op, void *p_data)
-{
-    switch(op)
-    {
-#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
-        case USERIAL_OP_ASSERT_BT_WAKE:
-            VNDUSERIALDBG("## userial_vendor_ioctl: Asserting BT_Wake ##");
-            ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_ASSERT, NULL);
-            break;
-
-        case USERIAL_OP_DEASSERT_BT_WAKE:
-            VNDUSERIALDBG("## userial_vendor_ioctl: De-asserting BT_Wake ##");
-            ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_DEASSERT, NULL);
-            break;
-
-        case USERIAL_OP_GET_BT_WAKE_STATE:
-            ioctl(vnd_userial.fd, USERIAL_IOCTL_BT_WAKE_GET_ST, p_data);
-            break;
-#endif  //  (BT_WAKE_VIA_USERIAL_IOCTL==TRUE)
-
-        default:
-            break;
-    }
-}
-
-/*******************************************************************************
-**
-** Function        userial_set_port
-**
-** Description     Configure UART port name
-**
-** Returns         0 : Success
-**                 Otherwise : Fail
-**
-*******************************************************************************/
-int userial_set_port(char *p_conf_name, char *p_conf_value, int param)
-{
-    strcpy(vnd_userial.port_name, p_conf_value);
-
-    return 0;
-}
-
diff --git a/libbt/vnd_buildcfg.mk b/libbt/vnd_buildcfg.mk
deleted file mode 100644
index b65033a..0000000
--- a/libbt/vnd_buildcfg.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-intermediates := $(local-intermediates-dir)
-
-SRC := $(call my-dir)/include/$(addprefix vnd_, $(addsuffix .txt,$(basename $(TARGET_DEVICE))))
-ifeq (,$(wildcard $(SRC)))
-# configuration file does not exist. Use default one
-SRC := $(call my-dir)/include/vnd_generic.txt
-endif
-GEN := $(intermediates)/vnd_buildcfg.h
-TOOL := $(TOP_DIR)external/bluetooth/bluedroid/tools/gen-buildcfg.sh
-
-$(GEN): PRIVATE_PATH := $(call my-dir)
-$(GEN): PRIVATE_CUSTOM_TOOL = $(TOOL) $< $@
-$(GEN): $(SRC)  $(TOOL)
-	$(transform-generated-source)
-
-LOCAL_GENERATED_SOURCES += $(GEN)
