/*
  * Function to start a delayed output after RAW3215_TIMEOUT seconds
  */
-static void raw3215_timeout(unsigned long __data)
+static void raw3215_timeout(struct timer_list *t)
 {
-       struct raw3215_info *raw = (struct raw3215_info *) __data;
+       struct raw3215_info *raw = from_timer(raw, t, timer);
        unsigned long flags;
 
        spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
                return NULL;
        }
 
-       setup_timer(&info->timer, raw3215_timeout, (unsigned long)info);
+       timer_setup(&info->timer, raw3215_timeout, 0);
        init_waitqueue_head(&info->empty_wait);
        tasklet_init(&info->tlet, raw3215_wakeup, (unsigned long)info);
        tty_port_init(&info->port);
 
 #define CON_UPDATE_STATUS      4       /* Update status line. */
 #define CON_UPDATE_ALL         8       /* Recreate screen. */
 
-static void con3270_update(struct con3270 *);
+static void con3270_update(struct timer_list *);
 
 /*
  * Setup timeout for a device. On timeout trigger an update.
  * Update console display.
  */
 static void
-con3270_update(struct con3270 *cp)
+con3270_update(struct timer_list *t)
 {
+       struct con3270 *cp = from_timer(cp, t, timer);
        struct raw3270_request *wrq;
        char wcc, prolog[6];
        unsigned long flags;
        con3270_update_status(cp);
        while (cp->update_flags != 0) {
                spin_unlock_irqrestore(&cp->view.lock, flags);
-               con3270_update(cp);
+               con3270_update(&cp->timer);
                spin_lock_irqsave(&cp->view.lock, flags);
                con3270_wait_write(cp);
        }
 
        INIT_LIST_HEAD(&condev->lines);
        INIT_LIST_HEAD(&condev->update);
-       setup_timer(&condev->timer, (void (*)(unsigned long)) con3270_update,
-                   (unsigned long) condev);
+       timer_setup(&condev->timer, con3270_update, 0);
        tasklet_init(&condev->readlet, 
                     (void (*)(unsigned long)) con3270_read_tasklet,
                     (unsigned long) condev->read);
 
 #define SCLP_BUSY_INTERVAL     10
 #define SCLP_RETRY_INTERVAL    30
 
+static void sclp_request_timeout(bool force_restart);
 static void sclp_process_queue(void);
 static void __sclp_make_read_req(void);
 static int sclp_init_mask(int calculate);
 
 /* Set up request retry timer. Called while sclp_lock is locked. */
 static inline void
-__sclp_set_request_timer(unsigned long time, void (*function)(unsigned long),
-                        unsigned long data)
+__sclp_set_request_timer(unsigned long time, void (*cb)(struct timer_list *))
 {
        del_timer(&sclp_request_timer);
-       sclp_request_timer.function = function;
-       sclp_request_timer.data = data;
+       sclp_request_timer.function = (TIMER_FUNC_TYPE)cb;
        sclp_request_timer.expires = jiffies + time;
        add_timer(&sclp_request_timer);
 }
 
-/* Request timeout handler. Restart the request queue. If DATA is non-zero,
+static void sclp_request_timeout_restart(struct timer_list *unused)
+{
+       sclp_request_timeout(true);
+}
+
+static void sclp_request_timeout_normal(struct timer_list *unused)
+{
+       sclp_request_timeout(false);
+}
+
+/* Request timeout handler. Restart the request queue. If force_restart,
  * force restart of running request. */
-static void
-sclp_request_timeout(unsigned long data)
+static void sclp_request_timeout(bool force_restart)
 {
        unsigned long flags;
 
        spin_lock_irqsave(&sclp_lock, flags);
-       if (data) {
+       if (force_restart) {
                if (sclp_running_state == sclp_running_state_running) {
                        /* Break running state and queue NOP read event request
                         * to get a defined interface state. */
                }
        } else {
                __sclp_set_request_timer(SCLP_BUSY_INTERVAL * HZ,
-                                        sclp_request_timeout, 0);
+                                        sclp_request_timeout_normal);
        }
        spin_unlock_irqrestore(&sclp_lock, flags);
        sclp_process_queue();
  * invokes callback. This timer can be set per request in situations where
  * waiting too long would be harmful to the system, e.g. during SE reboot.
  */
-static void sclp_req_queue_timeout(unsigned long data)
+static void sclp_req_queue_timeout(struct timer_list *unused)
 {
        unsigned long flags, expires_next;
        struct sclp_req *req;
                req->status = SCLP_REQ_RUNNING;
                sclp_running_state = sclp_running_state_running;
                __sclp_set_request_timer(SCLP_RETRY_INTERVAL * HZ,
-                                        sclp_request_timeout, 1);
+                                        sclp_request_timeout_restart);
                return 0;
        } else if (rc == -EBUSY) {
                /* Try again later */
                __sclp_set_request_timer(SCLP_BUSY_INTERVAL * HZ,
-                                        sclp_request_timeout, 0);
+                                        sclp_request_timeout_normal);
                return 0;
        }
        /* Request failed */
                        /* Cannot abort already submitted request - could still
                         * be active at the SCLP */
                        __sclp_set_request_timer(SCLP_BUSY_INTERVAL * HZ,
-                                                sclp_request_timeout, 0);
+                                                sclp_request_timeout_normal);
                        break;
                }
 do_post:
                if (timer_pending(&sclp_request_timer) &&
                    get_tod_clock_fast() > timeout &&
                    del_timer(&sclp_request_timer))
