diff options
author | Boris BREZILLON <boris.brezillon@free-electrons.com> | 2014-07-10 13:14:22 -0400 |
---|---|---|
committer | Nicolas Ferre <nicolas.ferre@atmel.com> | 2014-08-19 14:32:49 -0400 |
commit | 2626063f86cdce500153e8550334b9331421dc6f (patch) | |
tree | 429ecbfde36f8cec709ca1271cdf7e50ca15ec85 | |
parent | 3b26f39b0ab1f390365701981e831aa128e3e4ac (diff) |
ARM: at91: remove old irq material
Remove all the material related to AIC5 support: this interrupt controller
driver is now implemented in drivers/irqchip/atmel-aic.c.
Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
-rw-r--r-- | arch/arm/mach-at91/irq.c | 270 |
1 files changed, 6 insertions, 264 deletions
diff --git a/arch/arm/mach-at91/irq.c b/arch/arm/mach-at91/irq.c index 3d192c5aee66..cdb3ec9efd2b 100644 --- a/arch/arm/mach-at91/irq.c +++ b/arch/arm/mach-at91/irq.c | |||
@@ -48,11 +48,6 @@ void __iomem *at91_aic_base; | |||
48 | static struct irq_domain *at91_aic_domain; | 48 | static struct irq_domain *at91_aic_domain; |
49 | static struct device_node *at91_aic_np; | 49 | static struct device_node *at91_aic_np; |
50 | static unsigned int n_irqs = NR_AIC_IRQS; | 50 | static unsigned int n_irqs = NR_AIC_IRQS; |
51 | static unsigned long at91_aic_caps = 0; | ||
52 | |||
53 | /* AIC5 introduces a Source Select Register */ | ||
54 | #define AT91_AIC_CAP_AIC5 (1 << 0) | ||
55 | #define has_aic5() (at91_aic_caps & AT91_AIC_CAP_AIC5) | ||
56 | 51 | ||
57 | #ifdef CONFIG_PM | 52 | #ifdef CONFIG_PM |
58 | 53 | ||
@@ -92,50 +87,14 @@ static int at91_aic_set_wake(struct irq_data *d, unsigned value) | |||
92 | 87 | ||
93 | void at91_irq_suspend(void) | 88 | void at91_irq_suspend(void) |
94 | { | 89 | { |
95 | int bit = -1; | 90 | at91_aic_write(AT91_AIC_IDCR, *backups); |
96 | 91 | at91_aic_write(AT91_AIC_IECR, *wakeups); | |
97 | if (has_aic5()) { | ||
98 | /* disable enabled irqs */ | ||
99 | while ((bit = find_next_bit(backups, n_irqs, bit + 1)) < n_irqs) { | ||
100 | at91_aic_write(AT91_AIC5_SSR, | ||
101 | bit & AT91_AIC5_INTSEL_MSK); | ||
102 | at91_aic_write(AT91_AIC5_IDCR, 1); | ||
103 | } | ||
104 | /* enable wakeup irqs */ | ||
105 | bit = -1; | ||
106 | while ((bit = find_next_bit(wakeups, n_irqs, bit + 1)) < n_irqs) { | ||
107 | at91_aic_write(AT91_AIC5_SSR, | ||
108 | bit & AT91_AIC5_INTSEL_MSK); | ||
109 | at91_aic_write(AT91_AIC5_IECR, 1); | ||
110 | } | ||
111 | } else { | ||
112 | at91_aic_write(AT91_AIC_IDCR, *backups); | ||
113 | at91_aic_write(AT91_AIC_IECR, *wakeups); | ||
114 | } | ||
115 | } | 92 | } |
116 | 93 | ||
117 | void at91_irq_resume(void) | 94 | void at91_irq_resume(void) |
118 | { | 95 | { |
119 | int bit = -1; | 96 | at91_aic_write(AT91_AIC_IDCR, *wakeups); |
120 | 97 | at91_aic_write(AT91_AIC_IECR, *backups); | |
121 | if (has_aic5()) { | ||
122 | /* disable wakeup irqs */ | ||
123 | while ((bit = find_next_bit(wakeups, n_irqs, bit + 1)) < n_irqs) { | ||
124 | at91_aic_write(AT91_AIC5_SSR, | ||
125 | bit & AT91_AIC5_INTSEL_MSK); | ||
126 | at91_aic_write(AT91_AIC5_IDCR, 1); | ||
127 | } | ||
128 | /* enable irqs disabled for suspend */ | ||
129 | bit = -1; | ||
130 | while ((bit = find_next_bit(backups, n_irqs, bit + 1)) < n_irqs) { | ||
131 | at91_aic_write(AT91_AIC5_SSR, | ||
132 | bit & AT91_AIC5_INTSEL_MSK); | ||
133 | at91_aic_write(AT91_AIC5_IECR, 1); | ||
134 | } | ||
135 | } else { | ||
136 | at91_aic_write(AT91_AIC_IDCR, *wakeups); | ||
137 | at91_aic_write(AT91_AIC_IECR, *backups); | ||
138 | } | ||
139 | } | 98 | } |
140 | 99 | ||
141 | #else | 100 | #else |
@@ -169,21 +128,6 @@ at91_aic_handle_irq(struct pt_regs *regs) | |||
169 | handle_IRQ(irqnr, regs); | 128 | handle_IRQ(irqnr, regs); |
170 | } | 129 | } |
171 | 130 | ||
172 | asmlinkage void __exception_irq_entry | ||
173 | at91_aic5_handle_irq(struct pt_regs *regs) | ||
174 | { | ||
175 | u32 irqnr; | ||
176 | u32 irqstat; | ||
177 | |||
178 | irqnr = at91_aic_read(AT91_AIC5_IVR); | ||
179 | irqstat = at91_aic_read(AT91_AIC5_ISR); | ||
180 | |||
181 | if (!irqstat) | ||
182 | at91_aic_write(AT91_AIC5_EOICR, 0); | ||
183 | else | ||
184 | handle_IRQ(irqnr, regs); | ||
185 | } | ||
186 | |||
187 | static void at91_aic_mask_irq(struct irq_data *d) | 131 | static void at91_aic_mask_irq(struct irq_data *d) |
188 | { | 132 | { |
189 | /* Disable interrupt on AIC */ | 133 | /* Disable interrupt on AIC */ |
@@ -192,15 +136,6 @@ static void at91_aic_mask_irq(struct irq_data *d) | |||
192 | clear_backup(d->hwirq); | 136 | clear_backup(d->hwirq); |
193 | } | 137 | } |
194 | 138 | ||
195 | static void __maybe_unused at91_aic5_mask_irq(struct irq_data *d) | ||
196 | { | ||
197 | /* Disable interrupt on AIC5 */ | ||
198 | at91_aic_write(AT91_AIC5_SSR, d->hwirq & AT91_AIC5_INTSEL_MSK); | ||
199 | at91_aic_write(AT91_AIC5_IDCR, 1); | ||
200 | /* Update ISR cache */ | ||
201 | clear_backup(d->hwirq); | ||
202 | } | ||
203 | |||
204 | static void at91_aic_unmask_irq(struct irq_data *d) | 139 | static void at91_aic_unmask_irq(struct irq_data *d) |
205 | { | 140 | { |
206 | /* Enable interrupt on AIC */ | 141 | /* Enable interrupt on AIC */ |
@@ -209,15 +144,6 @@ static void at91_aic_unmask_irq(struct irq_data *d) | |||
209 | set_backup(d->hwirq); | 144 | set_backup(d->hwirq); |
210 | } | 145 | } |
211 | 146 | ||
212 | static void __maybe_unused at91_aic5_unmask_irq(struct irq_data *d) | ||
213 | { | ||
214 | /* Enable interrupt on AIC5 */ | ||
215 | at91_aic_write(AT91_AIC5_SSR, d->hwirq & AT91_AIC5_INTSEL_MSK); | ||
216 | at91_aic_write(AT91_AIC5_IECR, 1); | ||
217 | /* Update ISR cache */ | ||
218 | set_backup(d->hwirq); | ||
219 | } | ||
220 | |||
221 | static void at91_aic_eoi(struct irq_data *d) | 147 | static void at91_aic_eoi(struct irq_data *d) |
222 | { | 148 | { |
223 | /* | 149 | /* |
@@ -227,11 +153,6 @@ static void at91_aic_eoi(struct irq_data *d) | |||
227 | at91_aic_write(AT91_AIC_EOICR, 0); | 153 | at91_aic_write(AT91_AIC_EOICR, 0); |
228 | } | 154 | } |
229 | 155 | ||
230 | static void __maybe_unused at91_aic5_eoi(struct irq_data *d) | ||
231 | { | ||
232 | at91_aic_write(AT91_AIC5_EOICR, 0); | ||
233 | } | ||
234 | |||
235 | static unsigned long *at91_extern_irq; | 156 | static unsigned long *at91_extern_irq; |
236 | 157 | ||
237 | u32 at91_get_extern_irq(void) | 158 | u32 at91_get_extern_irq(void) |
@@ -282,16 +203,8 @@ static int at91_aic_set_type(struct irq_data *d, unsigned type) | |||
282 | if (srctype < 0) | 203 | if (srctype < 0) |
283 | return srctype; | 204 | return srctype; |
284 | 205 | ||
285 | if (has_aic5()) { | 206 | smr = at91_aic_read(AT91_AIC_SMR(d->hwirq)) & ~AT91_AIC_SRCTYPE; |
286 | at91_aic_write(AT91_AIC5_SSR, | 207 | at91_aic_write(AT91_AIC_SMR(d->hwirq), smr | srctype); |
287 | d->hwirq & AT91_AIC5_INTSEL_MSK); | ||
288 | smr = at91_aic_read(AT91_AIC5_SMR) & ~AT91_AIC_SRCTYPE; | ||
289 | at91_aic_write(AT91_AIC5_SMR, smr | srctype); | ||
290 | } else { | ||
291 | smr = at91_aic_read(AT91_AIC_SMR(d->hwirq)) | ||
292 | & ~AT91_AIC_SRCTYPE; | ||
293 | at91_aic_write(AT91_AIC_SMR(d->hwirq), smr | srctype); | ||
294 | } | ||
295 | 208 | ||
296 | return 0; | 209 | return 0; |
297 | } | 210 | } |
@@ -331,177 +244,6 @@ static void __init at91_aic_hw_init(unsigned int spu_vector) | |||
331 | at91_aic_write(AT91_AIC_ICCR, 0xFFFFFFFF); | 244 | at91_aic_write(AT91_AIC_ICCR, 0xFFFFFFFF); |
332 | } | 245 | } |
333 | 246 | ||
334 | static void __init __maybe_unused at91_aic5_hw_init(unsigned int spu_vector) | ||
335 | { | ||
336 | int i; | ||
337 | |||
338 | /* | ||
339 | * Perform 8 End Of Interrupt Command to make sure AIC | ||
340 | * will not Lock out nIRQ | ||
341 | */ | ||
342 | for (i = 0; i < 8; i++) | ||
343 | at91_aic_write(AT91_AIC5_EOICR, 0); | ||
344 | |||
345 | /* | ||
346 | * Spurious Interrupt ID in Spurious Vector Register. | ||
347 | * When there is no current interrupt, the IRQ Vector Register | ||
348 | * reads the value stored in AIC_SPU | ||
349 | */ | ||
350 | at91_aic_write(AT91_AIC5_SPU, spu_vector); | ||
351 | |||
352 | /* No debugging in AIC: Debug (Protect) Control Register */ | ||
353 | at91_aic_write(AT91_AIC5_DCR, 0); | ||
354 | |||
355 | /* Disable and clear all interrupts initially */ | ||
356 | for (i = 0; i < n_irqs; i++) { | ||
357 | at91_aic_write(AT91_AIC5_SSR, i & AT91_AIC5_INTSEL_MSK); | ||
358 | at91_aic_write(AT91_AIC5_IDCR, 1); | ||
359 | at91_aic_write(AT91_AIC5_ICCR, 1); | ||
360 | } | ||
361 | } | ||
362 | |||
363 | #if defined(CONFIG_OF) | ||
364 | static unsigned int *at91_aic_irq_priorities; | ||
365 | |||
366 | static int at91_aic_irq_map(struct irq_domain *h, unsigned int virq, | ||
367 | irq_hw_number_t hw) | ||
368 | { | ||
369 | /* Put virq number in Source Vector Register */ | ||
370 | at91_aic_write(AT91_AIC_SVR(hw), virq); | ||
371 | |||
372 | /* Active Low interrupt, with priority */ | ||
373 | at91_aic_write(AT91_AIC_SMR(hw), | ||
374 | AT91_AIC_SRCTYPE_LOW | at91_aic_irq_priorities[hw]); | ||
375 | |||
376 | irq_set_chip_and_handler(virq, &at91_aic_chip, handle_fasteoi_irq); | ||
377 | set_irq_flags(virq, IRQF_VALID | IRQF_PROBE); | ||
378 | |||
379 | return 0; | ||
380 | } | ||
381 | |||
382 | static int at91_aic5_irq_map(struct irq_domain *h, unsigned int virq, | ||
383 | irq_hw_number_t hw) | ||
384 | { | ||
385 | at91_aic_write(AT91_AIC5_SSR, hw & AT91_AIC5_INTSEL_MSK); | ||
386 | |||
387 | /* Put virq number in Source Vector Register */ | ||
388 | at91_aic_write(AT91_AIC5_SVR, virq); | ||
389 | |||
390 | /* Active Low interrupt, with priority */ | ||
391 | at91_aic_write(AT91_AIC5_SMR, | ||
392 | AT91_AIC_SRCTYPE_LOW | at91_aic_irq_priorities[hw]); | ||
393 | |||
394 | irq_set_chip_and_handler(virq, &at91_aic_chip, handle_fasteoi_irq); | ||
395 | set_irq_flags(virq, IRQF_VALID | IRQF_PROBE); | ||
396 | |||
397 | return 0; | ||
398 | } | ||
399 | |||
400 | static int at91_aic_irq_domain_xlate(struct irq_domain *d, struct device_node *ctrlr, | ||
401 | const u32 *intspec, unsigned int intsize, | ||
402 | irq_hw_number_t *out_hwirq, unsigned int *out_type) | ||
403 | { | ||
404 | if (WARN_ON(intsize < 3)) | ||
405 | return -EINVAL; | ||
406 | if (WARN_ON(intspec[0] >= n_irqs)) | ||
407 | return -EINVAL; | ||
408 | if (WARN_ON((intspec[2] < AT91_AIC_IRQ_MIN_PRIORITY) | ||
409 | || (intspec[2] > AT91_AIC_IRQ_MAX_PRIORITY))) | ||
410 | return -EINVAL; | ||
411 | |||
412 | *out_hwirq = intspec[0]; | ||
413 | *out_type = intspec[1] & IRQ_TYPE_SENSE_MASK; | ||
414 | at91_aic_irq_priorities[*out_hwirq] = intspec[2]; | ||
415 | |||
416 | return 0; | ||
417 | } | ||
418 | |||
419 | static struct irq_domain_ops at91_aic_irq_ops = { | ||
420 | .map = at91_aic_irq_map, | ||
421 | .xlate = at91_aic_irq_domain_xlate, | ||
422 | }; | ||
423 | |||
424 | int __init at91_aic_of_common_init(struct device_node *node, | ||
425 | struct device_node *parent) | ||
426 | { | ||
427 | struct property *prop; | ||
428 | const __be32 *p; | ||
429 | u32 val; | ||
430 | |||
431 | at91_extern_irq = kzalloc(BITS_TO_LONGS(n_irqs) | ||
432 | * sizeof(*at91_extern_irq), GFP_KERNEL); | ||
433 | if (!at91_extern_irq) | ||
434 | return -ENOMEM; | ||
435 | |||
436 | if (at91_aic_pm_init()) { | ||
437 | kfree(at91_extern_irq); | ||
438 | return -ENOMEM; | ||
439 | } | ||
440 | |||
441 | at91_aic_irq_priorities = kzalloc(n_irqs | ||
442 | * sizeof(*at91_aic_irq_priorities), | ||
443 | GFP_KERNEL); | ||
444 | if (!at91_aic_irq_priorities) | ||
445 | return -ENOMEM; | ||
446 | |||
447 | at91_aic_base = of_iomap(node, 0); | ||
448 | at91_aic_np = node; | ||
449 | |||
450 | at91_aic_domain = irq_domain_add_linear(at91_aic_np, n_irqs, | ||
451 | &at91_aic_irq_ops, NULL); | ||
452 | if (!at91_aic_domain) | ||
453 | panic("Unable to add AIC irq domain (DT)\n"); | ||
454 | |||
455 | of_property_for_each_u32(node, "atmel,external-irqs", prop, p, val) { | ||
456 | if (val >= n_irqs) | ||
457 | pr_warn("AIC: external irq %d >= %d skip it\n", | ||
458 | val, n_irqs); | ||
459 | else | ||
460 | set_bit(val, at91_extern_irq); | ||
461 | } | ||
462 | |||
463 | irq_set_default_host(at91_aic_domain); | ||
464 | |||
465 | return 0; | ||
466 | } | ||
467 | |||
468 | int __init at91_aic_of_init(struct device_node *node, | ||
469 | struct device_node *parent) | ||
470 | { | ||
471 | int err; | ||
472 | |||
473 | err = at91_aic_of_common_init(node, parent); | ||
474 | if (err) | ||
475 | return err; | ||
476 | |||
477 | at91_aic_hw_init(n_irqs); | ||
478 | |||
479 | return 0; | ||
480 | } | ||
481 | |||
482 | int __init at91_aic5_of_init(struct device_node *node, | ||
483 | struct device_node *parent) | ||
484 | { | ||
485 | int err; | ||
486 | |||
487 | at91_aic_caps |= AT91_AIC_CAP_AIC5; | ||
488 | n_irqs = NR_AIC5_IRQS; | ||
489 | at91_aic_chip.irq_ack = at91_aic5_mask_irq; | ||
490 | at91_aic_chip.irq_mask = at91_aic5_mask_irq; | ||
491 | at91_aic_chip.irq_unmask = at91_aic5_unmask_irq; | ||
492 | at91_aic_chip.irq_eoi = at91_aic5_eoi; | ||
493 | at91_aic_irq_ops.map = at91_aic5_irq_map; | ||
494 | |||
495 | err = at91_aic_of_common_init(node, parent); | ||
496 | if (err) | ||
497 | return err; | ||
498 | |||
499 | at91_aic5_hw_init(n_irqs); | ||
500 | |||
501 | return 0; | ||
502 | } | ||
503 | #endif | ||
504 | |||
505 | /* | 247 | /* |
506 | * Initialize the AIC interrupt controller. | 248 | * Initialize the AIC interrupt controller. |
507 | */ | 249 | */ |