diff --git a/fm_hci/fm_hci.c b/fm_hci/fm_hci.c
deleted file mode 100644
index ff932b9..0000000
--- a/fm_hci/fm_hci.c
+++ /dev/null
@@ -1,808 +0,0 @@
-/*
- * Copyright (c) 2015, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *        * Redistributions of source code must retain the above copyright
- *            notice, this list of conditions and the following disclaimer.
- *        * Redistributions in binary form must reproduce the above
- *            copyright notice, this list of conditions and the following
- *            disclaimer in the documentation and/or other materials provided
- *            with the distribution.
- *        * Neither the name of The Linux Foundation nor the names of its
- *            contributors may be used to endorse or promote products derived
- *            from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#define LOG_TAG "fm_hci_helium"
-
-#include <assert.h>
-#include <utils/Log.h>
-
-#include "bt_hci_bdroid.h"
-#include "bt_vendor_lib.h"
-#include "userial.h"
-#include "fm_hci.h"
-#include "wcnss_hci.h"
-#include <stdlib.h>
-#include <dlfcn.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <cutils/sockets.h>
-#include <pthread.h>
-#include <sys/select.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/un.h>
-#include <cutils/properties.h>
-#include <signal.h>
-
-static int fm_hal_fd =0;
-
-#define FM_VND_SERVICE_START "wc_transport.start_fmhci"
-#define WAIT_TIMEOUT 200000 /* 200*1000us */
-
-static void fm_hci_exit(void *arg);
-static int power(struct fm_hci_t *hci, fm_power_state_t state);
-
-static void event_notification(struct fm_hci_t *hci, uint16_t event)
-{
-    pthread_mutex_lock(&hci->event_lock);
-    ALOGI("%s: Notifying worker thread with event: %d", __func__, event);
-    ready_events |= event;
-    pthread_cond_broadcast(&hci->event_cond);
-    pthread_mutex_unlock(&hci->event_lock);
-}
-
-static void rx_thread_exit_handler(int sig)
-{
-    ALOGD("%s: sig = 0x%x", __func__, sig);
-    if (sig == SIGUSR1) {
-    ALOGE("Got the signal.. exiting");
-    pthread_exit(NULL);
-    }
-}
-
-static int vendor_init(struct fm_hci_t *hci)
-{
-    void *dlhandle = hci->dlhandle = NULL;
-    unsigned char bdaddr[] = {0xaa, 0xbb, 0xcc, 0x11, 0x22, 0x33};
-
-    dlhandle = dlopen("libbt-vendor.so", RTLD_NOW);
-    if (!dlhandle) {
-        ALOGE("!!! Failed to load libbt-vendor.so !!!");
-        goto err;
-    }
-
-    hci->vendor = (bt_vendor_interface_t *) dlsym(dlhandle, "BLUETOOTH_VENDOR_LIB_INTERFACE");
-    if (!hci->vendor) {
-        ALOGE("!!! Failed to get bt vendor interface !!!");
-        goto err;
-    }
-
-    ALOGI("FM-HCI: Registering the WCNSS HAL library by passing CBs and BD addr.");
-    if (hci->vendor->init(&fm_vendor_callbacks, bdaddr) !=
-                FM_HC_STATUS_SUCCESS) {
-        ALOGE("FM vendor interface init failed");
-        goto err;
-    }
-
-    return FM_HC_STATUS_SUCCESS;
-
-err:
-    return FM_HC_STATUS_FAIL;
-}
-
-static void vendor_close(struct fm_hci_t *hci)
-{
-    void *dlhandle = hci->dlhandle;
-
-    if (hci->vendor)
-        hci->vendor->cleanup();
-    if (dlhandle) {
-        dlclose(dlhandle);
-        dlhandle = NULL;
-    }
-    hci->vendor = NULL;
-}
-
-/* De-queues the FM CMD from the struct transmit_queue_t */
-static void dequeue_fm_tx_cmd(struct fm_hci_t *hci)
-{
-    struct transmit_queue_t *temp;
-    uint16_t count = 0, len = 0;
-
-    ALOGD("%s", __func__);
-    while (1) {
-        pthread_mutex_lock(&hci->tx_q_lock);
-        temp = hci->first;
-        if (!temp) {
-            ALOGI("No FM CMD available in the Queue\n");
-            pthread_mutex_unlock(&hci->tx_q_lock);
-            return;
-        } else {
-            hci->first = temp->next;
-        }
-        pthread_mutex_unlock(&hci->tx_q_lock);
-
-        pthread_mutex_lock(&hci->credit_lock);
-wait_for_cmd_credits:
-        while (hci->command_credits == 0) {
-              pthread_cond_wait(&hci->cmd_credits_cond, &hci->credit_lock);
-        }
-
-        /* Check if we really got the command credits */
-        if (hci->command_credits) {
-
-            len = sizeof(struct fm_command_header_t) + temp->hdr->len;
-again:
-            /* Use socket 'fd' to send the command down to WCNSS Filter */
-            count = write(hci->fd, (uint8_t *)temp->hdr + count, len);
-
-            if (count < len) {
-                len -= count;
-                goto again;
-            }
-            count = 0;
-
-            /* Decrement cmd credits by '1' after sending the cmd*/
-            hci->command_credits--;
-            if (temp->hdr)
-                free(temp->hdr);
-            free(temp);
-        } else {
-            if (!lib_running) {
-                pthread_mutex_unlock(&hci->credit_lock);
-                break;
-            }
-            goto wait_for_cmd_credits;
-        }
-        pthread_mutex_unlock(&hci->credit_lock);
-    }
-}
-
-static int read_fm_event(struct fm_hci_t *hci, struct fm_event_header_t *pbuf, int len)
-{
-    fd_set readFds;
-    sigset_t sigmask, emptymask;
-    int n = 0, ret = -1, evt_len = -1,status=0;
-    volatile int fd = hci->fd;
-    struct sigaction action;
-
-    sigemptyset(&sigmask);
-    sigaddset(&sigmask, SIGUSR1);
-    if (sigprocmask(SIG_BLOCK, &sigmask, NULL) == -1) {
-    ALOGE("failed to sigprocmask");
-    }
-    memset(&action, 0, sizeof(struct sigaction));
-    sigemptyset(&action.sa_mask);
-    action.sa_flags = 0;
-    action.sa_handler = rx_thread_exit_handler;
-
-    sigemptyset(&emptymask);
-
-    if (sigaction(SIGUSR1, &action, NULL) < 0) {
-    ALOGE("%s:sigaction failed", __func__);
-    }
-
-    while (lib_running)
-    {
-        FD_ZERO(&readFds);
-        FD_SET(fd, &readFds);
-
-        ALOGV("%s: Waiting for events from WCNSS FILTER...\n", __func__);
-
-        /* Wait for event/data from WCNSS Filter */
-        n = pselect(fd+1, &readFds, NULL, NULL, NULL, &emptymask);
-        if (n > 0)
-        {
-            /* Check if event is available or not */
-            if (FD_ISSET(fd, &readFds)) {
-                ret = read(fd, (uint8_t *)pbuf, (size_t)(sizeof(struct fm_event_header_t) + MAX_FM_EVT_PARAMS));
-                if (0 == ret) {
-                    ALOGV("%s: read() returned '0' bytes\n", __func__);
-                    break;
-                }
-                else {
-                    ALOGV("%s: read() returned %d bytes of FM event/data\n", __func__, ret);
-                    while (ret > 0) {
-                        pthread_mutex_lock(&hci->credit_lock);
-                        if (pbuf->evt_code == FM_CMD_COMPLETE) {
-                            hci->command_credits = pbuf->params[0];
-                            pthread_cond_signal(&hci->cmd_credits_cond);
-                        } else if (pbuf->evt_code == FM_CMD_STATUS) {
-                            hci->command_credits = pbuf->params[1];
-                            pthread_cond_signal(&hci->cmd_credits_cond);
-                        } else if (pbuf->evt_code == FM_HW_ERR_EVENT) {
-                              ALOGI("%s: FM H/w Err Event Recvd. Event Code: 0x%2x", __func__, pbuf->evt_code);
-                         /*  remove until support added */
-                              //hci->vendor->ssr_cleanup(0x22);
-                              status  = power(hci, FM_RADIO_DISABLE);
-                              if (status < 0) {
-                                 ALOGE("power off fm radio failed during SSR ");
-                              }
-                        } else {
-                            ALOGE("%s: Not CS/CC Event: Recvd. Event Code: 0x%2x", __func__, pbuf->evt_code);
-                        }
-                        pthread_mutex_unlock(&hci->credit_lock);
-
-                        evt_len = pbuf->evt_len;
-
-                        /* Notify 'hci_tx_thread' about availability of event or data */
-                        ALOGI("%s: \nNotifying 'hci_tx_thread' availability of FM event or data...\n", __func__);
-                        event_notification(hci, HC_EVENT_RX);
-
-                        if (hci->cb && hci->cb->process_event)
-                            hci->cb->process_event((uint8_t *)pbuf);
-                        else
-                            ALOGE("%s: ASSERT $$$$$$ Callback function NULL $$$$$", __func__);
-
-                        ret = ret - (evt_len + 3);
-                        ALOGD("%s: Length of available bytes @ HCI Layer: %d", __func__, ret);
-                        if (ret > 0) {
-                            ALOGE("%s: Remaining bytes of event/data: %d", __func__, ret);
-                            pbuf = (struct fm_event_header_t *)&pbuf->params[evt_len];
-                        }
-                    }
-                } //end of processing the event
-
-            } else
-                ALOGV("%s: No data available, though select returned!!!\n", __func__);
-        }
-        else if (n < 0) {
-           ALOGE("%s: select() failed with return value: %d", __func__, ret);
-           lib_running =0;
-        }
-        else if (n == 0)
-            ALOGE("%s: select() timeout!!!", __func__);
-    }
-
-    return ret;
-}
-
-static void *hci_read_thread(void *arg)
-{
-    int length = 0;
-    struct fm_hci_t *hci = (struct fm_hci_t *)arg;
-
-    struct fm_event_header_t *evt_buf = (struct fm_event_header_t *) malloc(sizeof(struct fm_event_header_t) + MAX_FM_EVT_PARAMS);
-
-    if (!evt_buf) {
-        ALOGE("%s: Memory allocation failed for evt_buf", __func__);
-        goto cleanup;
-    }
-
-    length = read_fm_event(hci, evt_buf, sizeof(struct fm_event_header_t) + MAX_FM_EVT_PARAMS);
-    ALOGD("length=%d\n",length);
-    if(length <=0) {
-       lib_running =0;
-    }
-    goto exit;
-
-cleanup:
-    lib_running = 0;
-    hci = NULL;
-
-exit:
-    ALOGV("%s: Leaving hci_read_thread()", __func__);
-    if (evt_buf)
-        free(evt_buf);
-    pthread_exit(NULL);
-    return arg;
-}
-
-int connect_to_local_fmsocket(char* name) {
-       socklen_t len; int sk = -1;
-
-       ALOGE("%s: ACCEPT ", __func__);
-       sk  = socket(AF_LOCAL, SOCK_STREAM, 0);
-       if (sk < 0) {
-           ALOGE("Socket creation failure");
-           return -1;
-       }
-
-        if(socket_local_client_connect(sk, name,
-            ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM) < 0)
-        {
-             ALOGE("failed to connect (%s)", strerror(errno));
-             close(sk);
-             sk = -1;
-        } else {
-             ALOGE("%s: Connection succeeded\n", __func__);
-        }
-        return sk;
-}
-
-/*
- * Reads the FM-CMDs from the struct transmit_queue_t and sends it down to WCNSS Filter
- * Reads events sent by the WCNSS Filter and copies onto RX_Q
- */
-static void* hci_tx_thread(void *arg)
-{
-    uint16_t events;
-    struct fm_hci_t *hci = (struct fm_hci_t *)arg;
-
-    while (lib_running) {
-        pthread_mutex_lock(&hci->event_lock);
-        if (!(ready_events & HC_EVENT_TX))
-            pthread_cond_wait(&hci->event_cond, &hci->event_lock);
-        ALOGE("%s: ready_events= %d", __func__, ready_events);
-        events = ready_events;
-        if (ready_events & HC_EVENT_TX)
-            ready_events &= (~HC_EVENT_TX);
-        if (ready_events & HC_EVENT_RX)
-            ready_events &= (~HC_EVENT_RX);
-        pthread_mutex_unlock(&hci->event_lock);
-
-        if (events & HC_EVENT_TX) {
-            dequeue_fm_tx_cmd(hci);
-        }
-        if (events & HC_EVENT_RX) {
-             ALOGI("\n##### FM-HCI Task : EVENT_RX available #####\n");
-        }
-        if (events & HC_EVENT_EXIT) {
-            ALOGE("GOT HC_EVENT_EXIT.. exiting");
-            break;
-        }
-    }
-
-    ALOGV("%s: ##### Exiting hci_tx_thread Worker thread!!! #####", __func__);
-    return NULL;
-}
-
-void stop_fmhal_service() {
-       char value[PROPERTY_VALUE_MAX] = {'\0'};
-       ALOGI("%s: Entry ", __func__);
-       property_get(FM_VND_SERVICE_START, value, "false");
-       if (strcmp(value, "false") == 0) {
-           ALOGI("%s: fmhal service  has been stopped already", __func__);
-//         return;
-       }
-       close(fm_hal_fd);
-       fm_hal_fd = -1;
-       property_set(FM_VND_SERVICE_START, "false");
-       property_set("wc_transport.fm_service_status", "0");
-       ALOGI("%s: Exit ", __func__);
-}
-
-void start_fmhal_service() {
-       ALOGI("%s: Entry ", __func__);
-       int i, init_success = 0;
-       char value[PROPERTY_VALUE_MAX] = {'\0'};
-
-       property_get(FM_VND_SERVICE_START, value, false);
-
-       if (strcmp(value, "true") == 0) {
-           ALOGI("%s: hci_filter has been started already", __func__);
-           return;
-       }
-  //     property_set("wc_transport.fm_service_status", "0");
-       usleep(100 * 1000);	// 100 msecs
-       property_set(FM_VND_SERVICE_START, "true");
-       ALOGI("%s: %s set to true ", __func__, FM_VND_SERVICE_START );
-       for(i=0; i<45; i++) {
-          property_get("wc_transport.fm_service_status", value, "0");
-          if (strcmp(value, "1") == 0) {
-               ALOGI("%s: wc_transport.fm_service_status set to %s", __func__,value);
-               init_success = 1;
-               break;
-           } else {
-               usleep(WAIT_TIMEOUT);
-           }
-        }
-        ALOGI("start_fmhal_service status:%d after %f seconds \n", init_success, 0.2*i);
-
-        ALOGI("%s: Exit ", __func__);
-}
-
-static int start_tx_thread(struct fm_hci_t *hci)
-{
-    struct sched_param param;
-    int policy, result;
-
-    ALOGI("FM-HCI: Creating the FM-HCI TASK...");
-    if (pthread_create(&hci->tx_thread, NULL, hci_tx_thread, hci) != 0)
-    {
-        ALOGE("pthread_create failed!");
-        lib_running = 0;
-        return FM_HC_STATUS_FAIL;
-    }
-
-    if(pthread_getschedparam(hci->tx_thread, &policy, &param)==0)
-    {
-        policy = SCHED_NORMAL;
-#if (BTHC_LINUX_BASE_POLICY!=SCHED_NORMAL)
-        param.sched_priority = BTHC_MAIN_THREAD_PRIORITY;
-#endif
-        result = pthread_setschedparam(hci->tx_thread, policy, &param);
-        if (result != 0)
-        {
-            ALOGW("libbt-hci init: pthread_setschedparam failed (%d)", \
-                  result);
-        }
-    } else
-        ALOGI("FM-HCI: Failed to get the Scheduling parameters!!!");
-
-    return FM_HC_STATUS_SUCCESS;
-}
-
-static void stop_tx_thread(struct fm_hci_t *hci)
-{
-    int ret;
-
-    ALOGV("%s++", __func__);
-    if ((ret = pthread_kill(hci->tx_thread, SIGUSR1))
-            == FM_HC_STATUS_SUCCESS) {
-        ALOGE("%s:pthread_join", __func__);
-         if ((ret = pthread_join(hci->tx_thread, NULL)) != FM_HC_STATUS_SUCCESS)
-             ALOGE("Error joining tx thread, error = %d (%s)",
-                     ret, strerror(ret));
-    } else {
-        ALOGE("Error killing tx thread, error = %d (%s)",
-                ret, strerror(ret));
-    }
-}
-
-static void *hci_mon_thread(void *arg)
-{
-    struct fm_hci_t *hci = (struct fm_hci_t *)arg;
-    uint16_t events;
-    ALOGV("%s", __func__);
-
-    while (lib_running) {
-        pthread_mutex_lock(&hci->event_lock);
-        if (!(ready_events & HC_EVENT_EXIT))
-            pthread_cond_wait(&hci->event_cond, &hci->event_lock);
-        events = ready_events;
-        if (ready_events & HC_EVENT_EXIT)
-            ready_events &= (~HC_EVENT_EXIT);
-        pthread_mutex_unlock(&hci->event_lock);
-
-        ALOGD("events = 0x%x", events);
-        if (events & HC_EVENT_EXIT) {
-            ALOGD("Got Exit event.. Exiting HCI");
-            fm_hci_exit(hci);
-            break;
-        }
-    }
-    ALOGV("%s--", __func__);
-    return NULL;
-}
-
-static int start_mon_thread(struct fm_hci_t *hci)
-{
-    int ret = FM_HC_STATUS_SUCCESS;
-    ALOGD("%s", __func__);
-    if ((ret = pthread_create(&hci->mon_thread, NULL,
-                    hci_mon_thread, hci)) !=0) {
-        ALOGE("pthread_create failed! status = %d (%s)",
-                ret, strerror(ret));
-        lib_running = 0;
-    }
-    return ret;
-}
-
-static void stop_mon_thread(struct fm_hci_t *hci)
-{
-    int ret;
-    ALOGV("%s++", __func__);
-    if ((ret = pthread_kill(hci->mon_thread, SIGUSR1))
-            == FM_HC_STATUS_SUCCESS) {
-        ALOGE("%s:pthread_join", __func__);
-        if ((ret = pthread_join(hci->mon_thread, NULL)) != FM_HC_STATUS_SUCCESS)
-            ALOGE("Error joining mon thread, error = %d (%s)",
-                    ret, strerror(ret));
-    } else {
-        ALOGE("Error killing mon thread, error = %d (%s)",
-                ret, strerror(ret));
-    }
-}
-
-static int start_rx_thread(struct fm_hci_t *hci)
-{
-    int ret = FM_HC_STATUS_SUCCESS;
-    ALOGV("%s++", __func__);
-
-    ALOGD("%s: Starting the userial read thread....", __func__);
-    if ((ret = pthread_create(&hci->rx_thread, NULL, \
-                       hci_read_thread, hci)) != 0) {
-        ALOGE("pthread_create failed! status = %d (%s)",
-                ret, strerror(ret));
-        lib_running = 0;
-    }
-    return ret;
-}
-
-static void stop_rx_thread(struct fm_hci_t *hci)
-{
-    int ret;
-    ALOGV("%s++", __func__);
-    if ((ret = pthread_kill(hci->rx_thread, SIGUSR1))
-            == FM_HC_STATUS_SUCCESS) {
-        ALOGE("%s:pthread_join", __func__);
-        if ((ret = pthread_join(hci->rx_thread, NULL)) != FM_HC_STATUS_SUCCESS)
-            ALOGE("Error joining rx thread, error = %d (%s)",
-                    ret, strerror(ret));
-    } else {
-        ALOGE("Error killing rx thread, error = %d (%s)",
-                ret, strerror(ret));
-    }
-}
-
-static int power(struct fm_hci_t *hci, fm_power_state_t state)
-{
-        int i,opcode,ret;
-        int init_success = 0;
-        char value[PROPERTY_VALUE_MAX] = {'\0'};
-        if (fm_hal_fd)
-        {
-            if (state)
-                opcode = 2;
-            else {
-                opcode = 1;
-            }
-            ALOGI("%s:opcode: %x", LOG_TAG, opcode);
-            ret = write(fm_hal_fd,&opcode, 1);
-            if (ret < 0) {
-                ALOGE("failed to write fm hal socket");
-            } else {
-                ret = FM_HC_STATUS_SUCCESS;
-            }
-        } else {
-            ALOGE("Connect to socket failed ..");
-            ret = -1;
-        }
-        if (state == FM_RADIO_DISABLE) {
-            for (i=0; i<10; i++) {
-                property_get("wc_transport.fm_power_status", value, "0");
-                if (strcmp(value, "0") == 0) {
-                    init_success = 1;
-                    break;
-                } else {
-                    usleep(WAIT_TIMEOUT);
-                }
-            }
-            ALOGI("fm power OFF status:%d after %f seconds \n", init_success, 0.2*i);
-            stop_fmhal_service();
-        }
-        if (state == FM_RADIO_ENABLE) {
-            for (i=0; i<10; i++) {
-                property_get("wc_transport.fm_power_status", value, "0");
-                if (strcmp(value, "1") == 0) {
-                    init_success = 1;
-                    break;
-                } else {
-                    usleep(WAIT_TIMEOUT);
-                }
-            }
-            ALOGI("fm power ON status:%d after %f seconds \n", init_success, 0.2*i);
-        }
-        return ret;
-}
-
-#define CH_MAX 3
-static int serial_port_init(struct fm_hci_t *hci)
-{
-    int i, ret;
-    int fd_array[CH_MAX];
-
-    for (int i = 0; i < CH_MAX; i++)
-        fd_array[i] = -1;
-
-    ALOGI("%s: Opening the TTy Serial port...", __func__);
-    ret = hci->vendor->op(BT_VND_OP_FM_USERIAL_OPEN, &fd_array);
-
-    if (fd_array[0] == -1) {
-        ALOGE("%s unable to open TTY serial port", __func__);
-        goto err;
-    }
-    hci->fd = fd_array[0];
-
-    return FM_HC_STATUS_SUCCESS;
-
-err:
-    return FM_HC_STATUS_FAIL;
-}
-
-static void serial_port_close(struct fm_hci_t *hci)
-{
-    //TODO: what if hci/fm_vnd_if is null.. need to take lock and check
-    ALOGI("%s: Closing the TTy Serial port!!!", __func__);
-    hci->vendor->op(BT_VND_OP_FM_USERIAL_CLOSE, NULL);
-    hci->fd = -1;
-}
-
-static int enqueue_fm_tx_cmd(struct fm_hci_t *hci, struct fm_command_header_t *pbuf)
-{
-    struct transmit_queue_t *element =  (struct transmit_queue_t *) malloc(sizeof(struct transmit_queue_t));
-
-    if (!element) {
-        ALOGI("Failed to allocate memory for element!!\n");
-        return FM_HC_STATUS_NOMEM;
-    }
-    element->hdr = pbuf;
-    element->next = NULL;
-
-    pthread_mutex_lock(&hci->tx_q_lock);
-
-    if (!hci->first) {
-        hci->last = hci->first = element;
-    } else {
-        hci->last->next = element;
-        hci->last = element;
-    }
-    ALOGI("%s: FM-CMD ENQUEUED SUCCESSFULLY", __func__);
-
-    pthread_mutex_unlock(&hci->tx_q_lock);
-
-    return FM_HC_STATUS_SUCCESS;
-}
-
-int fm_hci_transmit(void *hci, struct fm_command_header_t *buf)
-{
-    int status = FM_HC_STATUS_FAIL;
-
-    if (!hci || !buf) {
-        ALOGE("NULL input arguments");
-        return FM_HC_STATUS_NULL_POINTER;
-    }
-
-    if ((status = enqueue_fm_tx_cmd((struct fm_hci_t *)hci, buf))
-            == FM_HC_STATUS_SUCCESS)
-        event_notification(hci, HC_EVENT_TX);
-
-    return status;
-}
-
-void fm_hci_close(void *arg) {
-
-    ALOGV("%s  close fm userial ", __func__);
-
-    struct fm_hci_t *hci = (struct fm_hci_t *)arg;
-    if (!hci) {
-        ALOGE("NULL arguments");
-        return;
-    }
-    event_notification(hci, HC_EVENT_EXIT);
-    pthread_mutex_lock(&hci->event_lock);
-again:
-    pthread_cond_wait(&hci->event_cond, &hci->event_lock);
-    if (!(ready_events & HC_EVENT_EXIT_DONE))
-        goto again;
-    pthread_mutex_unlock(&hci->event_lock);
-}
-
-int fm_hci_init(fm_hci_hal_t *hci_hal)
-{
-    int ret = FM_HC_STATUS_FAIL;
-    struct fm_hci_t *hci = NULL;
-    ALOGV("++%s", __func__);
-
-    if (!hci_hal || !hci_hal->hal) {
-        ALOGE("NULL input argument");
-        return FM_HC_STATUS_NULL_POINTER;
-    }
-
-    hci = malloc(sizeof(struct fm_hci_t));
-    if (!hci) {
-        ALOGE("Failed to malloc hci context");
-        return FM_HC_STATUS_NOMEM;
-    }
-    memset(hci, 0, sizeof(struct fm_hci_t));
-
-    pthread_mutex_init(&hci->tx_q_lock, NULL);
-    pthread_mutex_init(&hci->credit_lock, NULL);
-    pthread_mutex_init(&hci->event_lock, NULL);
-
-    pthread_cond_init(&hci->event_cond, NULL);
-    pthread_cond_init(&hci->cmd_credits_cond, NULL);
-
-    start_fmhal_service();
-    fm_hal_fd = connect_to_local_fmsocket("fmhal_sock");
-    if (fm_hal_fd == -1) {
-        ALOGI("FM hal service socket connect failed..");
-        goto err_socket;
-    }
-    ALOGI("fm_hal_fd = %d", fm_hal_fd);
-
-    lib_running = 1;
-    ready_events = 0;
-    hci->command_credits = 1;
-    hci->fd = -1;
-
-    ret = vendor_init(hci);
-    if (ret)
-        goto err_vendor;
-    ret = power(hci, FM_RADIO_ENABLE);
-    if (ret)
-        goto err_power;
-    ret = serial_port_init(hci);
-    if (ret)
-        goto err_serial;
-    ret = start_mon_thread(hci);
-    if (ret)
-        goto err_thread_mon;
-    ret = start_tx_thread(hci);
-    if (ret)
-        goto err_thread_tx;
-    ret = start_rx_thread(hci);
-    if (ret)
-        goto err_thread_rx;
-
-    hci->cb = hci_hal->cb;
-    hci->private_data = hci_hal->hal;
-    hci_hal->hci = hci;
-    ALOGD("--%s success", __func__);
-    return FM_HC_STATUS_SUCCESS;
-
-err_thread_rx:
-    stop_rx_thread(hci);
-err_thread_tx:
-    stop_tx_thread(hci);
-err_thread_mon:
-    stop_mon_thread(hci);
-err_serial:
-    serial_port_close(hci);
-err_power:
-    power(hci, FM_RADIO_DISABLE);
-err_vendor:
-    vendor_close(hci);
-err_socket:
-    stop_fmhal_service();
-
-    pthread_mutex_destroy(&hci->tx_q_lock);
-    pthread_mutex_destroy(&hci->credit_lock);
-    pthread_mutex_destroy(&hci->event_lock);
-    pthread_cond_destroy(&hci->event_cond);
-    pthread_cond_destroy(&hci->cmd_credits_cond);
-
-    lib_running = 0;
-    ready_events = 0;
-    hci->command_credits = 0;
-    free(hci);
-
-    ALOGE("--%s fail", __func__);
-    return ret;
-}
-
-static void fm_hci_exit(void *arg)
-{
-    struct fm_hci_t *hci = (struct fm_hci_t *)arg;
-    ALOGE("%s", __func__);
-
-    lib_running = 0;
-    ready_events = HC_EVENT_EXIT;
-    hci->command_credits = 0;
-    serial_port_close(hci);
-    power(hci, FM_RADIO_DISABLE);//need to address this
-    vendor_close(hci);
-    pthread_cond_broadcast(&hci->event_cond);
-    pthread_cond_broadcast(&hci->cmd_credits_cond);
-    event_notification(hci, HC_EVENT_EXIT_DONE);
-    stop_rx_thread(hci);
-    stop_tx_thread(hci);
-    ALOGD("Tx, Rx Threads join done");
-    pthread_mutex_destroy(&hci->tx_q_lock);
-    pthread_mutex_destroy(&hci->credit_lock);
-    pthread_mutex_destroy(&hci->event_lock);
-    pthread_cond_destroy(&hci->event_cond);
-    pthread_cond_destroy(&hci->cmd_credits_cond);
-
-    free(hci);
-    hci = NULL;
-}
-
diff --git a/fm_hci/fm_hci.cpp b/fm_hci/fm_hci.cpp
index c4b421d..8bad980 100644
--- a/fm_hci/fm_hci.cpp
+++ b/fm_hci/fm_hci.cpp
@@ -60,6 +60,7 @@
 using ::android::hardware::Return;
 using ::android::hardware::Void;
 using ::android::hardware::hidl_vec;
+using ::android::hardware::hidl_death_recipient;
 
 static struct fm_hci_t hci;
 
@@ -80,6 +81,31 @@
 static bool hci_initialize();
 static void hci_transmit(struct fm_command_header_t *hdr);
 static void hci_close();
+#define HCI_EV_HW_ERR_EVENT             0x1A
+
+void hal_service_died() {
+    struct fm_event_header_t *temp = (struct fm_event_header_t *)
+                       malloc(sizeof(struct fm_event_header_t));
+    if (temp != nullptr) {
+        temp->evt_code = HCI_EV_HW_ERR_EVENT;
+        temp->evt_len = 0;
+        ALOGI("%s: evt_code:  0x%x", __func__, temp->evt_code);
+        enqueue_fm_rx_event(temp);
+    } else {
+        ALOGE("%s: Memory Allocation failed for event buffer ",__func__);
+    }
+}
+
+class FmHciDeathRecipient : public hidl_death_recipient {
+    public:
+       virtual void serviceDied(uint64_t /*cookie*/,
+           const android::wp<::android::hidl::base::V1_0::IBase>& /*who*/) {
+       ALOGE("Fm HAL service died!");
+       hal_service_died();
+   }
+};
+
+android::sp<FmHciDeathRecipient> fmHciDeathRecipient = new FmHciDeathRecipient();
 
 /*******************************************************************************
 **
@@ -456,6 +482,7 @@
     int ret;
     ALOGI("++%s: is_hci_initialize: %d", __func__, is_hci_initialize);
 
+    hci.on_mtx.lock();
     while (is_hci_initialize) {
         ret = start_tx_thread();
         if (ret)
@@ -478,6 +505,7 @@
     }
 
     hci.on_cond.notify_all();
+    hci.on_mtx.unlock();
     ALOGI("--%s: is_hci_initialize: %d", __func__, is_hci_initialize);
 
 }
@@ -542,8 +570,6 @@
 {
     ALOGI("%s", __func__);
 
-    fmHci = IFmHci::getService();
-
     if (fmHci != nullptr) {
         hci.state = FM_RADIO_ENABLING;
         android::sp<IFmHciCallbacks> callbacks = new FmHciCallbacks();
@@ -606,6 +632,10 @@
     ALOGI("%s", __func__);
 
     if (fmHci != nullptr) {
+        auto death_unlink = fmHci->unlinkToDeath(fmHciDeathRecipient);
+        if (!death_unlink.isOk()) {
+            ALOGE( "%s: Error unlinking death recipient from the Fm HAL", __func__);
+        }
         auto hidl_daemon_status = fmHci->close();
         if(!hidl_daemon_status.isOk()) {
             ALOGE("%s: HIDL daemon is dead", __func__);
@@ -643,6 +673,18 @@
         return FM_HC_STATUS_NULL_POINTER;
     }
 
+    fmHci = IFmHci::getService();
+    if(fmHci == nullptr) {
+        ALOGE("FM hal service is not running");
+        return FM_HC_STATUS_NULL_POINTER;
+    }
+
+    auto death_link = fmHci->linkToDeath(fmHciDeathRecipient, 0);
+    if (!death_link.isOk()) {
+        ALOGE("%s: Unable to set the death recipient for the Fm HAL", __func__);
+        abort();
+    }
+
     memset(&hci, 0, sizeof(struct fm_hci_t));
 
     hci.cb = hci_hal->cb;
@@ -654,19 +696,21 @@
 
     if (hci_initialize()) {
         //wait for iniialization complete
-        ALOGD("--%s waiting for iniialization complete hci state: %d ",
-                __func__, hci.state);
+        Lock lk(hci.on_mtx);
         if(hci.state == FM_RADIO_ENABLING){
-            Lock lk(hci.on_mtx);
+            ALOGD("--%s waiting for iniialization complete hci state: %d ",
+                    __func__, hci.state);
             std::cv_status status = std::cv_status::no_timeout;
             auto now = std::chrono::system_clock::now();
             status =
                hci.on_cond.wait_until(lk, now + std::chrono::seconds(HCI_TIMEOUT));
              if (status == std::cv_status::timeout) {
                  ALOGE("hci_initialize failed, kill the fm process");
+                 hci.on_mtx.unlock();
                  kill(getpid(), SIGKILL);
              }
         }
+        hci.on_mtx.unlock();
     }
 
     if (hci.state == FM_RADIO_ENABLED) {
diff --git a/fm_hci/fm_hci_api.h b/fm_hci/fm_hci_api.h
index 4c41509..1602fbb 100644
--- a/fm_hci/fm_hci_api.h
+++ b/fm_hci/fm_hci_api.h
@@ -64,7 +64,7 @@
 } fm_power_state_t;
 
 typedef int (*event_notification_cb_t)(unsigned char *buf);
-typedef int (*hci_close_done_cb_t)();
+typedef int (*hci_close_done_cb_t)(void);
 
 
 struct fm_hci_callbacks_t {
diff --git a/fm_hci/wcnss_hci.h b/fm_hci/wcnss_hci.h
deleted file mode 100644
index 95fa9c1..0000000
--- a/fm_hci/wcnss_hci.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2015, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *        * Redistributions of source code must retain the above copyright
- *            notice, this list of conditions and the following disclaimer.
- *        * Redistributions in binary form must reproduce the above
- *            copyright notice, this list of conditions and the following
- *            disclaimer in the documentation and/or other materials provided
- *            with the distribution.
- *        * Neither the name of The Linux Foundation nor the names of its
- *            contributors may be used to endorse or promote products derived
- *            from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __WCNSS_HCI__
-#define __WCNSS_HCI__
-static void vendor_fwcfg_cb(bt_vendor_op_result_t result) {
-}
-
-static void vendor_scocfg_cb(bt_vendor_op_result_t result) {
-}
-
-static void vendor_lpm_vnd_cb(bt_vendor_op_result_t result) {
-}
-
-static void sco_audiostate_cb(bt_vendor_op_result_t result) {
-}
-
-static void* vendor_alloc(int size) {
-    return NULL;
-}
-
-static void vendor_dealloc(void *p_buf) {
-}
-
-static uint8_t vendor_xmit_cb(uint16_t opcode, void *p_buf, tINT_CMD_CBACK p_cback) {
-    return 0;
-}
-
-static void vendor_epilog_cb(bt_vendor_op_result_t result) {
-}
-
-
-static const bt_vendor_callbacks_t fm_vendor_callbacks = {
-  sizeof(fm_vendor_callbacks),
-   vendor_fwcfg_cb,
-   vendor_scocfg_cb,
-   vendor_lpm_vnd_cb,
-   sco_audiostate_cb,
-   vendor_alloc,
-   vendor_dealloc,
-   vendor_xmit_cb,
-   vendor_epilog_cb
-};
-#endif
diff --git a/fmapp2/AndroidManifest.xml b/fmapp2/AndroidManifest.xml
index 8f373e8..b82b333 100644
--- a/fmapp2/AndroidManifest.xml
+++ b/fmapp2/AndroidManifest.xml
@@ -28,8 +28,8 @@
 -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.caf.fmradio"
-    android:sharedUserId="android.uid.system" >
+    package="com.caf.fmradio" >
+    <uses-sdk android:minSdkVersion="28"  android:targetSdkVersion="28"/>
     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
     <uses-permission android:name="android.permission.BLUETOOTH" />
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
@@ -39,12 +39,17 @@
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
     <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
-    <uses-sdk android:minSdkVersion="28"  android:targetSdkVersion="28"/>
+    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
+    <uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />
+    <uses-permission android:name="android.permission.CAPTURE_AUDIO_HOTWORD" />
     <application
         android:icon="@drawable/ic_launcher_fmradio"
         android:label="@string/app_name"
diff --git a/fmapp2/src/com/caf/fmradio/FMRadio.java b/fmapp2/src/com/caf/fmradio/FMRadio.java
index 4ee3494..4c9ac20 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadio.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadio.java
@@ -98,6 +98,8 @@
 import android.content.SharedPreferences;
 import android.graphics.Color;
 import android.graphics.Point;
+import android.Manifest;
+import android.content.pm.PackageManager;
 
 public class FMRadio extends Activity
 {
@@ -279,7 +281,39 @@
    private static String mBTsoc;
 
    private BroadcastReceiver mFmSettingReceiver = null;
+   private static String[] RECORD_PERMISSIONS = {
+            Manifest.permission.RECORD_AUDIO,
+            Manifest.permission.CAPTURE_AUDIO_OUTPUT,
+            Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE
+    };
+   private static final int ALL_PERMISSIONS = 101;
 
+    @Override
+public void onRequestPermissionsResult(int requestCode, String[] permissions,  int[] grantResults) {
+    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+    // for PERMISSION_CODE:
+    switch (requestCode){
+        case 101:
+            if(grantResults.length > 0){
+                if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
+                    Log.d(LOGTAG,"  RECORD_AUDIO permission granted");
+                }
+                else{ Log.d(LOGTAG,"  no RECORD_AUDIO permissions"); }
+                if(grantResults[1] == PackageManager.PERMISSION_GRANTED){
+                    Log.d(LOGTAG,"   CAPTURE_AUDIO_OUTPUT permission granted");
+                }
+                else{  Log.d(LOGTAG,"   no CAPTURE_AUDIO_OUTPUT permissions"); }
+                if(grantResults[2] == PackageManager.PERMISSION_GRANTED){
+                    Log.d(LOGTAG,"   WRITE_EXTERNAL_STORAGE permission granted");
+                }
+                else{ Log.d(LOGTAG,"   no WRITE_EXTERNAL_STORAGE permissions"); }
+                if(grantResults[3] == PackageManager.PERMISSION_GRANTED){
+                    Log.d(LOGTAG,"  READ_EXTERNAL_STORAGE permission granted");
+                }
+                else{Log.d(LOGTAG,"  no READ_EXTERNAL_STORAGE permissions"); }
+            }
+    }
+}
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
@@ -290,6 +324,8 @@
       mCommandActive = CMD_NONE;
       mCommandFailed = CMD_NONE;
 
+      Log.d(LOGTAG, "onCreate permssion req");
+      requestPermissions(RECORD_PERMISSIONS, ALL_PERMISSIONS);
       Point p = new Point();
       getWindowManager().getDefaultDisplay().getSize(p);
       mDisplayWidth = p.x;
@@ -1723,6 +1759,8 @@
    private void startRecording() {
       if(mService != null) {
          try {
+             Log.d(LOGTAG, "startRecording permssion req");
+             requestPermissions(RECORD_PERMISSIONS, ALL_PERMISSIONS);
              mRecording = mService.startRecording();
          }catch (RemoteException e) {
              e.printStackTrace();
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index 7dacbee..bcbc2ce 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -833,10 +833,8 @@
       if (isFmOn()) {
           setLowPowerMode(false);
           startFM();
-          if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true))) {
-              enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
-          }
-      }
+          enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
+        }
    }
 
    @Override
@@ -1159,13 +1157,6 @@
 
        stopRecording();
 
-       if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
-            Log.e(LOGTAG, "startRecording, no external storage available");
-            return false;
-       }
-
-        if (!updateAndShowStorageHint())
-            return false;
         long maxFileSize = mStorageSpace - LOW_STORAGE_THRESHOLD;
         if(FmSharedPreferences.getRecordDuration() !=
             FmSharedPreferences.RECORD_DUR_INDEX_3_VAL) {
@@ -1181,7 +1172,7 @@
 
         }
 
-        mStoragePath = Environment.getExternalStorageDirectory();
+        mStoragePath = getApplicationContext().getFilesDir();;
         Log.d(LOGTAG, "mStoragePath " + mStoragePath);
         if (null == mStoragePath) {
             Log.e(LOGTAG, "External Storage Directory is null");
@@ -1192,10 +1183,10 @@
         File sampleDir = null;
         if (!"".equals(getResources().getString(R.string.def_fmRecord_savePath))) {
             String fmRecordSavePath = getResources().getString(R.string.def_fmRecord_savePath);
-            sampleDir = new File(Environment.getExternalStorageDirectory().toString()
+            sampleDir = new File(getApplicationContext().getFilesDir().getPath().toString()
                     + fmRecordSavePath);
         } else {
-            sampleDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
+            sampleDir = new File(getApplicationContext().getFilesDir().getAbsolutePath()
                     + "/FMRecording");
         }
 
@@ -1273,7 +1264,6 @@
                      if (mFmRecordingOn) {
                          stopRecording();
                      }
-                     updateAndShowStorageHint();
                  }
              }
         });
@@ -1306,7 +1296,6 @@
        String state = Environment.getExternalStorageState(mStoragePath);
        Log.d(LOGTAG, "storage state is " + state);
 
-       if (Environment.MEDIA_MOUNTED.equals(state)) {
           try {
                this.addToMediaDB(mSampleFile);
                Toast.makeText(this,getString(R.string.save_record_file,
@@ -1315,10 +1304,6 @@
           } catch(Exception e) {
                e.printStackTrace();
           }
-       } else {
-           Log.e(LOGTAG, "SD card must have removed during recording. ");
-           Toast.makeText(this, "Recording aborted", Toast.LENGTH_SHORT).show();
-       }
        try {
            if((mServiceInUse) && (mCallbacks != null) ) {
                mCallbacks.onRecordingStopped();
@@ -1593,10 +1578,9 @@
                       //intentional fall through.
                   case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                       Log.v(LOGTAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT");
-                      if (mReceiver != null && mReceiver.isCherokeeChip() &&
-                                            (mPref.getBoolean("SLIMBUS_SEQ", true))) {
-                          enableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
-                      }
+
+                      enableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
+
                       if (true == mPlaybackInProgress) {
                           stopFM();
                       }
@@ -1618,10 +1602,8 @@
 
                       if(false == mPlaybackInProgress) {
                           startFM();
-                          if (mReceiver != null && mReceiver.isCherokeeChip() &&
-                                (mPref.getBoolean("SLIMBUS_SEQ", true))) {
-                              enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
-                          }
+                          enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
+
                       } else {
                           /* This case usually happens, when FM volume is lowered down and Playback
                            * In Progress on AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK recived. Need
@@ -1927,11 +1909,6 @@
       {
          return(mService.get().getProgramID());
       }
-      public int[] getSearchList()
-      {
-         return(mService.get().getSearchList());
-      }
-
       public boolean setLowPowerMode(boolean enable)
       {
          return(mService.get().setLowPowerMode(enable));
@@ -2176,86 +2153,6 @@
        return status;
    }
 
-   private boolean fmTurnOnSequence () {
-       boolean bStatus = false;
-       // This sets up the FM radio device
-       FmConfig config = FmSharedPreferences.getFMConfiguration();
-
-       Log.d(LOGTAG, "fmOn: RadioBand   :"+ config.getRadioBand());
-       Log.d(LOGTAG, "fmOn: Emphasis    :"+ config.getEmphasis());
-       Log.d(LOGTAG, "fmOn: ChSpacing   :"+ config.getChSpacing());
-       Log.d(LOGTAG, "fmOn: RdsStd      :"+ config.getRdsStd());
-       Log.d(LOGTAG, "fmOn: LowerLimit  :"+ config.getLowerLimit());
-       Log.d(LOGTAG, "fmOn: UpperLimit  :"+ config.getUpperLimit());
-
-       mEventReceived = false;
-       bStatus = mReceiver.enable(FmSharedPreferences.getFMConfiguration(), this);
-
-       if (mReceiver.isCherokeeChip()) {
-           bStatus = waitForEvent();
-       }
-
-       Log.d(LOGTAG, "mReceiver.enable done, Status :" +  bStatus);
-
-         if (bStatus == true)
-         {
-            /* Put the hardware into normal mode */
-            bStatus = setLowPowerMode(false);
-            Log.d(LOGTAG, "setLowPowerMode done, Status :" +  bStatus);
-
-
-            AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
-            if( (audioManager != null) &&(false == mPlaybackInProgress) )
-            {
-               Log.d(LOGTAG, "mAudioManager.setFmRadioOn = true \n" );
-               //audioManager.setParameters("FMRadioOn="+mAudioDevice);
-               int state =  getCallState();
-               if ( TelephonyManager.CALL_STATE_IDLE != getCallState() )
-               {
-                 fmActionOnCallState(state);
-               } else {
-                   startFM(); // enable FM Audio only when Call is IDLE
-               }
-               Log.d(LOGTAG, "mAudioManager.setFmRadioOn done \n" );
-            }
-            if (mReceiver != null) {
-                bStatus = mReceiver.registerRdsGroupProcessing(FmReceiver.FM_RX_RDS_GRP_RT_EBL|
-                                                           FmReceiver.FM_RX_RDS_GRP_PS_EBL|
-                                                           FmReceiver.FM_RX_RDS_GRP_AF_EBL|
-                                                           FmReceiver.FM_RX_RDS_GRP_PS_SIMPLE_EBL|
-                                                           FmReceiver.FM_RX_RDS_GRP_ECC_EBL|
-                                                           FmReceiver.FM_RX_RDS_GRP_PTYN_EBL|
-                                                           FmReceiver.FM_RX_RDS_GRP_RT_PLUS_EBL);
-                Log.d(LOGTAG, "registerRdsGroupProcessing done, Status :" +  bStatus);
-            }
-            bStatus = enableAutoAF(FmSharedPreferences.getAutoAFSwitch());
-            Log.d(LOGTAG, "enableAutoAF done, Status :" +  bStatus);
-
-            /* There is no internal Antenna*/
-            bStatus = mReceiver.setInternalAntenna(false);
-            Log.d(LOGTAG, "setInternalAntenna done, Status :" +  bStatus);
-
-            /* Read back to verify the internal Antenna mode*/
-            readInternalAntennaAvailable();
-
-            startNotification();
-            bStatus = true;
-         }
-         else
-         {
-            if ((mReceiver.getFMState() != mReceiver.subPwrLevel_FMRx_Starting) &&
-                            (mReceiver.getFMState() != mReceiver.FMState_Rx_Turned_On)) {
-                mReceiver = null; // as enable failed no need to disable
-                              // failure of enable can be because handle
-                              // already open which gets effected if
-                              // we disable
-                stop();
-            }
-         }
-
-         return bStatus;
-   }
-
    private boolean enableSlimbus(int flag) {
        Log.d(LOGTAG, "enableSlimbus");
        boolean bStatus = false;
@@ -2271,7 +2168,7 @@
    *                                                                                 .
    * @return true if fm Enable api was invoked successfully, false if the api failed.
    */
-   private boolean fmTurnOnSequenceCherokee () {
+   private boolean fmTurnOnSequence() {
        boolean bStatus = false;
        AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        if ((audioManager != null) & (false == mPlaybackInProgress)) {
@@ -2377,15 +2274,9 @@
          }
          else
          {
-           if (mReceiver.isCherokeeChip()) {
-               if (mPref.getBoolean("SLIMBUS_SEQ", true)) {
-                   enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
-               }
-               bStatus = fmTurnOnSequenceCherokee();
-           } else {
-               bStatus = fmTurnOnSequence();
-           }
-           /* reset SSR flag */
+             enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
+             bStatus = fmTurnOnSequence();
+                /* reset SSR flag */
            mIsSSRInProgressFromActivity = false;
          }
       }
@@ -2463,23 +2354,6 @@
    private boolean fmOffImpl() {
       boolean bStatus=false;
 
-      // This will disable the FM radio device
-      synchronized(mReceiverLock) {
-         if (mReceiver != null)
-         {
-            bStatus = mReceiver.disable(this);
-            mReceiver = null;
-         }
-      }
-      fmOperationsOff();
-      stop();
-
-      return(bStatus);
-   }
-
-   private boolean fmOffImplCherokee() {
-      boolean bStatus=false;
-
       fmOperationsOff();
       stop();
       try {
@@ -2509,11 +2383,7 @@
    private boolean fmOff() {
        boolean ret = false;
        if (mReceiver != null) {
-           if (mReceiver.isCherokeeChip()) {
-               ret = fmOffImplCherokee();
-           } else {
-              ret = fmOffImpl();
-           }
+           ret = fmOffImpl();
        }
        mWakeLock.release();
        return ret;
@@ -2597,9 +2467,7 @@
            return;
 
        mSpeakerPhoneOn = speakerOn;
-       if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true))) {
-           enableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
-       }
+       enableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
 
        if (speakerOn == false) {
            mAudioDevice = AudioDeviceInfo.TYPE_WIRED_HEADPHONES;
@@ -2613,9 +2481,7 @@
        String keyValPairs = new String("fm_routing="+mAudioDeviceType);
        Log.d(LOGTAG, "keyValPairs = "+keyValPairs);
        audioManager.setParameters(keyValPairs);
-       if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true))) {
-          enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
-       }
+       enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
    }
   /*
    *  ReConfigure the FM Setup parameters
@@ -3011,24 +2877,6 @@
       return pi;
    }
 
-
-   /* Retrieves the station list from the SearchStationlist.
-    *
-    * @return Array of integers that represents the station frequencies.
-    * Note: 1. This is a synchronous call that should typically called when
-    *           Callback onSearchListComplete.
-    */
-   public int[] getSearchList()
-   {
-      int[] frequencyList = null;
-      if (mReceiver != null)
-      {
-         Log.d(LOGTAG, "getSearchList: ");
-         frequencyList = mReceiver.getStationList();
-      }
-      return frequencyList;
-   }
-
    /* Set the FM Power Mode on the FM hardware SoC.
     * Typically used when UI/Activity is in the background, so the Host is interrupted less often.
     *
@@ -3222,11 +3070,9 @@
       {
          Log.d(LOGTAG, "FmRxEvEnableReceiver");
          if (mReceiver != null) {
-             if (mReceiver.isCherokeeChip()) {
-                 synchronized(mEventWaitLock) {
-                     mEventReceived = true;
-                     mEventWaitLock.notify();
-                 }
+             synchronized(mEventWaitLock) {
+                 mEventReceived = true;
+                 mEventWaitLock.notify();
              }
          }
       }
@@ -3235,11 +3081,9 @@
          Log.d(LOGTAG, "FmRxEvDisableReceiver");
          mFMOn = false;
          FmSharedPreferences.clearTags();
-         if (mReceiver != null && mReceiver.isCherokeeChip()) {
-             synchronized (mEventWaitLock) {
-                 mEventReceived = true;
-                 mEventWaitLock.notify();
-             }
+         synchronized (mEventWaitLock) {
+             mEventReceived = true;
+             mEventWaitLock.notify();
          }
       }
       public void FmRxEvRadioReset()
@@ -3475,11 +3319,9 @@
           if (mCallbacks != null) {
               try {
                   mCallbacks.getStationParamCb(val, status);
-                  if (mReceiver != null && mReceiver.isCherokeeChip()) {
-                      synchronized(mEventWaitLock) {
-                          mEventReceived = true;
-                          mEventWaitLock.notify();
-                      }
+                  synchronized(mEventWaitLock) {
+                      mEventReceived = true;
+                      mEventWaitLock.notify();
                   }
               } catch (RemoteException e) {
                   e.printStackTrace();
@@ -3684,21 +3526,18 @@
       public void FmRxEvEnableSlimbus(int status)
       {
          Log.e(LOGTAG, "FmRxEvEnableSlimbus status = " + status);
-         if (mReceiver != null && mReceiver.isCherokeeChip()) {
-             synchronized(mEventWaitLock) {
-                 mEventReceived = true;
-                 mEventWaitLock.notify();
-             }
+         synchronized(mEventWaitLock) {
+             mEventReceived = true;
+             mEventWaitLock.notify();
          }
+
       }
       public void FmRxEvEnableSoftMute(int status)
       {
          Log.e(LOGTAG, "FmRxEvEnableSoftMute status = " + status);
-         if (mReceiver != null && mReceiver.isCherokeeChip()) {
-             synchronized(mEventWaitLock) {
-                 mEventReceived = true;
-                 mEventWaitLock.notify();
-             }
+         synchronized(mEventWaitLock) {
+             mEventReceived = true;
+             mEventWaitLock.notify();
          }
       }
    };
@@ -3984,18 +3823,7 @@
    }
 
    private void requestFocusImpl() {
-      if( (false == mPlaybackInProgress) &&
-          (true  == mStoppedOnFocusLoss) && isFmOn()) {
-           // adding code for audio focus gain.
-           AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
-           audioManager.requestAudioFocus(mGainFocusReq);
-           startFM();
-           mStoppedOnFocusLoss = false;
-       }
-   }
-
-   private void requestFocusImplCherokee() {
-      Log.d(LOGTAG, "++requestFocusImplCherokee mPlaybackInProgress: " +
+      Log.d(LOGTAG, "++requestFocusImpl mPlaybackInProgress: " +
                     mPlaybackInProgress + " mStoppedOnFocusLoss: " +
                     mStoppedOnFocusLoss + " isFmOn: " + isFmOn());
       if( (false == mPlaybackInProgress) &&
@@ -4004,24 +3832,17 @@
            AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
            audioManager.requestAudioFocus(mGainFocusReq);
            startFM();
-           if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true))) {
-              enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
-           }
+           enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
            mStoppedOnFocusLoss = false;
        }
    }
 
    private void requestFocus() {
        Log.d(LOGTAG, "++requestFocus");
-       if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true))) {
-           requestFocusImplCherokee();
-       } else {
-           requestFocusImpl();
-       }
+       requestFocusImpl();
        Log.d(LOGTAG, "--requestFocus");
    }
 
-
    public void onAudioFocusChange(int focusChange) {
            mDelayedStopHandler.obtainMessage(FOCUSCHANGE, focusChange, 0).sendToTarget();
    }
diff --git a/fmapp2/src/com/caf/fmradio/FMStats.java b/fmapp2/src/com/caf/fmradio/FMStats.java
index 2042052..4d3b9d0 100644
--- a/fmapp2/src/com/caf/fmradio/FMStats.java
+++ b/fmapp2/src/com/caf/fmradio/FMStats.java
@@ -3018,15 +3018,11 @@
         case SEARCH_TEST:
               try {
                   Log.e(LOGTAG, "start scanning\n");
-                  if(isTransportLayerSMD() || isCherokeeChip()) {
-                      Log.d(LOGTAG,"Scanning with 0 scan time");
-                      if (mReceiver != null)
-                          mIsSearching = mReceiver.searchStations(FmReceiver.FM_RX_SRCH_MODE_SCAN,
-                                  SCAN_DWELL_PERIOD, FmReceiver.FM_RX_SEARCHDIR_UP);
-                  } else {
-                      mIsSearching = mService.scan(0);
-                  }
-              }catch (RemoteException e) {
+                  Log.d(LOGTAG,"Scanning with 0 scan time");
+                  if (mReceiver != null)
+                      mIsSearching = mReceiver.searchStations(FmReceiver.FM_RX_SRCH_MODE_SCAN,
+                              SCAN_DWELL_PERIOD, FmReceiver.FM_RX_SEARCHDIR_UP);
+              } catch (Exception e) {
                   e.printStackTrace();
               }
 
@@ -3223,16 +3219,12 @@
         boolean isCherokeeChip = isCherokeeChip();
         if((null != mService)) {
             try {
-                if (isCherokeeChip) {
-                    lastCmdSent = CMD_STNPARAM_RSSI;
-                    ret = mService.getRssi();
-                     if (ret != 0) {
-                         Log.e(LOGTAG, "getrssi cmd failed: ret = " + ret);
-                         lastCmdSent = 0;
-                         return null;
-                     }
-                } else {
-                    nRssi = mService.getRssi();
+                lastCmdSent = CMD_STNPARAM_RSSI;
+                ret = mService.getRssi();
+                if (ret != 0) {
+                    Log.e(LOGTAG, "getrssi cmd failed: ret = " + ret);
+                    lastCmdSent = 0;
+                    return null;
                 }
                 Log.e(LOGTAG, "Got response of mService.getRssi");
                 if (nRssi != Integer.MAX_VALUE) {
diff --git a/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl b/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
index 9766093..70d906e 100644
--- a/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
+++ b/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
@@ -25,7 +25,6 @@
     boolean scan(int pty);
     boolean seekPI(int piCode);
     boolean searchStrongStationList(int numStations);
-    int[]   getSearchList();
     boolean cancelSearch();
     String getProgramService();
     String getRadioText();
diff --git a/helium/radio-helium.h b/helium/radio-helium.h
index eb6ea9b..d3dae68 100644
--- a/helium/radio-helium.h
+++ b/helium/radio-helium.h
@@ -134,6 +134,7 @@
 #define FM_AFJUMP_CONFG_MODE 0x42
 #define FM_SRCH_CNFG_LEN    0x08
 #define FM_AFJUMP_CNFG_LEN  0x06
+#define STD_BUF_SIZE  256
 
 /* HCI timeouts */
 #define RADIO_HCI_TIMEOUT   (10000) /* 10 seconds */
