irdebi(av7110, DEBISWAB, addr, 0, len);
 }
 
-static void debiirq(unsigned long cookie)
+static void debiirq(struct tasklet_struct *t)
 {
-       struct av7110 *av7110 = (struct av7110 *)cookie;
+       struct av7110 *av7110 = from_tasklet(av7110, t, debi_tasklet);
        int type = av7110->debitype;
        int handle = (type >> 8) & 0x1f;
        unsigned int xfer = 0;
 }
 
 /* irq from av7110 firmware writing the mailbox register in the DPRAM */
-static void gpioirq(unsigned long cookie)
+static void gpioirq(struct tasklet_struct *t)
 {
-       struct av7110 *av7110 = (struct av7110 *)cookie;
+       struct av7110 *av7110 = from_tasklet(av7110, t, gpio_tasklet);
        u32 rxbuf, txbuf;
        int len;
 
        return status;
 }
 
-static void vpeirq(unsigned long cookie)
+static void vpeirq(struct tasklet_struct *t)
 {
-       struct av7110 *budget = (struct av7110 *)cookie;
+       struct av7110 *budget = from_tasklet(budget, t, vpe_tasklet);
        u8 *mem = (u8 *) (budget->grabbing);
        u32 olddma = budget->ttbp;
        u32 newdma = saa7146_read(budget->dev, PCI_VDP3);
                saa7146_write(dev, NUM_LINE_BYTE3, (TS_HEIGHT << 16) | TS_WIDTH);
                saa7146_write(dev, MC2, MASK_04 | MASK_20);
 
-               tasklet_init(&av7110->vpe_tasklet, vpeirq, (unsigned long) av7110);
+               tasklet_setup(&av7110->vpe_tasklet, vpeirq);
 
        } else if (budgetpatch) {
                spin_lock_init(&av7110->feedlock1);
                saa7146_write(dev, MC1, (MASK_13 | MASK_29));
 
                /* end of budgetpatch register initialization */
-               tasklet_init (&av7110->vpe_tasklet,  vpeirq,  (unsigned long) av7110);
+               tasklet_setup(&av7110->vpe_tasklet,  vpeirq);
        } else {
                saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
                saa7146_write(dev, BCS_CTRL, 0x80400040);
                saa7146_write(dev, GPIO_CTRL, 0x000000);
        }
 
-       tasklet_init (&av7110->debi_tasklet, debiirq, (unsigned long) av7110);
-       tasklet_init (&av7110->gpio_tasklet, gpioirq, (unsigned long) av7110);
+       tasklet_setup(&av7110->debi_tasklet, debiirq);
+       tasklet_setup(&av7110->gpio_tasklet, gpioirq);
 
        mutex_init(&av7110->pid_mutex);
 
 
        u8 tuner_pll_address; /* used for philips_tdm1316l configs */
 };
 
-static void msp430_ir_interrupt(unsigned long data)
+static void msp430_ir_interrupt(struct tasklet_struct *t)
 {
-       struct budget_ci *budget_ci = (struct budget_ci *) data;
+       struct budget_ci_ir *ir = from_tasklet(ir, t, msp430_irq_tasklet);
+       struct budget_ci *budget_ci = container_of(ir, typeof(*budget_ci), ir);
        struct rc_dev *dev = budget_ci->ir.dev;
        u32 command = ttpci_budget_debiread(&budget_ci->budget, DEBINOSWAP, DEBIADDR_IR, 2, 1, 0) >> 8;
 
 
        budget_ci->ir.dev = dev;
 
-       tasklet_init(&budget_ci->ir.msp430_irq_tasklet, msp430_ir_interrupt,
-                    (unsigned long) budget_ci);
+       tasklet_setup(&budget_ci->ir.msp430_irq_tasklet, msp430_ir_interrupt);
 
        SAA7146_IER_ENABLE(saa, MASK_06);
        saa7146_setgpio(saa, 3, SAA7146_GPIO_IRQHI);
        return 0;
 }
 
-static void ciintf_interrupt(unsigned long data)
+static void ciintf_interrupt(struct tasklet_struct *t)
 {
-       struct budget_ci *budget_ci = (struct budget_ci *) data;
+       struct budget_ci *budget_ci = from_tasklet(budget_ci, t,
+                                                  ciintf_irq_tasklet);
        struct saa7146_dev *saa = budget_ci->budget.dev;
        unsigned int flags;
 
 
        // Setup CI slot IRQ
        if (budget_ci->ci_irq) {
-               tasklet_init(&budget_ci->ciintf_irq_tasklet, ciintf_interrupt, (unsigned long) budget_ci);
+               tasklet_setup(&budget_ci->ciintf_irq_tasklet, ciintf_interrupt);
                if (budget_ci->slot_status != SLOTSTATUS_NONE) {
                        saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQLO);
                } else {
 
        return ret;
 }
 
-static void vpeirq(unsigned long data)
+static void vpeirq(struct tasklet_struct *t)
 {
-       struct budget *budget = (struct budget *) data;
+       struct budget *budget = from_tasklet(budget, t, vpe_tasklet);
        u8 *mem = (u8 *) (budget->grabbing);
        u32 olddma = budget->ttbp;
        u32 newdma = saa7146_read(budget->dev, PCI_VDP3);
        /* upload all */
        saa7146_write(dev, GPIO_CTRL, 0x000000);
 
-       tasklet_init(&budget->vpe_tasklet, vpeirq, (unsigned long) budget);
+       tasklet_setup(&budget->vpe_tasklet, vpeirq);
 
        /* frontend power on */
        if (bi->type != BUDGET_FS_ACTIVY)