Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild
[powerpc.git] / arch / powerpc / sysdev / mpic.c
index 4f26304..bffe50d 100644 (file)
@@ -234,7 +234,7 @@ static void mpic_shutdown_ht_interrupt(struct mpic *mpic, unsigned int source,
        spin_lock_irqsave(&mpic->fixup_lock, flags);
        writeb(0x10 + 2 * fixup->index, fixup->base + 2);
        tmp = readl(fixup->base + 4);
-       tmp &= ~1U;
+       tmp |= 1;
        writel(tmp, fixup->base + 4);
        spin_unlock_irqrestore(&mpic->fixup_lock, flags);
 }
@@ -446,14 +446,15 @@ static unsigned int mpic_startup_irq(unsigned int irq)
 #ifdef CONFIG_MPIC_BROKEN_U3
        struct mpic *mpic = mpic_from_irq(irq);
        unsigned int src = irq - mpic->irq_offset;
+#endif /* CONFIG_MPIC_BROKEN_U3 */
+
+       mpic_enable_irq(irq);
 
+#ifdef CONFIG_MPIC_BROKEN_U3
        if (mpic_is_ht_interrupt(mpic, src))
                mpic_startup_ht_interrupt(mpic, src, irq_desc[irq].status);
-
 #endif /* CONFIG_MPIC_BROKEN_U3 */
 
-       mpic_enable_irq(irq);
-
        return 0;
 }
 
@@ -828,7 +829,27 @@ void __init mpic_init(struct mpic *mpic)
        mpic_cpu_write(MPIC_CPU_CURRENT_TASK_PRI, 0);
 }
 
+void __init mpic_set_clk_ratio(struct mpic *mpic, u32 clock_ratio)
+{
+       u32 v;
+
+       v = mpic_read(mpic->gregs, MPIC_GREG_GLOBAL_CONF_1);
+       v &= ~MPIC_GREG_GLOBAL_CONF_1_CLK_RATIO_MASK;
+       v |= MPIC_GREG_GLOBAL_CONF_1_CLK_RATIO(clock_ratio);
+       mpic_write(mpic->gregs, MPIC_GREG_GLOBAL_CONF_1, v);
+}
 
+void __init mpic_set_serial_int(struct mpic *mpic, int enable)
+{
+       u32 v;
+
+       v = mpic_read(mpic->gregs, MPIC_GREG_GLOBAL_CONF_1);
+       if (enable)
+               v |= MPIC_GREG_GLOBAL_CONF_1_SIE;
+       else
+               v &= ~MPIC_GREG_GLOBAL_CONF_1_SIE;
+       mpic_write(mpic->gregs, MPIC_GREG_GLOBAL_CONF_1, v);
+}
 
 void mpic_irq_set_priority(unsigned int irq, unsigned int pri)
 {