-                       sclp_request_timer.function(sclp_request_timer.data);
+                       sclp_request_timer.function((TIMER_DATA_TYPE)&sclp_request_timer);
                cpu_relax();
        }
        local_irq_disable();
 
 /* Initial init mask request timed out. Modify request state to failed. */
 static void
-sclp_check_timeout(unsigned long data)
+sclp_check_timeout(struct timer_list *unused)
 {
        unsigned long flags;
 
                sclp_init_req.status = SCLP_REQ_RUNNING;
                sclp_running_state = sclp_running_state_running;
                __sclp_set_request_timer(SCLP_RETRY_INTERVAL * HZ,
-                                        sclp_check_timeout, 0);
+                                        sclp_check_timeout);
                spin_unlock_irqrestore(&sclp_lock, flags);
                /* Enable service-signal interruption - needs to happen
                 * with IRQs enabled. */
        INIT_LIST_HEAD(&sclp_req_queue);
        INIT_LIST_HEAD(&sclp_reg_list);
        list_add(&sclp_state_change_event.list, &sclp_reg_list);
-       init_timer(&sclp_request_timer);
-       init_timer(&sclp_queue_timer);
-       sclp_queue_timer.function = sclp_req_queue_timeout;
+       timer_setup(&sclp_request_timer, NULL, 0);
+       timer_setup(&sclp_queue_timer, sclp_req_queue_timeout, 0);
        /* Check interface */
        spin_unlock_irqrestore(&sclp_lock, flags);
        rc = sclp_check_interface();
 
  * temporary write buffer without further waiting on a final new line.
  */
 static void
-sclp_console_timeout(unsigned long data)
+sclp_console_timeout(struct timer_list *unused)
 {
        sclp_conbuf_emit();
 }
        /* Setup timer to output current console buffer after 1/10 second */
        if (sclp_conbuf != NULL && sclp_chars_in_buffer(sclp_conbuf) != 0 &&
            !timer_pending(&sclp_con_timer)) {
-               setup_timer(&sclp_con_timer, sclp_console_timeout, 0UL);
                mod_timer(&sclp_con_timer, jiffies + HZ / 10);
        }
 out:
        INIT_LIST_HEAD(&sclp_con_outqueue);
        spin_lock_init(&sclp_con_lock);
        sclp_conbuf = NULL;
-       init_timer(&sclp_con_timer);
+       timer_setup(&sclp_con_timer, sclp_console_timeout, 0);
 
        /* Set output format */
        if (MACHINE_IS_VM)
 
  * temporary write buffer.
  */
 static void
-sclp_tty_timeout(unsigned long data)
+sclp_tty_timeout(struct timer_list *unused)
 {
        unsigned long flags;
        struct sclp_buffer *buf;
        /* Setup timer to output current console buffer after 1/10 second */
        if (sclp_ttybuf && sclp_chars_in_buffer(sclp_ttybuf) &&
            !timer_pending(&sclp_tty_timer)) {
-               setup_timer(&sclp_tty_timer, sclp_tty_timeout, 0UL);
                mod_timer(&sclp_tty_timer, jiffies + HZ / 10);
        }
        spin_unlock_irqrestore(&sclp_tty_lock, flags);
        }
        INIT_LIST_HEAD(&sclp_tty_outqueue);
        spin_lock_init(&sclp_tty_lock);
