struct clk      *clk;
        int             irq;
        struct resource *r;
+       unsigned int    i;
 
        irq = platform_get_irq(pdev, 0);
        if (irq < 0)
        if (tc->irq[2] < 0)
                tc->irq[2] = irq;
 
+       for (i = 0; i < 3; i++)
+               writel(ATMEL_TC_ALL_IRQ, tc->regs + ATMEL_TC_REG(i, IDR));
+
        spin_lock(&tc_list_lock);
        list_add_tail(&tc->node, &tc_list);
        spin_unlock(&tc_list_lock);
 
+       platform_set_drvdata(pdev, tc);
+
        return 0;
 }
 
+static void tc_shutdown(struct platform_device *pdev)
+{
+       int i;
+       struct atmel_tc *tc = platform_get_drvdata(pdev);
+
+       for (i = 0; i < 3; i++)
+               writel(ATMEL_TC_ALL_IRQ, tc->regs + ATMEL_TC_REG(i, IDR));
+}
+
 static struct platform_driver tc_driver = {
        .driver = {
                .name   = "atmel_tcb",
                .of_match_table = of_match_ptr(atmel_tcb_dt_ids),
        },
+       .shutdown = tc_shutdown,
 };
 
 static int __init tc_init(void)
 
 #define     ATMEL_TC_LDRAS     (1 <<  5)       /* RA loading */
 #define     ATMEL_TC_LDRBS     (1 <<  6)       /* RB loading */
 #define     ATMEL_TC_ETRGS     (1 <<  7)       /* external trigger */
+#define     ATMEL_TC_ALL_IRQ   (ATMEL_TC_COVFS | ATMEL_TC_LOVRS | \
+                                ATMEL_TC_CPAS | ATMEL_TC_CPBS | \
+                                ATMEL_TC_CPCS | ATMEL_TC_LDRAS | \
+                                ATMEL_TC_LDRBS | ATMEL_TC_ETRGS) \
+                                /* all IRQs */
 
 #endif