i.MX: Add FIQ support
authorPaulius Zaleckas <paulius.zaleckas@teltonika.lt>
Tue, 9 Sep 2008 08:19:43 +0000 (10:19 +0200)
committerSascha Hauer <s.hauer@pengutronix.de>
Tue, 9 Sep 2008 10:13:55 +0000 (12:13 +0200)
Drivers which are going to use it will have to select it and use
imx_set_irq_fiq() to set FIQ mode for this interrupt.

Changes since V1:
- removed '#ifdef CONFIG_FIQ' from irqs.h
- renamed imx_set_irq_type() to imx_set_irq_fiq()
- made irqt unsigned
- fixed irq number check

Signed-off-by: Paulius Zaleckas <paulius.zaleckas@teltonika.lt>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
arch/arm/mach-imx/include/mach/irqs.h
arch/arm/mach-imx/irq.c

index eb8d5bd..67812c5 100644 (file)
 /* decode irq number to use with IMR(x), ISR(x) and friends */
 #define IRQ_TO_REG(irq) ((irq - IMX_IRQS) >> 5)
 
+/* all normal IRQs can be FIQs */
+#define FIQ_START      0
+/* switch betwean IRQ and FIQ */
+extern int imx_set_irq_fiq(unsigned int irq, unsigned int type);
+
 #define NR_IRQS (IRQ_GPIOD(32) + 1)
 #define IRQ_GPIO(x)
 #endif
index 798f221..2bb829e 100644 (file)
 /*
  *
  * We simply use the ENABLE DISABLE registers inside of the IMX
- * to turn on/off specific interrupts.  FIXME- We should
- * also add support for the accelerated interrupt controller
- * by putting offets to irq jump code in the appropriate
- * places.
+ * to turn on/off specific interrupts.
  *
  */
 
@@ -102,6 +99,28 @@ imx_unmask_irq(unsigned int irq)
        __raw_writel(irq, IMX_AITC_INTENNUM);
 }
 
+#ifdef CONFIG_FIQ
+int imx_set_irq_fiq(unsigned int irq, unsigned int type)
+{
+       unsigned int irqt;
+
+       if (irq >= IMX_IRQS)
+               return -EINVAL;
+
+       if (irq < IMX_IRQS / 2) {
+               irqt = __raw_readl(IMX_AITC_INTTYPEL) & ~(1 << irq);
+               __raw_writel(irqt | (!!type << irq), IMX_AITC_INTTYPEL);
+       } else {
+               irq -= IMX_IRQS / 2;
+               irqt = __raw_readl(IMX_AITC_INTTYPEH) & ~(1 << irq);
+               __raw_writel(irqt | (!!type << irq), IMX_AITC_INTTYPEH);
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL(imx_set_irq_fiq);
+#endif /* CONFIG_FIQ */
+
 static int
 imx_gpio_irq_type(unsigned int _irq, unsigned int type)
 {
@@ -286,4 +305,9 @@ imx_init_irq(void)
 
        /* Release masking of interrupts according to priority */
        __raw_writel(-1, IMX_AITC_NIMASK);
+
+#ifdef CONFIG_FIQ
+       /* Initialize FIQ */
+       init_FIQ();
+#endif
 }