-       init_timer(&sclp_tty_timer);
+       timer_setup(&sclp_tty_timer, sclp_tty_timeout, 0);
        sclp_ttybuf = NULL;
        sclp_tty_buffer_count = 0;
        if (MACHINE_IS_VM) {
 
  * Emit buffer after having waited long enough for more data to arrive.
  */
 static void
-sclp_vt220_timeout(unsigned long data)
+sclp_vt220_timeout(struct timer_list *unused)
 {
        sclp_vt220_emit_current();
 }
        /* Setup timer to output current console buffer after some time */
        if (sclp_vt220_current_request != NULL &&
            !timer_pending(&sclp_vt220_timer) && do_schedule) {
-               sclp_vt220_timer.function = sclp_vt220_timeout;
-               sclp_vt220_timer.data = 0UL;
                sclp_vt220_timer.expires = jiffies + BUFFER_MAX_DELAY;
                add_timer(&sclp_vt220_timer);
        }
        spin_lock_init(&sclp_vt220_lock);
        INIT_LIST_HEAD(&sclp_vt220_empty);
        INIT_LIST_HEAD(&sclp_vt220_outqueue);
-       init_timer(&sclp_vt220_timer);
+       timer_setup(&sclp_vt220_timer, sclp_vt220_timeout, 0);
        tty_port_init(&sclp_vt220_port);
        sclp_vt220_current_request = NULL;
        sclp_vt220_buffered_chars = 0;
 
 
 static void __tape_do_irq (struct ccw_device *, unsigned long, struct irb *);
 static void tape_delayed_next_request(struct work_struct *);
-static void tape_long_busy_timeout(unsigned long data);
+static void tape_long_busy_timeout(struct timer_list *t);
 
 /*
  * One list to contain all tape devices of all disciplines, so
                return -EINVAL;
        }
 
-       init_timer(&device->lb_timeout);
-       device->lb_timeout.function = tape_long_busy_timeout;
+       timer_setup(&device->lb_timeout, tape_long_busy_timeout, 0);
 
        /* Let the discipline have a go at the device. */
        device->discipline = discipline;
        spin_unlock_irq(get_ccwdev_lock(device->cdev));
 }
 
-static void tape_long_busy_timeout(unsigned long data)
+static void tape_long_busy_timeout(struct timer_list *t)
 {
+       struct tape_device *device = from_timer(device, t, lb_timeout);
        struct tape_request *request;
-       struct tape_device *device;
 
-       device = (struct tape_device *) data;
        spin_lock_irq(get_ccwdev_lock(device->cdev));
        request = list_entry(device->req_queue.next, struct tape_request, list);
        BUG_ON(request->status != TAPE_REQUEST_LONG_BUSY);
        DBF_LH(6, "%08x: Long busy timeout.\n", device->cdev_id);
        __tape_start_next_request(device);
-       device->lb_timeout.data = 0UL;
        tape_put_device(device);
        spin_unlock_irq(get_ccwdev_lock(device->cdev));
 }
                if (req->status == TAPE_REQUEST_LONG_BUSY) {
                        DBF_EVENT(3, "(%08x): del timer\n", device->cdev_id);
                        if (del_timer(&device->lb_timeout)) {
-                               device->lb_timeout.data = 0UL;
                                tape_put_device(device);
                                __tape_start_next_request(device);
                        }
                case TAPE_IO_PENDING:
                        break;
                case TAPE_IO_LONG_BUSY:
-                       device->lb_timeout.data =
-                               (unsigned long) tape_get_device(device);
                        device->lb_timeout.expires = jiffies +
                                LONG_BUSY_TIMEOUT * HZ;
                        DBF_EVENT(3, "(%08x): add timer\n", device->cdev_id);
 
 #define TTY_UPDATE_STATUS      8       /* Update status line. */
 #define TTY_UPDATE_ALL         16      /* Recreate screen. */
 
-static void tty3270_update(struct tty3270 *);
+static void tty3270_update(struct timer_list *);
 static void tty3270_resize_work(struct work_struct *work);
 
 /*
  * Update 3270 display.
  */
 static void
-tty3270_update(struct tty3270 *tp)
+tty3270_update(struct timer_list *t)
 {
+       struct tty3270 *tp = from_timer(tp, t, timer);
        static char invalid_sba[2] = { 0xff, 0xff };
        struct raw3270_request *wrq;
        unsigned long updated;
                goto out_reset;
 
        tty_port_init(&tp->port);
-       setup_timer(&tp->timer, (void (*)(unsigned long)) tty3270_update,
-                   (unsigned long) tp);
+       timer_setup(&tp->timer, tty3270_update, 0);
        tasklet_init(&tp->readlet,
                     (void (*)(unsigned long)) tty3270_read_tasklet,
                     (unsigned long) tp->read);