if (test_bit(ST_REG_IN_PROGRESS, &st_gdata->st_state)) {
                pr_info(" ST_REG_IN_PROGRESS:%d ", new_proto->chnl_id);
                /* fw download in progress */
-               st_kim_chip_toggle(new_proto->chnl_id, KIM_GPIO_ACTIVE);
 
                add_channel_to_table(st_gdata, new_proto);
                st_gdata->protos_registered++;
                        return -EINVAL;
                }
 
-               /* the chnl_id might require other gpios to be toggled
-                */
-               st_kim_chip_toggle(new_proto->chnl_id, KIM_GPIO_ACTIVE);
-
                clear_bit(ST_REG_IN_PROGRESS, &st_gdata->st_state);
                st_recv = st_int_recv;
 
 
        st_gdata->protos_registered--;
        remove_channel_from_table(st_gdata, proto);
-
-       /* kim ignores BT in the below function
-        * and handles the rest, BT is toggled
-        * only in kim_start and kim_stop
-        */
-       st_kim_chip_toggle(proto->chnl_id, KIM_GPIO_INACTIVE);
        spin_unlock_irqrestore(&st_gdata->lock, flags);
 
        if ((st_gdata->protos_registered == ST_EMPTY) &&
 
 
 /**********************************************************************/
 /* functions called from ST core */
-/* function to toggle the GPIO
- * needs to know whether the GPIO is active high or active low
- */
-void st_kim_chip_toggle(enum proto_type type, enum kim_gpio_state state)
-{
-       struct platform_device  *kim_pdev;
-       struct kim_data_s       *kim_gdata;
-       pr_info(" %s ", __func__);
-
-       kim_pdev = st_get_plat_device(0);
-       kim_gdata = dev_get_drvdata(&kim_pdev->dev);
-
-       if (kim_gdata->gpios[type] == -1) {
-               pr_info("gpio not requested for protocol %d", type);
-               return;
-       }
-       switch (type) {
-       case ST_BT:
-               /*Do Nothing */
-               break;
-
-       case ST_FM:
-               if (state == KIM_GPIO_ACTIVE)
-                       gpio_set_value(kim_gdata->gpios[ST_FM], GPIO_LOW);
-               else
-                       gpio_set_value(kim_gdata->gpios[ST_FM], GPIO_HIGH);
-               break;
-
-       case ST_GPS:
-               if (state == KIM_GPIO_ACTIVE)
-                       gpio_set_value(kim_gdata->gpios[ST_GPS], GPIO_HIGH);
-               else
-                       gpio_set_value(kim_gdata->gpios[ST_GPS], GPIO_LOW);
-               break;
-
-       case ST_MAX_CHANNELS:
-       default:
-               break;
-       }
-
-       return;
-}
-
 /* called from ST Core, when REG_IN_PROGRESS (registration in progress)
  * can be because of
  * 1. response to read local version
 
        do {
                /* Configure BT nShutdown to HIGH state */
-               gpio_set_value(kim_gdata->gpios[ST_BT], GPIO_LOW);
+               gpio_set_value(kim_gdata->nshutdown, GPIO_LOW);
                mdelay(5);      /* FIXME: a proper toggle */
-               gpio_set_value(kim_gdata->gpios[ST_BT], GPIO_HIGH);
+               gpio_set_value(kim_gdata->nshutdown, GPIO_HIGH);
                mdelay(100);
                /* re-initialize the completion */
                INIT_COMPLETION(kim_gdata->ldisc_installed);
        }
 
        /* By default configure BT nShutdown to LOW state */
-       gpio_set_value(kim_gdata->gpios[ST_BT], GPIO_LOW);
+       gpio_set_value(kim_gdata->nshutdown, GPIO_LOW);
        mdelay(1);
-       gpio_set_value(kim_gdata->gpios[ST_BT], GPIO_HIGH);
+       gpio_set_value(kim_gdata->nshutdown, GPIO_HIGH);
        mdelay(1);
