#define SNDRV_TIMER_HW_STOP    0x00000002      /* call stop before start */
 #define SNDRV_TIMER_HW_SLAVE   0x00000004      /* only slave timer (variable resolution) */
 #define SNDRV_TIMER_HW_FIRST   0x00000008      /* first tick can be incomplete */
-#define SNDRV_TIMER_HW_TASKLET 0x00000010      /* timer is called from tasklet */
+#define SNDRV_TIMER_HW_WORK    0x00000010      /* timer is called from work */
 
 #define SNDRV_TIMER_IFLG_SLAVE   0x00000001
 #define SNDRV_TIMER_IFLG_RUNNING  0x00000002
 #define SNDRV_TIMER_IFLG_START   0x00000004
 #define SNDRV_TIMER_IFLG_AUTO    0x00000008    /* auto restart */
-#define SNDRV_TIMER_IFLG_FAST    0x00000010    /* fast callback (do not use tasklet) */
+#define SNDRV_TIMER_IFLG_FAST    0x00000010    /* fast callback (do not use work) */
 #define SNDRV_TIMER_IFLG_CALLBACK 0x00000020   /* timer callback is active */
 #define SNDRV_TIMER_IFLG_EXCLUSIVE 0x00000040  /* exclusive owner - no more instances */
 #define SNDRV_TIMER_IFLG_EARLY_EVENT 0x00000080        /* write early event to the poll queue */
        struct list_head active_list_head;
        struct list_head ack_list_head;
        struct list_head sack_list_head; /* slow ack list head */
-       struct tasklet_struct task_queue;
+       struct work_struct task_work;
        int max_instances;      /* upper limit of timer instances */
        int num_instances;      /* current number of timer instances */
 };
        unsigned long ticks;            /* auto-load ticks when expired */
        unsigned long cticks;           /* current ticks */
        unsigned long pticks;           /* accumulated ticks for callback */
-       unsigned long resolution;       /* current resolution for tasklet */
+       unsigned long resolution;       /* current resolution for work */
        unsigned long lost;             /* lost ticks */
        int slave_class;
        unsigned int slave_id;
 
 }
 
 static const struct snd_timer_hardware hrtimer_hw __initconst = {
-       .flags =        SNDRV_TIMER_HW_AUTO | SNDRV_TIMER_HW_TASKLET,
+       .flags =        SNDRV_TIMER_HW_AUTO | SNDRV_TIMER_HW_WORK,
        .open =         snd_hrtimer_open,
        .close =        snd_hrtimer_close,
        .start =        snd_hrtimer_start,
 
 }
 
 /*
- * timer tasklet
+ * timer work
  *
  */
-static void snd_timer_tasklet(struct tasklet_struct *t)
+static void snd_timer_work(struct work_struct *work)
 {
-       struct snd_timer *timer = from_tasklet(timer, t, task_queue);
+       struct snd_timer *timer = container_of(work, struct snd_timer, task_work);
        unsigned long flags;
 
        if (timer->card && timer->card->shutdown) {
        unsigned long resolution;
        struct list_head *ack_list_head;
        unsigned long flags;
-       int use_tasklet = 0;
+       bool use_work = false;
 
        if (timer == NULL)
                return;
                        --timer->running;
                        list_del_init(&ti->active_list);
                }
-               if ((timer->hw.flags & SNDRV_TIMER_HW_TASKLET) ||
+               if ((timer->hw.flags & SNDRV_TIMER_HW_WORK) ||
                    (ti->flags & SNDRV_TIMER_IFLG_FAST))
                        ack_list_head = &timer->ack_list_head;
                else
        snd_timer_process_callbacks(timer, &timer->ack_list_head);
 
        /* do we have any slow callbacks? */
-       use_tasklet = !list_empty(&timer->sack_list_head);
+       use_work = !list_empty(&timer->sack_list_head);
        spin_unlock_irqrestore(&timer->lock, flags);
 
-       if (use_tasklet)
-               tasklet_schedule(&timer->task_queue);
+       if (use_work)
+               queue_work(system_highpri_wq, &timer->task_work);
 }
 EXPORT_SYMBOL(snd_timer_interrupt);
 
        INIT_LIST_HEAD(&timer->ack_list_head);
        INIT_LIST_HEAD(&timer->sack_list_head);
        spin_lock_init(&timer->lock);
-       tasklet_setup(&timer->task_queue, snd_timer_tasklet);
+       INIT_WORK(&timer->task_work, snd_timer_work);
        timer->max_instances = 1000; /* default limit per timer */
        if (card != NULL) {
                timer->module = card->module;
 
 static const struct snd_timer_hardware snd_timer_system =
 {
-       .flags =        SNDRV_TIMER_HW_FIRST | SNDRV_TIMER_HW_TASKLET,
+       .flags =        SNDRV_TIMER_HW_FIRST | SNDRV_TIMER_HW_WORK,
        .resolution =   1000000000L / HZ,
        .ticks =        10000000L,
        .close =        snd_timer_s_close,