2 * linux/include/asm-arm/arch-rpc/irq.h
4 * Copyright (C) 1996 Russell King
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
11 * 10-10-1996 RMK Brought up to date with arch-sa110eval
12 * 22-08-1998 RMK Restructured IRQ routines
14 #include <asm/hardware/iomd.h>
17 #define fixup_irq(x) (x)
19 static void rpc_mask_irq_ack_a(unsigned int irq)
21 unsigned int val, mask;
24 val = iomd_readb(IOMD_IRQMASKA);
25 iomd_writeb(val & ~mask, IOMD_IRQMASKA);
26 iomd_writeb(mask, IOMD_IRQCLRA);
29 static void rpc_mask_irq_a(unsigned int irq)
31 unsigned int val, mask;
34 val = iomd_readb(IOMD_IRQMASKA);
35 iomd_writeb(val & ~mask, IOMD_IRQMASKA);
38 static void rpc_unmask_irq_a(unsigned int irq)
40 unsigned int val, mask;
43 val = iomd_readb(IOMD_IRQMASKA);
44 iomd_writeb(val | mask, IOMD_IRQMASKA);
47 static void rpc_mask_irq_b(unsigned int irq)
49 unsigned int val, mask;
51 mask = 1 << (irq & 7);
52 val = iomd_readb(IOMD_IRQMASKB);
53 iomd_writeb(val & ~mask, IOMD_IRQMASKB);
56 static void rpc_unmask_irq_b(unsigned int irq)
58 unsigned int val, mask;
60 mask = 1 << (irq & 7);
61 val = iomd_readb(IOMD_IRQMASKB);
62 iomd_writeb(val | mask, IOMD_IRQMASKB);
65 static void rpc_mask_irq_dma(unsigned int irq)
67 unsigned int val, mask;
69 mask = 1 << (irq & 7);
70 val = iomd_readb(IOMD_DMAMASK);
71 iomd_writeb(val & ~mask, IOMD_DMAMASK);
74 static void rpc_unmask_irq_dma(unsigned int irq)
76 unsigned int val, mask;
78 mask = 1 << (irq & 7);
79 val = iomd_readb(IOMD_DMAMASK);
80 iomd_writeb(val | mask, IOMD_DMAMASK);
83 static void rpc_mask_irq_fiq(unsigned int irq)
85 unsigned int val, mask;
87 mask = 1 << (irq & 7);
88 val = iomd_readb(IOMD_FIQMASK);
89 iomd_writeb(val & ~mask, IOMD_FIQMASK);
92 static void rpc_unmask_irq_fiq(unsigned int irq)
94 unsigned int val, mask;
96 mask = 1 << (irq & 7);
97 val = iomd_readb(IOMD_FIQMASK);
98 iomd_writeb(val | mask, IOMD_FIQMASK);
101 static __inline__ void irq_init_irq(void)
105 iomd_writeb(0, IOMD_IRQMASKA);
106 iomd_writeb(0, IOMD_IRQMASKB);
107 iomd_writeb(0, IOMD_FIQMASK);
108 iomd_writeb(0, IOMD_DMAMASK);
110 for (irq = 0; irq < NR_IRQS; irq++) {
113 irq_desc[irq].probe_ok = 1;
115 irq_desc[irq].valid = 1;
116 irq_desc[irq].mask_ack = rpc_mask_irq_ack_a;
117 irq_desc[irq].mask = rpc_mask_irq_a;
118 irq_desc[irq].unmask = rpc_unmask_irq_a;
122 irq_desc[irq].probe_ok = 1;
124 irq_desc[irq].valid = 1;
125 irq_desc[irq].mask_ack = rpc_mask_irq_b;
126 irq_desc[irq].mask = rpc_mask_irq_b;
127 irq_desc[irq].unmask = rpc_unmask_irq_b;
132 irq_desc[irq].noautoenable = 1;
134 irq_desc[irq].valid = 1;
135 irq_desc[irq].mask_ack = rpc_mask_irq_dma;
136 irq_desc[irq].mask = rpc_mask_irq_dma;
137 irq_desc[irq].unmask = rpc_unmask_irq_dma;
141 irq_desc[irq].valid = 1;
142 irq_desc[irq].mask_ack = rpc_mask_irq_fiq;
143 irq_desc[irq].mask = rpc_mask_irq_fiq;
144 irq_desc[irq].unmask = rpc_unmask_irq_fiq;
149 irq_desc[IRQ_KEYBOARDTX].noautoenable = 1;