diff options
author | Arnd Bergmann <arnd@arndb.de> | 2013-04-09 16:05:50 -0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2013-04-09 16:05:50 -0400 |
commit | 894b7382cf20e81d38097d43b8802af6e79d48c4 (patch) | |
tree | 7b51fd5c6e51d60bb5e9122816dc9c09823d3578 /arch | |
parent | ab9838e145dab98744798af0d5e849f1de139bff (diff) | |
parent | f0774d41da0e607b70e54ecc50aeb6684f54c2b1 (diff) |
Merge tag 'irq-s3c24xx-for-v3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung into next/drivers
From Kukjin Kim <kgene.kim@samsung.com>:
s3c24xx irq cleanup and move into drivers/irqchip
* tag 'irq-s3c24xx-for-v3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung:
irqchip: s3c24xx: add devicetree support
irqchip: s3c24xx: make interrupt handling independent of irq_domain structure
irqchip: s3c24xx: globally keep track of the created intc instances
irqchip: s3c24xx: add irq_set_type callback for basic interrupt types
irqchip: s3c24xx: fix irqlist of second s3c2416 controller
irqchip: s3c24xx: fix comments on some camera interrupts
ARM: S3C24XX: move irq driver to drivers/irqchip
ARM: S3C24XX: add handle_irq function
ARM: S3C24XX: make s3c24xx_init_intc static
ARM: S3C24XX: move s3c24xx_init_irq to s3c2410_init_irq
ARM: S3C24XX: fix irq parent check
ARM: S3C24XX: fix redundant checks in the irq mapping function
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/Kconfig | 1 | ||||
-rw-r--r-- | arch/arm/mach-s3c24xx/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/mach-s3c24xx/common.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-s3c24xx/include/mach/entry-macro.S | 70 | ||||
-rw-r--r-- | arch/arm/mach-s3c24xx/irq.c | 1068 | ||||
-rw-r--r-- | arch/arm/mach-s3c24xx/mach-amlm5900.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-s3c24xx/mach-bast.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-s3c24xx/mach-h1940.c | 7 | ||||
-rw-r--r-- | arch/arm/mach-s3c24xx/mach-n30.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-s3c24xx/mach-otom.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-s3c24xx/mach-qt2410.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-s3c24xx/mach-smdk2410.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-s3c24xx/mach-tct_hammer.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-s3c24xx/mach-vr1000.c | 2 | ||||
-rw-r--r-- | arch/arm/plat-samsung/include/plat/cpu.h | 1 |
15 files changed, 13 insertions, 1155 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index ada582b15cf2..6adf79869f8c 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -778,6 +778,7 @@ config ARCH_S3C24XX | |||
778 | select HAVE_S3C2410_I2C if I2C | 778 | select HAVE_S3C2410_I2C if I2C |
779 | select HAVE_S3C2410_WATCHDOG if WATCHDOG | 779 | select HAVE_S3C2410_WATCHDOG if WATCHDOG |
780 | select HAVE_S3C_RTC if RTC_CLASS | 780 | select HAVE_S3C_RTC if RTC_CLASS |
781 | select MULTI_IRQ_HANDLER | ||
781 | select NEED_MACH_GPIO_H | 782 | select NEED_MACH_GPIO_H |
782 | select NEED_MACH_IO_H | 783 | select NEED_MACH_IO_H |
783 | help | 784 | help |
diff --git a/arch/arm/mach-s3c24xx/Makefile b/arch/arm/mach-s3c24xx/Makefile index be6e4d0e6f1a..6f46ecfc8396 100644 --- a/arch/arm/mach-s3c24xx/Makefile +++ b/arch/arm/mach-s3c24xx/Makefile | |||
@@ -14,7 +14,7 @@ obj- := | |||
14 | 14 | ||
15 | # core | 15 | # core |
16 | 16 | ||
17 | obj-y += common.o irq.o | 17 | obj-y += common.o |
18 | 18 | ||
19 | obj-$(CONFIG_CPU_S3C2410) += s3c2410.o | 19 | obj-$(CONFIG_CPU_S3C2410) += s3c2410.o |
20 | obj-$(CONFIG_S3C2410_CPUFREQ) += cpufreq-s3c2410.o | 20 | obj-$(CONFIG_S3C2410_CPUFREQ) += cpufreq-s3c2410.o |
diff --git a/arch/arm/mach-s3c24xx/common.h b/arch/arm/mach-s3c24xx/common.h index abefeb38bba4..307c3714be55 100644 --- a/arch/arm/mach-s3c24xx/common.h +++ b/arch/arm/mach-s3c24xx/common.h | |||
@@ -21,6 +21,7 @@ extern void s3c2410_map_io(void); | |||
21 | extern void s3c2410_init_uarts(struct s3c2410_uartcfg *cfg, int no); | 21 | extern void s3c2410_init_uarts(struct s3c2410_uartcfg *cfg, int no); |
22 | extern void s3c2410_init_clocks(int xtal); | 22 | extern void s3c2410_init_clocks(int xtal); |
23 | extern void s3c2410_restart(char mode, const char *cmd); | 23 | extern void s3c2410_restart(char mode, const char *cmd); |
24 | extern void s3c2410_init_irq(void); | ||
24 | #else | 25 | #else |
25 | #define s3c2410_init_clocks NULL | 26 | #define s3c2410_init_clocks NULL |
26 | #define s3c2410_init_uarts NULL | 27 | #define s3c2410_init_uarts NULL |
diff --git a/arch/arm/mach-s3c24xx/include/mach/entry-macro.S b/arch/arm/mach-s3c24xx/include/mach/entry-macro.S deleted file mode 100644 index 6a21beeba1da..000000000000 --- a/arch/arm/mach-s3c24xx/include/mach/entry-macro.S +++ /dev/null | |||
@@ -1,70 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-s3c2410/include/mach/entry-macro.S | ||
3 | * | ||
4 | * Low-level IRQ helper macros for S3C2410-based platforms | ||
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 | /* We have a problem that the INTOFFSET register does not always | ||
12 | * show one interrupt. Occasionally we get two interrupts through | ||
13 | * the prioritiser, and this causes the INTOFFSET register to show | ||
14 | * what looks like the logical-or of the two interrupt numbers. | ||
15 | * | ||
16 | * Thanks to Klaus, Shannon, et al for helping to debug this problem | ||
17 | */ | ||
18 | |||
19 | #define INTPND (0x10) | ||
20 | #define INTOFFSET (0x14) | ||
21 | |||
22 | #include <mach/hardware.h> | ||
23 | #include <asm/irq.h> | ||
24 | |||
25 | .macro get_irqnr_preamble, base, tmp | ||
26 | .endm | ||
27 | |||
28 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
29 | |||
30 | mov \base, #S3C24XX_VA_IRQ | ||
31 | |||
32 | @@ try the interrupt offset register, since it is there | ||
33 | |||
34 | ldr \irqstat, [\base, #INTPND ] | ||
35 | teq \irqstat, #0 | ||
36 | beq 1002f | ||
37 | ldr \irqnr, [\base, #INTOFFSET ] | ||
38 | mov \tmp, #1 | ||
39 | tst \irqstat, \tmp, lsl \irqnr | ||
40 | bne 1001f | ||
41 | |||
42 | @@ the number specified is not a valid irq, so try | ||
43 | @@ and work it out for ourselves | ||
44 | |||
45 | mov \irqnr, #0 @@ start here | ||
46 | |||
47 | @@ work out which irq (if any) we got | ||
48 | |||
49 | movs \tmp, \irqstat, lsl#16 | ||
50 | addeq \irqnr, \irqnr, #16 | ||
51 | moveq \irqstat, \irqstat, lsr#16 | ||
52 | tst \irqstat, #0xff | ||
53 | addeq \irqnr, \irqnr, #8 | ||
54 | moveq \irqstat, \irqstat, lsr#8 | ||
55 | tst \irqstat, #0xf | ||
56 | addeq \irqnr, \irqnr, #4 | ||
57 | moveq \irqstat, \irqstat, lsr#4 | ||
58 | tst \irqstat, #0x3 | ||
59 | addeq \irqnr, \irqnr, #2 | ||
60 | moveq \irqstat, \irqstat, lsr#2 | ||
61 | tst \irqstat, #0x1 | ||
62 | addeq \irqnr, \irqnr, #1 | ||
63 | |||
64 | @@ we have the value | ||
65 | 1001: | ||
66 | adds \irqnr, \irqnr, #IRQ_EINT0 | ||
67 | 1002: | ||
68 | @@ exit here, Z flag unset if IRQ | ||
69 | |||
70 | .endm | ||
diff --git a/arch/arm/mach-s3c24xx/irq.c b/arch/arm/mach-s3c24xx/irq.c deleted file mode 100644 index 3f3de7492094..000000000000 --- a/arch/arm/mach-s3c24xx/irq.c +++ /dev/null | |||
@@ -1,1068 +0,0 @@ | |||
1 | /* | ||
2 | * S3C24XX IRQ handling | ||
3 | * | ||
4 | * Copyright (c) 2003-2004 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * Copyright (c) 2012 Heiko Stuebner <heiko@sntech.de> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | */ | ||
18 | |||
19 | #include <linux/init.h> | ||
20 | #include <linux/slab.h> | ||
21 | #include <linux/module.h> | ||
22 | #include <linux/io.h> | ||
23 | #include <linux/err.h> | ||
24 | #include <linux/interrupt.h> | ||
25 | #include <linux/ioport.h> | ||
26 | #include <linux/device.h> | ||
27 | #include <linux/irqdomain.h> | ||
28 | |||
29 | #include <asm/mach/irq.h> | ||
30 | |||
31 | #include <mach/regs-irq.h> | ||
32 | #include <mach/regs-gpio.h> | ||
33 | |||
34 | #include <plat/cpu.h> | ||
35 | #include <plat/regs-irqtype.h> | ||
36 | #include <plat/pm.h> | ||
37 | |||
38 | #define S3C_IRQTYPE_NONE 0 | ||
39 | #define S3C_IRQTYPE_EINT 1 | ||
40 | #define S3C_IRQTYPE_EDGE 2 | ||
41 | #define S3C_IRQTYPE_LEVEL 3 | ||
42 | |||
43 | struct s3c_irq_data { | ||
44 | unsigned int type; | ||
45 | unsigned long parent_irq; | ||
46 | |||
47 | /* data gets filled during init */ | ||
48 | struct s3c_irq_intc *intc; | ||
49 | unsigned long sub_bits; | ||
50 | struct s3c_irq_intc *sub_intc; | ||
51 | }; | ||
52 | |||
53 | /* | ||
54 | * Sructure holding the controller data | ||
55 | * @reg_pending register holding pending irqs | ||
56 | * @reg_intpnd special register intpnd in main intc | ||
57 | * @reg_mask mask register | ||
58 | * @domain irq_domain of the controller | ||
59 | * @parent parent controller for ext and sub irqs | ||
60 | * @irqs irq-data, always s3c_irq_data[32] | ||
61 | */ | ||
62 | struct s3c_irq_intc { | ||
63 | void __iomem *reg_pending; | ||
64 | void __iomem *reg_intpnd; | ||
65 | void __iomem *reg_mask; | ||
66 | struct irq_domain *domain; | ||
67 | struct s3c_irq_intc *parent; | ||
68 | struct s3c_irq_data *irqs; | ||
69 | }; | ||
70 | |||
71 | static void s3c_irq_mask(struct irq_data *data) | ||
72 | { | ||
73 | struct s3c_irq_intc *intc = data->domain->host_data; | ||
74 | struct s3c_irq_intc *parent_intc = intc->parent; | ||
75 | struct s3c_irq_data *irq_data = &intc->irqs[data->hwirq]; | ||
76 | struct s3c_irq_data *parent_data; | ||
77 | unsigned long mask; | ||
78 | unsigned int irqno; | ||
79 | |||
80 | mask = __raw_readl(intc->reg_mask); | ||
81 | mask |= (1UL << data->hwirq); | ||
82 | __raw_writel(mask, intc->reg_mask); | ||
83 | |||
84 | if (parent_intc && irq_data->parent_irq) { | ||
85 | parent_data = &parent_intc->irqs[irq_data->parent_irq]; | ||
86 | |||
87 | /* check to see if we need to mask the parent IRQ */ | ||
88 | if ((mask & parent_data->sub_bits) == parent_data->sub_bits) { | ||
89 | irqno = irq_find_mapping(parent_intc->domain, | ||
90 | irq_data->parent_irq); | ||
91 | s3c_irq_mask(irq_get_irq_data(irqno)); | ||
92 | } | ||
93 | } | ||
94 | } | ||
95 | |||
96 | static void s3c_irq_unmask(struct irq_data *data) | ||
97 | { | ||
98 | struct s3c_irq_intc *intc = data->domain->host_data; | ||
99 | struct s3c_irq_intc *parent_intc = intc->parent; | ||
100 | struct s3c_irq_data *irq_data = &intc->irqs[data->hwirq]; | ||
101 | unsigned long mask; | ||
102 | unsigned int irqno; | ||
103 | |||
104 | mask = __raw_readl(intc->reg_mask); | ||
105 | mask &= ~(1UL << data->hwirq); | ||
106 | __raw_writel(mask, intc->reg_mask); | ||
107 | |||
108 | if (parent_intc && irq_data->parent_irq) { | ||
109 | irqno = irq_find_mapping(parent_intc->domain, | ||
110 | irq_data->parent_irq); | ||
111 | s3c_irq_unmask(irq_get_irq_data(irqno)); | ||
112 | } | ||
113 | } | ||
114 | |||
115 | static inline void s3c_irq_ack(struct irq_data *data) | ||
116 | { | ||
117 | struct s3c_irq_intc *intc = data->domain->host_data; | ||
118 | unsigned long bitval = 1UL << data->hwirq; | ||
119 | |||
120 | __raw_writel(bitval, intc->reg_pending); | ||
121 | if (intc->reg_intpnd) | ||
122 | __raw_writel(bitval, intc->reg_intpnd); | ||
123 | } | ||
124 | |||
125 | static int s3c_irqext_type_set(void __iomem *gpcon_reg, | ||
126 | void __iomem *extint_reg, | ||
127 | unsigned long gpcon_offset, | ||
128 | unsigned long extint_offset, | ||
129 | unsigned int type) | ||
130 | { | ||
131 | unsigned long newvalue = 0, value; | ||
132 | |||
133 | /* Set the GPIO to external interrupt mode */ | ||
134 | value = __raw_readl(gpcon_reg); | ||
135 | value = (value & ~(3 << gpcon_offset)) | (0x02 << gpcon_offset); | ||
136 | __raw_writel(value, gpcon_reg); | ||
137 | |||
138 | /* Set the external interrupt to pointed trigger type */ | ||
139 | switch (type) | ||
140 | { | ||
141 | case IRQ_TYPE_NONE: | ||
142 | pr_warn("No edge setting!\n"); | ||
143 | break; | ||
144 | |||
145 | case IRQ_TYPE_EDGE_RISING: | ||
146 | newvalue = S3C2410_EXTINT_RISEEDGE; | ||
147 | break; | ||
148 | |||
149 | case IRQ_TYPE_EDGE_FALLING: | ||
150 | newvalue = S3C2410_EXTINT_FALLEDGE; | ||
151 | break; | ||
152 | |||
153 | case IRQ_TYPE_EDGE_BOTH: | ||
154 | newvalue = S3C2410_EXTINT_BOTHEDGE; | ||
155 | break; | ||
156 | |||
157 | case IRQ_TYPE_LEVEL_LOW: | ||
158 | newvalue = S3C2410_EXTINT_LOWLEV; | ||
159 | break; | ||
160 | |||
161 | case IRQ_TYPE_LEVEL_HIGH: | ||
162 | newvalue = S3C2410_EXTINT_HILEV; | ||
163 | break; | ||
164 | |||
165 | default: | ||
166 | pr_err("No such irq type %d", type); | ||
167 | return -EINVAL; | ||
168 | } | ||
169 | |||
170 | value = __raw_readl(extint_reg); | ||
171 | value = (value & ~(7 << extint_offset)) | (newvalue << extint_offset); | ||
172 | __raw_writel(value, extint_reg); | ||
173 | |||
174 | return 0; | ||
175 | } | ||
176 | |||
177 | static int s3c_irqext_type(struct irq_data *data, unsigned int type) | ||
178 | { | ||
179 | void __iomem *extint_reg; | ||
180 | void __iomem *gpcon_reg; | ||
181 | unsigned long gpcon_offset, extint_offset; | ||
182 | |||
183 | if ((data->hwirq >= 4) && (data->hwirq <= 7)) { | ||
184 | gpcon_reg = S3C2410_GPFCON; | ||
185 | extint_reg = S3C24XX_EXTINT0; | ||
186 | gpcon_offset = (data->hwirq) * 2; | ||
187 | extint_offset = (data->hwirq) * 4; | ||
188 | } else if ((data->hwirq >= 8) && (data->hwirq <= 15)) { | ||
189 | gpcon_reg = S3C2410_GPGCON; | ||
190 | extint_reg = S3C24XX_EXTINT1; | ||
191 | gpcon_offset = (data->hwirq - 8) * 2; | ||
192 | extint_offset = (data->hwirq - 8) * 4; | ||
193 | } else if ((data->hwirq >= 16) && (data->hwirq <= 23)) { | ||
194 | gpcon_reg = S3C2410_GPGCON; | ||
195 | extint_reg = S3C24XX_EXTINT2; | ||
196 | gpcon_offset = (data->hwirq - 8) * 2; | ||
197 | extint_offset = (data->hwirq - 16) * 4; | ||
198 | } else { | ||
199 | return -EINVAL; | ||
200 | } | ||
201 | |||
202 | return s3c_irqext_type_set(gpcon_reg, extint_reg, gpcon_offset, | ||
203 | extint_offset, type); | ||
204 | } | ||
205 | |||
206 | static int s3c_irqext0_type(struct irq_data *data, unsigned int type) | ||
207 | { | ||
208 | void __iomem *extint_reg; | ||
209 | void __iomem *gpcon_reg; | ||
210 | unsigned long gpcon_offset, extint_offset; | ||
211 | |||
212 | if ((data->hwirq >= 0) && (data->hwirq <= 3)) { | ||
213 | gpcon_reg = S3C2410_GPFCON; | ||
214 | extint_reg = S3C24XX_EXTINT0; | ||
215 | gpcon_offset = (data->hwirq) * 2; | ||
216 | extint_offset = (data->hwirq) * 4; | ||
217 | } else { | ||
218 | return -EINVAL; | ||
219 | } | ||
220 | |||
221 | return s3c_irqext_type_set(gpcon_reg, extint_reg, gpcon_offset, | ||
222 | extint_offset, type); | ||
223 | } | ||
224 | |||
225 | static struct irq_chip s3c_irq_chip = { | ||
226 | .name = "s3c", | ||
227 | .irq_ack = s3c_irq_ack, | ||
228 | .irq_mask = s3c_irq_mask, | ||
229 | .irq_unmask = s3c_irq_unmask, | ||
230 | .irq_set_wake = s3c_irq_wake | ||
231 | }; | ||
232 | |||
233 | static struct irq_chip s3c_irq_level_chip = { | ||
234 | .name = "s3c-level", | ||
235 | .irq_mask = s3c_irq_mask, | ||
236 | .irq_unmask = s3c_irq_unmask, | ||
237 | .irq_ack = s3c_irq_ack, | ||
238 | }; | ||
239 | |||
240 | static struct irq_chip s3c_irqext_chip = { | ||
241 | .name = "s3c-ext", | ||
242 | .irq_mask = s3c_irq_mask, | ||
243 | .irq_unmask = s3c_irq_unmask, | ||
244 | .irq_ack = s3c_irq_ack, | ||
245 | .irq_set_type = s3c_irqext_type, | ||
246 | .irq_set_wake = s3c_irqext_wake | ||
247 | }; | ||
248 | |||
249 | static struct irq_chip s3c_irq_eint0t4 = { | ||
250 | .name = "s3c-ext0", | ||
251 | .irq_ack = s3c_irq_ack, | ||
252 | .irq_mask = s3c_irq_mask, | ||
253 | .irq_unmask = s3c_irq_unmask, | ||
254 | .irq_set_wake = s3c_irq_wake, | ||
255 | .irq_set_type = s3c_irqext0_type, | ||
256 | }; | ||
257 | |||
258 | static void s3c_irq_demux(unsigned int irq, struct irq_desc *desc) | ||
259 | { | ||
260 | struct irq_chip *chip = irq_desc_get_chip(desc); | ||
261 | struct s3c_irq_intc *intc = desc->irq_data.domain->host_data; | ||
262 | struct s3c_irq_data *irq_data = &intc->irqs[desc->irq_data.hwirq]; | ||
263 | struct s3c_irq_intc *sub_intc = irq_data->sub_intc; | ||
264 | unsigned long src; | ||
265 | unsigned long msk; | ||
266 | unsigned int n; | ||
267 | |||
268 | chained_irq_enter(chip, desc); | ||
269 | |||
270 | src = __raw_readl(sub_intc->reg_pending); | ||
271 | msk = __raw_readl(sub_intc->reg_mask); | ||
272 | |||
273 | src &= ~msk; | ||
274 | src &= irq_data->sub_bits; | ||
275 | |||
276 | while (src) { | ||
277 | n = __ffs(src); | ||
278 | src &= ~(1 << n); | ||
279 | generic_handle_irq(irq_find_mapping(sub_intc->domain, n)); | ||
280 | } | ||
281 | |||
282 | chained_irq_exit(chip, desc); | ||
283 | } | ||
284 | |||
285 | #ifdef CONFIG_FIQ | ||
286 | /** | ||
287 | * s3c24xx_set_fiq - set the FIQ routing | ||
288 | * @irq: IRQ number to route to FIQ on processor. | ||
289 | * @on: Whether to route @irq to the FIQ, or to remove the FIQ routing. | ||
290 | * | ||
291 | * Change the state of the IRQ to FIQ routing depending on @irq and @on. If | ||
292 | * @on is true, the @irq is checked to see if it can be routed and the | ||
293 | * interrupt controller updated to route the IRQ. If @on is false, the FIQ | ||
294 | * routing is cleared, regardless of which @irq is specified. | ||
295 | */ | ||
296 | int s3c24xx_set_fiq(unsigned int irq, bool on) | ||
297 | { | ||
298 | u32 intmod; | ||
299 | unsigned offs; | ||
300 | |||
301 | if (on) { | ||
302 | offs = irq - FIQ_START; | ||
303 | if (offs > 31) | ||
304 | return -EINVAL; | ||
305 | |||
306 | intmod = 1 << offs; | ||
307 | } else { | ||
308 | intmod = 0; | ||
309 | } | ||
310 | |||
311 | __raw_writel(intmod, S3C2410_INTMOD); | ||
312 | return 0; | ||
313 | } | ||
314 | |||
315 | EXPORT_SYMBOL_GPL(s3c24xx_set_fiq); | ||
316 | #endif | ||
317 | |||
318 | static int s3c24xx_irq_map(struct irq_domain *h, unsigned int virq, | ||
319 | irq_hw_number_t hw) | ||
320 | { | ||
321 | struct s3c_irq_intc *intc = h->host_data; | ||
322 | struct s3c_irq_data *irq_data = &intc->irqs[hw]; | ||
323 | struct s3c_irq_intc *parent_intc; | ||
324 | struct s3c_irq_data *parent_irq_data; | ||
325 | unsigned int irqno; | ||
326 | |||
327 | if (!intc) { | ||
328 | pr_err("irq-s3c24xx: no controller found for hwirq %lu\n", hw); | ||
329 | return -EINVAL; | ||
330 | } | ||
331 | |||
332 | if (!irq_data) { | ||
333 | pr_err("irq-s3c24xx: no irq data found for hwirq %lu\n", hw); | ||
334 | return -EINVAL; | ||
335 | } | ||
336 | |||
337 | /* attach controller pointer to irq_data */ | ||
338 | irq_data->intc = intc; | ||
339 | |||
340 | /* set handler and flags */ | ||
341 | switch (irq_data->type) { | ||
342 | case S3C_IRQTYPE_NONE: | ||
343 | return 0; | ||
344 | case S3C_IRQTYPE_EINT: | ||
345 | /* On the S3C2412, the EINT0to3 have a parent irq | ||
346 | * but need the s3c_irq_eint0t4 chip | ||
347 | */ | ||
348 | if (irq_data->parent_irq && (!soc_is_s3c2412() || hw >= 4)) | ||
349 | irq_set_chip_and_handler(virq, &s3c_irqext_chip, | ||
350 | handle_edge_irq); | ||
351 | else | ||
352 | irq_set_chip_and_handler(virq, &s3c_irq_eint0t4, | ||
353 | handle_edge_irq); | ||
354 | break; | ||
355 | case S3C_IRQTYPE_EDGE: | ||
356 | if (irq_data->parent_irq || | ||
357 | intc->reg_pending == S3C2416_SRCPND2) | ||
358 | irq_set_chip_and_handler(virq, &s3c_irq_level_chip, | ||
359 | handle_edge_irq); | ||
360 | else | ||
361 | irq_set_chip_and_handler(virq, &s3c_irq_chip, | ||
362 | handle_edge_irq); | ||
363 | break; | ||
364 | case S3C_IRQTYPE_LEVEL: | ||
365 | if (irq_data->parent_irq) | ||
366 | irq_set_chip_and_handler(virq, &s3c_irq_level_chip, | ||
367 | handle_level_irq); | ||
368 | else | ||
369 | irq_set_chip_and_handler(virq, &s3c_irq_chip, | ||
370 | handle_level_irq); | ||
371 | break; | ||
372 | default: | ||
373 | pr_err("irq-s3c24xx: unsupported irqtype %d\n", irq_data->type); | ||
374 | return -EINVAL; | ||
375 | } | ||
376 | set_irq_flags(virq, IRQF_VALID); | ||
377 | |||
378 | if (irq_data->parent_irq) { | ||
379 | parent_intc = intc->parent; | ||
380 | if (!parent_intc) { | ||
381 | pr_err("irq-s3c24xx: no parent controller found for hwirq %lu\n", | ||
382 | hw); | ||
383 | goto err; | ||
384 | } | ||
385 | |||
386 | parent_irq_data = &parent_intc->irqs[irq_data->parent_irq]; | ||
387 | if (!irq_data) { | ||
388 | pr_err("irq-s3c24xx: no irq data found for hwirq %lu\n", | ||
389 | hw); | ||
390 | goto err; | ||
391 | } | ||
392 | |||
393 | parent_irq_data->sub_intc = intc; | ||
394 | parent_irq_data->sub_bits |= (1UL << hw); | ||
395 | |||
396 | /* attach the demuxer to the parent irq */ | ||
397 | irqno = irq_find_mapping(parent_intc->domain, | ||
398 | irq_data->parent_irq); | ||
399 | if (!irqno) { | ||
400 | pr_err("irq-s3c24xx: could not find mapping for parent irq %lu\n", | ||
401 | irq_data->parent_irq); | ||
402 | goto err; | ||
403 | } | ||
404 | irq_set_chained_handler(irqno, s3c_irq_demux); | ||
405 | } | ||
406 | |||
407 | return 0; | ||
408 | |||
409 | err: | ||
410 | set_irq_flags(virq, 0); | ||
411 | |||
412 | /* the only error can result from bad mapping data*/ | ||
413 | return -EINVAL; | ||
414 | } | ||
415 | |||
416 | static struct irq_domain_ops s3c24xx_irq_ops = { | ||
417 | .map = s3c24xx_irq_map, | ||
418 | .xlate = irq_domain_xlate_twocell, | ||
419 | }; | ||
420 | |||
421 | static void s3c24xx_clear_intc(struct s3c_irq_intc *intc) | ||
422 | { | ||
423 | void __iomem *reg_source; | ||
424 | unsigned long pend; | ||
425 | unsigned long last; | ||
426 | int i; | ||
427 | |||
428 | /* if intpnd is set, read the next pending irq from there */ | ||
429 | reg_source = intc->reg_intpnd ? intc->reg_intpnd : intc->reg_pending; | ||
430 | |||
431 | last = 0; | ||
432 | for (i = 0; i < 4; i++) { | ||
433 | pend = __raw_readl(reg_source); | ||
434 | |||
435 | if (pend == 0 || pend == last) | ||
436 | break; | ||
437 | |||
438 | __raw_writel(pend, intc->reg_pending); | ||
439 | if (intc->reg_intpnd) | ||
440 | __raw_writel(pend, intc->reg_intpnd); | ||
441 | |||
442 | pr_info("irq: clearing pending status %08x\n", (int)pend); | ||
443 | last = pend; | ||
444 | } | ||
445 | } | ||
446 | |||
447 | struct s3c_irq_intc *s3c24xx_init_intc(struct device_node *np, | ||
448 | struct s3c_irq_data *irq_data, | ||
449 | struct s3c_irq_intc *parent, | ||
450 | unsigned long address) | ||
451 | { | ||
452 | struct s3c_irq_intc *intc; | ||
453 | void __iomem *base = (void *)0xf6000000; /* static mapping */ | ||
454 | int irq_num; | ||
455 | int irq_start; | ||
456 | int ret; | ||
457 | |||
458 | intc = kzalloc(sizeof(struct s3c_irq_intc), GFP_KERNEL); | ||
459 | if (!intc) | ||
460 | return ERR_PTR(-ENOMEM); | ||
461 | |||
462 | intc->irqs = irq_data; | ||
463 | |||
464 | if (parent) | ||
465 | intc->parent = parent; | ||
466 | |||
467 | /* select the correct data for the controller. | ||
468 | * Need to hard code the irq num start and offset | ||
469 | * to preserve the static mapping for now | ||
470 | */ | ||
471 | switch (address) { | ||
472 | case 0x4a000000: | ||
473 | pr_debug("irq: found main intc\n"); | ||
474 | intc->reg_pending = base; | ||
475 | intc->reg_mask = base + 0x08; | ||
476 | intc->reg_intpnd = base + 0x10; | ||
477 | irq_num = 32; | ||
478 | irq_start = S3C2410_IRQ(0); | ||
479 | break; | ||
480 | case 0x4a000018: | ||
481 | pr_debug("irq: found subintc\n"); | ||
482 | intc->reg_pending = base + 0x18; | ||
483 | intc->reg_mask = base + 0x1c; | ||
484 | irq_num = 29; | ||
485 | irq_start = S3C2410_IRQSUB(0); | ||
486 | break; | ||
487 | case 0x4a000040: | ||
488 | pr_debug("irq: found intc2\n"); | ||
489 | intc->reg_pending = base + 0x40; | ||
490 | intc->reg_mask = base + 0x48; | ||
491 | intc->reg_intpnd = base + 0x50; | ||
492 | irq_num = 8; | ||
493 | irq_start = S3C2416_IRQ(0); | ||
494 | break; | ||
495 | case 0x560000a4: | ||
496 | pr_debug("irq: found eintc\n"); | ||
497 | base = (void *)0xfd000000; | ||
498 | |||
499 | intc->reg_mask = base + 0xa4; | ||
500 | intc->reg_pending = base + 0x08; | ||
501 | irq_num = 24; | ||
502 | irq_start = S3C2410_IRQ(32); | ||
503 | break; | ||
504 | default: | ||
505 | pr_err("irq: unsupported controller address\n"); | ||
506 | ret = -EINVAL; | ||
507 | goto err; | ||
508 | } | ||
509 | |||
510 | /* now that all the data is complete, init the irq-domain */ | ||
511 | s3c24xx_clear_intc(intc); | ||
512 | intc->domain = irq_domain_add_legacy(np, irq_num, irq_start, | ||
513 | 0, &s3c24xx_irq_ops, | ||
514 | intc); | ||
515 | if (!intc->domain) { | ||
516 | pr_err("irq: could not create irq-domain\n"); | ||
517 | ret = -EINVAL; | ||
518 | goto err; | ||
519 | } | ||
520 | |||
521 | return intc; | ||
522 | |||
523 | err: | ||
524 | kfree(intc); | ||
525 | return ERR_PTR(ret); | ||
526 | } | ||
527 | |||
528 | /* s3c24xx_init_irq | ||
529 | * | ||
530 | * Initialise S3C2410 IRQ system | ||
531 | */ | ||
532 | |||
533 | static struct s3c_irq_data init_base[32] = { | ||
534 | { .type = S3C_IRQTYPE_EINT, }, /* EINT0 */ | ||
535 | { .type = S3C_IRQTYPE_EINT, }, /* EINT1 */ | ||
536 | { .type = S3C_IRQTYPE_EINT, }, /* EINT2 */ | ||
537 | { .type = S3C_IRQTYPE_EINT, }, /* EINT3 */ | ||
538 | { .type = S3C_IRQTYPE_LEVEL, }, /* EINT4to7 */ | ||
539 | { .type = S3C_IRQTYPE_LEVEL, }, /* EINT8to23 */ | ||
540 | { .type = S3C_IRQTYPE_NONE, }, /* reserved */ | ||
541 | { .type = S3C_IRQTYPE_EDGE, }, /* nBATT_FLT */ | ||
542 | { .type = S3C_IRQTYPE_EDGE, }, /* TICK */ | ||
543 | { .type = S3C_IRQTYPE_EDGE, }, /* WDT */ | ||
544 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER0 */ | ||
545 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER1 */ | ||
546 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER2 */ | ||
547 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER3 */ | ||
548 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER4 */ | ||
549 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART2 */ | ||
550 | { .type = S3C_IRQTYPE_EDGE, }, /* LCD */ | ||
551 | { .type = S3C_IRQTYPE_EDGE, }, /* DMA0 */ | ||
552 | { .type = S3C_IRQTYPE_EDGE, }, /* DMA1 */ | ||
553 | { .type = S3C_IRQTYPE_EDGE, }, /* DMA2 */ | ||
554 | { .type = S3C_IRQTYPE_EDGE, }, /* DMA3 */ | ||
555 | { .type = S3C_IRQTYPE_EDGE, }, /* SDI */ | ||
556 | { .type = S3C_IRQTYPE_EDGE, }, /* SPI0 */ | ||
557 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART1 */ | ||
558 | { .type = S3C_IRQTYPE_NONE, }, /* reserved */ | ||
559 | { .type = S3C_IRQTYPE_EDGE, }, /* USBD */ | ||
560 | { .type = S3C_IRQTYPE_EDGE, }, /* USBH */ | ||
561 | { .type = S3C_IRQTYPE_EDGE, }, /* IIC */ | ||
562 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART0 */ | ||
563 | { .type = S3C_IRQTYPE_EDGE, }, /* SPI1 */ | ||
564 | { .type = S3C_IRQTYPE_EDGE, }, /* RTC */ | ||
565 | { .type = S3C_IRQTYPE_LEVEL, }, /* ADCPARENT */ | ||
566 | }; | ||
567 | |||
568 | static struct s3c_irq_data init_eint[32] = { | ||
569 | { .type = S3C_IRQTYPE_NONE, }, /* reserved */ | ||
570 | { .type = S3C_IRQTYPE_NONE, }, /* reserved */ | ||
571 | { .type = S3C_IRQTYPE_NONE, }, /* reserved */ | ||
572 | { .type = S3C_IRQTYPE_NONE, }, /* reserved */ | ||
573 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT4 */ | ||
574 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT5 */ | ||
575 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT6 */ | ||
576 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT7 */ | ||
577 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT8 */ | ||
578 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT9 */ | ||
579 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT10 */ | ||
580 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT11 */ | ||
581 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT12 */ | ||
582 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT13 */ | ||
583 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT14 */ | ||
584 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT15 */ | ||
585 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT16 */ | ||
586 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT17 */ | ||
587 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT18 */ | ||
588 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT19 */ | ||
589 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT20 */ | ||
590 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT21 */ | ||
591 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT22 */ | ||
592 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT23 */ | ||
593 | }; | ||
594 | |||
595 | static struct s3c_irq_data init_subint[32] = { | ||
596 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-RX */ | ||
597 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-TX */ | ||
598 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-ERR */ | ||
599 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-RX */ | ||
600 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-TX */ | ||
601 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-ERR */ | ||
602 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-RX */ | ||
603 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-TX */ | ||
604 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */ | ||
605 | { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */ | ||
606 | { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */ | ||
607 | }; | ||
608 | |||
609 | void __init s3c24xx_init_irq(void) | ||
610 | { | ||
611 | struct s3c_irq_intc *main_intc; | ||
612 | |||
613 | #ifdef CONFIG_FIQ | ||
614 | init_FIQ(FIQ_START); | ||
615 | #endif | ||
616 | |||
617 | main_intc = s3c24xx_init_intc(NULL, &init_base[0], NULL, 0x4a000000); | ||
618 | if (IS_ERR(main_intc)) { | ||
619 | pr_err("irq: could not create main interrupt controller\n"); | ||
620 | return; | ||
621 | } | ||
622 | |||
623 | s3c24xx_init_intc(NULL, &init_subint[0], main_intc, 0x4a000018); | ||
624 | s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4); | ||
625 | } | ||
626 | |||
627 | #ifdef CONFIG_CPU_S3C2412 | ||
628 | static struct s3c_irq_data init_s3c2412base[32] = { | ||
629 | { .type = S3C_IRQTYPE_LEVEL, }, /* EINT0 */ | ||
630 | { .type = S3C_IRQTYPE_LEVEL, }, /* EINT1 */ | ||
631 | { .type = S3C_IRQTYPE_LEVEL, }, /* EINT2 */ | ||
632 | { .type = S3C_IRQTYPE_LEVEL, }, /* EINT3 */ | ||
633 | { .type = S3C_IRQTYPE_LEVEL, }, /* EINT4to7 */ | ||
634 | { .type = S3C_IRQTYPE_LEVEL, }, /* EINT8to23 */ | ||
635 | { .type = S3C_IRQTYPE_NONE, }, /* reserved */ | ||
636 | { .type = S3C_IRQTYPE_EDGE, }, /* nBATT_FLT */ | ||
637 | { .type = S3C_IRQTYPE_EDGE, }, /* TICK */ | ||
638 | { .type = S3C_IRQTYPE_EDGE, }, /* WDT */ | ||
639 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER0 */ | ||
640 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER1 */ | ||
641 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER2 */ | ||
642 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER3 */ | ||
643 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER4 */ | ||
644 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART2 */ | ||
645 | { .type = S3C_IRQTYPE_EDGE, }, /* LCD */ | ||
646 | { .type = S3C_IRQTYPE_EDGE, }, /* DMA0 */ | ||
647 | { .type = S3C_IRQTYPE_EDGE, }, /* DMA1 */ | ||
648 | { .type = S3C_IRQTYPE_EDGE, }, /* DMA2 */ | ||
649 | { .type = S3C_IRQTYPE_EDGE, }, /* DMA3 */ | ||
650 | { .type = S3C_IRQTYPE_LEVEL, }, /* SDI/CF */ | ||
651 | { .type = S3C_IRQTYPE_EDGE, }, /* SPI0 */ | ||
652 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART1 */ | ||
653 | { .type = S3C_IRQTYPE_NONE, }, /* reserved */ | ||
654 | { .type = S3C_IRQTYPE_EDGE, }, /* USBD */ | ||
655 | { .type = S3C_IRQTYPE_EDGE, }, /* USBH */ | ||
656 | { .type = S3C_IRQTYPE_EDGE, }, /* IIC */ | ||
657 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART0 */ | ||
658 | { .type = S3C_IRQTYPE_EDGE, }, /* SPI1 */ | ||
659 | { .type = S3C_IRQTYPE_EDGE, }, /* RTC */ | ||
660 | { .type = S3C_IRQTYPE_LEVEL, }, /* ADCPARENT */ | ||
661 | }; | ||
662 | |||
663 | static struct s3c_irq_data init_s3c2412eint[32] = { | ||
664 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 0 }, /* EINT0 */ | ||
665 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 1 }, /* EINT1 */ | ||
666 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 2 }, /* EINT2 */ | ||
667 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 3 }, /* EINT3 */ | ||
668 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT4 */ | ||
669 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT5 */ | ||
670 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT6 */ | ||
671 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT7 */ | ||
672 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT8 */ | ||
673 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT9 */ | ||
674 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT10 */ | ||
675 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT11 */ | ||
676 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT12 */ | ||
677 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT13 */ | ||
678 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT14 */ | ||
679 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT15 */ | ||
680 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT16 */ | ||
681 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT17 */ | ||
682 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT18 */ | ||
683 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT19 */ | ||
684 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT20 */ | ||
685 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT21 */ | ||
686 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT22 */ | ||
687 | { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT23 */ | ||
688 | }; | ||
689 | |||
690 | static struct s3c_irq_data init_s3c2412subint[32] = { | ||
691 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-RX */ | ||
692 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-TX */ | ||
693 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-ERR */ | ||
694 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-RX */ | ||
695 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-TX */ | ||
696 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-ERR */ | ||
697 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-RX */ | ||
698 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-TX */ | ||
699 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */ | ||
700 | { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */ | ||
701 | { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */ | ||
702 | { .type = S3C_IRQTYPE_NONE, }, | ||
703 | { .type = S3C_IRQTYPE_NONE, }, | ||
704 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 21 }, /* SDI */ | ||
705 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 21 }, /* CF */ | ||
706 | }; | ||
707 | |||
708 | void s3c2412_init_irq(void) | ||
709 | { | ||
710 | struct s3c_irq_intc *main_intc; | ||
711 | |||
712 | pr_info("S3C2412: IRQ Support\n"); | ||
713 | |||
714 | #ifdef CONFIG_FIQ | ||
715 | init_FIQ(FIQ_START); | ||
716 | #endif | ||
717 | |||
718 | main_intc = s3c24xx_init_intc(NULL, &init_s3c2412base[0], NULL, 0x4a000000); | ||
719 | if (IS_ERR(main_intc)) { | ||
720 | pr_err("irq: could not create main interrupt controller\n"); | ||
721 | return; | ||
722 | } | ||
723 | |||
724 | s3c24xx_init_intc(NULL, &init_s3c2412eint[0], main_intc, 0x560000a4); | ||
725 | s3c24xx_init_intc(NULL, &init_s3c2412subint[0], main_intc, 0x4a000018); | ||
726 | } | ||
727 | #endif | ||
728 | |||
729 | #ifdef CONFIG_CPU_S3C2416 | ||
730 | static struct s3c_irq_data init_s3c2416base[32] = { | ||
731 | { .type = S3C_IRQTYPE_EINT, }, /* EINT0 */ | ||
732 | { .type = S3C_IRQTYPE_EINT, }, /* EINT1 */ | ||
733 | { .type = S3C_IRQTYPE_EINT, }, /* EINT2 */ | ||
734 | { .type = S3C_IRQTYPE_EINT, }, /* EINT3 */ | ||
735 | { .type = S3C_IRQTYPE_LEVEL, }, /* EINT4to7 */ | ||
736 | { .type = S3C_IRQTYPE_LEVEL, }, /* EINT8to23 */ | ||
737 | { .type = S3C_IRQTYPE_NONE, }, /* reserved */ | ||
738 | { .type = S3C_IRQTYPE_EDGE, }, /* nBATT_FLT */ | ||
739 | { .type = S3C_IRQTYPE_EDGE, }, /* TICK */ | ||
740 | { .type = S3C_IRQTYPE_LEVEL, }, /* WDT/AC97 */ | ||
741 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER0 */ | ||
742 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER1 */ | ||
743 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER2 */ | ||
744 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER3 */ | ||
745 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER4 */ | ||
746 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART2 */ | ||
747 | { .type = S3C_IRQTYPE_LEVEL, }, /* LCD */ | ||
748 | { .type = S3C_IRQTYPE_LEVEL, }, /* DMA */ | ||
749 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART3 */ | ||
750 | { .type = S3C_IRQTYPE_NONE, }, /* reserved */ | ||
751 | { .type = S3C_IRQTYPE_EDGE, }, /* SDI1 */ | ||
752 | { .type = S3C_IRQTYPE_EDGE, }, /* SDI0 */ | ||
753 | { .type = S3C_IRQTYPE_EDGE, }, /* SPI0 */ | ||
754 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART1 */ | ||
755 | { .type = S3C_IRQTYPE_EDGE, }, /* NAND */ | ||
756 | { .type = S3C_IRQTYPE_EDGE, }, /* USBD */ | ||
757 | { .type = S3C_IRQTYPE_EDGE, }, /* USBH */ | ||
758 | { .type = S3C_IRQTYPE_EDGE, }, /* IIC */ | ||
759 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART0 */ | ||
760 | { .type = S3C_IRQTYPE_NONE, }, | ||
761 | { .type = S3C_IRQTYPE_EDGE, }, /* RTC */ | ||
762 | { .type = S3C_IRQTYPE_LEVEL, }, /* ADCPARENT */ | ||
763 | }; | ||
764 | |||
765 | static struct s3c_irq_data init_s3c2416subint[32] = { | ||
766 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-RX */ | ||
767 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-TX */ | ||
768 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-ERR */ | ||
769 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-RX */ | ||
770 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-TX */ | ||
771 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-ERR */ | ||
772 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-RX */ | ||
773 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-TX */ | ||
774 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */ | ||
775 | { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */ | ||
776 | { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */ | ||
777 | { .type = S3C_IRQTYPE_NONE }, /* reserved */ | ||
778 | { .type = S3C_IRQTYPE_NONE }, /* reserved */ | ||
779 | { .type = S3C_IRQTYPE_NONE }, /* reserved */ | ||
780 | { .type = S3C_IRQTYPE_NONE }, /* reserved */ | ||
781 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 16 }, /* LCD2 */ | ||
782 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 16 }, /* LCD3 */ | ||
783 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 16 }, /* LCD4 */ | ||
784 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA0 */ | ||
785 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA1 */ | ||
786 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA2 */ | ||
787 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA3 */ | ||
788 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA4 */ | ||
789 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA5 */ | ||
790 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 18 }, /* UART3-RX */ | ||
791 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 18 }, /* UART3-TX */ | ||
792 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 18 }, /* UART3-ERR */ | ||
793 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 9 }, /* WDT */ | ||
794 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 9 }, /* AC97 */ | ||
795 | }; | ||
796 | |||
797 | static struct s3c_irq_data init_s3c2416_second[32] = { | ||
798 | { .type = S3C_IRQTYPE_EDGE }, /* 2D */ | ||
799 | { .type = S3C_IRQTYPE_EDGE }, /* IIC1 */ | ||
800 | { .type = S3C_IRQTYPE_NONE }, /* reserved */ | ||
801 | { .type = S3C_IRQTYPE_NONE }, /* reserved */ | ||
802 | { .type = S3C_IRQTYPE_EDGE }, /* PCM0 */ | ||
803 | { .type = S3C_IRQTYPE_EDGE }, /* PCM1 */ | ||
804 | { .type = S3C_IRQTYPE_EDGE }, /* I2S0 */ | ||
805 | { .type = S3C_IRQTYPE_EDGE }, /* I2S1 */ | ||
806 | }; | ||
807 | |||
808 | void __init s3c2416_init_irq(void) | ||
809 | { | ||
810 | struct s3c_irq_intc *main_intc; | ||
811 | |||
812 | pr_info("S3C2416: IRQ Support\n"); | ||
813 | |||
814 | #ifdef CONFIG_FIQ | ||
815 | init_FIQ(FIQ_START); | ||
816 | #endif | ||
817 | |||
818 | main_intc = s3c24xx_init_intc(NULL, &init_s3c2416base[0], NULL, 0x4a000000); | ||
819 | if (IS_ERR(main_intc)) { | ||
820 | pr_err("irq: could not create main interrupt controller\n"); | ||
821 | return; | ||
822 | } | ||
823 | |||
824 | s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4); | ||
825 | s3c24xx_init_intc(NULL, &init_s3c2416subint[0], main_intc, 0x4a000018); | ||
826 | |||
827 | s3c24xx_init_intc(NULL, &init_s3c2416_second[0], NULL, 0x4a000040); | ||
828 | } | ||
829 | |||
830 | #endif | ||
831 | |||
832 | #ifdef CONFIG_CPU_S3C2440 | ||
833 | static struct s3c_irq_data init_s3c2440base[32] = { | ||
834 | { .type = S3C_IRQTYPE_EINT, }, /* EINT0 */ | ||
835 | { .type = S3C_IRQTYPE_EINT, }, /* EINT1 */ | ||
836 | { .type = S3C_IRQTYPE_EINT, }, /* EINT2 */ | ||
837 | { .type = S3C_IRQTYPE_EINT, }, /* EINT3 */ | ||
838 | { .type = S3C_IRQTYPE_LEVEL, }, /* EINT4to7 */ | ||
839 | { .type = S3C_IRQTYPE_LEVEL, }, /* EINT8to23 */ | ||
840 | { .type = S3C_IRQTYPE_LEVEL, }, /* CAM */ | ||
841 | { .type = S3C_IRQTYPE_EDGE, }, /* nBATT_FLT */ | ||
842 | { .type = S3C_IRQTYPE_EDGE, }, /* TICK */ | ||
843 | { .type = S3C_IRQTYPE_LEVEL, }, /* WDT/AC97 */ | ||
844 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER0 */ | ||
845 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER1 */ | ||
846 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER2 */ | ||
847 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER3 */ | ||
848 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER4 */ | ||
849 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART2 */ | ||
850 | { .type = S3C_IRQTYPE_EDGE, }, /* LCD */ | ||
851 | { .type = S3C_IRQTYPE_EDGE, }, /* DMA0 */ | ||
852 | { .type = S3C_IRQTYPE_EDGE, }, /* DMA1 */ | ||
853 | { .type = S3C_IRQTYPE_EDGE, }, /* DMA2 */ | ||
854 | { .type = S3C_IRQTYPE_EDGE, }, /* DMA3 */ | ||
855 | { .type = S3C_IRQTYPE_EDGE, }, /* SDI */ | ||
856 | { .type = S3C_IRQTYPE_EDGE, }, /* SPI0 */ | ||
857 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART1 */ | ||
858 | { .type = S3C_IRQTYPE_LEVEL, }, /* NFCON */ | ||
859 | { .type = S3C_IRQTYPE_EDGE, }, /* USBD */ | ||
860 | { .type = S3C_IRQTYPE_EDGE, }, /* USBH */ | ||
861 | { .type = S3C_IRQTYPE_EDGE, }, /* IIC */ | ||
862 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART0 */ | ||
863 | { .type = S3C_IRQTYPE_EDGE, }, /* SPI1 */ | ||
864 | { .type = S3C_IRQTYPE_EDGE, }, /* RTC */ | ||
865 | { .type = S3C_IRQTYPE_LEVEL, }, /* ADCPARENT */ | ||
866 | }; | ||
867 | |||
868 | static struct s3c_irq_data init_s3c2440subint[32] = { | ||
869 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-RX */ | ||
870 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-TX */ | ||
871 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-ERR */ | ||
872 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-RX */ | ||
873 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-TX */ | ||
874 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-ERR */ | ||
875 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-RX */ | ||
876 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-TX */ | ||
877 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */ | ||
878 | { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */ | ||
879 | { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */ | ||
880 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* TC */ | ||
881 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* ADC */ | ||
882 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 9 }, /* WDT */ | ||
883 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 9 }, /* AC97 */ | ||
884 | }; | ||
885 | |||
886 | void __init s3c2440_init_irq(void) | ||
887 | { | ||
888 | struct s3c_irq_intc *main_intc; | ||
889 | |||
890 | pr_info("S3C2440: IRQ Support\n"); | ||
891 | |||
892 | #ifdef CONFIG_FIQ | ||
893 | init_FIQ(FIQ_START); | ||
894 | #endif | ||
895 | |||
896 | main_intc = s3c24xx_init_intc(NULL, &init_s3c2440base[0], NULL, 0x4a000000); | ||
897 | if (IS_ERR(main_intc)) { | ||
898 | pr_err("irq: could not create main interrupt controller\n"); | ||
899 | return; | ||
900 | } | ||
901 | |||
902 | s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4); | ||
903 | s3c24xx_init_intc(NULL, &init_s3c2440subint[0], main_intc, 0x4a000018); | ||
904 | } | ||
905 | #endif | ||
906 | |||
907 | #ifdef CONFIG_CPU_S3C2442 | ||
908 | static struct s3c_irq_data init_s3c2442base[32] = { | ||
909 | { .type = S3C_IRQTYPE_EINT, }, /* EINT0 */ | ||
910 | { .type = S3C_IRQTYPE_EINT, }, /* EINT1 */ | ||
911 | { .type = S3C_IRQTYPE_EINT, }, /* EINT2 */ | ||
912 | { .type = S3C_IRQTYPE_EINT, }, /* EINT3 */ | ||
913 | { .type = S3C_IRQTYPE_LEVEL, }, /* EINT4to7 */ | ||
914 | { .type = S3C_IRQTYPE_LEVEL, }, /* EINT8to23 */ | ||
915 | { .type = S3C_IRQTYPE_LEVEL, }, /* CAM */ | ||
916 | { .type = S3C_IRQTYPE_EDGE, }, /* nBATT_FLT */ | ||
917 | { .type = S3C_IRQTYPE_EDGE, }, /* TICK */ | ||
918 | { .type = S3C_IRQTYPE_EDGE, }, /* WDT */ | ||
919 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER0 */ | ||
920 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER1 */ | ||
921 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER2 */ | ||
922 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER3 */ | ||
923 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER4 */ | ||
924 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART2 */ | ||
925 | { .type = S3C_IRQTYPE_EDGE, }, /* LCD */ | ||
926 | { .type = S3C_IRQTYPE_EDGE, }, /* DMA0 */ | ||
927 | { .type = S3C_IRQTYPE_EDGE, }, /* DMA1 */ | ||
928 | { .type = S3C_IRQTYPE_EDGE, }, /* DMA2 */ | ||
929 | { .type = S3C_IRQTYPE_EDGE, }, /* DMA3 */ | ||
930 | { .type = S3C_IRQTYPE_EDGE, }, /* SDI */ | ||
931 | { .type = S3C_IRQTYPE_EDGE, }, /* SPI0 */ | ||
932 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART1 */ | ||
933 | { .type = S3C_IRQTYPE_LEVEL, }, /* NFCON */ | ||
934 | { .type = S3C_IRQTYPE_EDGE, }, /* USBD */ | ||
935 | { .type = S3C_IRQTYPE_EDGE, }, /* USBH */ | ||
936 | { .type = S3C_IRQTYPE_EDGE, }, /* IIC */ | ||
937 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART0 */ | ||
938 | { .type = S3C_IRQTYPE_EDGE, }, /* SPI1 */ | ||
939 | { .type = S3C_IRQTYPE_EDGE, }, /* RTC */ | ||
940 | { .type = S3C_IRQTYPE_LEVEL, }, /* ADCPARENT */ | ||
941 | }; | ||
942 | |||
943 | static struct s3c_irq_data init_s3c2442subint[32] = { | ||
944 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-RX */ | ||
945 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-TX */ | ||
946 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-ERR */ | ||
947 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-RX */ | ||
948 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-TX */ | ||
949 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-ERR */ | ||
950 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-RX */ | ||
951 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-TX */ | ||
952 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */ | ||
953 | { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */ | ||
954 | { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */ | ||
955 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* TC */ | ||
956 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* ADC */ | ||
957 | }; | ||
958 | |||
959 | void __init s3c2442_init_irq(void) | ||
960 | { | ||
961 | struct s3c_irq_intc *main_intc; | ||
962 | |||
963 | pr_info("S3C2442: IRQ Support\n"); | ||
964 | |||
965 | #ifdef CONFIG_FIQ | ||
966 | init_FIQ(FIQ_START); | ||
967 | #endif | ||
968 | |||
969 | main_intc = s3c24xx_init_intc(NULL, &init_s3c2442base[0], NULL, 0x4a000000); | ||
970 | if (IS_ERR(main_intc)) { | ||
971 | pr_err("irq: could not create main interrupt controller\n"); | ||
972 | return; | ||
973 | } | ||
974 | |||
975 | s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4); | ||
976 | s3c24xx_init_intc(NULL, &init_s3c2442subint[0], main_intc, 0x4a000018); | ||
977 | } | ||
978 | #endif | ||
979 | |||
980 | #ifdef CONFIG_CPU_S3C2443 | ||
981 | static struct s3c_irq_data init_s3c2443base[32] = { | ||
982 | { .type = S3C_IRQTYPE_EINT, }, /* EINT0 */ | ||
983 | { .type = S3C_IRQTYPE_EINT, }, /* EINT1 */ | ||
984 | { .type = S3C_IRQTYPE_EINT, }, /* EINT2 */ | ||
985 | { .type = S3C_IRQTYPE_EINT, }, /* EINT3 */ | ||
986 | { .type = S3C_IRQTYPE_LEVEL, }, /* EINT4to7 */ | ||
987 | { .type = S3C_IRQTYPE_LEVEL, }, /* EINT8to23 */ | ||
988 | { .type = S3C_IRQTYPE_LEVEL, }, /* CAM */ | ||
989 | { .type = S3C_IRQTYPE_EDGE, }, /* nBATT_FLT */ | ||
990 | { .type = S3C_IRQTYPE_EDGE, }, /* TICK */ | ||
991 | { .type = S3C_IRQTYPE_LEVEL, }, /* WDT/AC97 */ | ||
992 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER0 */ | ||
993 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER1 */ | ||
994 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER2 */ | ||
995 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER3 */ | ||
996 | { .type = S3C_IRQTYPE_EDGE, }, /* TIMER4 */ | ||
997 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART2 */ | ||
998 | { .type = S3C_IRQTYPE_LEVEL, }, /* LCD */ | ||
999 | { .type = S3C_IRQTYPE_LEVEL, }, /* DMA */ | ||
1000 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART3 */ | ||
1001 | { .type = S3C_IRQTYPE_EDGE, }, /* CFON */ | ||
1002 | { .type = S3C_IRQTYPE_EDGE, }, /* SDI1 */ | ||
1003 | { .type = S3C_IRQTYPE_EDGE, }, /* SDI0 */ | ||
1004 | { .type = S3C_IRQTYPE_EDGE, }, /* SPI0 */ | ||
1005 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART1 */ | ||
1006 | { .type = S3C_IRQTYPE_EDGE, }, /* NAND */ | ||
1007 | { .type = S3C_IRQTYPE_EDGE, }, /* USBD */ | ||
1008 | { .type = S3C_IRQTYPE_EDGE, }, /* USBH */ | ||
1009 | { .type = S3C_IRQTYPE_EDGE, }, /* IIC */ | ||
1010 | { .type = S3C_IRQTYPE_LEVEL, }, /* UART0 */ | ||
1011 | { .type = S3C_IRQTYPE_EDGE, }, /* SPI1 */ | ||
1012 | { .type = S3C_IRQTYPE_EDGE, }, /* RTC */ | ||
1013 | { .type = S3C_IRQTYPE_LEVEL, }, /* ADCPARENT */ | ||
1014 | }; | ||
1015 | |||
1016 | |||
1017 | static struct s3c_irq_data init_s3c2443subint[32] = { | ||
1018 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-RX */ | ||
1019 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-TX */ | ||
1020 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-ERR */ | ||
1021 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-RX */ | ||
1022 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-TX */ | ||
1023 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-ERR */ | ||
1024 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-RX */ | ||
1025 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-TX */ | ||
1026 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */ | ||
1027 | { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */ | ||
1028 | { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */ | ||
1029 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* CAM_C */ | ||
1030 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* CAM_P */ | ||
1031 | { .type = S3C_IRQTYPE_NONE }, /* reserved */ | ||
1032 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 16 }, /* LCD1 */ | ||
1033 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 16 }, /* LCD2 */ | ||
1034 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 16 }, /* LCD3 */ | ||
1035 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 16 }, /* LCD4 */ | ||
1036 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA0 */ | ||
1037 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA1 */ | ||
1038 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA2 */ | ||
1039 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA3 */ | ||
1040 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA4 */ | ||
1041 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 17 }, /* DMA5 */ | ||
1042 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 18 }, /* UART3-RX */ | ||
1043 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 18 }, /* UART3-TX */ | ||
1044 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 18 }, /* UART3-ERR */ | ||
1045 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 9 }, /* WDT */ | ||
1046 | { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 9 }, /* AC97 */ | ||
1047 | }; | ||
1048 | |||
1049 | void __init s3c2443_init_irq(void) | ||
1050 | { | ||
1051 | struct s3c_irq_intc *main_intc; | ||
1052 | |||
1053 | pr_info("S3C2443: IRQ Support\n"); | ||
1054 | |||
1055 | #ifdef CONFIG_FIQ | ||
1056 | init_FIQ(FIQ_START); | ||
1057 | #endif | ||
1058 | |||
1059 | main_intc = s3c24xx_init_intc(NULL, &init_s3c2443base[0], NULL, 0x4a000000); | ||
1060 | if (IS_ERR(main_intc)) { | ||
1061 | pr_err("irq: could not create main interrupt controller\n"); | ||
1062 | return; | ||
1063 | } | ||
1064 | |||
1065 | s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4); | ||
1066 | s3c24xx_init_intc(NULL, &init_s3c2443subint[0], main_intc, 0x4a000018); | ||
1067 | } | ||
1068 | #endif | ||
diff --git a/arch/arm/mach-s3c24xx/mach-amlm5900.c b/arch/arm/mach-s3c24xx/mach-amlm5900.c index 432144cb54ae..e27b5c91b3db 100644 --- a/arch/arm/mach-s3c24xx/mach-amlm5900.c +++ b/arch/arm/mach-s3c24xx/mach-amlm5900.c | |||
@@ -238,7 +238,7 @@ static void __init amlm5900_init(void) | |||
238 | MACHINE_START(AML_M5900, "AML_M5900") | 238 | MACHINE_START(AML_M5900, "AML_M5900") |
239 | .atag_offset = 0x100, | 239 | .atag_offset = 0x100, |
240 | .map_io = amlm5900_map_io, | 240 | .map_io = amlm5900_map_io, |
241 | .init_irq = s3c24xx_init_irq, | 241 | .init_irq = s3c2410_init_irq, |
242 | .init_machine = amlm5900_init, | 242 | .init_machine = amlm5900_init, |
243 | .init_time = samsung_timer_init, | 243 | .init_time = samsung_timer_init, |
244 | .restart = s3c2410_restart, | 244 | .restart = s3c2410_restart, |
diff --git a/arch/arm/mach-s3c24xx/mach-bast.c b/arch/arm/mach-s3c24xx/mach-bast.c index eabe2db42ef6..22d6ae926d91 100644 --- a/arch/arm/mach-s3c24xx/mach-bast.c +++ b/arch/arm/mach-s3c24xx/mach-bast.c | |||
@@ -605,7 +605,7 @@ MACHINE_START(BAST, "Simtec-BAST") | |||
605 | /* Maintainer: Ben Dooks <ben@simtec.co.uk> */ | 605 | /* Maintainer: Ben Dooks <ben@simtec.co.uk> */ |
606 | .atag_offset = 0x100, | 606 | .atag_offset = 0x100, |
607 | .map_io = bast_map_io, | 607 | .map_io = bast_map_io, |
608 | .init_irq = s3c24xx_init_irq, | 608 | .init_irq = s3c2410_init_irq, |
609 | .init_machine = bast_init, | 609 | .init_machine = bast_init, |
610 | .init_time = samsung_timer_init, | 610 | .init_time = samsung_timer_init, |
611 | .restart = s3c2410_restart, | 611 | .restart = s3c2410_restart, |
diff --git a/arch/arm/mach-s3c24xx/mach-h1940.c b/arch/arm/mach-s3c24xx/mach-h1940.c index 8dd660102846..af4334d6b4d5 100644 --- a/arch/arm/mach-s3c24xx/mach-h1940.c +++ b/arch/arm/mach-s3c24xx/mach-h1940.c | |||
@@ -667,11 +667,6 @@ static void __init h1940_reserve(void) | |||
667 | memblock_reserve(0x30081000, 0x1000); | 667 | memblock_reserve(0x30081000, 0x1000); |
668 | } | 668 | } |
669 | 669 | ||
670 | static void __init h1940_init_irq(void) | ||
671 | { | ||
672 | s3c24xx_init_irq(); | ||
673 | } | ||
674 | |||
675 | static void __init h1940_init(void) | 670 | static void __init h1940_init(void) |
676 | { | 671 | { |
677 | u32 tmp; | 672 | u32 tmp; |
@@ -740,7 +735,7 @@ MACHINE_START(H1940, "IPAQ-H1940") | |||
740 | .atag_offset = 0x100, | 735 | .atag_offset = 0x100, |
741 | .map_io = h1940_map_io, | 736 | .map_io = h1940_map_io, |
742 | .reserve = h1940_reserve, | 737 | .reserve = h1940_reserve, |
743 | .init_irq = h1940_init_irq, | 738 | .init_irq = s3c2410_init_irq, |
744 | .init_machine = h1940_init, | 739 | .init_machine = h1940_init, |
745 | .init_time = samsung_timer_init, | 740 | .init_time = samsung_timer_init, |
746 | .restart = s3c2410_restart, | 741 | .restart = s3c2410_restart, |
diff --git a/arch/arm/mach-s3c24xx/mach-n30.c b/arch/arm/mach-s3c24xx/mach-n30.c index 73a690f431e6..2cb46c37c920 100644 --- a/arch/arm/mach-s3c24xx/mach-n30.c +++ b/arch/arm/mach-s3c24xx/mach-n30.c | |||
@@ -592,7 +592,7 @@ MACHINE_START(N30, "Acer-N30") | |||
592 | .atag_offset = 0x100, | 592 | .atag_offset = 0x100, |
593 | .init_time = samsung_timer_init, | 593 | .init_time = samsung_timer_init, |
594 | .init_machine = n30_init, | 594 | .init_machine = n30_init, |
595 | .init_irq = s3c24xx_init_irq, | 595 | .init_irq = s3c2410_init_irq, |
596 | .map_io = n30_map_io, | 596 | .map_io = n30_map_io, |
597 | .restart = s3c2410_restart, | 597 | .restart = s3c2410_restart, |
598 | MACHINE_END | 598 | MACHINE_END |
@@ -603,7 +603,7 @@ MACHINE_START(N35, "Acer-N35") | |||
603 | .atag_offset = 0x100, | 603 | .atag_offset = 0x100, |
604 | .init_time = samsung_timer_init, | 604 | .init_time = samsung_timer_init, |
605 | .init_machine = n30_init, | 605 | .init_machine = n30_init, |
606 | .init_irq = s3c24xx_init_irq, | 606 | .init_irq = s3c2410_init_irq, |
607 | .map_io = n30_map_io, | 607 | .map_io = n30_map_io, |
608 | .restart = s3c2410_restart, | 608 | .restart = s3c2410_restart, |
609 | MACHINE_END | 609 | MACHINE_END |
diff --git a/arch/arm/mach-s3c24xx/mach-otom.c b/arch/arm/mach-s3c24xx/mach-otom.c index 7b8670746b6a..7e16b0740ec1 100644 --- a/arch/arm/mach-s3c24xx/mach-otom.c +++ b/arch/arm/mach-s3c24xx/mach-otom.c | |||
@@ -116,7 +116,7 @@ MACHINE_START(OTOM, "Nex Vision - Otom 1.1") | |||
116 | .atag_offset = 0x100, | 116 | .atag_offset = 0x100, |
117 | .map_io = otom11_map_io, | 117 | .map_io = otom11_map_io, |
118 | .init_machine = otom11_init, | 118 | .init_machine = otom11_init, |
119 | .init_irq = s3c24xx_init_irq, | 119 | .init_irq = s3c2410_init_irq, |
120 | .init_time = samsung_timer_init, | 120 | .init_time = samsung_timer_init, |
121 | .restart = s3c2410_restart, | 121 | .restart = s3c2410_restart, |
122 | MACHINE_END | 122 | MACHINE_END |
diff --git a/arch/arm/mach-s3c24xx/mach-qt2410.c b/arch/arm/mach-s3c24xx/mach-qt2410.c index 71cf29b12d1f..f8feaeadb55a 100644 --- a/arch/arm/mach-s3c24xx/mach-qt2410.c +++ b/arch/arm/mach-s3c24xx/mach-qt2410.c | |||
@@ -343,7 +343,7 @@ static void __init qt2410_machine_init(void) | |||
343 | MACHINE_START(QT2410, "QT2410") | 343 | MACHINE_START(QT2410, "QT2410") |
344 | .atag_offset = 0x100, | 344 | .atag_offset = 0x100, |
345 | .map_io = qt2410_map_io, | 345 | .map_io = qt2410_map_io, |
346 | .init_irq = s3c24xx_init_irq, | 346 | .init_irq = s3c2410_init_irq, |
347 | .init_machine = qt2410_machine_init, | 347 | .init_machine = qt2410_machine_init, |
348 | .init_time = samsung_timer_init, | 348 | .init_time = samsung_timer_init, |
349 | .restart = s3c2410_restart, | 349 | .restart = s3c2410_restart, |
diff --git a/arch/arm/mach-s3c24xx/mach-smdk2410.c b/arch/arm/mach-s3c24xx/mach-smdk2410.c index fd96f7fc330c..a773789e4f38 100644 --- a/arch/arm/mach-s3c24xx/mach-smdk2410.c +++ b/arch/arm/mach-s3c24xx/mach-smdk2410.c | |||
@@ -116,7 +116,7 @@ MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switc | |||
116 | /* Maintainer: Jonas Dietsche */ | 116 | /* Maintainer: Jonas Dietsche */ |
117 | .atag_offset = 0x100, | 117 | .atag_offset = 0x100, |
118 | .map_io = smdk2410_map_io, | 118 | .map_io = smdk2410_map_io, |
119 | .init_irq = s3c24xx_init_irq, | 119 | .init_irq = s3c2410_init_irq, |
120 | .init_machine = smdk2410_init, | 120 | .init_machine = smdk2410_init, |
121 | .init_time = samsung_timer_init, | 121 | .init_time = samsung_timer_init, |
122 | .restart = s3c2410_restart, | 122 | .restart = s3c2410_restart, |
diff --git a/arch/arm/mach-s3c24xx/mach-tct_hammer.c b/arch/arm/mach-s3c24xx/mach-tct_hammer.c index 31dfe589e349..7fad8f055cab 100644 --- a/arch/arm/mach-s3c24xx/mach-tct_hammer.c +++ b/arch/arm/mach-s3c24xx/mach-tct_hammer.c | |||
@@ -149,7 +149,7 @@ static void __init tct_hammer_init(void) | |||
149 | MACHINE_START(TCT_HAMMER, "TCT_HAMMER") | 149 | MACHINE_START(TCT_HAMMER, "TCT_HAMMER") |
150 | .atag_offset = 0x100, | 150 | .atag_offset = 0x100, |
151 | .map_io = tct_hammer_map_io, | 151 | .map_io = tct_hammer_map_io, |
152 | .init_irq = s3c24xx_init_irq, | 152 | .init_irq = s3c2410_init_irq, |
153 | .init_machine = tct_hammer_init, | 153 | .init_machine = tct_hammer_init, |
154 | .init_time = samsung_timer_init, | 154 | .init_time = samsung_timer_init, |
155 | .restart = s3c2410_restart, | 155 | .restart = s3c2410_restart, |
diff --git a/arch/arm/mach-s3c24xx/mach-vr1000.c b/arch/arm/mach-s3c24xx/mach-vr1000.c index deeb8a0a4034..42e7187fed60 100644 --- a/arch/arm/mach-s3c24xx/mach-vr1000.c +++ b/arch/arm/mach-s3c24xx/mach-vr1000.c | |||
@@ -355,7 +355,7 @@ MACHINE_START(VR1000, "Thorcom-VR1000") | |||
355 | .atag_offset = 0x100, | 355 | .atag_offset = 0x100, |
356 | .map_io = vr1000_map_io, | 356 | .map_io = vr1000_map_io, |
357 | .init_machine = vr1000_init, | 357 | .init_machine = vr1000_init, |
358 | .init_irq = s3c24xx_init_irq, | 358 | .init_irq = s3c2410_init_irq, |
359 | .init_time = samsung_timer_init, | 359 | .init_time = samsung_timer_init, |
360 | .restart = s3c2410_restart, | 360 | .restart = s3c2410_restart, |
361 | MACHINE_END | 361 | MACHINE_END |
diff --git a/arch/arm/plat-samsung/include/plat/cpu.h b/arch/arm/plat-samsung/include/plat/cpu.h index 0f6c47a6475b..989fefe18be6 100644 --- a/arch/arm/plat-samsung/include/plat/cpu.h +++ b/arch/arm/plat-samsung/include/plat/cpu.h | |||
@@ -183,7 +183,6 @@ extern void s3c_init_cpu(unsigned long idcode, | |||
183 | 183 | ||
184 | /* core initialisation functions */ | 184 | /* core initialisation functions */ |
185 | 185 | ||
186 | extern void s3c24xx_init_irq(void); | ||
187 | extern void s5p_init_irq(u32 *vic, u32 num_vic); | 186 | extern void s5p_init_irq(u32 *vic, u32 num_vic); |
188 | 187 | ||
189 | extern void s3c24xx_init_io(struct map_desc *mach_desc, int size); | 188 | extern void s3c24xx_init_io(struct map_desc *mach_desc, int size); |