patch-mxc-fiq
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>
This commit is contained in:
Родитель
bd006a9bfe
Коммит
d7927e1916
|
@ -14,4 +14,9 @@
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
extern void imx_irq_set_priority(unsigned char irq, unsigned char prio);
|
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__ */
|
#endif /* __ASM_ARCH_MXC_IRQS_H__ */
|
||||||
|
|
|
@ -17,9 +17,11 @@
|
||||||
* MA 02110-1301, USA.
|
* MA 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/module.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <mach/common.h>
|
#include <mach/common.h>
|
||||||
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
#define AVIC_BASE IO_ADDRESS(AVIC_BASE_ADDR)
|
#define AVIC_BASE IO_ADDRESS(AVIC_BASE_ADDR)
|
||||||
#define AVIC_INTCNTL (AVIC_BASE + 0x00) /* int control reg */
|
#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);
|
EXPORT_SYMBOL(imx_irq_set_priority);
|
||||||
#endif
|
#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 */
|
/* Disable interrupt number "irq" in the AVIC */
|
||||||
static void mxc_mask_irq(unsigned int irq)
|
static void mxc_mask_irq(unsigned int irq)
|
||||||
{
|
{
|
||||||
|
@ -119,5 +143,10 @@ void __init mxc_init_irq(void)
|
||||||
/* init architectures chained interrupt handler */
|
/* init architectures chained interrupt handler */
|
||||||
mxc_register_gpios();
|
mxc_register_gpios();
|
||||||
|
|
||||||
|
#ifdef CONFIG_FIQ
|
||||||
|
/* Initialize FIQ */
|
||||||
|
init_FIQ();
|
||||||
|
#endif
|
||||||
|
|
||||||
printk(KERN_INFO "MXC IRQ initialized\n");
|
printk(KERN_INFO "MXC IRQ initialized\n");
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче