diff options
author | Lennert Buytenhek <buytenh@wantstofly.org> | 2008-03-27 14:51:40 -0400 |
---|---|---|
committer | Nicolas Pitre <nico@marvell.com> | 2008-03-27 14:51:40 -0400 |
commit | 01eb569823792ab83b2810fcb31fa38560b08951 (patch) | |
tree | 8387d18b01b87d3d533b7f3f068c0c470af5fbd4 /arch/arm/plat-orion | |
parent | 69b02f6a9639af89c099d06d5f2c4c66a1b03ebf (diff) |
plat-orion: share IRQ handling code
Split off Orion IRQ handling code into plat-orion/, and add
support for multiple sets of (32) interrupts.
Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
Reviewed-by: Tzachi Perelstein <tzachi@marvell.com>
Acked-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Nicolas Pitre <nico@marvell.com>
Diffstat (limited to 'arch/arm/plat-orion')
-rw-r--r-- | arch/arm/plat-orion/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/plat-orion/irq.c | 64 |
2 files changed, 65 insertions, 1 deletions
diff --git a/arch/arm/plat-orion/Makefile b/arch/arm/plat-orion/Makefile index 2327762133f7..ea4ce342a196 100644 --- a/arch/arm/plat-orion/Makefile +++ b/arch/arm/plat-orion/Makefile | |||
@@ -2,7 +2,7 @@ | |||
2 | # Makefile for the linux kernel. | 2 | # Makefile for the linux kernel. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := | 5 | obj-y := irq.o |
6 | obj-m := | 6 | obj-m := |
7 | obj-n := | 7 | obj-n := |
8 | obj- := | 8 | obj- := |
diff --git a/arch/arm/plat-orion/irq.c b/arch/arm/plat-orion/irq.c new file mode 100644 index 000000000000..c5b669d234bc --- /dev/null +++ b/arch/arm/plat-orion/irq.c | |||
@@ -0,0 +1,64 @@ | |||
1 | /* | ||
2 | * arch/arm/plat-orion/irq.c | ||
3 | * | ||
4 | * Marvell Orion SoC IRQ handling. | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public | ||
7 | * License version 2. This program is licensed "as is" without any | ||
8 | * warranty of any kind, whether express or implied. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/irq.h> | ||
14 | #include <linux/io.h> | ||
15 | #include <asm/plat-orion/irq.h> | ||
16 | |||
17 | static void orion_irq_mask(u32 irq) | ||
18 | { | ||
19 | void __iomem *maskaddr = get_irq_chip_data(irq); | ||
20 | u32 mask; | ||
21 | |||
22 | mask = readl(maskaddr); | ||
23 | mask &= ~(1 << (irq & 31)); | ||
24 | writel(mask, maskaddr); | ||
25 | } | ||
26 | |||
27 | static void orion_irq_unmask(u32 irq) | ||
28 | { | ||
29 | void __iomem *maskaddr = get_irq_chip_data(irq); | ||
30 | u32 mask; | ||
31 | |||
32 | mask = readl(maskaddr); | ||
33 | mask |= 1 << (irq & 31); | ||
34 | writel(mask, maskaddr); | ||
35 | } | ||
36 | |||
37 | static struct irq_chip orion_irq_chip = { | ||
38 | .name = "orion_irq", | ||
39 | .ack = orion_irq_mask, | ||
40 | .mask = orion_irq_mask, | ||
41 | .unmask = orion_irq_unmask, | ||
42 | }; | ||
43 | |||
44 | void __init orion_irq_init(unsigned int irq_start, void __iomem *maskaddr) | ||
45 | { | ||
46 | unsigned int i; | ||
47 | |||
48 | /* | ||
49 | * Mask all interrupts initially. | ||
50 | */ | ||
51 | writel(0, maskaddr); | ||
52 | |||
53 | /* | ||
54 | * Register IRQ sources. | ||
55 | */ | ||
56 | for (i = 0; i < 32; i++) { | ||
57 | unsigned int irq = irq_start + i; | ||
58 | |||
59 | set_irq_chip(irq, &orion_irq_chip); | ||
60 | set_irq_chip_data(irq, maskaddr); | ||
61 | set_irq_handler(irq, handle_level_irq); | ||
62 | set_irq_flags(irq, IRQF_VALID); | ||
63 | } | ||
64 | } | ||