@@ -513,6 +514,10 @@
 #define HCI_EV_RADIO_TEXT_PLUS_TAG      0x19
 #define HCI_EV_HW_ERR_EVENT             0x1A
 
+/*HCI event opcode for fm driver RDS support*/
+#define HCI_EV_DRIVER_RDS_EVENT         0x1B
+#define HCI_EV_E_RADIO_TEXT             0x1C
+
 #define HCI_REQ_DONE      0
 #define HCI_REQ_PEND      1
 #define HCI_REQ_CANCELED  2
diff --git a/helium/radio_helium_hal.c b/helium/radio_helium_hal.c
index 42be704..e258bff 100644
--- a/helium/radio_helium_hal.c
+++ b/helium/radio_helium_hal.c
@@ -862,6 +862,50 @@
     }
 }
 
+static void hci_ev_driver_rds_event(uint8_t buff[])
+{
+    uint8_t rds_type;
+    char *rds_data = NULL;
+    rds_type = buff[0];
+
+    ALOGD("%s:%s:rds type = 0x%x", LOG_TAG, __func__, rds_type);
+    rds_data = malloc(STD_BUF_SIZE);
+    if (rds_data == NULL) {
+        ALOGE("%s:memory allocation failed\n", LOG_TAG);
+        return;
+    } else {
+        memcpy(rds_data, &buff[1],STD_BUF_SIZE);
+    }
+
+    switch (rds_type) {
+        case HCI_EV_RADIO_TEXT:
+            hal->jni_cb->rt_update_cb(rds_data);
+            break;
+
+        case HCI_EV_PROGRAM_SERVICE:
+            hal->jni_cb->ps_update_cb(rds_data);
+            break;
+
+        case HCI_EV_FM_AF_LIST:
+            hal->jni_cb->af_list_update_cb((uint16_t *)&rds_data);
+            break;
+
+        case HCI_EV_RADIO_TEXT_PLUS_TAG:
+            hal->jni_cb->rt_plus_update_cb(rds_data);
+            break;
+
+        case HCI_EV_E_RADIO_TEXT:
+            hal->jni_cb->ert_update_cb(rds_data);
+            break;
+
+        default:
+            ALOGD("%s: Unknown RDS event", __func__);
+            break;
+        }
+
+    free(rds_data);
+}
+
 static void hci_ev_ert()
 {
     char *data = NULL;
@@ -1075,6 +1119,9 @@
     case HCI_EV_EXT_COUNTRY_CODE:
         hci_ev_ext_country_code(((struct fm_event_header_t *)evt_buf)->params);
         break;
+    case HCI_EV_DRIVER_RDS_EVENT:
+        hci_ev_driver_rds_event(((struct fm_event_header_t *)evt_buf)->params);
+        break;
     case HCI_EV_HW_ERR_EVENT:
         hci_ev_hw_error();
         break;
@@ -1092,7 +1139,7 @@
     return 0;
 }
 
