arm64: irq: allow FIQs to be handled
[linux-2.6-microblaze.git] / arch / arm64 / kernel / irq.c
index dfb1fea..bda4943 100644 (file)
@@ -71,13 +71,44 @@ static void init_irq_stacks(void)
 }
 #endif
 
+static void default_handle_irq(struct pt_regs *regs)
+{
+       panic("IRQ taken without a root IRQ handler\n");
+}
+
+static void default_handle_fiq(struct pt_regs *regs)
+{
+       panic("FIQ taken without a root FIQ handler\n");
+}
+
+void (*handle_arch_irq)(struct pt_regs *) __ro_after_init = default_handle_irq;
+void (*handle_arch_fiq)(struct pt_regs *) __ro_after_init = default_handle_fiq;
+
+int __init set_handle_irq(void (*handle_irq)(struct pt_regs *))
+{
+       if (handle_arch_irq != default_handle_irq)
+               return -EBUSY;
+
+       handle_arch_irq = handle_irq;
+       pr_info("Root IRQ handler: %ps\n", handle_irq);
+       return 0;
+}
+
+int __init set_handle_fiq(void (*handle_fiq)(struct pt_regs *))
+{
+       if (handle_arch_fiq != default_handle_fiq)
+               return -EBUSY;
+
+       handle_arch_fiq = handle_fiq;
+       pr_info("Root FIQ handler: %ps\n", handle_fiq);
+       return 0;
+}
+
 void __init init_IRQ(void)
 {
        init_irq_stacks();
        init_irq_scs();
        irqchip_init();
-       if (!handle_arch_irq)
-               panic("No interrupt controller found.");
 
        if (system_uses_irq_prio_masking()) {
                /*