Merge branch 'timers-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / arch / arm / mach-mmp / irq-mmp2.c
index dcd36f4..cb18221 100644 (file)
@@ -37,10 +37,17 @@ static void icu_unmask_irq(unsigned int irq)
 
 static struct irq_chip icu_irq_chip = {
        .name           = "icu_irq",
+       .mask           = icu_mask_irq,
        .mask_ack       = icu_mask_irq,
        .unmask         = icu_unmask_irq,
 };
 
+static void pmic_irq_ack(unsigned int irq)
+{
+       if (irq == IRQ_MMP2_PMIC)
+               mmp2_clear_pmic_int();
+}
+
 #define SECOND_IRQ_MASK(_name_, irq_base, prefix)                      \
 static void _name_##_mask_irq(unsigned int irq)                                \
 {                                                                      \
@@ -80,7 +87,7 @@ SECOND_IRQ_UNMASK(_name_, irq_base, prefix)                           \
 SECOND_IRQ_DEMUX(_name_, irq_base, prefix)                             \
 static struct irq_chip _name_##_irq_chip = {                           \
        .name           = #_name_,                                      \
-       .mask_ack       = _name_##_mask_irq,                            \
+       .mask           = _name_##_mask_irq,                            \
        .unmask         = _name_##_unmask_irq,                          \
 }
 
@@ -95,14 +102,18 @@ static void init_mux_irq(struct irq_chip *chip, int start, int num)
        int irq;
 
        for (irq = start; num > 0; irq++, num--) {
-               chip->mask_ack(irq);
+               /* mask and clear the IRQ */
+               chip->mask(irq);
+               if (chip->ack)
+                       chip->ack(irq);
+
                set_irq_chip(irq, chip);
                set_irq_flags(irq, IRQF_VALID);
                set_irq_handler(irq, handle_level_irq);
        }
 }
 
-void __init mmp2_init_irq(void)
+void __init mmp2_init_icu(void)
 {
        int irq;
 
@@ -124,6 +135,11 @@ void __init mmp2_init_irq(void)
                }
        }
 
+       /* NOTE: IRQ_MMP2_PMIC requires the PMIC MFPR register
+        * to be written to clear the interrupt
+        */
+       pmic_irq_chip.ack = pmic_irq_ack;
+
        init_mux_irq(&pmic_irq_chip, IRQ_MMP2_PMIC_BASE, 2);
        init_mux_irq(&rtc_irq_chip, IRQ_MMP2_RTC_BASE, 2);
        init_mux_irq(&twsi_irq_chip, IRQ_MMP2_TWSI_BASE, 5);