-int fm_hci_close_done()
+int fm_hci_close_done(void)
 {
     ALOGI("fm_hci_close_done");
     const fm_hal_callbacks_t *ptr = NULL;
diff --git a/jni/Android.bp b/jni/Android.bp
index 2bb8c2c..9696223 100644
--- a/jni/Android.bp
+++ b/jni/Android.bp
@@ -4,10 +4,6 @@
     product_specific: true,
     srcs: [
         "android_hardware_fm.cpp",
-        "ConfFileParser.cpp",
-        "ConfigFmThs.cpp",
-        "FmIoctlsInterface.cpp",
-        "FmPerformanceParams.cpp",
     ],
 
     host_ldlibs: ["-ldl"],
diff --git a/jni/ConfFileParser.cpp b/jni/ConfFileParser.cpp
deleted file mode 100644
index d270690..0000000
--- a/jni/ConfFileParser.cpp
+++ /dev/null
@@ -1,930 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *        * Redistributions of source code must retain the above copyright
- *            notice, this list of conditions and the following disclaimer.
- *        * Redistributions in binary form must reproduce the above copyright
- *            notice, this list of conditions and the following disclaimer in the
- *            documentation and/or other materials provided with the distribution.
- *        * Neither the name of The Linux Foundation nor
- *            the names of its contributors may be used to endorse or promote
- *            products derived from this software without specific prior written
- *            permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT ARE DISCLAIMED.    IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ConfFileParser.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <limits.h>
-#include <math.h>
-#include <utils/Log.h>
-
-//declaration of functions only specific to this file
-static char parse_line
-(
-  group_table *key_file,
-  const char *line,
-  char **cur_grp
-);
-
-static char parse_load_frm_fhandler
-(
-  group_table *key_file,
-  FILE *fp
-);
-
-static char line_is_grp
-(
-  group_table *key_file,
-  const char *str,
-  char **cur_grp
-);
-
-static void free_grp_list
-(
-  group *a
-);
-
-static void free_key_list
-(
-  key_value_pair_list *a
-);
-
-static char line_is_key_value_pair
-(
-  group_table *key_file,
-  const char *str,
-  const char *cur_grp
-);
-
-static char line_is_comment
-(
-  const char *str
-);
-
-static char grp_exist
-(
-  const group_table *key_file,
-  const char *new_grp
-);
-
-static char add_grp
-(
-  group_table *key_file,
-  const char *new_grp
-);
-
-static group *alloc_group
-(
-  void
-);
-
-static key_value_pair_list *alloc_key_value_pair
-(
-  void
-);
-
-static char add_key_value_pair
-(
-  group_table *key_file,
-  const char *cur_grp,
-  const char *key,
-  const char *val
-);
-
-
-//Definitions
-void free_strs
-(
-  char **str_array
-)
-{
-  char **str_array_cpy = str_array;
-  if(str_array != NULL) {
-     while(*str_array != NULL) {
-           free(*str_array);
-           str_array++;
-     }
-  }
-  free(str_array_cpy);
-}
-//ToDo: Come up with code hashing
-//function
-unsigned int get_hash_code
-(
-  const char *str
-)
-{
-
-  unsigned len = strlen(str);
-  unsigned int i;
-  unsigned int hash_code = 0;
-
-  for(i = 0; len > 0; len--, i++) {
-      hash_code += (int)((str[i] * pow(2, len))) % INT_MAX;
-      hash_code %= INT_MAX;
-  }
-  return hash_code;
-}
-
-static key_value_pair_list *alloc_key_value_pair
-(
-  void
-)
-{
-  key_value_pair_list *key_list = NULL;
-
-  key_list = (key_value_pair_list *)malloc(
-                                       sizeof(key_value_pair_list));
-  if(key_list != NULL) {
-     key_list->key = NULL;
-     key_list->next = NULL;
-     key_list->value = NULL;
-  }
-  return key_list;
-}
-
-static group * alloc_group
-(
-  void
-)
-{
-  group *grp = NULL;
-  unsigned int i;
-
-  grp = (group *)malloc(sizeof(group));
-  if(grp != NULL) {
-     grp->grp_name = NULL;
-     grp->grp_next = NULL;
-     grp->num_of_keys = 0;
-     grp->keys_hash_size = MAX_UNIQ_KEYS;
-     grp->list = (key_value_pair_list **)malloc
-                    (sizeof(key_value_pair_list *) * grp->keys_hash_size);
-     if(grp->list == NULL) {
-        ALOGE("Could not alloc group\n");
-        free(grp);
-        grp = NULL;
-     }else {
-        for(i = 0; i < grp->keys_hash_size; i++) {
-            grp->list[i] = NULL;
-        }
-     }
-  }
-  return grp;
-}
-
-group_table *get_key_file
-(
-)
-{
-  group_table *t = NULL;
-  unsigned int i;
-
-  t = (group_table *)malloc(sizeof(group_table));
-  if (t != NULL) {
-      t->grps_hash_size = MAX_UNIQ_GRPS;
-      t->num_of_grps = 0;
-      t->grps_hash = (group **)malloc(sizeof(group *)
-                                       * t->grps_hash_size);
-      if (t->grps_hash == NULL) {
-          free(t);
-          return NULL;
-      }
-      for(i = 0; i < t->grps_hash_size; i++) {
-          t->grps_hash[i] = NULL;
-      }
-  }
-  return t;
-}
-
-void free_key_file(
-  group_table *key_file
-)
-{
-  unsigned int i;
-
-  if(key_file != NULL) {
-     if(key_file->grps_hash != NULL) {
-        for(i = 0; i < key_file->grps_hash_size; i++) {
-            free_grp_list(key_file->grps_hash[i]);
-        }
-     }
-     free(key_file->grps_hash);
-     free(key_file);
-  }
-}
-
-static void free_grp_list
-(
-  group *a
-)
-{
-  group *next;
-  unsigned int i;
-
-  while(a != NULL) {
-       next = a->grp_next;
-       if(a->list != NULL) {
-          for(i = 0; i < a->keys_hash_size; i++) {
-              free_key_list(a->list[i]);
-          }
-       }
-       free(a->grp_name);
-       free(a->list);
-       free(a);
-       a = next;
-  }
-}
-
-static void free_key_list
-(
-  key_value_pair_list *a
-)
-{
-  key_value_pair_list *next;
-
-  while(a != NULL) {
-       next = a->next;
-       free(a->key);
-       free(a->value);
-       free(a);
-       a = next;
-  }
-}
-//return all the groups
-//present in the file
-char **get_grps
-(
-  const group_table *key_file
-)
-{
-  char **grps = NULL;
-  unsigned int i = 0;
-  unsigned int j = 0;
-  unsigned int grp_len;
-  group *grp_list;
-
-  if((key_file == NULL)
-     || (key_file->grps_hash == NULL)
-     || (key_file->grps_hash_size == 0)
-     || (key_file->num_of_grps == 0)) {
-     return grps;
-  }
-  grps = (char **)calloc((key_file->num_of_grps + 1),
-                           sizeof(char *));
-  if(grps == NULL) {
-     return grps;
-  }
-  for(i = 0; i < key_file->grps_hash_size; i++) {
-      grp_list = key_file->grps_hash[i];
-      while(grp_list != NULL) {
-            grp_len = strlen(grp_list->grp_name);
-            grps[j] = (char *)malloc(sizeof(char) *
-                                     (grp_len + 1));
-            if(grps[j] == NULL) {
-               free_strs(grps);
-               grps = NULL;
-               return grps;
-            }
-            memcpy(grps[j], grp_list->grp_name,
-                   (grp_len + 1));
-            grp_list = grp_list->grp_next;
-            j++;
-      }
-  }
-  grps[j] = NULL;
-  return grps;
-}
-
-//returns the list of keys
-//associated with group name
-char **get_keys
-(
-  const group_table *key_file,
-  const char *grp_name
-)
-{
-  unsigned int grp_hash_code;
-  unsigned int grp_index;
-  unsigned int num_of_keys;
-  unsigned int i;
-  unsigned int j = 0;
-  unsigned int key_len;
-  group *grp;
-  key_value_pair_list *key_val_list;
-  char **keys = NULL;
-
-  if((key_file == NULL) || (grp_name == NULL)
-     || (key_file->num_of_grps == 0) ||
-     (key_file->grps_hash_size == 0) ||
-     (key_file->grps_hash == NULL) ||
-     (!strcmp(grp_name, ""))) {
-      return keys;
-  }
-  grp_hash_code = get_hash_code(grp_name);
-  grp_index = (grp_hash_code % key_file->grps_hash_size);
-  grp = key_file->grps_hash[grp_index];
-  while(grp != NULL) {
-        if(!strcmp(grp_name, grp->grp_name)) {
-            if((grp->num_of_keys == 0)
-               || (grp->keys_hash_size == 0)
-               || (grp->list == 0)) {
-               return keys;
-            }
-            keys = (char **)calloc((grp->num_of_keys + 1),
-                                   sizeof(char *));
-            if(keys == NULL) {
-                return keys;
-            }
-            for(i = 0; i < grp->keys_hash_size; i++) {
-                key_val_list = grp->list[i];
-                while(key_val_list != NULL) {
-                     key_len = strlen(key_val_list->key);
-                     keys[j] = (char *)malloc(sizeof(char) *
-                                              (key_len + 1));
-                     if(keys[j] == NULL) {
-                         free_strs(keys);
-                         keys = NULL;
-                         return keys;
-                     }
-                     memcpy(keys[j], key_val_list->key,
-                            (key_len + 1));
-                     j++;
-                     key_val_list = key_val_list->next;
-                }
-            }
-            keys[j] = NULL;
-            return keys;
-        }
-        grp = grp->grp_next;
-  }
-  return keys;
-}
-
-char *get_value
-(
-   const group_table *key_file,
-   const char *grp_name,
-   const char *key
-)
-{
-   unsigned int grp_hash_code;
-   unsigned int key_hash_code;
-   unsigned int grp_index;
-   unsigned int key_index;
-   unsigned val_len;
-   char *val = NULL;
-   group *grp;
-   key_value_pair_list *list;
-
-   if((key_file == NULL) || (grp_name == NULL)
-      || (key == NULL) || (key_file->grps_hash == NULL)
-      || (key_file->grps_hash_size == 0) || !strcmp(grp_name, "")
-      ||(!strcmp(key, ""))) {
-       return NULL;
-   }
-   grp_hash_code = get_hash_code(grp_name);
-   key_hash_code = get_hash_code(key);
-   grp_index = (grp_hash_code % key_file->grps_hash_size);
-   grp = key_file->grps_hash[grp_index];
-   while(grp != NULL) {
-         if(!strcmp(grp_name, grp->grp_name) && grp->keys_hash_size
-            && grp->list) {
-            key_index = (key_hash_code % grp->keys_hash_size);
-            list = grp->list[key_index];
-            while((list != NULL) && (strcmp(list->key, key))) {
-                   list = list->next;
-            }
-            if(list != NULL) {
-                val_len = strlen(list->value);
-                val = (char *)malloc(sizeof(char) * (val_len + 1));
-                if(val != NULL) {
-                   memcpy(val, list->value, val_len);
-                   val[val_len] = '\0';
-                }
-            }
-            return val;
-         }
-         grp = grp->grp_next;
-   }
-   return val;
-}
-//open the file,
-//read, parse and load
-//returns PARSE_SUCCESS if successfully
-//loaded else PARSE_FAILED
-char parse_load_file
-(
-  group_table *key_file,
-  const char *file
-)
-{
-  FILE *fp;
-  char ret = FALSE;
-
-  if((file == NULL) || !strcmp(file, "")) {
-     ALOGE("File name is null or empty \n");
-     return ret;
-  }
-
-  fp = fopen(file, "r");
-  if(fp == NULL) {
-     ALOGE("could not open file for read\n");
-     return ret;
-  }
-
-  ret = parse_load_frm_fhandler(key_file, fp);
-  fclose(fp);
-
-  return ret;
-}
-
-//Read block of data from file handler
-//extract each line, check kind of line(comment,
-//group, key value pair)
-static char parse_load_frm_fhandler
-(
-  group_table *key_file,
-  FILE *fp
-)
-{
-  char buf[MAX_LINE_LEN];
-  char ret = TRUE;
-  char *line = NULL;
-  void *new_line;
-  char *cur_grp = NULL;
-  unsigned line_len = 0;
-  unsigned line_allocated = 0;
-  unsigned int bytes_read = 0;
-  unsigned int i;
-  bool has_carriage_rtn = false;
-
-  while((bytes_read = fread(buf, 1, MAX_LINE_LEN, fp))) {
-        for(i = 0; i < bytes_read; i++) {
-            if(line_len == line_allocated) {
-                line_allocated += 25;
-                new_line = realloc(line, line_allocated);
-                if(new_line == NULL) {
-                   ret = FALSE;
-                   ALOGE("memory allocation failed for line\n");
-                   break;
-                }
-                line = (char *)new_line;
-            }
-            if((buf[i] == '\n')) {
-                has_carriage_rtn = false;
-                line[line_len] = '\0';
-                ret = parse_line(key_file, line, &cur_grp);
-                line_len = 0;
-                if(ret == FALSE) {
-                   ALOGE("could not parse the line, line not proper\n");
-                   break;
-                }
-            }else if(buf[i] == '\r') {
-                ALOGE("File has carriage return\n");
-                has_carriage_rtn = true;
-            }else if(has_carriage_rtn) {
-                ALOGE("File format is not proper, no line character\
-                        after carraige return\n");
-                ret = FALSE;
-                break;
-            }else {
-                line[line_len] = buf[i];
-                line_len++;
-            }
-        }
-        if (!ret) {
-            break;
-        }
-  }
-  free(line);
-  free(cur_grp);
-
-  return ret;
-}
-
-//checks whether a line is
-//comment or grp or key pair value
-//and accordingly adds to list
-static char parse_line
-(
-  group_table *key_file,
-  const char *line,
-  char **cur_grp
-)
-{
-  const char *line_begin;
-  char *grp_name;
-  unsigned int len;
-
-  if((line == NULL) || (key_file == NULL)) {
-      ALOGE("key file or line is null\n");
-      return FALSE;
-  }
-
-  for(line_begin = line; isspace(*line_begin);
-          line_begin++);
-
-  if(line_is_comment(line_begin)) {
-      ALOGE("line is comment\n");
-      return TRUE;
-  }else if(line_is_grp(key_file, line_begin, cur_grp)) {
-      ALOGE("line is grp\n");
-      return TRUE;
-  }else if(line_is_key_value_pair(key_file, line_begin, *cur_grp)) {
-      ALOGE("line is key value pair\n");
-      return TRUE;
-  }else {
-     ALOGE("line is neither comment, grp nor key value pair\n");
-     return FALSE;
-  }
-}
-
-static char line_is_comment
-(
-  const char *str
-)
-{
-  if(str == NULL) {
-      return FALSE;
-  }else if(((*str) == '#') || ((*str) == '\0')
-       || ((*str) == '\n')) {
-      return TRUE;
-  }else {
-      ALOGE("line is not comment\n");
-      return FALSE;
-  }
-}
-
-//return true if a group
-//name already exist
-//else false
-static char grp_exist
-(
-  const group_table *key_file,
-  const char *new_grp
-)
-{
-  unsigned hash_code;
-  unsigned int index;
-  group *grp;
-
-  if((key_file == NULL) || (new_grp == NULL)
-     || (!key_file->grps_hash_size)) {
-     return FALSE;
-  }else {
-    hash_code = get_hash_code(new_grp);
-    index = hash_code % key_file->grps_hash_size;
-    grp = key_file->grps_hash[index];
-    while(grp != NULL) {
-          if (!strcmp(grp->grp_name, new_grp))
-              return TRUE;
-          grp = grp->grp_next;
-    }
-    return FALSE;
-  }
-}
-
-//Add a group to group
-//table if it does not exist
-static char add_grp
-(
-  group_table *key_file,
-  const char *new_grp
-)
-{
-  unsigned int hash_code;
-  unsigned int index;
-  unsigned int grp_name_len;
-  group *grp;
-
-  if(!grp_exist(key_file, new_grp)) {
-      if((key_file == NULL) || (new_grp == NULL)
-         || !key_file->grps_hash_size) {
-         return FALSE;
-      }
-      hash_code = get_hash_code(new_grp);
-      ALOGE("group hash code is: %u\n", hash_code);
-      index = hash_code % key_file->grps_hash_size;
-      ALOGE("group index is: %u\n", index);
-      grp = alloc_group();
-      if(grp == NULL) {
-         return FALSE;
-      }
-      grp_name_len = strlen(new_grp);
-      grp->grp_name = (char *)malloc(
-                                  sizeof(char) * (grp_name_len + 1));
-      if(grp->grp_name == NULL) {
-         ALOGE("could not alloc memory for group name\n");
-         ALOGE("Add group failed\n");
-         free_grp_list(grp);
-         return FALSE;
-      }else {
-         memcpy(grp->grp_name, new_grp, (grp_name_len + 1));
-      }
-      grp->grp_next = key_file->grps_hash[index];
-      key_file->grps_hash[index] = grp;
-      key_file->num_of_grps++;
-      return TRUE;
-  }else {
-     return FALSE;
-  }
-}
-
-//checks validity of a group
-//a valid group is
-//inside [] group name must be
-//alphanumeric
-//Example: [grpName]
-static char line_is_grp
-(
-  group_table *key_file,
-  const char *str,
-  char **cur_grp
-)
-{
-  const char *g_start;
-  const char *g_end;
-  char *new_grp;
-  unsigned int grp_len;
-
-  if ((str == NULL) || (key_file == NULL)) {
-      ALOGE("str is null or key file is null\n");
-      return FALSE;
-  }
-  //checks start mark char ']'
-  if(((*str) != '[')) {
-      ALOGE("start mark is not '['\n");
-      return FALSE;
-  }else {
-      str++;
-      g_start = str;
-  }
-  //checks the end char '['
-  while((*str != '\0') && ((*str) != ']')) {
-        str++;
-  }
-  //if end mark group not found
-  if ((*str) != ']') {
-       ALOGE("grp end mark is not '['\n");
-       return FALSE;
-  }else {
-       g_end = (str - 1);
-  }
-
-  str++;
-  //if end mark found checks the rest chars as well
-  //rest chars should be space
-  while(((*str) == ' ') || ((*str) == '\t')) {
-        str++;
-  }
-  if(*str) {
-     ALOGE("after ']' there are some character\n");
-     return FALSE;
-  }
-
-  str = g_start;
-  while((*g_start != '\0') && (g_start != g_end)
-         && isalnum(*g_start)) {
-        g_start++;
-  }
-  if((g_start == g_end) && isalnum(*g_start)) {
-      //look up if already exist
-      //return false else insert the grp in grp table
-      grp_len = (g_end - str + 1);
-      new_grp = (char *)malloc(sizeof(char) * (grp_len + 1));
-      if (new_grp == NULL) {
-          ALOGE("could not alloc memory for new group\n");
-          return FALSE;
-      }
-      memcpy(new_grp, str, grp_len);
-      new_grp[grp_len] = '\0';
-
-      if(add_grp(key_file, new_grp)) {
-          free(*cur_grp);
-         *cur_grp = new_grp;
-         return TRUE;
-      }else {
-         ALOGE("could not add group to group table\n");
-         return FALSE;
-      }
-  }else {
-      return FALSE;
-  }
-}
-
-static char key_exist
-(
-  const group_table *key_file,
-  const char *cur_grp,
-  const char *key
-)
-{
-  unsigned int grp_hash_code;
-  unsigned int key_hash_code;
-  unsigned int grp_index;
-  unsigned int key_index;
-  group *grp = NULL;
-  key_value_pair_list *list = NULL;
-
-  if((key_file != NULL) && (cur_grp != NULL)
-      && (key != NULL) && ((key_file->grps_hash != NULL))
-      && (strcmp(key, ""))) {
-     grp_hash_code = get_hash_code(cur_grp);
-     grp_index = (grp_hash_code % key_file->grps_hash_size);
-     grp = key_file->grps_hash[grp_index];
-     key_hash_code = get_hash_code(key);
-     while((grp != NULL)) {
-           if(!strcmp(cur_grp, grp->grp_name)) {
-              key_index = (key_hash_code % grp->keys_hash_size);
-              if(grp->list)
-                 list = grp->list[key_index];
-              while((list != NULL) && strcmp(key, list->key)) {
-                    list = list->next;
-              }
-              if(list != NULL){
-                  return TRUE;
-              }else{
-                  return FALSE;
-              }
-           }
-           grp = grp->grp_next;
-     }
-     if(!grp) {
-        return TRUE;
-     }else {
-        return FALSE;
-     }
-  }else {
-     return FALSE;
-  }
-}
-
-//checks validity of key
-//a valid key must start in
-//a seperate line and key must
-//be alphanumeric and before '='
-//there must not be any space
-//Example: key=value
-static char line_is_key_value_pair
-(
-  group_table *key_file,
-  const char *str,
-  const char *cur_grp
-)
-{
-  const char *equal_start;
-  char *key = NULL;
-  char *val = NULL;
-  unsigned key_len;
-  unsigned val_len;
-
-  if((str == NULL) || (cur_grp == NULL) ||
-     !strcmp(cur_grp, "") || (key_file == NULL)) {
-     ALOGE("line is null or cur group or key file is null or empty\n");
-     return FALSE;
-  }
-  equal_start = strchr(str, '=');
-  key_len = (equal_start - str);
-  if((equal_start == NULL) || (equal_start == str)) {
-     ALOGE("line does not have '=' character or no key\n");
-     return FALSE;
-  }
-  while((str != equal_start) && isalnum(*str))
-        str++;
-  if((str == equal_start)) {
-      key = (char *)malloc(sizeof(char) * (key_len + 1));
-      if(key == NULL) {
-         ALOGE("could not alloc memory for new key\n");
-         return FALSE;
-      }
-      equal_start++;
-      val_len = strlen(equal_start);
-      val = (char *)malloc(sizeof(char) * (val_len + 1));
-      if(val == NULL) {
-         ALOGE("could not alloc memory for value\n");
-         if(key){
-             free(key);
-             key = NULL;
-         }
-         return FALSE;
-      }
-      memcpy(key, (str - key_len), key_len);
-      memcpy(val, equal_start, val_len);
-      key[key_len] = '\0';
-      val[val_len] = '\0';
-      ALOGE("Grp: %s, key: %s, value: %s\n", cur_grp, key, val);
-      return add_key_value_pair(key_file,
-                                 cur_grp, key, val);
-  }else {
-     ALOGE("key name doesnot have alpha numeric char\n");
-     return FALSE;
-  }
-}
-
-static char add_key_value_pair
-(
-  group_table *key_file,
-  const char *cur_grp,
-  const char *key,
-  const char *val
-)
-{
-  unsigned int grp_hash_code;
-  unsigned int key_hash_code;
-  unsigned int grp_index;
-  unsigned int key_index;
-  unsigned key_len = 0;
-  unsigned val_len = 0;
-  group *grp = NULL;
-  key_value_pair_list *list = NULL;
-
-  if((key_file != NULL) && (cur_grp != NULL)
-      && (key != NULL) && ((key_file->grps_hash != NULL))
-      && (strcmp(key, ""))) {
-     grp_hash_code = get_hash_code(cur_grp);
-     ALOGE("grp hash code is %u\n", grp_hash_code);
-     grp_index = (grp_hash_code % key_file->grps_hash_size);
-     ALOGE("grp index is %u\n", grp_index);
-     grp = key_file->grps_hash[grp_index];
-     key_hash_code = get_hash_code(key);
-     while((grp != NULL)) {
-           if(!strcmp(cur_grp, grp->grp_name)) {
-              key_index = (key_hash_code % grp->keys_hash_size);
-              if(grp->list) {
-                 list = grp->list[key_index];
-              }else {
-                 ALOGE("group list is null\n");
-                 goto err;
-              }
-              while((list != NULL) && strcmp(key, list->key)) {
-                    list = list->next;
-              }
-              if(list != NULL) {
-                  ALOGE("group already contains the key\n");
-                  goto err;
-              }else{
-                  list = alloc_key_value_pair();
-                  if(list == NULL) {
-                     ALOGE("add key value failed as could not alloc memory for key\
-                            val pair\n");
-                     goto err;
-                  }
-                  if(key) {
-                      key_len = strlen(key);
-                  }
-                  list->key = (char *)malloc(sizeof(char) *
-                                              (key_len + 1));
-                  if(list->key == NULL) {
-                     ALOGE("could not alloc memory for key\n");
-                     free(list);
-                     goto err;
-                  }
-                  if(val) {
-                      val_len = strlen(val);
-                  }
-                  list->value = (char *)malloc(sizeof(char) *
-                                                (val_len + 1));
-                  if(!list->value) {
-                      free(list->key);
-                      free(list);
-                      goto err;
-                  }
-                  memcpy(list->key, key, key_len);
-                  memcpy(list->value, val, val_len);
-                  if (key) free((char*)key);
-                  if (val) free((char*)val);
-                  list->key[key_len] = '\0';
-                  list->value[val_len] = '\0';
-                  list->next = grp->list[key_index];
-                  grp->list[key_index] = list;
-                  grp->num_of_keys++;
-                  return TRUE;
-              }
-           }
-           grp = grp->grp_next;
-     }
-     ALOGE("group does not exist\n");
-     goto err;
-  }
-err:
-     if (key) free((char*)key);
-     if (val) free((char*)val);
-     return FALSE;
-}
diff --git a/jni/ConfFileParser.h b/jni/ConfFileParser.h
deleted file mode 100644
index 33b86ce..0000000
--- a/jni/ConfFileParser.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *        * Redistributions of source code must retain the above copyright
- *            notice, this list of conditions and the following disclaimer.
- *        * Redistributions in binary form must reproduce the above copyright
- *            notice, this list of conditions and the following disclaimer in the
- *            documentation and/or other materials provided with the distribution.
- *        * Neither the name of The Linux Foundation nor
- *            the names of its contributors may be used to endorse or promote
- *            products derived from this software without specific prior written
- *            permission.
-
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT ARE DISCLAIMED.    IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#ifndef __CONF_FILE_PARSER_H__
-#define __CONF_FILE_PARSER_H__
-
-#define MAX_LINE_LEN 512
-#define MAX_UNIQ_KEYS 5
-#define MAX_UNIQ_GRPS 10
-#define TRUE 1
-#define FALSE 0
-
-struct key_value_pair_list
-{
-   char *key;
-   char *value;
-   key_value_pair_list *next;
-};
-
-struct group
-{
-    char *grp_name;
-    unsigned int num_of_keys;
-    unsigned int keys_hash_size;
-    key_value_pair_list **list;
-    group *grp_next;
-};
-
-struct group_table
-{
-    unsigned int grps_hash_size;
-    unsigned int num_of_grps;
-    group **grps_hash;
-};
-
-enum CONF_PARSE_ERRO_CODE
-{
-  PARSE_SUCCESS,
-  INVALID_FILE_NAME,
-  FILE_OPEN_FAILED,
-  FILE_NOT_PROPER,
-  MEMORY_ALLOC_FAILED,
-  PARSE_FAILED,
-};
-
-unsigned int get_hash_code(const char *str);
-group_table *get_key_file();
-void free_strs(char **str_array);
-void free_key_file(group_table *key_file);
-char parse_load_file(group_table *key_file, const char *file);
-char **get_grps(const group_table *key_file);
-char **get_keys(const group_table *key_file, const char *grp);
-char *get_value(const group_table *key_file, const char *grp,
-                 const char *key);
-
-#endif //__CONF_FILE_PARSER_H__
diff --git a/jni/ConfigFmThs.cpp b/jni/ConfigFmThs.cpp
deleted file mode 100644
index 3845dfd..0000000
--- a/jni/ConfigFmThs.cpp
+++ /dev/null
@@ -1,528 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *        * Redistributions of source code must retain the above copyright
- *            notice, this list of conditions and the following disclaimer.
- *        * Redistributions in binary form must reproduce the above copyright
- *            notice, this list of conditions and the following disclaimer in the
- *            documentation and/or other materials provided with the distribution.
- *        * Neither the name of The Linux Foundation nor
- *            the names of its contributors may be used to endorse or promote
- *            products derived from this software without specific prior written
- *            permission.
-
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT ARE DISCLAIMED.    IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <cstdlib>
-#include <cstring>
-#include "ConfigFmThs.h"
-#include "FmPerformanceParams.h"
-#include <utils/Log.h>
-
-static int compare_name
-(
-   const void *name1, const void *name2
-)
-{
-    char *first = (char *)name1;
-    struct NAME_MAP *second = (struct NAME_MAP *)name2;
-
-    return(strcmp(first, second->name));
-}
-
-ConfigFmThs :: ConfigFmThs
-(
-)
-{
-    keyfile = NULL;
-}
-
-ConfigFmThs :: ~ConfigFmThs
-(
-)
-{
-   free_key_file(keyfile);
-}
-
-void ConfigFmThs :: set_af_ths
-(
-   UINT fd
-)
-{
-    signed char ret = FM_SUCCESS;
-    char **keys;
-    char **keys_cpy;
-    char *key_value;
-    int value;
-    FmPerformanceParams perf_params;
-    struct NAME_MAP *found;
-
-    if(keyfile != NULL) {
-       keys_cpy = keys = get_keys(keyfile, GRPS_MAP[0].name);
-       if(keys != NULL) {
-          while(*keys != NULL) {
-              ALOGE("key found is: %s\n", *keys);
-              found = (NAME_MAP *)bsearch(*keys, AF_PARAMS_MAP,
-                          MAX_AF_PARAMS, sizeof(NAME_MAP), compare_name);
-              if(found != NULL) {
-                 key_value = get_value(keyfile,
-                                     GRPS_MAP[0].name, found->name);
-                 if((key_value != NULL) && strcmp(key_value, "")) {
-                    value = atoi(key_value);
-                    switch(found->num) {
-                    case AF_RMSSI_TH:
-                         if((value >= AF_RMSSI_TH_MIN)
-                             && (value <= AF_RMSSI_TH_MAX)) {
-                             ALOGE("Set af rmssi th: %d\n", value);
-                             ret = perf_params.SetAfRmssiTh(fd, value);
-                             if(ret == FM_FAILURE) {
-                                ALOGE("Error in setting Af Rmssi th\n");
-                                break;
-                             }
-                             unsigned short th;
-                             ret = perf_params.GetAfRmssiTh(fd, th);
-                             if(ret == FM_SUCCESS) {
-                                ALOGE("Read af rmssith: %hd\n", th);
-                             }else {
-                                ALOGE("Error in reading Af Rmssi th\n");
-                             }
-                         }
-                         break;
-                    case AF_RMSSI_SAMPLES:
-                         if((value >= AF_RMSSI_SAMPLES_MIN)
-                             && (value <= AF_RMSSI_SAMPLES_MAX)) {
-                             ALOGE("Set af rmssi samples cnt: %d\n", value);
-                             ret = perf_params.SetAfRmssiSamplesCnt(fd, value);
-                             if(ret == FM_FAILURE) {
-                                ALOGE("Error in setting af rmssi samples\n");
-                                break;
-                             }
-                             unsigned char cnt;
-                             ret = perf_params.GetAfRmssiSamplesCnt(fd, cnt);
-                             if(ret == FM_SUCCESS) {
-                                ALOGE("Read af rmssi samples cnt: %hhd\n", cnt);
-                             }else {
-                                 ALOGE("Error in reading rmssi samples\n");
-                             }
-                         }
-                         break;
-                    case GOOD_CH_RMSSI_TH:
-                         if((value >= GOOD_CH_RMSSI_TH_MIN)
-                             && (value <= GOOD_CH_RMSSI_TH_MAX)) {
-                             ALOGE("Set Good channle rmssi th: %d\n", value);
-                             ret = perf_params.SetGoodChannelRmssiTh(fd, value);
-                             if(ret == FM_FAILURE) {
-                                ALOGE("Error in setting Good channle rmssi th\n");
-                                break;
-                             }
-                             signed char th;
-                             ret = perf_params.GetGoodChannelRmssiTh(fd, th);
-                             if(ret == FM_SUCCESS) {
-                                ALOGE("Read good channel rmssi th: %d\n", th);
-                             }else {
-                                ALOGE("Error in reading Good channle rmssi th\n");
-                             }
-                         }
-                         break;
-                   }
-                 }else {
-                   ALOGE("key_val for key: %s is empty\n",
-                             *keys);
-                 }
-                 free(key_value);
-              }
-              keys++;
-          }
-       }else {
-          ALOGE("No of keys found is zero\n");
-       }
-       free_strs(keys_cpy);
-    }else {
-       ALOGE("key file is null\n");
-    }
-}
-
-void ConfigFmThs :: set_srch_ths
-(
-    UINT fd
-)
-{
-    signed char ret = FM_SUCCESS;
-    char **keys = NULL;
-    char **keys_cpy = NULL;
-    char *key_value = NULL;
-    int value;
-    FmPerformanceParams perf_params;
-    struct NAME_MAP *found = NULL;
-
-    if(keyfile != NULL) {
-       keys_cpy = keys = get_keys(keyfile, GRPS_MAP[2].name);
-       if(keys != NULL) {
-          while(*keys != NULL) {
-              found = (NAME_MAP *)bsearch(*keys, SEACH_PARAMS_MAP,
-                           MAX_SRCH_PARAMS, sizeof(NAME_MAP), compare_name);
-              if(found != NULL) {
-                 key_value = get_value(keyfile, GRPS_MAP[2].name, found->name);
-                 ALOGE("found srch ths: %s: %s\n", found->name, key_value);
-                 if((key_value != NULL) && strcmp(key_value, "")) {
-                    value = atoi(key_value);
-                    switch(found->num) {
-                    case SINR_FIRST_STAGE:
-                         if((value >= SINR_FIRST_STAGE_MIN)
-                             && (value <= SINR_FIRST_STAGE_MAX)) {
-                             ALOGE("Set sinr first stage: %d\n", value);
-                             ret = perf_params.SetSinrFirstStage(fd, value);
-                             if(ret == FM_FAILURE) {
-                                ALOGE("Error in setting sinr first stage\n");
-                                break;
-                             }
-                             signed char th;
-                             ret = perf_params.GetSinrFirstStage(fd, th);
-                             if(ret == FM_SUCCESS) {
-                                ALOGE("Read sinr first stage: %d\n", th);
-                             }else {
-                                ALOGE("Error in reading sinr first stage\n");
-                             }
-                         }
-                         break;
-                    case RMSSI_FIRST_STAGE:
-                         if((value >= RMSSI_FIRST_STAGE_MIN)
-                             && (value <= RMSSI_FIRST_STAGE_MAX)) {
-                             ALOGE("Set rmssi first stage: %d\n", value);
-                             ret = perf_params.SetRmssiFirstStage(fd, value);
-                             if(ret == FM_FAILURE) {
-                                ALOGE("Error in setting rmssi first stage\n");
-                                break;
-                             }
-                             signed char th;
-                             ret = perf_params.GetRmssiFirstStage(fd, th);
-                             if(ret == FM_SUCCESS) {
-                                ALOGE("Read rmssi first stage: %d\n", th);
-                             }else {
-                                ALOGE("Error in reading rmssi first stage\n");
-                             }
-                         }
-                         break;
-                    case INTF_LOW_TH:
-                         if((value >= INTF_LOW_TH_MIN)
-                             && (value <= INTF_LOW_TH_MAX)) {
-                            ALOGE("Set intf low th: %d\n", value);
-                            ret = perf_params.SetIntfLowTh(fd, value);
-                            if(ret == FM_FAILURE) {
-                                ALOGE("Error in setting intf low th\n");
-                                break;
-                            }
-                            unsigned char th;
-                            ret = perf_params.GetIntfLowTh(fd, th);
-                            if(ret == FM_SUCCESS) {
-                               ALOGE("Read intf low th: %u\n", th);
-                            }else {
-                               ALOGE("Error in reading intf low th\n");
-                            }
-                         }
-                         break;
-                    case INTF_HIGH_TH:
-                         if((value >= INTF_HIGH_TH_MIN)
-                             && (value <= INTF_HIGH_TH_MAX)) {
-                            ALOGE("Set intf high th: %d\n", value);
-                            ret = perf_params.SetIntfHighTh(fd, value);
-                            if(ret == FM_FAILURE) {
-                                ALOGE("Error in setting intf high th\n");
-                                break;
-                            }
-                            unsigned char th;
-                            ret = perf_params.GetIntfHighTh(fd, th);
-                            if(ret == FM_SUCCESS) {
-                               ALOGE("Read intf high th: %u\n", th);
-                            }else {
-                               ALOGE("Error in reading intf high th\n");
-                            }
-                         }
-                         break;
-                    case CF0_TH:
-                         ALOGE("Set cf0 th: %d\n", value);
-                         ret = perf_params.SetCf0Th12(fd, value);
-                         if(ret == FM_FAILURE) {
-                            ALOGE("Error in setting cf0 th\n");
-                            break;
-                         }
-                         int th;
-                         ret = perf_params.GetCf0Th12(fd, th);
-                         if(ret == FM_SUCCESS) {
-                            ALOGE("Read CF012 th: %d\n", th);
-                         }else {
-                            ALOGE("Error in reading cf0 th\n");
-                         }
-                         break;
-                    case SRCH_ALGO_TYPE:
-                         if((value >= SRCH_ALGO_TYPE_MIN)
-                             && (value <= SRCH_ALGO_TYPE_MAX)) {
-                             ALOGE("Set search algo type: %d\n", value);
-                             ret = perf_params.SetSrchAlgoType(fd, value);
-                             if(ret == FM_FAILURE) {
-                                ALOGE("Error in setting search algo type\n");
-                                break;
-                             }
-                             unsigned char algo;
-                             ret = perf_params.GetSrchAlgoType(fd, algo);
-                             if(ret == FM_SUCCESS) {
-                                ALOGE("Read algo type: %u\n", algo);
-                             }else {
-                                ALOGE("Error in reading search algo type\n");
-                             }
-                         }
-                         break;
-                    case SINR_SAMPLES:
-                         if((value >= SINR_SAMPLES_CNT_MIN)
-                             && (value <= SINR_SAMPLES_CNT_MAX)) {
-                             ALOGE("Set sinr samples count: %d\n", value);
-                             ret = perf_params.SetSinrSamplesCnt(fd, value);
-                             if(ret == FM_FAILURE) {
-                                ALOGE("Error in setting sinr samples count\n");
-                                break;
-                             }
-                             unsigned char cnt;
-                             ret = perf_params.GetSinrSamplesCnt(fd, cnt);
-                             if(ret == FM_SUCCESS) {
-                                ALOGE("Read sinr samples cnt: %u\n", cnt);
-                             }else {
-                                ALOGE("Error in reading sinr samples count\n");
-                             }
-                         }
-                         break;
-                    case SINR:
-                         if((value >= SINR_FINAL_STAGE_MIN)
-                             && (value <= SINR_FINAL_STAGE_MAX)) {
-                             ALOGE("Set final stage sinr: %d\n", value);
-                             ret = perf_params.SetSinrFinalStage(fd, value);
-                             if(ret == FM_FAILURE) {
-                                ALOGE("Error in setting final stage sinr\n");
-                                break;
-                             }
-                             signed char th;
-                             ret = perf_params.GetSinrFinalStage(fd, th);
-                             if(ret == FM_SUCCESS) {
-                                ALOGE("Read final stage sinr: %d\n", th);
-                             }else {
-                                ALOGE("Error in reading final stage sinr\n");
-                             }
-                         }
-                         break;
-                    }
-                 }else {
-                    ALOGE("key_value for key: %s is empty\n",
-                                  *keys);
-                 }
-                 free(key_value);
-              }
-              keys++;
-          }
-       }else {
-          ALOGE("No of keys found is zero\n");
-       }
-       free_strs(keys_cpy);
-    }else {
-       ALOGE("key file is null\n");
-    }
-}
-
-void ConfigFmThs :: set_hybrd_list
-(
-    UINT fd
-)
-{
-    signed char ret = FM_SUCCESS;
-    char **keys = NULL;
-    char **keys_cpy = NULL;
-    char *key_value = NULL;
-    char *freqs = NULL;
-    unsigned int *freqs_array = NULL;
-    signed char *sinrs_array = NULL;
-    char *sinrs = NULL;
-    int value;
-    unsigned int freq_cnt = 0;
-    unsigned int sinr_cnt = 0;
-    FmPerformanceParams perf_params;
-    struct NAME_MAP *found;
-
-    ALOGE("Inside hybrid srch list\n");
-    if(keyfile != NULL) {
-       keys_cpy = keys = get_keys(keyfile, GRPS_MAP[1].name);
-       if(keys != NULL) {
-          while(*keys != NULL) {
-              found = (NAME_MAP *)bsearch(*keys, HYBRD_SRCH_MAP,
-                           MAX_HYBRID_SRCH_PARAMS, sizeof(NAME_MAP), compare_name);
-              if(found != NULL) {
-                 key_value = get_value(keyfile, GRPS_MAP[1].name, found->name);
-                 if((key_value != NULL) && strcmp(key_value, "")) {
-                     switch(found->num) {
-                     case FREQ_LIST:
-                          freqs = key_value;
-                          break;
-                     case SINR_LIST:
-                          sinrs = key_value;
-                          break;
-                     default:
-                          free(key_value);
-                          break;
-                     }
-                 }
-              }
-              keys++;
-          }
-          free_strs(keys_cpy);
-       }else {
-          ALOGE("No of keys found is zero\n");
-       }
-    }else {
-       ALOGE("key file is null\n");
-    }
-
-    freq_cnt = extract_comma_sep_freqs(freqs, &freqs_array, ",");
-    sinr_cnt = extract_comma_sep_sinrs(sinrs, &sinrs_array, ",");
-
-    if((freq_cnt == sinr_cnt) && (sinr_cnt > 0)) {
-       perf_params.SetHybridSrchList(fd, freqs_array, sinrs_array, freq_cnt);
-    }
-
-    free(freqs);
-    free(sinrs);
-    free(freqs_array);
-    free(sinrs_array);
-}
-
-unsigned int ConfigFmThs :: extract_comma_sep_freqs
-(
-    char *freqs,
-    unsigned int **freqs_arr,
-    const char *str
-)
-{
-    char *next_freq;
-    char *saveptr = NULL;
-    unsigned int freq;
-    unsigned int *freqs_new_arr;
-    unsigned int size = 0;
-    unsigned int len = 0;
-
-    next_freq = strtok_r(freqs, str, &saveptr);
-    while(next_freq != NULL) {
-          freq = atoi(next_freq);
-          ALOGD("HYBRID_SRCH freq: %u\n", freq);
-          if(size == len) {
-             size <<= 1;
-             if(size == 0)
-                size = 1;
-             freqs_new_arr = (unsigned int *)realloc(*freqs_arr,
-                                              size * sizeof(unsigned int));
-             if(freqs_new_arr == NULL) {
-                free(*freqs_arr);
-                *freqs_arr = NULL;
-                break;
-             }
-             *freqs_arr = freqs_new_arr;
-          }
-          (*freqs_arr)[len] = freq;
-          len++;
-          next_freq = strtok_r(NULL, str, &saveptr);
-    }
-    return len;
-}
-
-unsigned int ConfigFmThs :: extract_comma_sep_sinrs
-(
-    char *sinrs,
-    signed char **sinrs_arr,
-    const char *str
-)
-{
-    char *next_sinr;
-    char *saveptr = NULL;
-    signed char *sinrs_new_arr;
-    unsigned int size = 0;
-    unsigned int len = 0;
-    signed char sinr;
-
-    next_sinr = strtok_r(sinrs, str, &saveptr);
-    while(next_sinr != NULL) {
-          sinr = atoi(next_sinr);
-          ALOGD("HYBRID_SRCH sinr: %d\n", sinr);
-          if(size == len) {
-             size <<= 1;
-             if(size == 0)
-                size = 1;
-             sinrs_new_arr = (signed char *)realloc(*sinrs_arr,
-                                               size * sizeof(signed char));
-             if(sinrs_new_arr == NULL) {
-                free(*sinrs_arr);
-                *sinrs_arr = NULL;
-                break;
-             }
-             *sinrs_arr = sinrs_new_arr;
-          }
-          (*sinrs_arr)[len] = sinr;
-          len++;
-          next_sinr = strtok_r(NULL, str, &saveptr);
-    }
-    return len;
-}
-
-void  ConfigFmThs :: SetRxSearchAfThs
-(
-    const char *file, UINT fd
-)
-{
-    int index;
-    struct NAME_MAP *found;
-    char **grps = NULL;
-    char **grps_cpy = NULL;
-
-    keyfile = get_key_file();
-
-    ALOGE("file name is: %s\n", file);
-    if(!parse_load_file(keyfile, file)) {
-       ALOGE("Error in loading threshold file\n");
-    }else {
-       grps_cpy = grps = get_grps(keyfile);
-       if(grps != NULL) {
-          while(*grps != NULL) {
-              ALOGE("Search grp: %s\n", *grps);
-              found = (NAME_MAP *)bsearch(*grps, GRPS_MAP, MAX_GRPS,
-                             sizeof(NAME_MAP), compare_name);
-              if(found != NULL) {
-                 ALOGE("Found group: %s\n", found->name);
-                 switch(found->num) {
-                 case AF_THS:
-                      set_af_ths(fd);
-                      break;
-                 case SRCH_THS:
-                      set_srch_ths(fd);
-                      break;
-                 case HYBRD_SRCH_LIST:
-                      set_hybrd_list(fd);
-                      break;
-                 }
-              }
-              grps++;
-          }
-       }else {
-          ALOGE("No of groups found is zero\n");
-       }
-       free_strs(grps_cpy);
-    }
-    free_key_file(keyfile);
-    keyfile = NULL;
-}
diff --git a/jni/ConfigFmThs.h b/jni/ConfigFmThs.h
deleted file mode 100644
index 0a791f7..0000000
--- a/jni/ConfigFmThs.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *        * Redistributions of source code must retain the above copyright
- *            notice, this list of conditions and the following disclaimer.
- *        * Redistributions in binary form must reproduce the above copyright
- *            notice, this list of conditions and the following disclaimer in the
- *            documentation and/or other materials provided with the distribution.
- *        * Neither the name of The Linux Foundation nor
- *            the names of its contributors may be used to endorse or promote
- *            products derived from this software without specific prior written
- *            permission.
-
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT ARE DISCLAIMED.    IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __CONFIG_FM_THS_H__
-#define __CONFIG_FM_THS_H__
-
-#include <cstring>
-#include "FmConst.h"
-#include "ConfFileParser.h"
-
-#define MAX_GRPS 3
-#define MAX_SRCH_PARAMS 8
-#define MAX_AF_PARAMS 3
-
-#define SINR_SAMPLES_CNT_MIN 0
-#define SINR_SAMPLES_CNT_MAX 255
-#define SINR_FIRST_STAGE_MIN -128
-#define SINR_FIRST_STAGE_MAX 127
-#define RMSSI_FIRST_STAGE_MIN -128
-#define RMSSI_FIRST_STAGE_MAX 127
-#define INTF_LOW_TH_MIN 0
-#define INTF_LOW_TH_MAX  255
-#define INTF_HIGH_TH_MIN 0
-#define INTF_HIGH_TH_MAX 255
-#define SRCH_ALGO_TYPE_MIN 0
-#define SRCH_ALGO_TYPE_MAX 1
-#define SINR_FINAL_STAGE_MIN -128
-#define SINR_FINAL_STAGE_MAX 127
-
-#define AF_RMSSI_TH_MIN 0
-#define AF_RMSSI_TH_MAX 65535
-#define AF_RMSSI_SAMPLES_MIN 0
-#define AF_RMSSI_SAMPLES_MAX 255
-#define GOOD_CH_RMSSI_TH_MIN -128
-#define GOOD_CH_RMSSI_TH_MAX 127
-
-const unsigned char MAX_HYBRID_SRCH_PARAMS = 2;
-
-struct NAME_MAP
-{
-   const char name[50];
-   const int num;
-};
-
-enum PERFORMANCE_GRPS
-{
-    AF_THS,
-    SRCH_THS,
-    HYBRD_SRCH_LIST,
-};
-
-enum PERFORMANCE_SRCH_PARAMS
-{
-    SRCH_ALGO_TYPE,
-    CF0_TH,
-    SINR_FIRST_STAGE,
-    SINR,
-    RMSSI_FIRST_STAGE,
-    INTF_LOW_TH,
-    INTF_HIGH_TH,
-    SINR_SAMPLES,
-};
-
-enum PERFORMANCE_AF_PARAMS
-{
-    AF_RMSSI_TH,
-    AF_RMSSI_SAMPLES,
-    GOOD_CH_RMSSI_TH,
-};
-
-enum HYBRID_SRCH_PARAMS
-{
-    FREQ_LIST,
-    SINR_LIST,
-};
-
-//Keep this list in sorted order (ascending order in terms of "name")
-//Don't change the name of GRPS, if changed please also change accordingly
-//file: fm_srch_af_th.conf
-static struct NAME_MAP GRPS_MAP[] =
-{
-   {"AFTHRESHOLDS", AF_THS},
-   {"HYBRIDSEARCHLIST", HYBRD_SRCH_LIST},
-   {"SEARCHTHRESHOLDS", SRCH_THS},
-};
-
-//Keep this list in sorted order (ascending order in terms of "name")
-//Don't change the name of SEARCH thresholds,
-//if changed please also change accordingly
-//file: fm_srch_af_th.conf
-static struct NAME_MAP SEACH_PARAMS_MAP[] =
-{
-   {"Cf0Th12", CF0_TH},
-   {"IntfHighTh", INTF_HIGH_TH},
-   {"IntfLowTh", INTF_LOW_TH},
-   {"RmssiFirstStage", RMSSI_FIRST_STAGE},
-   {"SearchAlgoType", SRCH_ALGO_TYPE},
-   {"Sinr", SINR},
-   {"SinrFirstStage", SINR_FIRST_STAGE},
-   {"SinrSamplesCnt", SINR_SAMPLES},
-};
-
-//Keep this list in sorted order (ascending order in terms of "name")
-//Don't change the name of SEARCH thresholds,
-//if changed please also change accordingly
-//file: fm_srch_af_th.conf
-static struct NAME_MAP AF_PARAMS_MAP[] =
-{
-   {"AfRmssiSamplesCnt", AF_RMSSI_SAMPLES},
-   {"AfRmssiTh", AF_RMSSI_TH},
-   {"GoodChRmssiTh", GOOD_CH_RMSSI_TH},
-};
-
-static struct NAME_MAP HYBRD_SRCH_MAP[] =
-{
-   {"Freqs", FREQ_LIST},
-   {"Sinrs", SINR_LIST},
-};
-
-class ConfigFmThs {
-   private:
-          group_table *keyfile;
-          void set_srch_ths(UINT fd);
-          void set_af_ths(UINT fd);
-          unsigned int extract_comma_sep_freqs(char *freqs, unsigned int **freqs_arr, const char *str);
-          unsigned int extract_comma_sep_sinrs(char *sinrs, signed char **sinrs_arr, const char *str);
-          void set_hybrd_list(UINT fd);
-   public:
-          ConfigFmThs();
-          ~ConfigFmThs();
-          void SetRxSearchAfThs(const char *file, UINT fd);
-};
-
-#endif //__CONFIG_FM_THS_H__
diff --git a/jni/FmConst.h b/jni/FmConst.h
deleted file mode 100644
index e37160f..0000000
--- a/jni/FmConst.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (c) 2014, 2015, The Linux Foundation. All rights reserved.
-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *        * Redistributions of source code must retain the above copyright
- *            notice, this list of conditions and the following disclaimer.
- *        * Redistributions in binary form must reproduce the above copyright
- *            notice, this list of conditions and the following disclaimer in the
- *            documentation and/or other materials provided with the distribution.
- *        * Neither the name of The Linux Foundation nor
- *            the names of its contributors may be used to endorse or promote
- *            products derived from this software without specific prior written
- *            permission.
-
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT ARE DISCLAIMED.    IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __FM_CONST_H__
-#define __FM_CONST_H__
-
-
-typedef  unsigned int UINT;
-typedef  unsigned long ULINT;
-
-//return related
-const int IOCTL_SUCC = 0;
-const int FM_SUCCESS = 0;
-const int FM_FAILURE = -1;
-const int PROP_SET_SUCC = 0;
-
-#define TUNE_MULT  16
-const UINT CAL_DATA_SIZE = 23;
-#define STD_BUF_SIZE  256
-
-const char *const FM_PERFORMANCE_PARAMS = "/etc/fm/fm_srch_af_th.conf";
-const char *const CALIB_DATA_NAME = "/data/misc/fm/Riva_fm_cal";
-
-#define V4L2_CTRL_CLASS_USER  0x00980000
-#define V4L2_CID_BASE  (V4L2_CTRL_CLASS_USER | 0x900)
-#define V4L2_CID_AUDIO_MUTE   (V4L2_CID_BASE + 9)
-const UINT SEARCH_DWELL_TIME = 2;
-const UINT SEEK_DWELL_TIME = 0;
-
-enum FM_AUDIO_PATH
-{
-    AUDIO_DIGITAL_PATH,
-    AUDIO_ANALOG_PATH,
-};
-
-enum FM_DEVICE
-{
-    FM_DEV_NONE,
-    FM_RX,
-    FM_TX,
-};
-
-enum BUFF_INDEXES
-{
-    STATION_LIST_IND,
-    EVENT_IND,
-    RT_IND,
-    PS_IND,
-    AF_LIST_IND = PS_IND + 2,
-    RT_PLUS_IND = 11,
-    ERT_IND,
-};
-
-enum SEARCH_MODE
-{
-    SEEK_MODE,
-    SCAN_MODE,
-};
-
-enum SEARCH_DIR
-{
-    SEARCH_DOWN,
-    SEARCH_UP,
-};
-
-enum AUDIO_MODE
-{
-    MONO,
-    STEREO,
-};
-
-//V4L2 CONTROLS FOR FM DRIVER
-enum FM_V4L2_PRV_CONTROLS
-{
-    V4L2_CID_PRV_BASE = 0x8000000,
-    V4L2_CID_PRV_SRCHMODE,
-    V4L2_CID_PRV_SCANDWELL,
-    V4L2_CID_PRV_SRCHON,
-    V4L2_CID_PRV_STATE,
-    V4L2_CID_PRV_TRANSMIT_MODE,
-    V4L2_CID_PRV_RDSGROUP_MASK,
-    V4L2_CID_PRV_REGION,
-    V4L2_CID_PRV_SIGNAL_TH,
-    V4L2_CID_PRV_SRCH_PTY,
-    V4L2_CID_PRV_SRCH_PI,
-    V4L2_CID_PRV_SRCH_CNT,
-    V4L2_CID_PRV_EMPHASIS,
-    V4L2_CID_PRV_RDS_STD,
-    V4L2_CID_PRV_CHAN_SPACING,
-    V4L2_CID_PRV_RDSON,
-    V4L2_CID_PRV_RDSGROUP_PROC,
-    V4L2_CID_PRV_LP_MODE,
-    V4L2_CID_PRV_INTDET = V4L2_CID_PRV_BASE + 25,
-    V4L2_CID_PRV_AF_JUMP = V4L2_CID_PRV_BASE + 27,
-    V4L2_CID_PRV_SOFT_MUTE = V4L2_CID_PRV_BASE + 30,
-    V4L2_CID_PRV_AUDIO_PATH = V4L2_CID_PRV_BASE + 41,
-    V4L2_CID_PRV_SINR = V4L2_CID_PRV_BASE + 44,
-    V4L2_CID_PRV_ON_CHANNEL_THRESHOLD = V4L2_CID_PRV_BASE + 0x2D,
-    V4L2_CID_PRV_OFF_CHANNEL_THRESHOLD,
-    V4L2_CID_PRV_SINR_THRESHOLD,
-    V4L2_CID_PRV_SINR_SAMPLES,
-    V4L2_CID_PRV_SPUR_FREQ,
-    V4L2_CID_PRV_SPUR_FREQ_RMSSI,
-    V4L2_CID_PRV_SPUR_SELECTION,
-    V4L2_CID_PRV_AF_RMSSI_TH = V4L2_CID_PRV_BASE + 0x36,
-    V4L2_CID_PRV_AF_RMSSI_SAMPLES,
-    V4L2_CID_PRV_GOOD_CH_RMSSI_TH,
-    V4L2_CID_PRV_SRCHALGOTYPE,
-    V4L2_CID_PRV_CF0TH12,
-    V4L2_CID_PRV_SINRFIRSTSTAGE,
-    V4L2_CID_PRV_RMSSIFIRSTSTAGE,
-    V4L2_CID_PRV_SOFT_MUTE_TH,
-    V4L2_CID_PRV_IRIS_RDSGRP_RT,
-    V4L2_CID_PRV_IRIS_RDSGRP_PS_SIMPLE,
-    V4L2_CID_PRV_IRIS_RDSGRP_AFLIST,
-    V4L2_CID_PRV_IRIS_RDSGRP_ERT,
-    V4L2_CID_PRV_IRIS_RDSGRP_RT_PLUS,
-    V4L2_CID_PRV_IRIS_RDSGRP_3A,
-
-    V4L2_CID_PRV_IRIS_READ_DEFAULT = V4L2_CTRL_CLASS_USER + 0x928,
-    V4L2_CID_PRV_IRIS_WRITE_DEFAULT,
-    V4L2_CID_PRV_SET_CALIBRATION = V4L2_CTRL_CLASS_USER + 0x92A,
-    HCI_FM_HELIUM_SET_SPURTABLE = 0x0098092D,
-    HCI_FM_HELIUM_GET_SPUR_TBL  = 0x0098092E,
-    V4L2_CID_PRV_IRIS_FREQ,
-    V4L2_CID_PRV_IRIS_SEEK,
-    V4L2_CID_PRV_IRIS_UPPER_BAND,
-    V4L2_CID_PRV_IRIS_LOWER_BAND,
-    V4L2_CID_PRV_IRIS_AUDIO_MODE,
-    V4L2_CID_PRV_IRIS_RMSSI,
-
-    V4L2_CID_PRV_ENABLE_SLIMBUS = 0x00980940,
-};
-
-#endif
diff --git a/jni/FmIoctlsInterface.cpp b/jni/FmIoctlsInterface.cpp
deleted file mode 100644
index 640a90f..0000000
--- a/jni/FmIoctlsInterface.cpp
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *        * Redistributions of source code must retain the above copyright
- *            notice, this list of conditions and the following disclaimer.
- *        * Redistributions in binary form must reproduce the above copyright
- *            notice, this list of conditions and the following disclaimer in the
- *            documentation and/or other materials provided with the distribution.
- *        * Neither the name of The Linux Foundation nor
- *            the names of its contributors may be used to endorse or promote
- *            products derived from this software without specific prior written
- *            permission.
-
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT ARE DISCLAIMED.    IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "FmIoctlsInterface.h"
-#include <cstdio>
-#include <cstdlib>
-#include <cstring>
-#include <fcntl.h>
-#include <utils/Log.h>
-#include <cutils/properties.h>
-#include <sys/ioctl.h>
-#include <linux/videodev2.h>
-#include <math.h>
-
-char const * const FmIoctlsInterface::LOGTAG = "FmIoctlsInterface";
-
-int  FmIoctlsInterface :: get_cur_freq
-(
-    UINT fd, long &freq
-)
-{
-    int ret;
-    struct v4l2_frequency channel;
-
-    channel.type = V4L2_TUNER_RADIO;
-    ret = ioctl(fd, VIDIOC_G_FREQUENCY, &channel);
-
-    if(ret < IOCTL_SUCC) {
-        return FM_FAILURE;
-    }else {
-        freq = (channel.frequency / TUNE_MULT);
-        return FM_SUCCESS;
-    }
-}
-
-int  FmIoctlsInterface :: set_freq
-(
-    UINT fd, ULINT freq
-)
-{
-    int ret;
-    struct v4l2_frequency channel;
-
-    channel.type = V4L2_TUNER_RADIO;
-    channel.frequency = (freq * TUNE_MULT);
-
-    ret = ioctl(fd, VIDIOC_S_FREQUENCY, &channel);
-    if(ret < IOCTL_SUCC) {
-        return FM_FAILURE;
-    }else {
-        return FM_SUCCESS;
-    }
-}
-
-int FmIoctlsInterface :: set_control
-(
-    UINT fd, UINT id, int val
-)
-{
-    int ret;
-    struct v4l2_control control;
-
-    control.value = val;
-    control.id = id;
-
-    for(int i = 0; i < 3; i++) {
-        ret = ioctl(fd, VIDIOC_S_CTRL, &control);
-        if(ret < IOCTL_SUCC) {
-           ret = FM_FAILURE;
-        }else {
-           ret = FM_SUCCESS;
-           break;
-        }
-    }
-    return ret;
-}
-
-int  FmIoctlsInterface :: set_calibration
-(
-    UINT fd
-)
-{
-    int ret;
-    FILE *cal_fp;
-    struct v4l2_ext_control ext_ctl;
-    struct v4l2_ext_controls v4l2_ctls;
-    char cal_data[CAL_DATA_SIZE] = {0};
-
-    memset(&v4l2_ctls, 0, sizeof(v4l2_ctls));
-    memset(&ext_ctl, 0, sizeof(ext_ctl));
-
-    cal_fp = fopen(CALIB_DATA_NAME, "r");
-    if(cal_fp != NULL) {
-       if(fread(&cal_data[0], 1, CAL_DATA_SIZE, cal_fp)
-           < CAL_DATA_SIZE) {
-           fclose(cal_fp);
-           ALOGE("%s: calibration file read failed\n", LOGTAG);
-           return FM_FAILURE;
-       }
-       fclose(cal_fp);
-       ext_ctl.id = V4L2_CID_PRV_SET_CALIBRATION;
-       ext_ctl.string = cal_data;
-       ext_ctl.size = CAL_DATA_SIZE;
-       v4l2_ctls.ctrl_class = V4L2_CTRL_CLASS_USER;
-       v4l2_ctls.count = 1;
-       v4l2_ctls.controls = &ext_ctl;
-       ret = ioctl(fd, VIDIOC_S_EXT_CTRLS, &v4l2_ctls);
-       if(ret < IOCTL_SUCC) {
-           ALOGE("%s: ioctl call failed\n", LOGTAG);
-           return FM_FAILURE;
-       }else {
-           return FM_SUCCESS;
-       }
-    }else {
-        return FM_SUCCESS;
-    }
-}
-
-int  FmIoctlsInterface :: get_control
-(
-    UINT fd, UINT id, long &val
-)
-{
-    int ret;
-    struct v4l2_control control;
-
-    control.id = id;
-    ret = ioctl(fd, VIDIOC_G_CTRL, &control);
-    if(ret < IOCTL_SUCC) {
-        return FM_FAILURE;
-    }else {
-        val = control.value;
-        return FM_SUCCESS;
-    }
-}
-
-int  FmIoctlsInterface :: start_search
-(
-    UINT fd, UINT dir
-)
-{
-    int ret;
-    struct v4l2_hw_freq_seek hw_seek;
-
-    hw_seek.seek_upward = dir;
-    hw_seek.type = V4L2_TUNER_RADIO;
-
-    ret = ioctl(fd, VIDIOC_S_HW_FREQ_SEEK, &hw_seek);
-    if(ret < IOCTL_SUCC) {
-        return FM_FAILURE;
-    }else {
-        return FM_SUCCESS;
-    }
-}
-
-int  FmIoctlsInterface :: set_band
-(
-    UINT fd, ULINT low, ULINT high
-)
-{
-    int ret;
-    struct v4l2_tuner tuner;
-
-    tuner.index = 0;
-    tuner.signal = 0;
-    tuner.rangelow = (low * TUNE_MULT);
-    tuner.rangehigh = (high * TUNE_MULT);
-
-    ret = ioctl(fd, VIDIOC_S_TUNER, &tuner);
-    ret = set_control(fd, V4L2_CID_PRV_REGION, 0);
-    if(ret < IOCTL_SUCC) {
-        return FM_FAILURE;
-    }else {
-        return FM_SUCCESS;
-    }
-}
-
-int FmIoctlsInterface :: get_rmssi
-(
-    UINT fd, long &rmssi
-)
-{
-    struct v4l2_tuner tuner;
-    int ret;
-
-    tuner.index = 0;
-    tuner.signal = 0;
-    ret = ioctl(fd, VIDIOC_G_TUNER, &tuner);
-    if(ret < IOCTL_SUCC) {
-        ret = FM_FAILURE;
-    }else {
-        rmssi = tuner.signal;
-        ret = FM_SUCCESS;
-    }
-    return ret;
-}
-
-int FmIoctlsInterface :: get_upperband_limit
-(
-    UINT fd, ULINT &freq
-)
-{
-    int ret;
-    struct v4l2_tuner tuner;
-
-    tuner.index = 0;
-    ret = ioctl(fd, VIDIOC_G_TUNER, &tuner);
-    if(ret < IOCTL_SUCC) {
-        return FM_FAILURE;
-    }else {
-        freq = (tuner.rangehigh / TUNE_MULT);
-        return FM_SUCCESS;
-    }
-}
-
-int FmIoctlsInterface :: get_lowerband_limit
-(
-    UINT fd, ULINT &freq
-)
-{
-    int ret;
-    struct v4l2_tuner tuner;
-
-    tuner.index = 0;
-    ret = ioctl(fd, VIDIOC_G_TUNER, &tuner);
-    if(ret < IOCTL_SUCC) {
-        return FM_FAILURE;
-    }else {
-        freq = (tuner.rangelow / TUNE_MULT);
-        return FM_SUCCESS;
-    }
-}
-
-int FmIoctlsInterface :: set_audio_mode
-(
-    UINT fd, enum AUDIO_MODE mode
-)
-{
-    int ret;
-    struct v4l2_tuner tuner;
-
-    tuner.index = 0;
-    ret = ioctl(fd, VIDIOC_G_TUNER, &tuner);
-    if(ret < IOCTL_SUCC) {
-        return FM_FAILURE;
-    }else {
-        tuner.audmode = mode;
-        ret = ioctl(fd, VIDIOC_S_TUNER, &tuner);
-        if(ret < IOCTL_SUCC) {
-            return FM_FAILURE;
-        }else {
-            return FM_SUCCESS;
-        }
-    }
-}
-
-int FmIoctlsInterface :: get_buffer
-(
-     UINT fd, char *buff, UINT len, UINT index
-)
-{
-    int ret;
-    struct v4l2_buffer v4l2_buf;
-
-    if((len < STD_BUF_SIZE) || (buff == NULL)) {
-        return FM_FAILURE;
-    }else {
-        memset(&v4l2_buf, 0, sizeof(v4l2_buf));
-        v4l2_buf.index = index;
-        v4l2_buf.type = V4L2_BUF_TYPE_PRIVATE;
-        v4l2_buf.length = STD_BUF_SIZE;
-        v4l2_buf.m.userptr = (ULINT)buff;
-        ret = ioctl(fd, VIDIOC_DQBUF, &v4l2_buf);
-        if(ret < IOCTL_SUCC) {
-            return FM_FAILURE;
-        }else {
-            return v4l2_buf.bytesused;
-        }
-    }
-}
-
-int FmIoctlsInterface :: set_ext_control
-(
-    UINT fd,
-    struct v4l2_ext_controls *v4l2_ctls
-)
-{
-    int ret;
-
-    ret = ioctl(fd, VIDIOC_S_EXT_CTRLS, v4l2_ctls);
-
-    if(ret < IOCTL_SUCC) {
-       return FM_FAILURE;
-    }else {
-       return FM_SUCCESS;
-    }
-}
-
diff --git a/jni/FmIoctlsInterface.h b/jni/FmIoctlsInterface.h
deleted file mode 100644
index eda28ee..0000000
--- a/jni/FmIoctlsInterface.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *        * Redistributions of source code must retain the above copyright
- *            notice, this list of conditions and the following disclaimer.
- *        * Redistributions in binary form must reproduce the above copyright
- *            notice, this list of conditions and the following disclaimer in the
- *            documentation and/or other materials provided with the distribution.
- *        * Neither the name of The Linux Foundation nor
- *            the names of its contributors may be used to endorse or promote
- *            products derived from this software without specific prior written
- *            permission.
-
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT ARE DISCLAIMED.    IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __FM_IOCTL_INTERFACE_H__
-#define __FM_IOCTL_INTERFACE_H__
-
-#include "FmConst.h"
-
-#include <linux/videodev2.h>
-
-class FmIoctlsInterface
-{
-    private:
-        static char const * const LOGTAG;
-    public:
-        static int start_fm_patch_dl(UINT fd);
-        static int close_fm_patch_dl(void);
-        static int get_cur_freq(UINT fd, long &freq);
-        static int set_freq(UINT fd, ULINT freq);
-        static int set_control(UINT fd, UINT id, int val);
-        static int set_calibration(UINT fd);
-        static int get_control(UINT fd, UINT id, long &val);
-        static int start_search(UINT fd, UINT dir);
-        static int set_band(UINT fd, ULINT low, ULINT high);
-        static int get_upperband_limit(UINT fd, ULINT &freq);
-        static int get_lowerband_limit(UINT fd, ULINT &freq);
-        static int set_audio_mode(UINT fd, enum AUDIO_MODE mode);
-        static int get_buffer(UINT fd, char *buff, UINT len, UINT index);
-        static int get_rmssi(UINT fd, long &rmssi);
-        static int set_ext_control(UINT fd, struct v4l2_ext_controls *v4l2_ctls);
-};
-
-//char const *FmIoctlsInterface::LOGTAG = "FmIoctlsInterface";
-
-#endif //__FM_IOCTL_INTERFACE_H__
diff --git a/jni/FmPerformanceParams.cpp b/jni/FmPerformanceParams.cpp
deleted file mode 100644
index bdd0a43..0000000
--- a/jni/FmPerformanceParams.cpp
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *        * Redistributions of source code must retain the above copyright
- *            notice, this list of conditions and the following disclaimer.
- *        * Redistributions in binary form must reproduce the above copyright
- *            notice, this list of conditions and the following disclaimer in the
- *            documentation and/or other materials provided with the distribution.
- *        * Neither the name of The Linux Foundation nor
- *            the names of its contributors may be used to endorse or promote
- *            products derived from this software without specific prior written
- *            permission.
-
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT ARE DISCLAIMED.    IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "FmPerformanceParams.h"
-#include "FmIoctlsInterface.h"
-
-#include <cstdio>
-#include <linux/videodev2.h>
-#include <utils/Log.h>
-
-signed char FmPerformanceParams :: SetAfRmssiTh
-(
-   UINT fd, unsigned short th
-)
-{
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::set_control(fd,
-                V4L2_CID_PRV_AF_RMSSI_TH, th);
-
-   return ret;
-}
-
-signed char FmPerformanceParams :: SetAfRmssiSamplesCnt
-(
-   UINT fd, unsigned char cnt
-)
-{
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::set_control(fd,
-                V4L2_CID_PRV_AF_RMSSI_SAMPLES, cnt);
-
-   return ret;
-}
-
-signed char FmPerformanceParams :: SetGoodChannelRmssiTh
-(
-   UINT fd, signed char th
-)
-{
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::set_control(fd,
-                V4L2_CID_PRV_GOOD_CH_RMSSI_TH, th);
-
-   return ret;
-}
-
-signed char FmPerformanceParams :: SetSrchAlgoType
-(
-   UINT fd, unsigned char algo
-)
-{
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::set_control(fd,
-                V4L2_CID_PRV_SRCHALGOTYPE, algo);
-
-   return ret;
-}
-
-signed char FmPerformanceParams :: SetSinrFirstStage
-(
-   UINT fd, signed char th
-)
-{
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::set_control(fd,
-                V4L2_CID_PRV_SINRFIRSTSTAGE, th);
-
-   return ret;
-}
-
-signed char FmPerformanceParams :: SetRmssiFirstStage
-(
-   UINT fd, signed char th
-)
-{
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::set_control(fd,
-                V4L2_CID_PRV_RMSSIFIRSTSTAGE, th);
-
-   return ret;
-}
-
-signed char FmPerformanceParams :: SetCf0Th12
-(
-   UINT fd, int th
-)
-{
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::set_control(fd,
-                V4L2_CID_PRV_CF0TH12, th);
-   return ret;
-}
-
-signed char FmPerformanceParams :: SetSinrSamplesCnt
-(
-   UINT fd, unsigned char cnt
-)
-{
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::set_control(fd,
-                V4L2_CID_PRV_SINR_SAMPLES, cnt);
-
-   return ret;
-}
-
-signed char FmPerformanceParams :: SetIntfLowTh
-(
-   UINT fd, unsigned char th
-)
-{
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::set_control(fd,
-                V4L2_CID_PRV_ON_CHANNEL_THRESHOLD, th);
-
-   return ret;
-}
-
-signed char FmPerformanceParams :: SetIntfHighTh
-(
-   UINT fd, unsigned char th
-)
-{
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::set_control(fd,
-                V4L2_CID_PRV_OFF_CHANNEL_THRESHOLD, th);
-   return ret;
-}
-
-signed char FmPerformanceParams :: SetSinrFinalStage
-(
-   UINT fd, signed char th
-)
-{
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::set_control(fd,
-                V4L2_CID_PRV_SINR_THRESHOLD, th);
-
-   return ret;
-}
-
-signed char FmPerformanceParams :: GetAfRmssiTh
-(
-   UINT fd, unsigned short &th
-)
-{
-   long int af_rmssi_th;
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::get_control(fd,
-                V4L2_CID_PRV_AF_RMSSI_TH, af_rmssi_th);
-   if(ret == FM_SUCCESS) {
-      th = af_rmssi_th;
-   }
-   return ret;
-}
-
-signed char FmPerformanceParams :: GetAfRmssiSamplesCnt
-(
-   UINT fd, unsigned char &cnt
-)
-{
-   long int af_samples_cnt;
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::get_control(fd,
-                V4L2_CID_PRV_AF_RMSSI_SAMPLES, af_samples_cnt);
-   if(ret == FM_SUCCESS) {
-      cnt = af_samples_cnt;
-   }
-   return ret;
-}
-
-signed char FmPerformanceParams :: GetGoodChannelRmssiTh
-(
-   UINT fd, signed char &th
-)
-{
-   long int gd_chan_rmssi_th;
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::get_control(fd,
-                V4L2_CID_PRV_GOOD_CH_RMSSI_TH, gd_chan_rmssi_th);
-   if(ret == FM_SUCCESS) {
-      th = gd_chan_rmssi_th;
-   }
-   return ret;
-}
-
-signed char FmPerformanceParams :: GetSrchAlgoType
-(
-   UINT fd, unsigned char &algo
-)
-{
-   long int srch_algo_type;
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::get_control(fd,
-                V4L2_CID_PRV_SRCHALGOTYPE, srch_algo_type);
-   if(ret == FM_SUCCESS) {
-      algo = srch_algo_type;
-   }
-   return ret;
-}
-
-signed char FmPerformanceParams :: GetSinrFirstStage
-(
-   UINT fd, signed char &th
-)
-{
-   long int sinr_first_stage;
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::get_control(fd,
-                V4L2_CID_PRV_SINRFIRSTSTAGE, sinr_first_stage);
-   if(ret == FM_SUCCESS) {
-      th = sinr_first_stage;
-   }
-   return ret;
-}
-
-signed char FmPerformanceParams :: GetRmssiFirstStage
-(
-   UINT fd, signed char &th
-)
-{
-   long int rmssi_first_stage;
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::get_control(fd,
-                V4L2_CID_PRV_RMSSIFIRSTSTAGE, rmssi_first_stage);
-   if(ret == FM_SUCCESS) {
-      th = rmssi_first_stage;
-   }
-   return ret;
-}
-
-signed char FmPerformanceParams :: GetCf0Th12
-(
-   UINT fd, int &th
-)
-{
-   long int cf0th12;
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::get_control(fd,
-                V4L2_CID_PRV_CF0TH12, cf0th12);
-   if(ret == FM_SUCCESS) {
-      th = cf0th12;
-   }
-   return ret;
-}
-
-signed char FmPerformanceParams :: GetSinrSamplesCnt
-(
-   UINT fd, unsigned char &cnt
-)
-{
-   long int sinr_samples_cnt;
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::get_control(fd,
-                V4L2_CID_PRV_SINR_SAMPLES, sinr_samples_cnt);
-   if(ret == FM_SUCCESS) {
-      cnt = sinr_samples_cnt;
-   }
-   return ret;
-}
-
-signed char FmPerformanceParams :: GetIntfLowTh
-(
-   UINT fd, unsigned char &th
-)
-{
-   long int intf_low_th;
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::get_control(fd,
-               V4L2_CID_PRV_ON_CHANNEL_THRESHOLD, intf_low_th);
-   if(ret == FM_SUCCESS) {
-      th = intf_low_th;
-   }
-   return ret;
-}
-
-signed char FmPerformanceParams :: GetIntfHighTh
-(
-   UINT fd, unsigned char &th
-)
-{
-   long int intf_high_th;
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::get_control(fd,
-               V4L2_CID_PRV_OFF_CHANNEL_THRESHOLD, intf_high_th);
-   if(ret == FM_SUCCESS) {
-      th = intf_high_th;
-   }
-   return ret;
-}
-
-signed char FmPerformanceParams :: GetIntfDet
-(
-   UINT fd, unsigned char &th
-)
-{
-   long int int_det;
-   signed char ret = FM_FAILURE;
-
-   ret = FmIoctlsInterface::get_control(fd,
-               V4L2_CID_PRV_INTDET, int_det);
-   if(ret == FM_SUCCESS) {
-      th = int_det;
-   }
-   return ret;
-}
-signed char FmPerformanceParams :: GetSinrFinalStage
-(
-   UINT fd, signed char &th
-)
-{
-   signed char ret = FM_FAILURE;
-   long int sinr;
-
-   ret = FmIoctlsInterface::get_control(fd,
-                V4L2_CID_PRV_SINR_THRESHOLD, sinr);
-
-   if(ret == FM_SUCCESS) {
-      th = sinr;
-   }
-   return ret;
-}
-
-signed char FmPerformanceParams :: SetHybridSrchList
-(
-   UINT fd,
-   unsigned int *freqs,
-   signed char *sinrs,
-   unsigned int n
-)
-{
-   struct v4l2_ext_control ext_ctl;
-   struct v4l2_ext_controls v4l2_ctls;
-   unsigned int freq;
-   signed char sinr;
-   unsigned int size = 0;
-   char *data = NULL;
-   signed char ret = FM_FAILURE;
-
-   if(n <= 0) {
-      return ret;
-   }
-   data = new char[(n * 3 + 3)];
-
-   if(data != NULL) {
-      data[size++] = 0x40;
-      data[size++] = ((n * 3) + 1);
-      data[size++] = n;
-      while((size < (n * 3 + 2)) && (freqs != NULL)
-            && (sinrs != NULL)) {
-            freq = (*freqs - 76000) / 50;
-            data[size++] = (freq & 0xff);
-            data[size++] = ((freq >> 8) & 0xff);
-            data[size++] = *sinrs;
-            freqs++;
-            sinrs++;
-      }
-      if(size == (n * 3 + 3)) {
-         ext_ctl.id = V4L2_CID_PRV_IRIS_WRITE_DEFAULT;
-         ext_ctl.string = data;
-         ext_ctl.size = size;
-         v4l2_ctls.ctrl_class = V4L2_CTRL_CLASS_USER;
-         v4l2_ctls.count = 1;
-         v4l2_ctls.controls  = &ext_ctl;
-         ret =  FmIoctlsInterface::set_ext_control(fd, &v4l2_ctls);
-         if(ret == FM_SUCCESS) {
-            ALOGE("hybrid srch list sent successfully\n");
-         }else {
-            ALOGE("hybrid srch list setting failed\n");
-         }
-      }
-   }
-
-   delete []data;
-
-   return ret;
-}
diff --git a/jni/FmPerformanceParams.h b/jni/FmPerformanceParams.h
deleted file mode 100644
index fd9ee52..0000000
--- a/jni/FmPerformanceParams.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *        * Redistributions of source code must retain the above copyright
- *            notice, this list of conditions and the following disclaimer.
- *        * Redistributions in binary form must reproduce the above copyright
- *            notice, this list of conditions and the following disclaimer in the
- *            documentation and/or other materials provided with the distribution.
- *        * Neither the name of The Linux Foundation nor
- *            the names of its contributors may be used to endorse or promote
- *            products derived from this software without specific prior written
- *            permission.
-
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT ARE DISCLAIMED.    IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __FM_PERFORMANCE_PARAMS_H__
-#define __FM_PERFORMANCE_PARAMS_H__
-
-#include "FmConst.h"
-
-class FmPerformanceParams
-{
-      private:
-      public:
-          signed char SetAfRmssiTh(UINT fd, unsigned short th);
-          signed char SetAfRmssiSamplesCnt(UINT fd, unsigned char cnt);
-          signed char SetGoodChannelRmssiTh(UINT fd, signed char th);
-          signed char SetSrchAlgoType(UINT fd, unsigned char algo);
-          signed char SetSinrFirstStage(UINT fd, signed char th);
-          signed char SetRmssiFirstStage(UINT fd, signed char th);
-          signed char SetCf0Th12(UINT fd, int th);
-          signed char SetSinrSamplesCnt(UINT fd, unsigned char cnt);
-          signed char SetIntfLowTh(UINT fd, unsigned char th);
-          signed char SetIntfHighTh(UINT fd, unsigned char th);
-          signed char SetSinrFinalStage(UINT fd, signed char th);
-          signed char SetHybridSrchList(UINT fd, unsigned int *freqs, signed char *sinrs, unsigned int n);
-
-          signed char GetAfRmssiTh(UINT fd, unsigned short &th);
-          signed char GetAfRmssiSamplesCnt(UINT fd, unsigned char &cnt);
-          signed char GetGoodChannelRmssiTh(UINT fd, signed char &th);
-          signed char GetSrchAlgoType(UINT fd, unsigned char &algo);
-          signed char GetSinrFirstStage(UINT fd, signed char &th);
-          signed char GetRmssiFirstStage(UINT fd, signed char &th);
-          signed char GetCf0Th12(UINT fd, int &th);
-          signed char GetSinrSamplesCnt(UINT fd, unsigned char &cnt);
-          signed char GetIntfLowTh(UINT fd, unsigned char &th);
-          signed char GetIntfHighTh(UINT fd, unsigned char &th);
-          signed char GetIntfDet(UINT fd, unsigned char &th);
-          signed char GetSinrFinalStage(UINT fd, signed char &th);
-};
-
-#endif //__FM_PERFORMANCE_PARAMS_H__
diff --git a/jni/android_hardware_fm.cpp b/jni/android_hardware_fm.cpp
index 2bf77c0..49538ea 100644
--- a/jni/android_hardware_fm.cpp
+++ b/jni/android_hardware_fm.cpp
@@ -32,8 +32,6 @@
 #include <nativehelper/JNIHelp.h>
 #include <utils/Log.h>
 #include "utils/misc.h"
-#include "FmIoctlsInterface.h"
-#include "ConfigFmThs.h"
 #include <cutils/properties.h>
 #include <fcntl.h>
 #include <math.h>
@@ -47,7 +45,9 @@
 #include <vector>
 #include "radio-helium.h"
 
-#define RADIO "/dev/radio0"
+typedef  unsigned int UINT;
+typedef  unsigned long ULINT;
+#define STD_BUF_SIZE  256
 #define FM_JNI_SUCCESS 0L
 #define FM_JNI_FAILURE -1L
 #define SEARCH_DOWN 0
@@ -74,6 +74,68 @@
 #define MASK_PTY                   (0x0000001F)
 #define MASK_TXREPCOUNT            (0x0000000F)
 
+enum FM_V4L2_PRV_CONTROLS
+{
+    V4L2_CID_PRV_BASE = 0x8000000,
+    V4L2_CID_PRV_SRCHMODE,
+    V4L2_CID_PRV_SCANDWELL,
+    V4L2_CID_PRV_SRCHON,
+    V4L2_CID_PRV_STATE,
+    V4L2_CID_PRV_TRANSMIT_MODE,
+    V4L2_CID_PRV_RDSGROUP_MASK,
+    V4L2_CID_PRV_REGION,
+    V4L2_CID_PRV_SIGNAL_TH,
+    V4L2_CID_PRV_SRCH_PTY,
+    V4L2_CID_PRV_SRCH_PI,
+    V4L2_CID_PRV_SRCH_CNT,
+    V4L2_CID_PRV_EMPHASIS,
+    V4L2_CID_PRV_RDS_STD,
+    V4L2_CID_PRV_CHAN_SPACING,
+    V4L2_CID_PRV_RDSON,
+    V4L2_CID_PRV_RDSGROUP_PROC,
+    V4L2_CID_PRV_LP_MODE,
+    V4L2_CID_PRV_INTDET = V4L2_CID_PRV_BASE + 25,
+    V4L2_CID_PRV_AF_JUMP = V4L2_CID_PRV_BASE + 27,
+    V4L2_CID_PRV_SOFT_MUTE = V4L2_CID_PRV_BASE + 30,
+    V4L2_CID_PRV_AUDIO_PATH = V4L2_CID_PRV_BASE + 41,
+    V4L2_CID_PRV_SINR = V4L2_CID_PRV_BASE + 44,
+    V4L2_CID_PRV_ON_CHANNEL_THRESHOLD = V4L2_CID_PRV_BASE + 0x2D,
+    V4L2_CID_PRV_OFF_CHANNEL_THRESHOLD,
+    V4L2_CID_PRV_SINR_THRESHOLD,
+    V4L2_CID_PRV_SINR_SAMPLES,
+    V4L2_CID_PRV_SPUR_FREQ,
+    V4L2_CID_PRV_SPUR_FREQ_RMSSI,
+    V4L2_CID_PRV_SPUR_SELECTION,
+    V4L2_CID_PRV_AF_RMSSI_TH = V4L2_CID_PRV_BASE + 0x36,
+    V4L2_CID_PRV_AF_RMSSI_SAMPLES,
+    V4L2_CID_PRV_GOOD_CH_RMSSI_TH,
+    V4L2_CID_PRV_SRCHALGOTYPE,
+    V4L2_CID_PRV_CF0TH12,
+    V4L2_CID_PRV_SINRFIRSTSTAGE,
+    V4L2_CID_PRV_RMSSIFIRSTSTAGE,
+    V4L2_CID_PRV_SOFT_MUTE_TH,
+    V4L2_CID_PRV_IRIS_RDSGRP_RT,
+    V4L2_CID_PRV_IRIS_RDSGRP_PS_SIMPLE,
+    V4L2_CID_PRV_IRIS_RDSGRP_AFLIST,
+    V4L2_CID_PRV_IRIS_RDSGRP_ERT,
+    V4L2_CID_PRV_IRIS_RDSGRP_RT_PLUS,
+    V4L2_CID_PRV_IRIS_RDSGRP_3A,
+
+    V4L2_CID_PRV_IRIS_READ_DEFAULT = V4L2_CTRL_CLASS_USER + 0x928,
+    V4L2_CID_PRV_IRIS_WRITE_DEFAULT,
+    V4L2_CID_PRV_SET_CALIBRATION = V4L2_CTRL_CLASS_USER + 0x92A,
+    HCI_FM_HELIUM_SET_SPURTABLE = 0x0098092D,
+    HCI_FM_HELIUM_GET_SPUR_TBL  = 0x0098092E,
+    V4L2_CID_PRV_IRIS_FREQ,
+    V4L2_CID_PRV_IRIS_SEEK,
+    V4L2_CID_PRV_IRIS_UPPER_BAND,
+    V4L2_CID_PRV_IRIS_LOWER_BAND,
+    V4L2_CID_PRV_IRIS_AUDIO_MODE,
+    V4L2_CID_PRV_IRIS_RMSSI,
+
+    V4L2_CID_PRV_ENABLE_SLIMBUS = 0x00980940,
+};
+
 enum search_dir_t {
     SEEK_UP,
     SEEK_DN,
@@ -586,13 +648,6 @@
 };
 /* native interface */
 
-static bool is_soc_pronto() {
-    if(strcmp(soc_name, "pronto") == 0)
-        return true;
-    else
-        return false;
-}
-
 static void get_property(int ptype, char *value)
 {
     std::vector<vendor_property_t> vPropList;
@@ -605,83 +660,6 @@
     }
 }
 
