* FM common sub-module will schedule this tasklet whenever it receives
  * FM packet from ST driver.
  */
-static void recv_tasklet(unsigned long arg)
+static void recv_tasklet(struct tasklet_struct *t)
 {
        struct fmdev *fmdev;
        struct fm_irq *irq_info;
        u8 num_fm_hci_cmds;
        unsigned long flags;
 
-       fmdev = (struct fmdev *)arg;
+       fmdev = from_tasklet(fmdev, t, tx_task);
        irq_info = &fmdev->irq_info;
        /* Process all packets in the RX queue */
        while ((skb = skb_dequeue(&fmdev->rx_q))) {
 }
 
 /* FM send tasklet: is scheduled when FM packet has to be sent to chip */
-static void send_tasklet(unsigned long arg)
+static void send_tasklet(struct tasklet_struct *t)
 {
        struct fmdev *fmdev;
        struct sk_buff *skb;
        int len;
 
-       fmdev = (struct fmdev *)arg;
+       fmdev = from_tasklet(fmdev, t, tx_task);
 
        if (!atomic_read(&fmdev->tx_cnt))
                return;
 
        /* Initialize TX queue and TX tasklet */
        skb_queue_head_init(&fmdev->tx_q);
-       tasklet_init(&fmdev->tx_task, send_tasklet, (unsigned long)fmdev);
+       tasklet_setup(&fmdev->tx_task, send_tasklet);
 
        /* Initialize RX Queue and RX tasklet */
        skb_queue_head_init(&fmdev->rx_q);
-       tasklet_init(&fmdev->rx_task, recv_tasklet, (unsigned long)fmdev);
+       tasklet_setup(&fmdev->rx_task, recv_tasklet);
 
        fmdev->irq_info.stage = 0;
        atomic_set(&fmdev->tx_cnt, 1);