ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / arch / arm / mach-adifcc / irq.c
1 /*
2  * linux/arch/arm/mach-xscale/irq.c
3  *
4  * Author:  Deepak Saxena
5  * Copyright:   (C) 2001 MontaVista Software Inc.
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  *
11  * Based on IOP80310 code.  Currently there's nothing more than the
12  * 80200 on chip interrupts. That'll change once the hardware adds
13  * support for PCI though.
14  */
15 #include <linux/init.h>
16 #include <linux/interrupt.h>
17
18 #include <asm/mach/irq.h>
19 #include <asm/irq.h>
20 #include <asm/hardware.h>
21
22 #include <asm/mach-types.h>
23
24 static void xs80200_irq_mask (unsigned int irq)
25 {
26         long INTCTL;
27         asm ("mrc p13, 0, %0, c0, c0, 0" : "=r" (INTCTL));
28         switch (irq) {
29             case IRQ_XS80200_BCU:     INTCTL &= ~(1<<3); break;
30             case IRQ_XS80200_PMU:     INTCTL &= ~(1<<2); break;
31             case IRQ_XS80200_EXTIRQ:  INTCTL &= ~(1<<1); break;
32             case IRQ_XS80200_EXTFIQ:  INTCTL &= ~(1<<0); break;
33         }
34         asm ("mcr p13, 0, %0, c0, c0, 0" : : "r" (INTCTL));
35 }
36
37 static void xs80200_irq_unmask (unsigned int irq)
38 {
39         long INTCTL;
40         asm ("mrc p13, 0, %0, c0, c0, 0" : "=r" (INTCTL));
41         switch (irq) {
42             case IRQ_XS80200_BCU:       INTCTL |= (1<<3); break;
43             case IRQ_XS80200_PMU:       INTCTL |= (1<<2); break;
44             case IRQ_XS80200_EXTIRQ:    INTCTL |= (1<<1); break;
45             case IRQ_XS80200_EXTFIQ:    INTCTL |= (1<<0); break;
46         }
47         asm ("mcr p13, 0, %0, c0, c0, 0" : : "r" (INTCTL));
48 }
49
50 void __init adifcc_init_irq(void)
51 {
52         int i;
53
54         for (i = 0; i < NR_XS80200_IRQS; i++) {
55                 irq_desc[i].valid       = 1;
56                 irq_desc[i].probe_ok    = 0;
57                 irq_desc[i].mask_ack    = xs80200_irq_mask;
58                 irq_desc[i].mask        = xs80200_irq_mask;
59                 irq_desc[i].unmask      = xs80200_irq_unmask;
60         }
61 }
62
63