patch-mxc-fiq
authorPaulius Zaleckas <paulius.zaleckas@teltonika.lt>
Fri, 14 Nov 2008 10:01:39 +0000 (11:01 +0100)
committerSascha Hauer <s.hauer@pengutronix.de>
Tue, 16 Dec 2008 13:58:43 +0000 (14:58 +0100)
Drivers which are going to use it will have to select it and use
mxc_set_irq_fiq() to set FIQ mode for this interrupt.

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

index b55bba3..b8ac916 100644 (file)
@@ -14,4 +14,9 @@
 #include <mach/hardware.h>
 extern void imx_irq_set_priority(unsigned char irq, unsigned char prio);
 
+/* all normal IRQs can be FIQs */
+#define FIQ_START      0
+/* switch betwean IRQ and FIQ */
+extern int mxc_set_irq_fiq(unsigned int irq, unsigned int type);
+
 #endif /* __ASM_ARCH_MXC_IRQS_H__ */
index d862c9e..dd7021b 100644 (file)
  * MA  02110-1301, USA.
  */
 
+#include <linux/module.h>
 #include <linux/irq.h>
 #include <linux/io.h>
 #include <mach/common.h>
+#include <asm/mach/irq.h>
 
 #define AVIC_BASE              IO_ADDRESS(AVIC_BASE_ADDR)
 #define AVIC_INTCNTL           (AVIC_BASE + 0x00)      /* int control reg */
@@ -65,6 +67,28 @@ void imx_irq_set_priority(unsigned char irq, unsigned char prio)
 EXPORT_SYMBOL(imx_irq_set_priority);
 #endif
 
+#ifdef CONFIG_FIQ
+int mxc_set_irq_fiq(unsigned int irq, unsigned int type)
+{
+       unsigned int irqt;
+
+       if (irq >= MXC_MAX_INT_LINES)
+               return -EINVAL;
+
+       if (irq < MXC_MAX_INT_LINES / 2) {
+               irqt = __raw_readl(AVIC_INTTYPEL) & ~(1 << irq);
+               __raw_writel(irqt | (!!type << irq), AVIC_INTTYPEL);
+       } else {
+               irq -= MXC_MAX_INT_LINES / 2;
+               irqt = __raw_readl(AVIC_INTTYPEH) & ~(1 << irq);
+               __raw_writel(irqt | (!!type << irq), AVIC_INTTYPEH);
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL(mxc_set_irq_fiq);
+#endif /* CONFIG_FIQ */
+
 /* Disable interrupt number "irq" in the AVIC */
 static void mxc_mask_irq(unsigned int irq)
 {
@@ -119,5 +143,10 @@ void __init mxc_init_irq(void)
        /* init architectures chained interrupt handler */
        mxc_register_gpios();
 
+#ifdef CONFIG_FIQ
+       /* Initialize FIQ */
+       init_FIQ();
+#endif
+
        printk(KERN_INFO "MXC IRQ initialized\n");
 }