u32 settings_register;  /* cached value for AIO / RayDat (sync reference, master/slave) */
 
        struct hdspm_midi midi[4];
-       struct tasklet_struct midi_tasklet;
+       struct work_struct midi_work;
 
        size_t period_bytes;
        unsigned char ss_in_channels;
 }
 
 
-static void hdspm_midi_tasklet(struct tasklet_struct *t)
+static void hdspm_midi_work(struct work_struct *work)
 {
-       struct hdspm *hdspm = from_tasklet(hdspm, t, midi_tasklet);
+       struct hdspm *hdspm = container_of(work, struct hdspm, midi_work);
        int i = 0;
 
        while (i < hdspm->midiPorts) {
                }
 
                if (schedule)
-                       tasklet_hi_schedule(&hdspm->midi_tasklet);
+                       queue_work(system_highpri_wq, &hdspm->midi_work);
        }
 
        return IRQ_HANDLED;
        hdspm->card = card;
 
        spin_lock_init(&hdspm->lock);
+       INIT_WORK(&hdspm->midi_work, hdspm_midi_work);
 
        pci_read_config_word(hdspm->pci,
                        PCI_CLASS_REVISION, &hdspm->firmware_rev);
 
        }
 
-       tasklet_setup(&hdspm->midi_tasklet, hdspm_midi_tasklet);
-
-
        if (hdspm->io_type != MADIface) {
                hdspm->serial = (hdspm_read(hdspm,
                                HDSPM_midiStatusIn0)>>8) & 0xFFFFFF;
 {
 
        if (hdspm->port) {
+               cancel_work_sync(&hdspm->midi_work);
 
                /* stop th audio, and cancel all interrupts */
                hdspm->control_register &=