siu_stream->rw_flg = RWF_STM_WT;
 
        /* DMA transfer start */
-       tasklet_schedule(&siu_stream->tasklet);
+       queue_work(system_highpri_wq, &siu_stream->work);
 
        return 0;
 }
                siu_stream->cur_period * siu_stream->period_bytes,
                siu_stream->buf_bytes, siu_stream->cookie);
 
-       tasklet_schedule(&siu_stream->tasklet);
+       queue_work(system_highpri_wq, &siu_stream->work);
 
        /* Notify alsa: a period is done */
        snd_pcm_period_elapsed(siu_stream->substream);
        return 0;
 }
 
-static void siu_io_tasklet(struct tasklet_struct *t)
+static void siu_io_work(struct work_struct *work)
 {
-       struct siu_stream *siu_stream = from_tasklet(siu_stream, t, tasklet);
+       struct siu_stream *siu_stream = container_of(work, struct siu_stream,
+                                                    work);
        struct snd_pcm_substream *substream = siu_stream->substream;
        struct device *dev = substream->pcm->card->dev;
        struct snd_pcm_runtime *rt = substream->runtime;
        /* during stmread flag set */
        siu_stream->rw_flg = RWF_STM_RD;
 
-       tasklet_schedule(&siu_stream->tasklet);
+       queue_work(system_highpri_wq, &siu_stream->work);
 
        return 0;
 }
 
                (*port_info)->pcm = pcm;
 
-               /* IO tasklets */
-               tasklet_setup(&(*port_info)->playback.tasklet, siu_io_tasklet);
-               tasklet_setup(&(*port_info)->capture.tasklet, siu_io_tasklet);
+               /* IO works */
+               INIT_WORK(&(*port_info)->playback.work, siu_io_work);
+               INIT_WORK(&(*port_info)->capture.work, siu_io_work);
        }
 
        dev_info(card->dev, "SuperH SIU driver initialized.\n");
        struct platform_device *pdev = to_platform_device(pcm->card->dev);
        struct siu_port *port_info = siu_ports[pdev->id];
 
-       tasklet_kill(&port_info->capture.tasklet);
-       tasklet_kill(&port_info->playback.tasklet);
+       cancel_work_sync(&port_info->capture.work);
+       cancel_work_sync(&port_info->playback.work);
 
        siu_free_port(port_info);