-static jint android_hardware_fmradio_FmReceiverJNI_acquireFdNative
-        (JNIEnv* env, jobject thiz, jstring path)
-{
-    int fd;
-    int i,err;
-    char value[PROPERTY_VALUE_MAX] = {'\0'};
-    int init_success = 0;
-    jboolean isCopy;
-    v4l2_capability cap;
-    const char* radio_path = env->GetStringUTFChars(path, &isCopy);
-
-    if(radio_path == NULL){
-        return FM_JNI_FAILURE;
-    }
-    fd = open(radio_path, O_RDONLY, O_NONBLOCK);
-    if(isCopy == JNI_TRUE){
-        env->ReleaseStringUTFChars(path, radio_path);
-    }
-    if(fd < 0){
-        return FM_JNI_FAILURE;
-    }
-    //Read the driver verions
-    err = ioctl(fd, VIDIOC_QUERYCAP, &cap);
-
-    ALOGD("VIDIOC_QUERYCAP returns :%d: version: %d \n", err , cap.version );
-
-    if (is_soc_pronto())
-    {
-       /*Set the mode for soc downloader*/
-       if (bt_configstore_intf != NULL) {
-           bt_configstore_intf->set_vendor_property(FM_PROP_HW_MODE, "normal");
-
-          /* Need to clear the hw.fm.init firstly */
-          bt_configstore_intf->set_vendor_property(FM_PROP_HW_INIT, "0");
-          bt_configstore_intf->set_vendor_property(FM_PROP_CTL_START, "fm_dl");
-
-          sched_yield();
-          for(i=0; i<45; i++) {
-              get_property(FM_PROP_HW_INIT, value);
-              if (strcmp(value, "1") == 0) {
-                  init_success = 1;
-                  break;
-              } else {
-                  usleep(WAIT_TIMEOUT);
-              }
-          }
-          ALOGE("init_success:%d after %f seconds \n", init_success, 0.2*i);
-          if(!init_success) {
-             bt_configstore_intf->set_vendor_property(FM_PROP_CTL_STOP,"fm_dl");
-             // close the fd(power down)
-             close(fd);
-             return FM_JNI_FAILURE;
-          }
-       }
-    }
-    return fd;
-}
-
-/* native interface */
-static jint android_hardware_fmradio_FmReceiverJNI_closeFdNative
-    (JNIEnv * env, jobject thiz, jint fd)
-{
-    if (is_soc_pronto() && bt_configstore_intf != NULL)
-    {
-        bt_configstore_intf->set_vendor_property(FM_PROP_CTL_STOP,"fm_dl");
-    }
-    close(fd);
-    return FM_JNI_SUCCESS;
-}
-
-static bool is_soc_cherokee() {
-    if(strcmp(soc_name, "cherokee") == 0)
-        return true;
-    else
-        return false;
-}
-
 /********************************************************************
  * Current JNI
  *******************************************************************/
@@ -692,31 +670,13 @@
 {
     int err;
     long freq;
-    if (is_soc_cherokee())
-    {
-        err = vendor_interface->get_fm_ctrl(V4L2_CID_PRV_IRIS_FREQ, (int *)&freq);
-        if (err == FM_JNI_SUCCESS) {
-            err = freq;
-        } else {
-            err = FM_JNI_FAILURE;
-            ALOGE("%s: get freq failed\n", LOG_TAG);
-        }
-    }
-    else
-    {
-        if (fd >= 0) {
-            err = FmIoctlsInterface :: get_cur_freq(fd, freq);
-            if(err < 0) {
-               err = FM_JNI_FAILURE;
-               ALOGE("%s: get freq failed\n", LOG_TAG);
-            } else {
-               err = freq;
-            }
-        } else {
-            ALOGE("%s: get freq failed because fd is negative, fd: %d\n",
-                  LOG_TAG, fd);
-            err = FM_JNI_FAILURE;
-        }
+
+    err = vendor_interface->get_fm_ctrl(V4L2_CID_PRV_IRIS_FREQ, (int *)&freq);
+    if (err == FM_JNI_SUCCESS) {
+        err = freq;
+    } else {
+        err = FM_JNI_FAILURE;
+        ALOGE("%s: get freq failed\n", LOG_TAG);
     }
     return err;
 }
@@ -726,26 +686,9 @@
     (JNIEnv * env, jobject thiz, jint fd, jint freq)
 {
     int err;
-    if (is_soc_cherokee())
-    {
-        err = vendor_interface->set_fm_ctrl(V4L2_CID_PRV_IRIS_FREQ, freq);
-    }
-    else 
-    {
-        if ((fd >= 0) && (freq > 0)) {
-            err = FmIoctlsInterface :: set_freq(fd, freq);
-            if (err < 0) {
-                ALOGE("%s: set freq failed, freq: %d\n", LOG_TAG, freq);
-                err = FM_JNI_FAILURE;
-            } else {
-                err = FM_JNI_SUCCESS;
-            }
-        } else {
-            ALOGE("%s: set freq failed because either fd/freq is negative,\
-                   fd: %d, freq: %d\n", LOG_TAG, fd, freq);
-            err = FM_JNI_FAILURE;
-        }
-    }
+
+    err = vendor_interface->set_fm_ctrl(V4L2_CID_PRV_IRIS_FREQ, freq);
+
     return err;
 }
 
@@ -755,26 +698,9 @@
 {
     int err;
     ALOGE("id(%x) value: %x\n", id, value);
-    if (is_soc_cherokee())
-    {
-        err = vendor_interface->set_fm_ctrl(id, value);
-    }
-    else
-    {
-        if ((fd >= 0) && (id >= 0)) {
-            err = FmIoctlsInterface :: set_control(fd, id, value);
-            if (err < 0) {
-                ALOGE("%s: set control failed, id: %d\n", LOG_TAG, id);
-                err = FM_JNI_FAILURE;
-            } else {
-                err = FM_JNI_SUCCESS;
-            }
-        } else {
-            ALOGE("%s: set control failed because either fd/id is negavtive,\
-                   fd: %d, id: %d\n", LOG_TAG, fd, id);
-            err = FM_JNI_FAILURE;
-        }
-    }
+
+    err = vendor_interface->set_fm_ctrl(id, value);
+
     return err;
 }
 
@@ -782,22 +708,9 @@
      (JNIEnv * env, jobject thiz, jint fd, jbyteArray buff)
 {
 
-   int err;
+   ALOGE("TODO: set calibration \n");
 
-   if (fd >= 0) {
-       err = FmIoctlsInterface :: set_calibration(fd);
-       if (err < 0) {
-           ALOGE("%s: set calibration failed\n", LOG_TAG);
-           err = FM_JNI_FAILURE;
-       } else {
-           err = FM_JNI_SUCCESS;
-       }
-   } else {
-       ALOGE("%s: set calibration failed because fd is negative, fd: %d\n",
-              LOG_TAG, fd);
-       err = FM_JNI_FAILURE;
-   }
-   return err;
+   return FM_JNI_SUCCESS;
 }
 /* native interface */
 static jint android_hardware_fmradio_FmReceiverJNI_getControlNative
@@ -807,33 +720,13 @@
     long val;
 
     ALOGE("id(%x)\n", id);
-    if (is_soc_cherokee())
-    {
-        err = vendor_interface->get_fm_ctrl(id, (int *)&val);
-        if (err < 0) {
-            ALOGE("%s: get control failed, id: %d\n", LOG_TAG, id);
-            err = FM_JNI_FAILURE;
-        } else {
-            err = val;
-        }
+    err = vendor_interface->get_fm_ctrl(id, (int *)&val);
+    if (err < 0) {
+        ALOGE("%s: get control failed, id: %d\n", LOG_TAG, id);
+        err = FM_JNI_FAILURE;
+    } else {
+        err = val;
     }
-    else
-    {
-        if ((fd >= 0) && (id >= 0)) {
-            err = FmIoctlsInterface :: get_control(fd, id, val);
-            if (err < 0) {
-                ALOGE("%s: get control failed, id: %d\n", LOG_TAG, id);
-                err = FM_JNI_FAILURE;
-            } else {
-                err = val;
-            }
-        } else {
-            ALOGE("%s: get control failed because either fd/id is negavtive,\
-                   fd: %d, id: %d\n", LOG_TAG, fd, id);
-            err = FM_JNI_FAILURE;
-        }
-    }
-
     return err;
 }
 
@@ -842,33 +735,15 @@
     (JNIEnv * env, jobject thiz, jint fd, jint dir)
 {
     int err;
-    if (is_soc_cherokee())
-    {
-        err = vendor_interface->set_fm_ctrl(V4L2_CID_PRV_IRIS_SEEK, dir);
-        if (err < 0) {
-            ALOGE("%s: search failed, dir: %d\n", LOG_TAG, dir);
-            err = FM_JNI_FAILURE;
-        } else {
-            err = FM_JNI_SUCCESS;
-        }
+
+    err = vendor_interface->set_fm_ctrl(V4L2_CID_PRV_IRIS_SEEK, dir);
+    if (err < 0) {
+        ALOGE("%s: search failed, dir: %d\n", LOG_TAG, dir);
+        err = FM_JNI_FAILURE;
+    } else {
+        err = FM_JNI_SUCCESS;
     }
-    else
-    {
-        if ((fd >= 0) && (dir >= 0)) {
-            ALOGD("startSearchNative: Issuing the VIDIOC_S_HW_FREQ_SEEK");
-            err = FmIoctlsInterface :: start_search(fd, dir);
-            if (err < 0) {
-                ALOGE("%s: search failed, dir: %d\n", LOG_TAG, dir);
-                err = FM_JNI_FAILURE;
-            } else {
-                err = FM_JNI_SUCCESS;
-            }
-        } else {
-            ALOGE("%s: search failed because either fd/dir is negative,\
-                   fd: %d, dir: %d\n", LOG_TAG, fd, dir);
-            err = FM_JNI_FAILURE;
-        }
-    }
+
     return err;
 }
 
@@ -878,32 +753,14 @@
 {
     int err;
 
-    if (is_soc_cherokee())
-    {
-        err = vendor_interface->set_fm_ctrl(V4L2_CID_PRV_SRCHON, 0);
-        if (err < 0) {
-            ALOGE("%s: cancel search failed\n", LOG_TAG);
-            err = FM_JNI_FAILURE;
-        } else {
-            err = FM_JNI_SUCCESS;
-        }
+    err = vendor_interface->set_fm_ctrl(V4L2_CID_PRV_SRCHON, 0);
+    if (err < 0) {
+        ALOGE("%s: cancel search failed\n", LOG_TAG);
+        err = FM_JNI_FAILURE;
+    } else {
+        err = FM_JNI_SUCCESS;
     }
-    else
-    {
-        if (fd >= 0) {
-            err = FmIoctlsInterface :: set_control(fd, V4L2_CID_PRV_SRCHON, 0);
-            if (err < 0) {
-                ALOGE("%s: cancel search failed\n", LOG_TAG);
-                err = FM_JNI_FAILURE;
-            } else {
-                err = FM_JNI_SUCCESS;
-            }
-        } else {
-            ALOGE("%s: cancel search failed because fd is negative, fd: %d\n",
-                   LOG_TAG, fd);
-            err = FM_JNI_FAILURE;
-        }
-    }
+
     return err;
 }
 
@@ -914,32 +771,14 @@
     int err;
     long rmssi;
 
-    if (is_soc_cherokee())
-    {
-        err = vendor_interface->get_fm_ctrl(V4L2_CID_PRV_IRIS_RMSSI, (int *)&rmssi);
-        if (err < 0) {
-            ALOGE("%s: Get Rssi failed", LOG_TAG);
-            err = FM_JNI_FAILURE;
-        } else {
-            err = FM_JNI_SUCCESS;
-        }
+    err = vendor_interface->get_fm_ctrl(V4L2_CID_PRV_IRIS_RMSSI, (int *)&rmssi);
+    if (err < 0) {
+        ALOGE("%s: Get Rssi failed", LOG_TAG);
+        err = FM_JNI_FAILURE;
+    } else {
+        err = FM_JNI_SUCCESS;
     }
-    else
-    {
-        if (fd >= 0) {
-            err = FmIoctlsInterface :: get_rmssi(fd, rmssi);
-            if (err < 0) {
-                ALOGE("%s: get rmssi failed\n", LOG_TAG);
-                err = FM_JNI_FAILURE;
-            } else {
-                err = rmssi;
-            }
-        } else {
-            ALOGE("%s: get rmssi failed because fd is negative, fd: %d\n",
-                   LOG_TAG, fd);
-            err = FM_JNI_FAILURE;
-        }
-    }
+
     return err;
 }
 
@@ -948,39 +787,21 @@
     (JNIEnv * env, jobject thiz, jint fd, jint low, jint high)
 {
     int err;
-    if (is_soc_cherokee())
-    {
-        err = vendor_interface->set_fm_ctrl(V4L2_CID_PRV_IRIS_UPPER_BAND, high);
-        if (err < 0) {
-            ALOGE("%s: set band failed, high: %d\n", LOG_TAG, high);
-            err = FM_JNI_FAILURE;
-            return err;
-        }
-        err = vendor_interface->set_fm_ctrl(V4L2_CID_PRV_IRIS_LOWER_BAND, low);
-        if (err < 0) {
-            ALOGE("%s: set band failed, low: %d\n", LOG_TAG, low);
-            err = FM_JNI_FAILURE;
-        } else {
-            err = FM_JNI_SUCCESS;
-        }
+
+    err = vendor_interface->set_fm_ctrl(V4L2_CID_PRV_IRIS_UPPER_BAND, high);
+    if (err < 0) {
+        ALOGE("%s: set band failed, high: %d\n", LOG_TAG, high);
+        err = FM_JNI_FAILURE;
+        return err;
     }
-    else
-    {
-        if ((fd >= 0) && (low >= 0) && (high >= 0)) {
-            err = FmIoctlsInterface :: set_band(fd, low, high);
-            if (err < 0) {
-                ALOGE("%s: set band failed, low: %d, high: %d\n",
-                       LOG_TAG, low, high);
-                err = FM_JNI_FAILURE;
-            } else {
-                err = FM_JNI_SUCCESS;
-            }
-        } else {
-            ALOGE("%s: set band failed because either fd/band is negative,\
-                   fd: %d, low: %d, high: %d\n", LOG_TAG, fd, low, high);
-            err = FM_JNI_FAILURE;
-        }
+    err = vendor_interface->set_fm_ctrl(V4L2_CID_PRV_IRIS_LOWER_BAND, low);
+    if (err < 0) {
+        ALOGE("%s: set band failed, low: %d\n", LOG_TAG, low);
+        err = FM_JNI_FAILURE;
+    } else {
+        err = FM_JNI_SUCCESS;
     }
+
     return err;
 }
 
@@ -990,8 +811,7 @@
 {
     int err;
     ULINT freq;
-if (is_soc_cherokee())
-{
+
     err = vendor_interface->get_fm_ctrl(V4L2_CID_PRV_IRIS_LOWER_BAND, (int *)&freq);
     if (err < 0) {
         ALOGE("%s: get lower band failed\n", LOG_TAG);
@@ -999,24 +819,7 @@
     } else {
         err = freq;
     }
-    return err;
-}
-else 
-{
-    if (fd >= 0) {
-        err = FmIoctlsInterface :: get_lowerband_limit(fd, freq);
-        if (err < 0) {
-            ALOGE("%s: get lower band failed\n", LOG_TAG);
-            err = FM_JNI_FAILURE;
-        } else {
-            err = freq;
-        }
-    } else {
-        ALOGE("%s: get lower band failed because fd is negative,\
-               fd: %d\n", LOG_TAG, fd);
-        err = FM_JNI_FAILURE;
-    }
-}
+
     return err;
 }
 
@@ -1026,8 +829,7 @@
 {
     int err;
     ULINT freq;
-if (is_soc_cherokee())
-{
+
     err = vendor_interface->get_fm_ctrl(V4L2_CID_PRV_IRIS_UPPER_BAND, (int *)&freq);
     if (err < 0) {
         ALOGE("%s: get upper band failed\n", LOG_TAG);
@@ -1035,24 +837,7 @@
     } else {
         err = freq;
     }
-    return err;
-}
-else
-{
-    if (fd >= 0) {
-        err = FmIoctlsInterface :: get_upperband_limit(fd, freq);
-        if (err < 0) {
-            ALOGE("%s: get lower band failed\n", LOG_TAG);
-            err = FM_JNI_FAILURE;
-        } else {
-            err = freq;
-        }
-    } else {
-        ALOGE("%s: get lower band failed because fd is negative,\
-               fd: %d\n", LOG_TAG, fd);
-        err = FM_JNI_FAILURE;
-    }
-}
+
     return err;
 }
 
@@ -1061,8 +846,7 @@
 {
 
     int err;
-if (is_soc_cherokee())
-{
+
     err = vendor_interface->set_fm_ctrl(V4L2_CID_PRV_IRIS_AUDIO_MODE, val);
     if (err < 0) {
         ALOGE("%s: set audio mode failed\n", LOG_TAG);
@@ -1070,51 +854,6 @@
     } else {
         err = FM_JNI_SUCCESS;
     }
-    return err;
-}
-else
-{
-    if (fd >= 0) {
-        err = FmIoctlsInterface :: set_audio_mode(fd, (enum AUDIO_MODE)val);
-        if (err < 0) {
-            err = FM_JNI_FAILURE;
-        } else {
-            err = FM_JNI_SUCCESS;
-        }
-    } else {
-        err = FM_JNI_FAILURE;
-    }
-}
-    return err;
-}
-
-
-/* native interface */
-static jint android_hardware_fmradio_FmReceiverJNI_getBufferNative
- (JNIEnv * env, jobject thiz, jint fd, jbyteArray buff, jint index)
-{
-    int err;
-    jboolean isCopy;
-    jbyte *byte_buffer = NULL;
-
-    if ((fd >= 0) && (index >= 0)) {
-        ALOGE("index: %d\n", index);
-        byte_buffer = env->GetByteArrayElements(buff, &isCopy);
-        err = FmIoctlsInterface :: get_buffer(fd,
-                                               (char *)byte_buffer,
-                                               STD_BUF_SIZE,
-                                               index);
-        if (err < 0) {
-            err = FM_JNI_FAILURE;
-        }
-        if (buff != NULL) {
-            ALOGE("Free the buffer\n");
-            env->ReleaseByteArrayElements(buff, byte_buffer, 0);
-            byte_buffer =  NULL;
-        }
-    } else {
-        err = FM_JNI_FAILURE;
-    }
 
     return err;
 }
@@ -1131,62 +870,7 @@
 /* native interface */
 static jint android_hardware_fmradio_FmReceiverJNI_setNotchFilterNative(JNIEnv * env, jobject thiz,jint fd, jint id, jboolean aValue)
 {
-    int init_success = 0,i;
-    char notch[PROPERTY_VALUE_MAX] = {0x00};
-    char value[PROPERTY_VALUE_MAX];
-    int band;
-    int err = 0;
-
-    if (is_soc_pronto() && bt_configstore_intf != NULL)
-    {
-        /* Need to clear the hw.fm.init firstly */
-        bt_configstore_intf->set_vendor_property(FM_PROP_HW_INIT, "0");
-
-        /*Enable/Disable the WAN avoidance*/
-        if (aValue)
-            bt_configstore_intf->set_vendor_property(FM_PROP_HW_MODE, "wa_enable");
-        else
-            bt_configstore_intf->set_vendor_property(FM_PROP_HW_MODE, "wa_disable");
-
-        bt_configstore_intf->set_vendor_property(FM_PROP_CTL_START, "fm_dl");
-
-        sched_yield();
-        for(i=0; i<10; i++) {
-            get_property(FM_PROP_HW_INIT, value);
-
-            if (strcmp(value, "1") == 0) {
-                init_success = 1;
-                break;
-            } else {
-                usleep(WAIT_TIMEOUT);
-            }
-        }
-       ALOGE("init_success:%d after %f seconds \n", init_success, 0.2*i);
-
-       get_property(FM_PROP_NOTCH_VALUE, notch);
-       ALOGE("Notch = %s",notch);
-       if (!strncmp("HIGH",notch,strlen("HIGH")))
-           band = HIGH_BAND;
-       else if(!strncmp("LOW",notch,strlen("LOW")))
-           band = LOW_BAND;
-       else
-           band = 0;
-
-       ALOGE("Notch value : %d", band);
-
-        if ((fd >= 0) && (id >= 0)) {
-            err = FmIoctlsInterface :: set_control(fd, id, band);
-            if (err < 0) {
-                err = FM_JNI_FAILURE;
-            } else {
-                err = FM_JNI_SUCCESS;
-            }
-        } else {
-            err = FM_JNI_FAILURE;
-        }
-    }
-
-    return err;
+    return FM_JNI_SUCCESS;
 }
 
 /*
@@ -1197,131 +881,27 @@
 static jint android_hardware_fmradio_FmReceiverJNI_setPTYNative
     (JNIEnv * env, jobject thiz, jint fd, jint pty)
 {
-    int masked_pty;
-    int err;
-
-    ALOGE("->android_hardware_fmradio_FmReceiverJNI_setPTYNative\n");
-
-    if (fd >= 0) {
-        masked_pty = pty & MASK_PTY;
-        err = FmIoctlsInterface :: set_control(fd,
-                                                V4L2_CID_RDS_TX_PTY,
-                                                masked_pty);
-        if (err < 0) {
-            err = FM_JNI_FAILURE;
-        } else {
-            err = FM_JNI_SUCCESS;
-        }
-    } else {
-        err = FM_JNI_FAILURE;
-    }
-
-    return err;
+    return FM_JNI_SUCCESS;
 }
 
 static jint android_hardware_fmradio_FmReceiverJNI_setPINative
     (JNIEnv * env, jobject thiz, jint fd, jint pi)
 {
-    int err;
-    int masked_pi;
-
-    ALOGE("->android_hardware_fmradio_FmReceiverJNI_setPINative\n");
-
-    if (fd >= 0) {
-        masked_pi = pi & MASK_PI;
-        err = FmIoctlsInterface :: set_control(fd,
-                                                V4L2_CID_RDS_TX_PI,
-                                                masked_pi);
-        if (err < 0) {
-            err = FM_JNI_FAILURE;
-        } else {
-            err = FM_JNI_SUCCESS;
-        }
-    } else {
-        err = FM_JNI_FAILURE;
-    }
-
-    return err;
+    return FM_JNI_SUCCESS;
 }
 
 static jint android_hardware_fmradio_FmReceiverJNI_startRTNative
     (JNIEnv * env, jobject thiz, jint fd, jstring radio_text, jint count )
 {
-    ALOGE("->android_hardware_fmradio_FmReceiverJNI_startRTNative\n");
 
-    struct v4l2_ext_control ext_ctl;
-    struct v4l2_ext_controls v4l2_ctls;
-    size_t len = 0;
-
-    int err = 0;
-    jboolean isCopy = false;
-    char* rt_string1 = NULL;
-    char* rt_string = (char*)env->GetStringUTFChars(radio_text, &isCopy);
-    if(rt_string == NULL ){
-        ALOGE("RT string is not valid \n");
-        return FM_JNI_FAILURE;
-    }
-    len = strlen(rt_string);
-    if (len > TX_RT_LENGTH) {
-        ALOGE("RT string length more than max size");
-        env->ReleaseStringUTFChars(radio_text, rt_string);
-        return FM_JNI_FAILURE;
-    }
-    rt_string1 = (char*) malloc(TX_RT_LENGTH + 1);
-    if (rt_string1 == NULL) {
-       ALOGE("out of memory \n");
-       env->ReleaseStringUTFChars(radio_text, rt_string);
-       return FM_JNI_FAILURE;
-    }
-    memset(rt_string1, 0, TX_RT_LENGTH + 1);
-    memcpy(rt_string1, rt_string, len);
-
-
-    ext_ctl.id     = V4L2_CID_RDS_TX_RADIO_TEXT;
-    ext_ctl.string = rt_string1;
-    ext_ctl.size   = strlen(rt_string1) + 1;
-
-    /* form the ctrls data struct */
-    v4l2_ctls.ctrl_class = V4L2_CTRL_CLASS_FM_TX,
-    v4l2_ctls.count      = 1,
-    v4l2_ctls.controls   = &ext_ctl;
-
-
-    err = ioctl(fd, VIDIOC_S_EXT_CTRLS, &v4l2_ctls );
-    env->ReleaseStringUTFChars(radio_text, rt_string);
-    if (rt_string1 != NULL) {
-        free(rt_string1);
-        rt_string1 = NULL;
-    }
-    if(err < 0){
-        ALOGE("VIDIOC_S_EXT_CTRLS for start RT returned : %d\n", err);
-        return FM_JNI_FAILURE;
-    }
-
-    ALOGD("->android_hardware_fmradio_FmReceiverJNI_startRTNative is SUCCESS\n");
     return FM_JNI_SUCCESS;
 }
 
 static jint android_hardware_fmradio_FmReceiverJNI_stopRTNative
     (JNIEnv * env, jobject thiz, jint fd )
 {
-    int err;
+    return FM_JNI_SUCCESS;
 
-    ALOGE("->android_hardware_fmradio_FmReceiverJNI_stopRTNative\n");
-    if (fd >= 0) {
-        err = FmIoctlsInterface :: set_control(fd,
-                                                V4L2_CID_PRIVATE_TAVARUA_STOP_RDS_TX_RT,
-                                                0);
-        if (err < 0) {
-            err = FM_JNI_FAILURE;
-        } else {
-            err = FM_JNI_SUCCESS;
-        }
-    } else {
-        err = FM_JNI_FAILURE;
-    }
-
-    return err;
 }
 
 static jint android_hardware_fmradio_FmReceiverJNI_startPSNative
@@ -1329,160 +909,40 @@
 {
     ALOGD("->android_hardware_fmradio_FmReceiverJNI_startPSNative\n");
 
-    struct v4l2_ext_control ext_ctl;
-    struct v4l2_ext_controls v4l2_ctls;
-    int l;
-    int err = 0;
-    jboolean isCopy = false;
-    char *ps_copy = NULL;
-    const char *ps_string = NULL;
-
-    ps_string = env->GetStringUTFChars(buff, &isCopy);
-    if (ps_string != NULL) {
-        l = strlen(ps_string);
-        if ((l > 0) && ((l + 1) == PS_LEN)) {
-             ps_copy = (char *)malloc(sizeof(char) * PS_LEN);
-             if (ps_copy != NULL) {
-                 memset(ps_copy, '\0', PS_LEN);
-                 memcpy(ps_copy, ps_string, (PS_LEN - 1));
-             } else {
-                 env->ReleaseStringUTFChars(buff, ps_string);
-                 return FM_JNI_FAILURE;
-             }
-        } else {
-             env->ReleaseStringUTFChars(buff, ps_string);
-             return FM_JNI_FAILURE;
-        }
-    } else {
-        return FM_JNI_FAILURE;
-    }
-
-    env->ReleaseStringUTFChars(buff, ps_string);
-
-    ext_ctl.id     = V4L2_CID_RDS_TX_PS_NAME;
-    ext_ctl.string = ps_copy;
-    ext_ctl.size   = PS_LEN;
-
-    /* form the ctrls data struct */
-    v4l2_ctls.ctrl_class = V4L2_CTRL_CLASS_FM_TX,
-    v4l2_ctls.count      = 1,
-    v4l2_ctls.controls   = &ext_ctl;
-
-    err = ioctl(fd, VIDIOC_S_EXT_CTRLS, &v4l2_ctls);
-    if (err < 0) {
-        ALOGE("VIDIOC_S_EXT_CTRLS for Start PS returned : %d\n", err);
-        free(ps_copy);
-        return FM_JNI_FAILURE;
-    }
-
-    ALOGD("->android_hardware_fmradio_FmReceiverJNI_startPSNative is SUCCESS\n");
-    free(ps_copy);
-
     return FM_JNI_SUCCESS;
 }
 
 static jint android_hardware_fmradio_FmReceiverJNI_stopPSNative
     (JNIEnv * env, jobject thiz, jint fd)
 {
-
-    int err;
-
-    ALOGE("->android_hardware_fmradio_FmReceiverJNI_stopPSNative\n");
-
-    if (fd >= 0) {
-        err = FmIoctlsInterface :: set_control(fd,
-                                                V4L2_CID_PRIVATE_TAVARUA_STOP_RDS_TX_PS_NAME,
-                                                0);
-        if (err < 0) {
-            err = FM_JNI_FAILURE;
-        } else {
-            err = FM_JNI_SUCCESS;
-        }
-    } else {
-        err = FM_JNI_FAILURE;
-    }
-
-    return err;
+    return FM_JNI_SUCCESS;
 }
 
 static jint android_hardware_fmradio_FmReceiverJNI_configureSpurTable
     (JNIEnv * env, jobject thiz, jint fd)
 {
-    int err;
-
     ALOGD("->android_hardware_fmradio_FmReceiverJNI_configureSpurTable\n");
 
-    if (fd >= 0) {
-        err = FmIoctlsInterface :: set_control(fd,
-                                                V4L2_CID_PRIVATE_UPDATE_SPUR_TABLE,
-                                                0);
-        if (err < 0) {
-            err = FM_JNI_FAILURE;
-        } else {
-            err = FM_JNI_SUCCESS;
-        }
-    } else {
-        err = FM_JNI_FAILURE;
-    }
-
-    return err;
+    return FM_JNI_SUCCESS;
 }
 
 static jint android_hardware_fmradio_FmReceiverJNI_setPSRepeatCountNative
     (JNIEnv * env, jobject thiz, jint fd, jint repCount)
 {
-    int masked_ps_repeat_cnt;
-    int err;
 
     ALOGE("->android_hardware_fmradio_FmReceiverJNI_setPSRepeatCountNative\n");
 
-    if (fd >= 0) {
-        masked_ps_repeat_cnt = repCount & MASK_TXREPCOUNT;
-        err = FmIoctlsInterface :: set_control(fd,
-                                                V4L2_CID_PRIVATE_TAVARUA_TX_SETPSREPEATCOUNT,
-                                                masked_ps_repeat_cnt);
-        if (err < 0) {
-            err = FM_JNI_FAILURE;
-        } else {
-            err = FM_JNI_SUCCESS;
-        }
-    } else {
-        err = FM_JNI_FAILURE;
-    }
+    return FM_JNI_SUCCESS;
 
-    return err;
 }
 
 static jint android_hardware_fmradio_FmReceiverJNI_setTxPowerLevelNative
     (JNIEnv * env, jobject thiz, jint fd, jint powLevel)
 {
-    int err;
 
     ALOGE("->android_hardware_fmradio_FmReceiverJNI_setTxPowerLevelNative\n");
 
-    if (fd >= 0) {
-        err = FmIoctlsInterface :: set_control(fd,
-                                                V4L2_CID_TUNE_POWER_LEVEL,
-                                                powLevel);
-        if (err < 0) {
-            err = FM_JNI_FAILURE;
-        } else {
-            err = FM_JNI_SUCCESS;
-        }
-    } else {
-        err = FM_JNI_FAILURE;
-    }
-
-    return err;
-}
-
-static void android_hardware_fmradio_FmReceiverJNI_configurePerformanceParams
-    (JNIEnv * env, jobject thiz, jint fd)
-{
-
-     ConfigFmThs thsObj;
-
-     thsObj.SetRxSearchAfThs(FM_PERFORMANCE_PARAMS, fd);
+    return FM_JNI_SUCCESS;
 }
 
 /* native interface */
@@ -1490,37 +950,7 @@
  (JNIEnv * env, jobject thiz, jint fd, jshortArray buff, jint count)
 {
     ALOGE("entered JNI's setSpurDataNative\n");
-    int err, i = 0;
-    struct v4l2_ext_control ext_ctl;
-    struct v4l2_ext_controls v4l2_ctls;
-    uint8_t *data;
-    short *spur_data = env->GetShortArrayElements(buff, NULL);
-    if (spur_data == NULL) {
-        ALOGE("Spur data is NULL\n");
-        return FM_JNI_FAILURE;
-    }
-    data = (uint8_t *) malloc(count);
-    if (data == NULL) {
-        ALOGE("Allocation failed for data\n");
-        return FM_JNI_FAILURE;
-    }
-    for(i = 0; i < count; i++)
-        data[i] = (uint8_t) spur_data[i];
 
-    ext_ctl.id = V4L2_CID_PRIVATE_IRIS_SET_SPURTABLE;
-    ext_ctl.string = (char*)data;
-    ext_ctl.size = count;
-    v4l2_ctls.ctrl_class = V4L2_CTRL_CLASS_USER;
-    v4l2_ctls.count   = 1;
-    v4l2_ctls.controls  = &ext_ctl;
-
-    err = ioctl(fd, VIDIOC_S_EXT_CTRLS, &v4l2_ctls );
-    if (err < 0){
-        ALOGE("Set ioctl failed\n");
-        free(data);
-        return FM_JNI_FAILURE;
-    }
-    free(data);
     return FM_JNI_SUCCESS;
 }
 
@@ -1529,9 +959,8 @@
 {
     ALOGD("%s: val = %d\n", __func__, val);
     int err = JNI_ERR;
-if (is_soc_cherokee()) {
     err = vendor_interface->set_fm_ctrl(V4L2_CID_PRV_ENABLE_SLIMBUS, val);
-}
+
     return err;
 }
 
@@ -1575,9 +1004,8 @@
 {
     ALOGD("%s: val = %d\n", __func__, val);
     int err = JNI_ERR;
-if (is_soc_cherokee()) {
     err = vendor_interface->set_fm_ctrl(V4L2_CID_PRV_SOFT_MUTE, val);
-}
+
     return err;
 }
 
@@ -1657,7 +1085,6 @@
 }
 
 static void initNative(JNIEnv *env, jobject object) {
-if (is_soc_cherokee()) {
     int status;
     ALOGI("Init native called \n");
 
@@ -1672,15 +1099,12 @@
     }
     mCallbacksObj = env->NewGlobalRef(object);
 }
-}
 
 static void cleanupNative(JNIEnv *env, jobject object) {
 
-    if (is_soc_cherokee()) {
-        if (mCallbacksObj != NULL) {
-            env->DeleteGlobalRef(mCallbacksObj);
-            mCallbacksObj = NULL;
-        }
+    if (mCallbacksObj != NULL) {
+        env->DeleteGlobalRef(mCallbacksObj);
+        mCallbacksObj = NULL;
     }
 }
 /*
@@ -1691,10 +1115,6 @@
         { "classInitNative", "()V", (void*)classInitNative},
         { "initNative", "()V", (void*)initNative},
         {"cleanupNative", "()V", (void *) cleanupNative},
-        { "acquireFdNative", "(Ljava/lang/String;)I",
-            (void*)android_hardware_fmradio_FmReceiverJNI_acquireFdNative},
-        { "closeFdNative", "(I)I",
-            (void*)android_hardware_fmradio_FmReceiverJNI_closeFdNative},
         { "getFreqNative", "(I)I",
             (void*)android_hardware_fmradio_FmReceiverJNI_getFreqNative},
         { "setFreqNative", "(II)I",
@@ -1715,8 +1135,6 @@
             (void*)android_hardware_fmradio_FmReceiverJNI_getLowerBandNative},
         { "getUpperBandNative", "(I)I",
             (void*)android_hardware_fmradio_FmReceiverJNI_getUpperBandNative},
-        { "getBufferNative", "(I[BI)I",
-            (void*)android_hardware_fmradio_FmReceiverJNI_getBufferNative},
         { "setMonoStereoNative", "(II)I",
             (void*)android_hardware_fmradio_FmReceiverJNI_setMonoStereoNative},
         { "getRawRdsNative", "(I[BI)I",
@@ -1745,8 +1163,6 @@
             (void*)android_hardware_fmradio_FmReceiverJNI_configureSpurTable},
         { "setSpurDataNative", "(I[SI)I",
             (void*)android_hardware_fmradio_FmReceiverJNI_setSpurDataNative},
-        { "configurePerformanceParams", "(I)V",
-             (void*)android_hardware_fmradio_FmReceiverJNI_configurePerformanceParams},
         { "enableSlimbus", "(II)I",
              (void*)android_hardware_fmradio_FmReceiverJNI_enableSlimbusNative},
         { "enableSoftMute", "(II)I",
diff --git a/qcom/fmradio/FmReceiver.java b/qcom/fmradio/FmReceiver.java
index b7c1613..48e4d11 100644
--- a/qcom/fmradio/FmReceiver.java
+++ b/qcom/fmradio/FmReceiver.java
@@ -366,14 +366,6 @@
            return false;
    }
 
-   public static boolean isCherokeeChip() {
-       String chip = FmReceiverJNI.getSocNameNative();
-       if (chip.equals("cherokee"))
-           return true;
-       else
-           return false;
-   }
-
    public PhoneStateListener  mDataConnectionStateListener = new PhoneStateListener(){
         public void onDataConnectionStateChanged(int state, int networkType) {
               Log.d (TAG, "state: " + Integer.toString(state) +  " networkType: " + Integer.toString(networkType));
@@ -453,7 +445,6 @@
    public FmReceiver(){
       mControl = new FmRxControls();
       mRdsData = new FmRxRdsData (sFd);
-      mRxEvents = new FmRxEventListner();
    }
 
    /**
@@ -468,79 +459,11 @@
    public FmReceiver(String devicePath,
                      FmRxEvCallbacksAdaptor callback) throws InstantiationException {
       mControl = new FmRxControls();
-      mRxEvents = new FmRxEventListner();
 
       Log.e(TAG, "FmReceiver constructor");
       //registerClient(callback);
       mCallback = callback;
-      if (isCherokeeChip()) {
-          mFmReceiverJNI = new FmReceiverJNI(mCallback);
-      }
-   }
-
-
-   /*==============================================================
-   FUNCTION:  registerClient
-   ==============================================================*/
-   /**
-   *    Registers a callback for FM receiver event
-   *           notifications.
-   *    <p>
-   *    This is a synchronous command used to register for event
-   *    notifications from the FM receiver driver. Since the FM
-   *    driver performs some tasks asynchronously, this function
-   *    allows the client to receive information asynchronously.
-   *    <p>
-   *    When calling this function, the client must pass a callback
-   *    function which will be used to deliver asynchronous events.
-   *    The argument callback must be a non-NULL value.  If a NULL
-   *    value is passed to this function, the registration will
-   *    fail.
-   *    <p>
-   *    The client can choose which events will be sent from the
-   *    receiver driver by simply implementing functions for events
-   *    it wishes to receive.
-   *    <p>
-   *    @param callback the callbacks to handle the events
-   *                               events from the FM receiver.
-   *    @return true if Callback registered, false if Callback
-   *            registration failed.
-   *    <p>
-   *    @see #acquire
-   *    @see #unregisterClient
-   *
-   */
-   public boolean registerClient(FmRxEvCallbacks callback){
-      boolean status;
-      status = super.registerClient(callback);
-      /* Do Receiver Specific Stuff here.*/
-
-      return status;
-   }
-
-   /*==============================================================
-   FUNCTION:  unregisterClient
-   ==============================================================*/
-   /**
-   *    UnRegisters a client's event notification callback.
-   *
-   *    This is a synchronous command used to unregister a client's
-   *    event callback.
-   *    <p>
-   *    @return true Always returns true.
-   *    <p>
-   *    @see #acquire
-   *    @see #release
-   *    @see #registerClient
-   *
-   */
-   public boolean unregisterClient () {
-      boolean status;
-
-      status = super.unregisterClient();
-
-      /* Do Receiver Specific Stuff here.*/
-      return status;
+      mFmReceiverJNI = new FmReceiverJNI(mCallback);
    }
 
    /*==============================================================
@@ -608,10 +531,6 @@
       status = super.enable(configSettings, FmTransceiver.FM_RX);
 
       if (status == true ) {
-          if (!isCherokeeChip()) {
-              /* Do Receiver Specific Enable Stuff here.*/
-              status = registerClient(mCallback);
-          }
           mRdsData = new FmRxRdsData(sFd);
           registerDataConnectionStateListener(app_context);
           app_context.registerReceiver(mReceiver, mIntentFilter);
@@ -672,10 +591,6 @@
       setFMPowerState(FMState_Turned_Off);
       Log.v(TAG, "reset: NEW-STATE : FMState_Turned_Off");
 
-      status = unregisterClient();
-
-      release("/dev/radio0");
-
       return status;
    }
 
@@ -1576,11 +1491,7 @@
       int piLower = 0;
       int piHigher = 0;
 
-      if(isCherokeeChip()) {
-          buff = FmReceiverJNI.getPsBuffer(buff);
-      }
-      else
-          FmReceiverJNI.getBufferNative(sFd, buff, 3);
+      buff = FmReceiverJNI.getPsBuffer(buff);
 
       /* byte is signed ;(
       *  knock down signed bits
@@ -1633,12 +1544,8 @@
       int piLower = 0;
       int piHigher = 0;
 
-      if (isCherokeeChip()) {
-          buff = FmReceiverJNI.getPsBuffer(buff);
-      }
-      else {
-          FmReceiverJNI.getBufferNative(sFd, buff, 2);
-      }
+      buff = FmReceiverJNI.getPsBuffer(buff);
+
       String rdsStr = new String(buff);
       /* byte is signed ;(
       *  knock down signed bit
@@ -1667,13 +1574,8 @@
       int rt_len;
       int i, j = 2;
       byte tag_code, tag_len, tag_start_pos;
-      if (isCherokeeChip()) {
-          rt_plus = FmReceiverJNI.getPsBuffer(rt_plus);
-      }
-      else
-      {
-          bytes_read = FmReceiverJNI.getBufferNative(sFd, rt_plus, BUF_RTPLUS);
-      }
+      rt_plus = FmReceiverJNI.getPsBuffer(rt_plus);
+
       bytes_read = rt_plus[0];
       if (bytes_read > 0) {
           if (rt_plus[RT_OR_ERT_IND] == 0)
@@ -1710,14 +1612,8 @@
       String encoding_type = "UCS-2";
       int bytes_read;
 
-      if(isCherokeeChip())
-      {
-         raw_ert = FmReceiverJNI.getPsBuffer(raw_ert);
-      }
-      else
-      {
-         bytes_read = FmReceiverJNI.getBufferNative(sFd, raw_ert, BUF_ERT);
-      }
+      raw_ert = FmReceiverJNI.getPsBuffer(raw_ert);
+
       bytes_read = raw_ert[0];
       if (bytes_read > 0) {
           ert_text = new byte[raw_ert[LEN_IND]];
@@ -1784,58 +1680,29 @@
       int  [] AfList = new int [50];
       int lowerBand, i;
       int tunedFreq, PI, size_AFLIST;
-      if (isCherokeeChip()) {
-          buff = FmReceiverJNI.getPsBuffer(buff);
-      }
-      else
-      {
-          FmReceiverJNI.getBufferNative(sFd, buff, TAVARUA_BUF_AF_LIST);
-      }
-      if (isSmdTransportLayer() || isRomeChip() || isCherokeeChip()) {
-          Log.d(TAG, "SMD transport layer or Rome chip");
 
-          tunedFreq = (buff[0] & 0xFF) |
-                      ((buff[1] & 0xFF) << 8) |
-                      ((buff[2] & 0xFF) << 16) |
-                      ((buff[3] & 0xFF) << 24) ;
-          Log.d(TAG, "tunedFreq = " +tunedFreq);
+      buff = FmReceiverJNI.getPsBuffer(buff);
 
-          PI = (buff[4] & 0xFF) |
-               ((buff[5] & 0xFF) << 8);
-          Log.d(TAG, "PI: " + PI);
+      tunedFreq = (buff[0] & 0xFF) |
+                  ((buff[1] & 0xFF) << 8) |
+                  ((buff[2] & 0xFF) << 16) |
+                  ((buff[3] & 0xFF) << 24) ;
+      Log.d(TAG, "tunedFreq = " +tunedFreq);
+       PI = (buff[4] & 0xFF) |
+           ((buff[5] & 0xFF) << 8);
+      Log.d(TAG, "PI: " + PI);
+       size_AFLIST = buff[6] & 0xFF;
+      Log.d(TAG, "size_AFLIST : " +size_AFLIST);
 
-          size_AFLIST = buff[6] & 0xFF;
-          Log.d(TAG, "size_AFLIST : " +size_AFLIST);
-
-          for (i = 0;i < size_AFLIST;i++) {
-                AfList[i] = (buff[6 + i * 4 + 1] & 0xFF) |
-                           ((buff[6 + i * 4 + 2] & 0xFF) << 8) |
-                           ((buff[6 + i * 4 + 3] & 0xFF) << 16) |
-                           ((buff[6 + i * 4 + 4] & 0xFF) << 24) ;
-                Log.d(TAG, "AF: " + AfList[i]);
-          }
-      } else {
-
-          if ((buff[4] <= 0) || (buff[4] > 25))
-              return null;
-
-          lowerBand = FmReceiverJNI.getLowerBandNative(sFd);
-          Log.d (TAG, "Low band " + lowerBand);
-
-          Log.d (TAG, "AF_buff 0: " + (buff[0] & 0xff));
-          Log.d (TAG, "AF_buff 1: " + (buff[1] & 0xff));
-          Log.d (TAG, "AF_buff 2: " + (buff[2] & 0xff));
-          Log.d (TAG, "AF_buff 3: " + (buff[3] & 0xff));
-          Log.d (TAG, "AF_buff 4: " + (buff[4] & 0xff));
-
-          for (i=0; i<buff[4]; i++) {
-               AfList[i] = ((buff[i+4] & 0xFF) * 1000) + lowerBand;
-               Log.d (TAG, "AF : " + AfList[i]);
-          }
+      for (i = 0;i < size_AFLIST;i++) {
+            AfList[i] = (buff[6 + i * 4 + 1] & 0xFF) |
+                       ((buff[6 + i * 4 + 2] & 0xFF) << 8) |
+                       ((buff[6 + i * 4 + 3] & 0xFF) << 16) |
+                       ((buff[6 + i * 4 + 4] & 0xFF) << 24) ;
+            Log.d(TAG, "AF: " + AfList[i]);
       }
 
       return AfList;
-
    }
 
    /*==============================================================
@@ -2404,39 +2271,6 @@
    }
 
    /*==============================================================
-   FUNCTION:  getStationList
-   ==============================================================*/
-   /**
-   *    Returns a frequency List of the searched stations.
-   *
-   *    <p>
-   *    This method retreives the results of the {@link
-   *    #searchStationList}. This method should be called when the
-   *    FmRxEvSearchListComplete is invoked.
-   *
-   *    <p>
-   *    @return      An array of integers that corresponds to the
-   *                    frequency of the searched Stations
-   *    @see #searchStationList
-   */
-   public int[] getStationList ()
-   {
-      int state = getFMState();
-      /* Check current state of FM device */
-      if (state == FMState_Turned_Off || state == FMState_Srch_InProg) {
-          Log.d(TAG, "getStationList: Device currently busy in executing another command.");
-          return null;
-      }
-      int[] stnList = new int [100];
-
-      stnList = mControl.stationList (sFd);
-
-      return stnList;
-
-   }
-
-
-   /*==============================================================
    FUNCTION:  getRssi
    ==============================================================*/
    /**
@@ -2929,38 +2763,6 @@
        return retval;
    }
 
-   public static void getSpurTableData()
-   {
-     int freq;
-     byte no_of_spurs;
-     int rotation_value;
-     byte lsbOfLen;
-     byte filterCoe;
-     byte isEnbale;
-     byte [] buff = new byte[STD_BUF_SIZE];
-     int i = 0;
-     FmReceiverJNI.getBufferNative(sFd, buff, 13);
-
-     freq = buff[0] & 0xFF;
-     freq |= ((buff[1] & 0xFF) << 8);
-     freq |= ((buff[2] & 0xFF) << 16);
-     Log.d (TAG, "freq = " +freq);
-     no_of_spurs =  buff[3];
-     Log.d (TAG, "no_of_spurs = " + no_of_spurs);
-     for(i = 0; i < FmConfig.no_Of_Spurs_For_Entry; i++) {
-         rotation_value =  buff[(i * 4) + 4] & 0xFF;
-         rotation_value |= ((buff[(i * 4) + 5] & 0xFF) << 8);
-         rotation_value |= ((buff[(i * 4) + 6] & 0x0F) << 12);
-         Log.d (TAG, "rotation_value = " +rotation_value);
-         lsbOfLen = (byte) (((buff[(i * 4) + 6] & 0xF0) >> 4) & 0x01);
-         Log.d (TAG, "lsbOfLen = "+lsbOfLen);
-         filterCoe = (byte) (((buff[(i * 4) + 6] & 0xF0) >> 5) & 0x03);
-         Log.d (TAG, "filterCoe = " +filterCoe);
-         isEnbale = (byte) (((buff[(i * 4) + 6] & 0xF0) >> 7) & 0x01);
-         Log.d (TAG, "spur level: " +buff[(i * 4) + 7]);
-     }
-     return;
-   }
    public void FMcontrolLowPassFilter(int state, int net_type, int enable) {
        int RatConf = getFmWanWlanCoexProp(WAN_RATCONF);
        Log.v (TAG, "FMcontrolLowPassFilter " + RatConf);
diff --git a/qcom/fmradio/FmReceiverJNI.java b/qcom/fmradio/FmReceiverJNI.java
index 73f0d34..b261423 100644
--- a/qcom/fmradio/FmReceiverJNI.java
+++ b/qcom/fmradio/FmReceiverJNI.java
@@ -319,8 +319,6 @@
         Log.d(TAG, "FmReceiverJNI constructor called");
     }
 
-    static native int acquireFdNative(String path);
-
     /**
      * native method:
      * @param fd
@@ -340,15 +338,6 @@
     static native int cancelSearchNative(int fd);
 
     /**
-     * native method: release control of device
-     * @param fd file descriptor of device
-     * @return May return
-     *             {@link #FM_JNI_SUCCESS}
-     *             {@link #FM_JNI_FAILURE}
-     */
-    static native int closeFdNative(int fd);
-
-    /**
      * native method: get frequency
      * @param fd file descriptor of device
      * @return Returns frequency in int form
@@ -394,16 +383,6 @@
     static native int startSearchNative (int fd, int dir);
 
     /**
-     * native method: get buffer
-     * @param fd file descriptor of device
-     * @param buff[] buffer
-     * @param index index of the buffer to be retrieved
-     * @return {@link #FM_JNI_SUCCESS}
-     *         {@link #FM_JNI_FAILURE}
-     */
-    static native int getBufferNative (int fd, byte  buff[], int index);
-
-    /**
      * native method: get RSSI value of the
      *                received signal
      * @param fd file descriptor of device
@@ -559,7 +538,6 @@
      *         {@link #FM_JNI_FAILURE}
      */
     static native int setSpurDataNative(int fd, short  buff[], int len);
-    static native void configurePerformanceParams(int fd);
     static native int enableSlimbus(int fd, int val);
     static native int enableSoftMute(int fd, int val);
     static native String getSocNameNative();
diff --git a/qcom/fmradio/FmRxControls.java b/qcom/fmradio/FmRxControls.java
index d99f6f4..b72e1e1 100644
--- a/qcom/fmradio/FmRxControls.java
+++ b/qcom/fmradio/FmRxControls.java
@@ -123,12 +123,11 @@
          Log.d(TAG,"setControlNative faile" + V4L2_CID_PRIVATE_TAVARUA_STATE);
          return re;
       }
