| /* |
| * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. |
| */ |
| |
| /* |
| * 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. |
| */ |
| |
| #include <linux/module.h> |
| #include <linux/moduleparam.h> |
| #include <linux/init.h> |
| #include <linux/device.h> |
| #include <linux/errno.h> |
| #include <asm/hardware.h> |
| #include <asm/io.h> |
| #include <asm/irq.h> |
| #include <asm/mach/irq.h> |
| #include <asm/arch/common.h> |
| |
| /*! |
| * Disable interrupt number "irq" in the AVIC |
| * |
| * @param irq interrupt source number |
| */ |
| static void mxc_mask_irq(unsigned int irq) |
| { |
| __raw_writel(irq, AVIC_INTDISNUM); |
| } |
| |
| /*! |
| * Enable interrupt number "irq" in the AVIC |
| * |
| * @param irq interrupt source number |
| */ |
| static void mxc_unmask_irq(unsigned int irq) |
| { |
| __raw_writel(irq, AVIC_INTENNUM); |
| } |
| |
| static struct irq_chip mxc_avic_chip = { |
| .mask_ack = mxc_mask_irq, |
| .mask = mxc_mask_irq, |
| .unmask = mxc_unmask_irq, |
| }; |
| |
| /*! |
| * This function initializes the AVIC hardware and disables all the |
| * interrupts. It registers the interrupt enable and disable functions |
| * to the kernel for each interrupt source. |
| */ |
| void __init mxc_init_irq(void) |
| { |
| int i; |
| u32 reg; |
| |
| /* put the AVIC into the reset value with |
| * all interrupts disabled |
| */ |
| __raw_writel(0, AVIC_INTCNTL); |
| __raw_writel(0x1f, AVIC_NIMASK); |
| |
| /* disable all interrupts */ |
| __raw_writel(0, AVIC_INTENABLEH); |
| __raw_writel(0, AVIC_INTENABLEL); |
| |
| /* all IRQ no FIQ */ |
| __raw_writel(0, AVIC_INTTYPEH); |
| __raw_writel(0, AVIC_INTTYPEL); |
| for (i = 0; i < MXC_MAX_INT_LINES; i++) { |
| set_irq_chip(i, &mxc_avic_chip); |
| set_irq_handler(i, handle_level_irq); |
| set_irq_flags(i, IRQF_VALID); |
| } |
| |
| /* Set WDOG2's interrupt the highest priority level (bit 28-31) */ |
| reg = __raw_readl(AVIC_NIPRIORITY6); |
| reg |= (0xF << 28); |
| __raw_writel(reg, AVIC_NIPRIORITY6); |
| |
| printk(KERN_INFO "MXC IRQ initialized\n"); |
| } |