-       gpio_set_value(kim_gdata->gpios[ST_BT], GPIO_LOW);
+       gpio_set_value(kim_gdata->nshutdown, GPIO_LOW);
        return err;
 }
 
 static int kim_probe(struct platform_device *pdev)
 {
        long status;
-       long proto;
        struct kim_data_s       *kim_gdata;
        struct ti_st_plat_data  *pdata = pdev->dev.platform_data;
-       long *gpios = pdata->gpios;
 
        if ((pdev->id != -1) && (pdev->id < MAX_ST_DEVICES)) {
                /* multiple devices could exist */
        /* refer to itself */
        kim_gdata->core_data->kim_data = kim_gdata;
 
-       for (proto = 0; proto < ST_MAX_CHANNELS; proto++) {
-               kim_gdata->gpios[proto] = gpios[proto];
-               pr_info(" %ld gpio to be requested", gpios[proto]);
+       /* Claim the chip enable nShutdown gpio from the system */
+       kim_gdata->nshutdown = pdata->nshutdown_gpio;
+       status = gpio_request(kim_gdata->nshutdown, "kim");
+       if (unlikely(status)) {
+               pr_err(" gpio %ld request failed ", kim_gdata->nshutdown);
+               return status;
        }
 
-       for (proto = 0; (proto < ST_MAX_CHANNELS)
-                       && (gpios[proto] != -1); proto++) {
-               /* Claim the Bluetooth/FM/GPIO
-                * nShutdown gpio from the system
-                */
-               status = gpio_request(gpios[proto], "kim");
-               if (unlikely(status)) {
-                       pr_err(" gpio %ld request failed ", gpios[proto]);
-                       proto -= 1;
-                       while (proto >= 0) {
-                               if (gpios[proto] != -1)
-                                       gpio_free(gpios[proto]);
-                       }
-                       return status;
-               }
-
-               /* Configure nShutdown GPIO as output=0 */
-               status =
-                   gpio_direction_output(gpios[proto], 0);
-               if (unlikely(status)) {
-                       pr_err(" unable to configure gpio %ld",
-                                  gpios[proto]);
-                       proto -= 1;
-                       while (proto >= 0) {
-                               if (gpios[proto] != -1)
-                                       gpio_free(gpios[proto]);
-                       }
-                       return status;
-               }
+       /* Configure nShutdown GPIO as output=0 */
+       status = gpio_direction_output(kim_gdata->nshutdown, 0);
+       if (unlikely(status)) {
+               pr_err(" unable to configure gpio %ld", kim_gdata->nshutdown);
+               return status;
        }
        /* get reference of pdev for request_firmware
         */
 {
        /* free the GPIOs requested */
        struct ti_st_plat_data  *pdata = pdev->dev.platform_data;
-       long *gpios = pdata->gpios;
-       long proto;
        struct kim_data_s       *kim_gdata;
 
        kim_gdata = dev_get_drvdata(&pdev->dev);
 
-       for (proto = 0; (proto < ST_MAX_CHANNELS)
-               && (gpios[proto] != -1); proto++) {
-               /* Claim the Bluetooth/FM/GPIO
-                * nShutdown gpio from the system
-                */
-               gpio_free(gpios[proto]);
-       }
-       pr_info("kim: GPIO Freed");
-       debugfs_remove_recursive(kim_debugfs_dir);
+       /* Free the Bluetooth/FM/GPIO
+        * nShutdown gpio from the system
+        */
+       gpio_free(pdata->nshutdown_gpio);
+       pr_info("nshutdown GPIO Freed");
 
+       debugfs_remove_recursive(kim_debugfs_dir);
        sysfs_remove_group(&pdev->dev.kobj, &uim_attr_grp);
+       pr_info("sysfs entries removed");
+
        kim_gdata->kim_pdev = NULL;
        st_core_exit(kim_gdata->core_data);
 
 
 #ifndef TI_WILINK_ST_H
 #define TI_WILINK_ST_H
 
-/**
- * enum kim_gpio_state - Few protocols such as FM have ACTIVE LOW
- *     gpio states for their chip/core enable gpios
- */
-enum kim_gpio_state {
-       KIM_GPIO_INACTIVE,
-       KIM_GPIO_ACTIVE,
-};
-
 /**
  * enum proto-type - The protocol on WiLink chips which share a
  *     common physical interface like UART.
  *     the ldisc was properly installed.
  * @resp_buffer: data buffer for the .bts fw file name.
  * @fw_entry: firmware class struct to request/release the fw.
- * @gpios: the list of core/chip enable gpios for BT, FM and GPS cores.
  * @rx_state: the rx state for kim's receive func during fw download.
  * @rx_count: the rx count for the kim's receive func during fw download.
  * @rx_skb: all of fw data might not come at once, and hence data storage for
  *     whole of the fw response, only HCI_EVENTs and hence diff from ST's
  *     response.
- * @rfkill: rfkill data for each of the cores to be registered with rfkill.
- * @rf_protos: proto types of the data registered with rfkill sub-system.
  * @core_data: ST core's data, which mainly is the tty's disc_data
  * @version: chip version available via a sysfs entry.
  *
        struct completion kim_rcvd, ldisc_installed;
        char resp_buffer[30];
        const struct firmware *fw_entry;
-       long gpios[ST_MAX_CHANNELS];
+       long nshutdown;
        unsigned long rx_state;
        unsigned long rx_count;
        struct sk_buff *rx_skb;
-       struct rfkill *rfkill[ST_MAX_CHANNELS];
-       enum proto_type rf_protos[ST_MAX_CHANNELS];
        struct st_data_s *core_data;
        struct chip_version version;
        unsigned char ldisc_install;
 long st_kim_stop(void *);
 
 void st_kim_recv(void *, const unsigned char *, long count);
-void st_kim_chip_toggle(enum proto_type, enum kim_gpio_state);
 void st_kim_complete(void *);
 void kim_st_list_protocols(struct st_data_s *, void *);
 
 
 /* platform data */
 struct ti_st_plat_data {
-       long gpios[ST_MAX_CHANNELS]; /* BT, FM and GPS */
+       long nshutdown_gpio;
        unsigned char dev_name[UART_DEV_NAME_LEN]; /* uart name */
        unsigned char flow_cntrl; /* flow control flag */
        unsigned long baud_rate;