-      if (FmReceiver.isCherokeeChip()) {
-          boolean ret = enableSoftMute(fd,ENABLE_SOFT_MUTE);
-          if(false == ret) {
-              Log.d(TAG,"enableSoftMute failed");
-          }
+      boolean ret = enableSoftMute(fd,ENABLE_SOFT_MUTE);
+      if(false == ret) {
+          Log.d(TAG,"enableSoftMute failed");
       }
+
       setAudioPath(fd, false);
       re = FmReceiverJNI.SetCalibrationNative(fd);
       if (re != 0)
@@ -442,69 +441,6 @@
 
    }
 
-   /* Read search list from buffer */
-   public int[] stationList (int fd)
-   {
-         int freq = 0;
-         int i=0, j = 0;
-         int station_num = 0;
-         float real_freq = 0;
-         int [] stationList;
-         byte [] sList = new byte[100];
-         int tmpFreqByte1=0;
-         int tmpFreqByte2=0;
-         float lowBand, highBand;
-
-
-         lowBand  = (float) (FmReceiverJNI.getLowerBandNative(fd) / 1000.00);
-         highBand = (float) (FmReceiverJNI.getUpperBandNative(fd) / 1000.00);
-
-         Log.d(TAG, "lowBand: " + lowBand);
-         Log.d(TAG, "highBand: " + highBand);
-
-         FmReceiverJNI.getBufferNative(fd, sList, 0);
-
-         if ((int)sList[0] >0) {
-            station_num = (int)sList[0];
-         }
-         stationList = new int[station_num+1];
-         Log.d(TAG, "station_num: " + station_num);
-
-         for (i=0;i<station_num;i++) {
-            freq = 0;
-            Log.d(TAG, " Byte1 = " + sList[i*2+1]);
-            Log.d(TAG, " Byte2 = " + sList[i*2+2]);
-            tmpFreqByte1 = sList[i*2+1] & 0xFF;
-            tmpFreqByte2 = sList[i*2+2] & 0xFF;
-            Log.d(TAG, " tmpFreqByte1 = " + tmpFreqByte1);
-            Log.d(TAG, " tmpFreqByte2 = " + tmpFreqByte2);
-            freq = (tmpFreqByte1 & 0x03) << 8;
-            freq |= tmpFreqByte2;
-            Log.d(TAG, " freq: " + freq);
-            real_freq  = (float)(freq * 50) + (lowBand * FREQ_MUL);//tuner.rangelow * FREQ_MUL;
-            Log.d(TAG, " real_freq: " + real_freq);
-            if ( (real_freq < (lowBand * FREQ_MUL)) || (real_freq > (highBand * FREQ_MUL)) ) {
-               Log.e(TAG, "Frequency out of band limits");
-            }
-            else {
-               stationList[j] = (int)(real_freq);
-               Log.d(TAG, " stationList: " + stationList[j]);
-               j++;
-            }
-         }
-
-        try {
-          // mark end of list
-           stationList[station_num] = 0;
-        }
-        catch (ArrayIndexOutOfBoundsException e) {
-           Log.d(TAG, "ArrayIndexOutOfBoundsException !!");
-        }
-
-        return stationList;
-
-   }
-
 
    /* configure various search parameters and start search */
    public int searchStations (int fd, int mode, int dwell,
diff --git a/qcom/fmradio/FmRxEventListner.java b/qcom/fmradio/FmRxEventListner.java
deleted file mode 100644
index c178f17..0000000
--- a/qcom/fmradio/FmRxEventListner.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * Copyright (c) 2009,2012-2014, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *    * Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *    * Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *    * Neither the name of The Linux Foundation nor
- *      the names of its contributors may be used to endorse or promote
- *      products derived from this software without specific prior written
- *      permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package qcom.fmradio;
-import qcom.fmradio.FmReceiver;
-import qcom.fmradio.FmTransceiver;
-import java.util.Arrays;
-import android.util.Log;
-
-
-class FmRxEventListner {
-
-    private final int EVENT_LISTEN = 1;
-
-    private final int STD_BUF_SIZE = 256;
-
-    private enum FmRxEvents {
-      READY_EVENT,
-      TUNE_EVENT,
-      SEEK_COMPLETE_EVENT,
-      SCAN_NEXT_EVENT,
-      RAW_RDS_EVENT,
-      RT_EVENT,
-      PS_EVENT,
-      ERROR_EVENT,
-      BELOW_TH_EVENT,
-      ABOVE_TH_EVENT,
-      STEREO_EVENT,
-      MONO_EVENT,
-      RDS_AVAL_EVENT,
-      RDS_NOT_AVAL_EVENT,
-      TAVARUA_EVT_NEW_SRCH_LIST,
-      TAVARUA_EVT_NEW_AF_LIST
-    }
-
-    private Thread mThread;
-    private static final String TAG = "FMRadio";
-
-    public void startListner (final int fd, final FmRxEvCallbacks cb) {
-        /* start a thread and listen for messages */
-        mThread = new Thread(){
-            public void run(){
-                byte [] buff = new byte[STD_BUF_SIZE];
-                Log.d(TAG, "Starting listener " + fd);
-
-                while ((!Thread.currentThread().isInterrupted())) {
-
-                    try {
-                        int index = 0;
-                        int state = 0;
-                        Arrays.fill(buff, (byte)0x00);
-                        int freq = 0;
-                        int eventCount = FmReceiverJNI.getBufferNative (fd, buff, EVENT_LISTEN);
-
-                        if (eventCount >= 0)
-                            Log.d(TAG, "Received event. Count: " + eventCount);
-
-                        for (  index = 0; index < eventCount; index++ ) {
-                            Log.d(TAG, "Received <" +buff[index]+ ">" );
-
-                            switch(buff[index]){
-                            case 0:
-                                Log.d(TAG, "Got READY_EVENT");
-                                if(FmTransceiver.getFMPowerState() == FmTransceiver.subPwrLevel_FMRx_Starting) {
-                                    /*Set the state as FMRxOn */
-                                    FmTransceiver.setFMPowerState(FmTransceiver.FMState_Rx_Turned_On);
-                                    Log.v(TAG, "RxEvtList: CURRENT-STATE : FMRxStarting ---> NEW-STATE : FMRxOn");
-                                    cb.FmRxEvEnableReceiver();
-                                    FmReceiverJNI.configurePerformanceParams(fd);
-                                }
-                                else if (FmTransceiver.getFMPowerState() == FmTransceiver.subPwrLevel_FMTurning_Off) {
-                                    /*Set the state as FMOff */
-                                    FmTransceiver.setFMPowerState(FmTransceiver.FMState_Turned_Off);
-                                    Log.v(TAG, "RxEvtList: CURRENT-STATE : FMTurningOff ---> NEW-STATE : FMOff");
-                                    FmTransceiver.release("/dev/radio0");
-                                    cb.FmRxEvDisableReceiver();
-                                    Thread.currentThread().interrupt();
-                                }
-                                break;
-                            case 1:
-                                Log.d(TAG, "Got TUNE_EVENT");
-                                freq = FmReceiverJNI.getFreqNative(fd);
-                                state = FmReceiver.getSearchState();
-                                switch(state) {
-                                   case FmTransceiver.subSrchLevel_SrchAbort:
-                                        Log.v(TAG, "Current state is SRCH_ABORTED");
-                                        Log.v(TAG, "Aborting on-going search command...");
-                                        /* intentional fall through */
-                                   case FmTransceiver.subSrchLevel_SeekInPrg :
-                                        Log.v(TAG, "Current state is " + state);
-                                        FmReceiver.setSearchState(FmTransceiver.subSrchLevel_SrchComplete);
-                                        Log.v(TAG, "RxEvtList: CURRENT-STATE : Search ---> NEW-STATE : FMRxOn");
-                                        cb.FmRxEvSearchComplete(freq);
-                                        break;
-                                   default:
-                                        if (freq > 0)
-                                            cb.FmRxEvRadioTuneStatus(freq);
-                                        else
-                                            Log.e(TAG, "get frequency command failed");
-                                        break;
-                                }
-                                break;
-                            case 2:
-                                Log.d(TAG, "Got SEEK_COMPLETE_EVENT");
-                                state = FmReceiver.getSearchState();
-                                switch(state) {
-                                   case FmTransceiver.subSrchLevel_ScanInProg:
-                                      Log.v(TAG, "Current state is " + state);
-                                      FmReceiver.setSearchState(FmTransceiver.subSrchLevel_SrchComplete);
-                                      Log.v(TAG, "RxEvtList: CURRENT-STATE : Search ---> NEW-STATE :FMRxOn");
-                                      cb.FmRxEvSearchComplete(FmReceiverJNI.getFreqNative(fd));
-                                      break;
-                                   case FmTransceiver.subSrchLevel_SrchAbort:
-                                      Log.v(TAG, "Current state is SRCH_ABORTED");
-                                      Log.v(TAG, "Aborting on-going search command...");
-                                      FmReceiver.setSearchState(FmTransceiver.subSrchLevel_SrchComplete);
-                                      Log.v(TAG, "RxEvtList: CURRENT-STATE : Search ---> NEW-STATE : FMRxOn");
-                                      cb.FmRxEvSearchComplete(FmReceiverJNI.getFreqNative(fd));
-                                      break;
-                                }
-                                break;
-                            case 3:
-                                Log.d(TAG, "Got SCAN_NEXT_EVENT");
-                                cb.FmRxEvSearchInProgress();
-                                break;
-                            case 4:
-                                Log.d(TAG, "Got RAW_RDS_EVENT");
-                                cb.FmRxEvRdsGroupData();
-                                break;
-                            case 5:
-                                Log.d(TAG, "Got RT_EVENT");
-                                cb.FmRxEvRdsRtInfo();
-                                break;
-                            case 6:
-                                Log.d(TAG, "Got PS_EVENT");
-                                cb.FmRxEvRdsPsInfo();
-                                break;
-                            case 7:
-                                Log.d(TAG, "Got ERROR_EVENT");
-                                break;
-                            case 8:
-                                Log.d(TAG, "Got BELOW_TH_EVENT");
-                                cb.FmRxEvServiceAvailable (false);
-                                break;
-                            case 9:
-                                Log.d(TAG, "Got ABOVE_TH_EVENT");
-                                cb.FmRxEvServiceAvailable(true);
-                                break;
-                            case 10:
-                                Log.d(TAG, "Got STEREO_EVENT");
-                                cb.FmRxEvStereoStatus (true);
-                                break;
-                            case 11:
-                                Log.d(TAG, "Got MONO_EVENT");
-                                cb.FmRxEvStereoStatus (false);
-                                break;
-                            case 12:
-                                Log.d(TAG, "Got RDS_AVAL_EVENT");
-                                cb.FmRxEvRdsLockStatus (true);
-                                break;
-                            case 13:
-                                Log.d(TAG, "Got RDS_NOT_AVAL_EVENT");
-                                cb.FmRxEvRdsLockStatus (false);
-                                break;
-                            case 14:
-                                Log.d(TAG, "Got NEW_SRCH_LIST");
-                                state = FmReceiver.getSearchState();
-                                switch(state) {
-                                   case FmTransceiver.subSrchLevel_SrchListInProg:
-                                      Log.v(TAG, "FmRxEventListener: Current state is AUTO_PRESET_INPROGRESS");
-                                      FmReceiver.setSearchState(FmTransceiver.subSrchLevel_SrchComplete);
-                                      Log.v(TAG, "RxEvtList: CURRENT-STATE : Search ---> NEW-STATE : FMRxOn");
-                                      cb.FmRxEvSearchListComplete ();
-                                      break;
-                                   case FmTransceiver.subSrchLevel_SrchAbort:
-                                      Log.v(TAG, "Current state is SRCH_ABORTED");
-                                      Log.v(TAG, "Aborting on-going SearchList command...");
-                                      FmReceiver.setSearchState(FmTransceiver.subSrchLevel_SrchComplete);
-                                      Log.v(TAG, "RxEvtList: CURRENT-STATE : Search ---> NEW-STATE : FMRxOn");
-                                      cb.FmRxEvSearchCancelled();
-                                      break;
-                                }
-                                break;
-                            case 15:
-                                Log.d(TAG, "Got NEW_AF_LIST");
-                                cb.FmRxEvRdsAfInfo();
-                                break;
-                            case 18:
-                                Log.d(TAG, "Got RADIO_DISABLED");
-                                if (FmTransceiver.getFMPowerState() == FmTransceiver.subPwrLevel_FMTurning_Off) {
-                                    FmTransceiver.release("/dev/radio0");
-                                    /*Set the state as FMOff */
-                                    FmTransceiver.setFMPowerState(FmTransceiver.FMState_Turned_Off);
-                                    cb.FmRxEvDisableReceiver();
-                                    Log.v(TAG, "RxEvtList: CURRENT-STATE : FMTurningOff ---> NEW-STATE : FMOff");
-                                    Thread.currentThread().interrupt();
-                                } else {
-                                    Log.d(TAG, "Unexpected RADIO_DISABLED recvd");
-                                    FmTransceiver.release("/dev/radio0");
-                                    cb.FmRxEvRadioReset();
-                                    FmTransceiver.setFMPowerState(FmTransceiver.FMState_Turned_Off);
-                                    Log.v(TAG, "RxEvtList: CURRENT-STATE : FMRxOn ---> NEW-STATE : FMOff");
-                                    Thread.currentThread().interrupt();
-                                }
-                                break;
-                            case 19:
-                                FmTransceiver.setRDSGrpMask(0);
-                                break;
-                            case 20:
-                                Log.d(TAG, "got RT plus event");
-                                cb.FmRxEvRTPlus();
-                                break;
-                            case 21:
-                                Log.d(TAG, "got eRT event");
-                                cb.FmRxEvERTInfo();
-                                break;
-                            case 22:
-                                Log.d(TAG, "got IRIS_EVT_SPUR_TBL event");
-                                FmReceiver.getSpurTableData();
-                                break;
-                            default:
-                                Log.d(TAG, "Unknown event");
-                                break;
-                            }
-                        }//end of for
-                    } catch ( Exception ex ) {
-                        Log.d( TAG,  "RunningThread InterruptedException");
-                        ex.printStackTrace();
-                        Thread.currentThread().interrupt();
-                    }
-                }
-            }
-        };
-        mThread.start();
-    }
-
-    public void stopListener(){
-        //mThread.stop();
-        //Thread stop is deprecate API
-        //Interrupt the thread and check for the thread status
-        // and return from the run() method to stop the thread
-        //properly
-        Log.d( TAG,  "stopping the Listener\n");
-        if( mThread != null ) {
-         mThread.interrupt();
-        }
-    }
-
-}
diff --git a/qcom/fmradio/FmTransceiver.java b/qcom/fmradio/FmTransceiver.java
index dcc46cc..9b29a25 100644
--- a/qcom/fmradio/FmTransceiver.java
+++ b/qcom/fmradio/FmTransceiver.java
@@ -139,168 +139,13 @@
    private static final int V4L2_CID_PRIVATE_TAVARUA_SET_NOTCH_FILTER = V4L2_CID_PRIVATE_BASE + 40;
 
    private final String TAG = "FmTransceiver";
-   private final String V4L2_DEVICE = "/dev/radio0";
 
    protected static int sFd;
    protected FmRxControls mControl;
    protected int mPowerMode;
-   protected FmRxEventListner mRxEvents;
    protected FmRxRdsData mRdsData;
-   protected FmTxEventListner mTxEvents;
-
    public static final int ERROR = -1;
 
-   /*==============================================================
-   FUNCTION:  acquire
-   ==============================================================*/
-   /**
-   *    Allows access to the V4L2 FM device.
-   *
-   *    This synchronous call allows a client to use the V4L2 FM
-   *    device. This must be the first call issued by the client
-   *    before any receiver interfaces can be used.
-   *
-   *    This call also powers up the FM Module.
-   *
-   *    @param device String that is path to radio device
-   *
-   *    @return true if V4L2 FM device acquired, false if V4L2 FM
-   *            device could not be acquired, possibly acquired by
-   *            other client
-   *    @see   #release
-   *
-   */
-   protected boolean acquire(String device){
-      boolean bStatus = true;
-      if (sFd <= 0) { // if previous open fails fd will be -ve.
-         sFd = FmReceiverJNI.acquireFdNative(V4L2_DEVICE);
-
-         if (sFd > 0) {
-            Log.d(TAG, "Opened "+ sFd);
-            bStatus = true;
-         }
-         else {
-            Log.d(TAG, "Fail to Open "+ sFd);
-	    bStatus = false;
-         }
-      }
-      else {
-         Log.d(TAG, "Already Opened:" + sFd);
-         /*This should be case
-          * Where User try to opne the device
-          * secondtime.
-          * Case where Tx and Rx try to
-          * acquire the device
-          */
-         bStatus = false;
-       }
-      return (bStatus);
-   }
-
-   /*==============================================================
-   FUNCTION:  release
-   ==============================================================*/
-   /**
-   *    Releases access to the V4L2 FM device.
-   *    <p>
-   *    This synchronous call allows a client to release control of
-   *    V4L2 FM device.  This function should be called when the FM
-   *    device is no longer needed. This should be the last call
-   *    issued by the FM client. Once called, the client must call
-   *    #acquire to re-aquire the V4L2 device control before the
-   *    FM device can be used again.
-   *    <p>
-   *    Before the client can release control of the FM receiver
-   *    interface, it must disable the FM receiver, if the client
-   *    enabled it, and unregister any registered callback.  If the
-   *    client has ownership of the receiver, it will automatically
-   *    be returned to the system.
-   *    <p>
-   *    This call also powers down the FM Module.
-   *    <p>
-   *    @param device String that is path to radio device
-   *    @return true if V4L2 FM device released, false if V4L2 FM
-   *            device could not be released
-   *    @see   #acquire
-   */
-   static boolean release(String device) {
-      if (sFd!=0)
-      {
-         FmReceiverJNI.closeFdNative(sFd);
-         sFd = 0;
-         Log.d("FmTransceiver", "Turned off: " + sFd);
-      } else
-      {
-         Log.d("FmTransceiver", "Error turning off");
-      }
-      return true;
-   }
-
-   /*==============================================================
-   FUNCTION:  registerClient
-   ==============================================================*/
-   /**
-   *    Registers a callback for FM receiver event notifications.
-   *    <p>
-   *    This is a synchronous call used to register for event
-   *    notifications from the FM receiver driver. Since the FM
-   *    driver performs some tasks asynchronously, this function
-   *    allows the client to receive information asynchronously.
-   *    <p>
-   *    When calling this function, the client must pass a callback
-   *    function which will be used to deliver asynchronous events.
-   *    The argument callback must be a non-NULL value.  If a NULL
-   *    value is passed to this function, the registration will
-   *    fail.
-   *    <p>
-   *    The client can choose which events will be sent from the
-   *    receiver driver by simply implementing functions for events
-   *    it wishes to receive.
-   *    <p>
-   *
-   *    @param callback the callback to handle the events events
-   *                    from the FM receiver.
-   *    @return true if Callback registered, false if Callback
-   *            registration failed.
-   *
-   *    @see #acquire
-   *    @see #unregisterClient
-   *
-   */
-   public boolean registerClient(FmRxEvCallbacks callback){
-      boolean bReturnStatus = false;
-      if (callback!=null)
-      {
-         mRxEvents.startListner(sFd, callback);
-         bReturnStatus = true;
-      } else
-      {
-         Log.d(TAG, "Null, do nothing");
-      }
-      return bReturnStatus;
-   }
-
-   /*==============================================================
-   FUNCTION:  unregisterClient
-   ==============================================================*/
-   /**
-   *    Unregisters a client's event notification callback.
-   *    <p>
-   *    This is a synchronous call used to unregister a client's
-   *    event callback.
-   *    <p>
-   *    @return true always.
-   *
-   *    @see  #acquire
-   *    @see  #release
-   *    @see  #registerClient
-   *
-   */
-   public boolean unregisterClient () {
-      mRxEvents.stopListener();
-      return true;
-   }
-
 
    /*==============================================================
    FUNCTION:  registerTransmitClient
@@ -338,7 +183,6 @@
       boolean bReturnStatus = false;
       if (callback!=null)
       {
-         mTxEvents.startListner(sFd, callback);
          bReturnStatus = true;
       } else
       {
@@ -364,7 +208,6 @@
    *
    */
    public boolean unregisterTransmitClient () {
-      mTxEvents.stopListener();
       return true;
    }
 
@@ -405,12 +248,6 @@
       boolean status;
       int ret;
 
-      if (!FmReceiver.isCherokeeChip()) {
-          //Acquire the deviceon Enable
-          if (!acquire("/dev/radio0")) {
-              return false;
-          }
-      }
       if (new File("/etc/fm/SpurTableFile.txt").isFile()) {
           Log.d(TAG, "Send Spur roation table");
           FmConfig.fmSpurConfig(sFd);
@@ -421,7 +258,6 @@
       ret = mControl.fmOn(sFd, device);
       if (ret < 0) {
           Log.d(TAG, "turning on failed");
-          FmReceiverJNI.closeFdNative(sFd);
           sFd = 0;
           return false;
       }
@@ -430,7 +266,6 @@
       status = FmConfig.fmConfigure (sFd, configSettings);
       if (!status) {
           Log.d(TAG, "fmConfigure failed");
-          FmReceiverJNI.closeFdNative(sFd);
           sFd = 0;
       }
       return status;
diff --git a/qcom/fmradio/FmTransmitter.java b/qcom/fmradio/FmTransmitter.java
index 287da3c..e16d62d 100644
--- a/qcom/fmradio/FmTransmitter.java
+++ b/qcom/fmradio/FmTransmitter.java
@@ -106,7 +106,6 @@
     */
    public FmTransmitter(String path, FmTransmitterCallbacksAdaptor callbacks) throws InstantiationException{
 
-       mTxEvents = new FmTxEventListner();
        mControl = new FmRxControls();
        mTxCallbacks = callbacks;
    }
@@ -312,7 +311,6 @@
       setFMPowerState(FMState_Turned_Off);
       Log.v(TAG, "reset: NEW-STATE : FMState_Turned_Off");
       status = unregisterTransmitClient();
-      release("/dev/radio0");
       return status;
    }
 
diff --git a/qcom/fmradio/FmTxEventListner.java b/qcom/fmradio/FmTxEventListner.java
deleted file mode 100644
index 998ef30..0000000
--- a/qcom/fmradio/FmTxEventListner.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (c) 2011,2012, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *    * Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *    * Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *    * Neither the name of The Linux Foundation nor
- *      the names of its contributors may be used to endorse or promote
- *      products derived from this software without specific prior written
- *      permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package qcom.fmradio;
-
-import android.util.Log;
-import qcom.fmradio.FmTransceiver;
-
-class FmTxEventListner {
-
-
-    private final int EVENT_LISTEN  = 1;
-
-    private final int TUNE_EVENT = 1;                   /*Tune completion event*/
-    private final int TXRDSDAT_EVENT = 16;               /*RDS Group available event*/
-    private final int TXRDSDONE_EVENT = 17;              /*RDS group complete event */
-    private final int RADIO_DISABLED = 18;
-    private final int READY_EVENT = 0;
-    private byte []buff = new byte[128];
-    private Thread mThread;
-    private static final String TAG = "FMTxEventListner";
-
-    public void startListner (final int fd, final FmTransmitterCallbacks cb) {
-        /* start a thread and listen for messages */
-        mThread = new Thread(){
-            public void run(){
-
-                Log.d(TAG, "Starting Tx Event listener " + fd);
-
-                while((!Thread.currentThread().isInterrupted())) {
-                   try {
-                        int index = 0;
-                        int freq = 0;
-                        Log.d(TAG, "getBufferNative called");
-                        int eventCount = FmReceiverJNI.getBufferNative
-                                                       (fd, buff, EVENT_LISTEN);
-                        Log.d(TAG, "Received event. Count: " + eventCount);
-
-                        for(index = 0; index < eventCount; index++) {
-                            Log.d(TAG, "Received <" +buff[index]+ ">" );
-                            switch(buff[index]){
-                                case READY_EVENT:
-                                   Log.d(TAG, "Got RADIO_ENABLED");
-                                   if(FmTransceiver.getFMPowerState() ==
-                                       FmTransceiver.subPwrLevel_FMTx_Starting) {
-                                      /*Set the state as FMRxOn */
-                                      FmTransceiver.setFMPowerState
-                                         (FmTransceiver.FMState_Tx_Turned_On);
-                                      Log.v(TAG, "TxEvtList: CURRENT-STATE:" +
-                                            "FMTxStarting ---> NEW-STATE : FMTxOn");
-                                      cb.FmTxEvRadioEnabled();
-                                   }
-                                   break;
-                                case TUNE_EVENT:
-                                   Log.d(TAG, "Got TUNE_EVENT");
-                                   freq = FmReceiverJNI.getFreqNative(fd);
-                                   if (freq > 0)
-                                       cb.FmTxEvTuneStatusChange(freq);
-                                   else
-                                       Log.e(TAG, "get frqency cmd failed");
-                                   break;
-                                case TXRDSDAT_EVENT:
-                                   Log.d(TAG, "Got TXRDSDAT_EVENT");
-                                   cb.FmTxEvRDSGroupsAvailable();
-                                   break;
-                                case TXRDSDONE_EVENT:
-                                   Log.d(TAG, "Got TXRDSDONE_EVENT");
-                                   cb.FmTxEvContRDSGroupsComplete();
-                                   break;
-                                case RADIO_DISABLED:
-                                   Log.d(TAG, "Got RADIO_DISABLED");
-                                   if(FmTransceiver.getFMPowerState() ==
-                                      FmTransceiver.subPwrLevel_FMTurning_Off) {
-                                      /*Set the state as FMOff */
-                                      FmTransceiver.setFMPowerState
-                                            (FmTransceiver.FMState_Turned_Off);
-                                      Log.v(TAG, "TxEvtList:CURRENT-STATE :" +
-                                            "FMTurningOff ---> NEW-STATE: FMOff");
-                                      FmTransceiver.release("/dev/radio0");
-                                      cb.FmTxEvRadioDisabled();
-                                      Thread.currentThread().interrupt();
-                                   } else {
-                                      Log.d(TAG, "Unexpected RADIO_DISABLED recvd");
-                                      cb.FmTxEvRadioReset();
-                                   }
-                                   break;
-                                default:
-                                   Log.d(TAG, "Unknown event");
-                                   break;
-                            }//switch
-                        }//for
-                      }catch (Exception ex) {
-                        Log.d( TAG,  "RunningThread InterruptedException");
-                        Thread.currentThread().interrupt();
-                      }//try
-               }//while
-               Log.d(TAG, "Came out of the while loop");
-          }
-        };
-        mThread.start();
-    }
-
-    public void stopListener(){
-        Log.d(TAG, "Thread Stopped\n");
-        //Thread stop is deprecate API
-        //Interrupt the thread and check for the thread status
-        // and return from the run() method to stop the thread
-        //properly
-        Log.d(TAG, "stopping the Listener\n");
-
-        if(mThread != null) {
-            mThread.interrupt();
-        }
-        Log.d(TAG, "Thread Stopped\n");
-    }
-}
