ARM: S3C24XX: Add FIQ IRQ routing support
authorBen Dooks <ben@simtec.co.uk>
Mon, 3 Aug 2009 16:26:57 +0000 (17:26 +0100)
committerBen Dooks <ben-linux@fluff.org>
Fri, 14 Aug 2009 00:13:28 +0000 (01:13 +0100)
Add support for routing an IRQ from the normal ARM IRQ mechanism to the
FIQ input of the processor.

Note, also fix a bug where the init_FIQ() function has not been called
when CONFIG_FIQ is enabled.

Signed-off-by; Ben Dooks <ben@simtec.co.uk>

Signed-off-by: Ben Dooks <ben-linux@fluff.org>
arch/arm/plat-s3c24xx/include/plat/fiq.h [new file with mode: 0644]
arch/arm/plat-s3c24xx/irq.c

diff --git a/arch/arm/plat-s3c24xx/include/plat/fiq.h b/arch/arm/plat-s3c24xx/include/plat/fiq.h
new file mode 100644 (file)
index 0000000..8521b83
--- /dev/null
@@ -0,0 +1,13 @@
+/* linux/include/asm-arm/plat-s3c24xx/fiq.h
+ *
+ * Copyright (c) 2009 Simtec Electronics
+ *     Ben Dooks <ben@simtec.co.uk>
+ *
+ * Header file for S3C24XX CPU FIQ support
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+extern int s3c24xx_set_fiq(unsigned int irq, bool on);
index 9587377..d02f5f0 100644 (file)
@@ -493,6 +493,38 @@ s3c_irq_demux_extint4t7(unsigned int irq,
        }
 }
 
+#ifdef CONFIG_FIQ
+/**
+ * s3c24xx_set_fiq - set the FIQ routing
+ * @irq: IRQ number to route to FIQ on processor.
+ * @on: Whether to route @irq to the FIQ, or to remove the FIQ routing.
+ *
+ * Change the state of the IRQ to FIQ routing depending on @irq and @on. If
+ * @on is true, the @irq is checked to see if it can be routed and the
+ * interrupt controller updated to route the IRQ. If @on is false, the FIQ
+ * routing is cleared, regardless of which @irq is specified.
+ */
+int s3c24xx_set_fiq(unsigned int irq, bool on)
+{
+       u32 intmod;
+       unsigned offs;
+
+       if (on) {
+               offs = irq - FIQ_START;
+               if (offs > 31)
+                       return -EINVAL;
+
+               intmod = 1 << offs;
+       } else {
+               intmod = 0;
+       }
+
+       __raw_writel(intmod, S3C2410_INTMOD);
+       return 0;
+}
+#endif
+
+
 /* s3c24xx_init_irq
  *
  * Initialise S3C2410 IRQ system
@@ -505,6 +537,10 @@ void __init s3c24xx_init_irq(void)
        int irqno;
        int i;
 
+#ifdef CONFIG_FIQ
+       init_FIQ();
+#endif
+
        irqdbf("s3c2410_init_irq: clearing interrupt status flags\n");
 
        /* first, clear all interrupts pending... */