diff options
author | Greg Ungerer <gerg@uclinux.org> | 2009-05-22 00:16:39 -0400 |
---|---|---|
committer | Greg Ungerer <gerg@uclinux.org> | 2009-09-15 19:43:53 -0400 |
commit | da3601a5fa664c8d51383fe916d96bd4fbce84b8 (patch) | |
tree | 83ee5d4e283cfdd11e83bdb7c739b5ccbeb9264a | |
parent | 3945ca0f84fee3fe564189fe8cf8f02491d19622 (diff) |
m68knommu: add support for second interrupt controller of ColdFire 5249
The ColdFire 5249 CPU has a second (compleletly different) interrupt
controller. It is the only ColdFire CPU that has this type. It controlls
GPIO interrupts amongst a number of interrupts from other internal
peripherals. Add support code for it.
Signed-off-by: Greg Ungerer <gerg@uclinux.org>
-rw-r--r-- | arch/m68k/include/asm/m5249sim.h | 20 | ||||
-rw-r--r-- | arch/m68knommu/platform/5249/Makefile | 2 | ||||
-rw-r--r-- | arch/m68knommu/platform/5249/intc2.c | 59 |
3 files changed, 78 insertions, 3 deletions
diff --git a/arch/m68k/include/asm/m5249sim.h b/arch/m68k/include/asm/m5249sim.h index 8d76a1930718..14bce877ed88 100644 --- a/arch/m68k/include/asm/m5249sim.h +++ b/arch/m68k/include/asm/m5249sim.h | |||
@@ -107,6 +107,22 @@ | |||
107 | #define MCFSIM2_IDECONFIG2 0x190 /* IDEconfig2 */ | 107 | #define MCFSIM2_IDECONFIG2 0x190 /* IDEconfig2 */ |
108 | 108 | ||
109 | /* | 109 | /* |
110 | * Define the base interrupt for the second interrupt controller. | ||
111 | * We set it to 128, out of the way of the base interrupts, and plenty | ||
112 | * of room for its 64 interrupts. | ||
113 | */ | ||
114 | #define MCFINTC2_VECBASE 128 | ||
115 | |||
116 | #define MCFINTC2_GPIOIRQ0 (MCFINTC2_VECBASE + 32) | ||
117 | #define MCFINTC2_GPIOIRQ1 (MCFINTC2_VECBASE + 33) | ||
118 | #define MCFINTC2_GPIOIRQ2 (MCFINTC2_VECBASE + 34) | ||
119 | #define MCFINTC2_GPIOIRQ3 (MCFINTC2_VECBASE + 35) | ||
120 | #define MCFINTC2_GPIOIRQ4 (MCFINTC2_VECBASE + 36) | ||
121 | #define MCFINTC2_GPIOIRQ5 (MCFINTC2_VECBASE + 37) | ||
122 | #define MCFINTC2_GPIOIRQ6 (MCFINTC2_VECBASE + 38) | ||
123 | #define MCFINTC2_GPIOIRQ7 (MCFINTC2_VECBASE + 39) | ||
124 | |||
125 | /* | ||
110 | * Generic GPIO support | 126 | * Generic GPIO support |
111 | */ | 127 | */ |
112 | #define MCFGPIO_PIN_MAX 64 | 128 | #define MCFGPIO_PIN_MAX 64 |
@@ -135,9 +151,9 @@ | |||
135 | subql #1,%a1 /* get MBAR2 address in a1 */ | 151 | subql #1,%a1 /* get MBAR2 address in a1 */ |
136 | 152 | ||
137 | /* | 153 | /* |
138 | * Move secondary interrupts to base at 128. | 154 | * Move secondary interrupts to their base (128). |
139 | */ | 155 | */ |
140 | moveb #0x80,%d0 | 156 | moveb #MCFINTC2_VECBASE,%d0 |
141 | moveb %d0,0x16b(%a1) /* interrupt base register */ | 157 | moveb %d0,0x16b(%a1) /* interrupt base register */ |
142 | 158 | ||
143 | /* | 159 | /* |
diff --git a/arch/m68knommu/platform/5249/Makefile b/arch/m68knommu/platform/5249/Makefile index 113c33390064..f56225d1582f 100644 --- a/arch/m68knommu/platform/5249/Makefile +++ b/arch/m68knommu/platform/5249/Makefile | |||
@@ -14,5 +14,5 @@ | |||
14 | 14 | ||
15 | asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1 | 15 | asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1 |
16 | 16 | ||
17 | obj-y := config.o gpio.o | 17 | obj-y := config.o gpio.o intc2.o |
18 | 18 | ||
diff --git a/arch/m68knommu/platform/5249/intc2.c b/arch/m68knommu/platform/5249/intc2.c new file mode 100644 index 000000000000..d09d9da04537 --- /dev/null +++ b/arch/m68knommu/platform/5249/intc2.c | |||
@@ -0,0 +1,59 @@ | |||
1 | /* | ||
2 | * intc2.c -- support for the 2nd INTC controller of the 5249 | ||
3 | * | ||
4 | * (C) Copyright 2009, Greg Ungerer <gerg@snapgear.com> | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file COPYING in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | |||
11 | #include <linux/types.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/interrupt.h> | ||
15 | #include <linux/irq.h> | ||
16 | #include <linux/io.h> | ||
17 | #include <asm/coldfire.h> | ||
18 | #include <asm/mcfsim.h> | ||
19 | |||
20 | static void intc2_irq_gpio_mask(unsigned int irq) | ||
21 | { | ||
22 | u32 imr; | ||
23 | imr = readl(MCF_MBAR2 + MCFSIM2_GPIOINTENABLE); | ||
24 | imr &= ~(0x1 << (irq - MCFINTC2_GPIOIRQ0)); | ||
25 | writel(imr, MCF_MBAR2 + MCFSIM2_GPIOINTENABLE); | ||
26 | } | ||
27 | |||
28 | static void intc2_irq_gpio_unmask(unsigned int irq) | ||
29 | { | ||
30 | u32 imr; | ||
31 | imr = readl(MCF_MBAR2 + MCFSIM2_GPIOINTENABLE); | ||
32 | imr |= (0x1 << (irq - MCFINTC2_GPIOIRQ0)); | ||
33 | writel(imr, MCF_MBAR2 + MCFSIM2_GPIOINTENABLE); | ||
34 | } | ||
35 | |||
36 | static void intc2_irq_gpio_ack(unsigned int irq) | ||
37 | { | ||
38 | writel(0x1 << (irq - MCFINTC2_GPIOIRQ0), MCF_MBAR2 + MCFSIM2_GPIOINTCLEAR); | ||
39 | } | ||
40 | |||
41 | static struct irq_chip intc2_irq_gpio_chip = { | ||
42 | .name = "CF-INTC2", | ||
43 | .mask = intc2_irq_gpio_mask, | ||
44 | .unmask = intc2_irq_gpio_unmask, | ||
45 | .ack = intc2_irq_gpio_ack, | ||
46 | }; | ||
47 | |||
48 | static int __init mcf_intc2_init(void) | ||
49 | { | ||
50 | int irq; | ||
51 | |||
52 | /* GPIO interrupt sources */ | ||
53 | for (irq = MCFINTC2_GPIOIRQ0; (irq <= MCFINTC2_GPIOIRQ7); irq++) | ||
54 | irq_desc[irq].chip = &intc2_irq_gpio_chip; | ||
55 | |||
56 | return 0; | ||
57 | } | ||
58 | |||
59 | arch_initcall(mcf_intc2_init); | ||