Merge branch 'fix/hda' of git://github.com/tiwai/sound
[pandora-kernel.git] / arch / mips / alchemy / devboards / bcsr.c
index c52af88..463d2c4 100644 (file)
@@ -89,34 +89,38 @@ static void bcsr_csc_handler(unsigned int irq, struct irq_desc *d)
 {
        unsigned short bisr = __raw_readw(bcsr_virt + BCSR_REG_INTSTAT);
 
+       disable_irq_nosync(irq);
+
        for ( ; bisr; bisr &= bisr - 1)
                generic_handle_irq(bcsr_csc_base + __ffs(bisr));
+
+       enable_irq(irq);
 }
 
 /* NOTE: both the enable and mask bits must be cleared, otherwise the
  * CPLD generates tons of spurious interrupts (at least on my DB1200).
  *     -- mlau
  */
-static void bcsr_irq_mask(unsigned int irq_nr)
+static void bcsr_irq_mask(struct irq_data *d)
 {
-       unsigned short v = 1 << (irq_nr - bcsr_csc_base);
+       unsigned short v = 1 << (d->irq - bcsr_csc_base);
        __raw_writew(v, bcsr_virt + BCSR_REG_INTCLR);
        __raw_writew(v, bcsr_virt + BCSR_REG_MASKCLR);
        wmb();
 }
 
-static void bcsr_irq_maskack(unsigned int irq_nr)
+static void bcsr_irq_maskack(struct irq_data *d)
 {
-       unsigned short v = 1 << (irq_nr - bcsr_csc_base);
+       unsigned short v = 1 << (d->irq - bcsr_csc_base);
        __raw_writew(v, bcsr_virt + BCSR_REG_INTCLR);
        __raw_writew(v, bcsr_virt + BCSR_REG_MASKCLR);
        __raw_writew(v, bcsr_virt + BCSR_REG_INTSTAT);  /* ack */
        wmb();
 }
 
-static void bcsr_irq_unmask(unsigned int irq_nr)
+static void bcsr_irq_unmask(struct irq_data *d)
 {
-       unsigned short v = 1 << (irq_nr - bcsr_csc_base);
+       unsigned short v = 1 << (d->irq - bcsr_csc_base);
        __raw_writew(v, bcsr_virt + BCSR_REG_INTSET);
        __raw_writew(v, bcsr_virt + BCSR_REG_MASKSET);
        wmb();
@@ -124,9 +128,9 @@ static void bcsr_irq_unmask(unsigned int irq_nr)
 
 static struct irq_chip bcsr_irq_type = {
        .name           = "CPLD",
-       .mask           = bcsr_irq_mask,
-       .mask_ack       = bcsr_irq_maskack,
-       .unmask         = bcsr_irq_unmask,
+       .irq_mask       = bcsr_irq_mask,
+       .irq_mask_ack   = bcsr_irq_maskack,
+       .irq_unmask     = bcsr_irq_unmask,
 };
 
 void __init bcsr_init_irq(int csc_start, int csc_end, int hook_irq)
@@ -142,8 +146,8 @@ void __init bcsr_init_irq(int csc_start, int csc_end, int hook_irq)
        bcsr_csc_base = csc_start;
 
        for (irq = csc_start; irq <= csc_end; irq++)
-               set_irq_chip_and_handler_name(irq, &bcsr_irq_type,
-                       handle_level_irq, "level");
+               irq_set_chip_and_handler_name(irq, &bcsr_irq_type,
+                                             handle_level_irq, "level");
 
-       set_irq_chained_handler(hook_irq, bcsr_csc_handler);
+       irq_set_chained_handler(hook_irq, bcsr_csc_handler);
 }