2 * include/asm-arm/arch-cl7500/irq.h
4 * Copyright (C) 1996 Russell King
5 * Copyright (C) 1999, 2001 Nexus Electronics Ltd.
8 * 10-10-1996 RMK Brought up to date with arch-sa110eval
9 * 22-08-1998 RMK Restructured IRQ routines
10 * 11-08-1999 PJB Created ARM7500 version, derived from RiscPC code
13 #include <asm/hardware/iomd.h>
16 static inline int fixup_irq(unsigned int irq)
19 int isabits = *((volatile unsigned int *)0xe002b700);
21 printk("Spurious ISA IRQ!\n");
25 while (!(isabits & 1)) {
34 static void cl7500_mask_irq_ack_a(unsigned int irq)
36 unsigned int val, mask;
39 val = iomd_readb(IOMD_IRQMASKA);
40 iomd_writeb(val & ~mask, IOMD_IRQMASKA);
41 iomd_writeb(mask, IOMD_IRQCLRA);
44 static void cl7500_mask_irq_a(unsigned int irq)
46 unsigned int val, mask;
49 val = iomd_readb(IOMD_IRQMASKA);
50 iomd_writeb(val & ~mask, IOMD_IRQMASKA);
53 static void cl7500_unmask_irq_a(unsigned int irq)
55 unsigned int val, mask;
58 val = iomd_readb(IOMD_IRQMASKA);
59 iomd_writeb(val | mask, IOMD_IRQMASKA);
62 static void cl7500_mask_irq_b(unsigned int irq)
64 unsigned int val, mask;
66 mask = 1 << (irq & 7);
67 val = iomd_readb(IOMD_IRQMASKB);
68 iomd_writeb(val & ~mask, IOMD_IRQMASKB);
71 static void cl7500_unmask_irq_b(unsigned int irq)
73 unsigned int val, mask;
75 mask = 1 << (irq & 7);
76 val = iomd_readb(IOMD_IRQMASKB);
77 iomd_writeb(val | mask, IOMD_IRQMASKB);
80 static void cl7500_mask_irq_c(unsigned int irq)
82 unsigned int val, mask;
84 mask = 1 << (irq & 7);
85 val = iomd_readb(IOMD_IRQMASKC);
86 iomd_writeb(val & ~mask, IOMD_IRQMASKC);
89 static void cl7500_unmask_irq_c(unsigned int irq)
91 unsigned int val, mask;
93 mask = 1 << (irq & 7);
94 val = iomd_readb(IOMD_IRQMASKC);
95 iomd_writeb(val | mask, IOMD_IRQMASKC);
99 static void cl7500_mask_irq_d(unsigned int irq)
101 unsigned int val, mask;
103 mask = 1 << (irq & 7);
104 val = iomd_readb(IOMD_IRQMASKD);
105 iomd_writeb(val & ~mask, IOMD_IRQMASKD);
108 static void cl7500_unmask_irq_d(unsigned int irq)
110 unsigned int val, mask;
112 mask = 1 << (irq & 7);
113 val = iomd_readb(IOMD_IRQMASKD);
114 iomd_writeb(val | mask, IOMD_IRQMASKD);
117 static void cl7500_mask_irq_dma(unsigned int irq)
119 unsigned int val, mask;
121 mask = 1 << (irq & 7);
122 val = iomd_readb(IOMD_DMAMASK);
123 iomd_writeb(val & ~mask, IOMD_DMAMASK);
126 static void cl7500_unmask_irq_dma(unsigned int irq)
128 unsigned int val, mask;
130 mask = 1 << (irq & 7);
131 val = iomd_readb(IOMD_DMAMASK);
132 iomd_writeb(val | mask, IOMD_DMAMASK);
135 static void cl7500_mask_irq_fiq(unsigned int irq)
137 unsigned int val, mask;
139 mask = 1 << (irq & 7);
140 val = iomd_readb(IOMD_FIQMASK);
141 iomd_writeb(val & ~mask, IOMD_FIQMASK);
144 static void cl7500_unmask_irq_fiq(unsigned int irq)
146 unsigned int val, mask;
148 mask = 1 << (irq & 7);
149 val = iomd_readb(IOMD_FIQMASK);
150 iomd_writeb(val | mask, IOMD_FIQMASK);
153 static void no_action(int cpl, void *dev_id, struct pt_regs *regs)
157 static struct irqaction irq_isa = { no_action, 0, 0, "isa", NULL, NULL };
159 static __inline__ void irq_init_irq(void)
163 iomd_writeb(0, IOMD_IRQMASKA);
164 iomd_writeb(0, IOMD_IRQMASKB);
165 iomd_writeb(0, IOMD_FIQMASK);
166 iomd_writeb(0, IOMD_DMAMASK);
168 for (irq = 0; irq < NR_IRQS; irq++) {
171 irq_desc[irq].probe_ok = 1;
173 irq_desc[irq].valid = 1;
174 irq_desc[irq].mask_ack = cl7500_mask_irq_ack_a;
175 irq_desc[irq].mask = cl7500_mask_irq_a;
176 irq_desc[irq].unmask = cl7500_unmask_irq_a;
180 irq_desc[irq].probe_ok = 1;
182 irq_desc[irq].valid = 1;
183 irq_desc[irq].mask_ack = cl7500_mask_irq_b;
184 irq_desc[irq].mask = cl7500_mask_irq_b;
185 irq_desc[irq].unmask = cl7500_unmask_irq_b;
189 irq_desc[irq].valid = 1;
190 irq_desc[irq].mask_ack = cl7500_mask_irq_dma;
191 irq_desc[irq].mask = cl7500_mask_irq_dma;
192 irq_desc[irq].unmask = cl7500_unmask_irq_dma;
196 irq_desc[irq].valid = 1;
197 irq_desc[irq].mask_ack = cl7500_mask_irq_c;
198 irq_desc[irq].mask = cl7500_mask_irq_c;
199 irq_desc[irq].unmask = cl7500_unmask_irq_c;
203 irq_desc[irq].valid = 1;
204 irq_desc[irq].mask_ack = cl7500_mask_irq_d;
205 irq_desc[irq].mask = cl7500_mask_irq_d;
206 irq_desc[irq].unmask = cl7500_unmask_irq_d;
210 irq_desc[irq].valid = 1;
211 irq_desc[irq].probe_ok = 1;
212 irq_desc[irq].mask_ack = no_action;
213 irq_desc[irq].mask = no_action;
214 irq_desc[irq].unmask = no_action;
218 irq_desc[irq].valid = 1;
219 irq_desc[irq].mask_ack = cl7500_mask_irq_fiq;
220 irq_desc[irq].mask = cl7500_mask_irq_fiq;
221 irq_desc[irq].unmask = cl7500_unmask_irq_fiq;
226 setup_arm_irq(IRQ_ISA, &irq_isa);