}
 
 
-static void cadet_handler(unsigned long data)
+static void cadet_handler(struct timer_list *t)
 {
-       struct cadet *dev = (void *)data;
+       struct cadet *dev = from_timer(dev, t, readtimer);
 
        /* Service the RDS fifo */
        if (mutex_trylock(&dev->lock)) {
        /*
         * Clean up and exit
         */
-       setup_timer(&dev->readtimer, cadet_handler, data);
        dev->readtimer.expires = jiffies + msecs_to_jiffies(50);
        add_timer(&dev->readtimer);
 }
 {
        dev->rdsstat = 1;
        outb(0x80, dev->io);        /* Select RDS fifo */
-       setup_timer(&dev->readtimer, cadet_handler, (unsigned long)dev);
+       timer_setup(&dev->readtimer, cadet_handler, 0);
        dev->readtimer.expires = jiffies + msecs_to_jiffies(50);
        add_timer(&dev->readtimer);
 }
 
  * interrupt process. Therefore reset stage index to re-enable default
  * interrupts. So that next interrupt will be processed as usual.
  */
-static void int_timeout_handler(unsigned long data)
+static void int_timeout_handler(struct timer_list *t)
 {
        struct fmdev *fmdev;
        struct fm_irq *fmirq;
 
        fmdbg("irq: timeout,trying to re-enable fm interrupts\n");
-       fmdev = (struct fmdev *)data;
+       fmdev = from_timer(fmdev, t, irq_info.timer);
        fmirq = &fmdev->irq_info;
        fmirq->retry++;
 
        atomic_set(&fmdev->tx_cnt, 1);
        fmdev->resp_comp = NULL;
 
-       setup_timer(&fmdev->irq_info.timer, &int_timeout_handler,
-                   (unsigned long)fmdev);
+       timer_setup(&fmdev->irq_info.timer, int_timeout_handler, 0);
        /*TODO: add FM_STIC_EVENT later */
        fmdev->irq_info.mask = FM_MAL_EVENT;