Commit b72f92ff authored by Paulius Zaleckas's avatar Paulius Zaleckas Committed by Sascha Hauer

i.MX: Add FIQ support

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: default avatarPaulius Zaleckas <paulius.zaleckas@teltonika.lt>
Signed-off-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
parent 8b69ac57
...@@ -111,6 +111,11 @@ ...@@ -111,6 +111,11 @@
/* decode irq number to use with IMR(x), ISR(x) and friends */ /* decode irq number to use with IMR(x), ISR(x) and friends */
#define IRQ_TO_REG(irq) ((irq - IMX_IRQS) >> 5) #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 NR_IRQS (IRQ_GPIOD(32) + 1)
#define IRQ_GPIO(x) #define IRQ_GPIO(x)
#endif #endif
...@@ -36,10 +36,7 @@ ...@@ -36,10 +36,7 @@
/* /*
* *
* We simply use the ENABLE DISABLE registers inside of the IMX * We simply use the ENABLE DISABLE registers inside of the IMX
* to turn on/off specific interrupts. FIXME- We should * to turn on/off specific interrupts.
* also add support for the accelerated interrupt controller
* by putting offets to irq jump code in the appropriate
* places.
* *
*/ */
...@@ -102,6 +99,28 @@ imx_unmask_irq(unsigned int irq) ...@@ -102,6 +99,28 @@ imx_unmask_irq(unsigned int irq)
__raw_writel(irq, IMX_AITC_INTENNUM); __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 static int
imx_gpio_irq_type(unsigned int _irq, unsigned int type) imx_gpio_irq_type(unsigned int _irq, unsigned int type)
{ {
...@@ -286,4 +305,9 @@ imx_init_irq(void) ...@@ -286,4 +305,9 @@ imx_init_irq(void)
/* Release masking of interrupts according to priority */ /* Release masking of interrupts according to priority */
__raw_writel(-1, IMX_AITC_NIMASK); __raw_writel(-1, IMX_AITC_NIMASK);
#ifdef CONFIG_FIQ
/* Initialize FIQ */
init_FIQ();
#endif
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment