2 * linux/arch/arm/mach-clps7500/core.c
4 * Copyright (C) 1998 Russell King
5 * Copyright (C) 1999 Nexus Electronics Ltd
7 * Extra MM routines for CL7500 architecture
9 #include <linux/kernel.h>
10 #include <linux/types.h>
11 #include <linux/interrupt.h>
12 #include <linux/list.h>
13 #include <linux/timer.h>
14 #include <linux/init.h>
16 #include <asm/mach/arch.h>
17 #include <asm/mach/map.h>
18 #include <asm/mach/irq.h>
20 #include <asm/hardware.h>
21 #include <asm/hardware/iomd.h>
24 #include <asm/mach-types.h>
26 static void cl7500_ack_irq_a(unsigned int irq)
28 unsigned int val, mask;
31 val = iomd_readb(IOMD_IRQMASKA);
32 iomd_writeb(val & ~mask, IOMD_IRQMASKA);
33 iomd_writeb(mask, IOMD_IRQCLRA);
36 static void cl7500_mask_irq_a(unsigned int irq)
38 unsigned int val, mask;
41 val = iomd_readb(IOMD_IRQMASKA);
42 iomd_writeb(val & ~mask, IOMD_IRQMASKA);
45 static void cl7500_unmask_irq_a(unsigned int irq)
47 unsigned int val, mask;
50 val = iomd_readb(IOMD_IRQMASKA);
51 iomd_writeb(val | mask, IOMD_IRQMASKA);
54 static struct irqchip clps7500_a_chip = {
55 .ack = cl7500_ack_irq_a,
56 .mask = cl7500_mask_irq_a,
57 .unmask = cl7500_unmask_irq_a,
60 static void cl7500_mask_irq_b(unsigned int irq)
62 unsigned int val, mask;
64 mask = 1 << (irq & 7);
65 val = iomd_readb(IOMD_IRQMASKB);
66 iomd_writeb(val & ~mask, IOMD_IRQMASKB);
69 static void cl7500_unmask_irq_b(unsigned int irq)
71 unsigned int val, mask;
73 mask = 1 << (irq & 7);
74 val = iomd_readb(IOMD_IRQMASKB);
75 iomd_writeb(val | mask, IOMD_IRQMASKB);
78 static struct irqchip clps7500_b_chip = {
79 .ack = cl7500_mask_irq_b,
80 .mask = cl7500_mask_irq_b,
81 .unmask = cl7500_unmask_irq_b,
84 static void cl7500_mask_irq_c(unsigned int irq)
86 unsigned int val, mask;
88 mask = 1 << (irq & 7);
89 val = iomd_readb(IOMD_IRQMASKC);
90 iomd_writeb(val & ~mask, IOMD_IRQMASKC);
93 static void cl7500_unmask_irq_c(unsigned int irq)
95 unsigned int val, mask;
97 mask = 1 << (irq & 7);
98 val = iomd_readb(IOMD_IRQMASKC);
99 iomd_writeb(val | mask, IOMD_IRQMASKC);
102 static struct irqchip clps7500_c_chip = {
103 .ack = cl7500_mask_irq_c,
104 .mask = cl7500_mask_irq_c,
105 .unmask = cl7500_unmask_irq_c,
108 static void cl7500_mask_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_unmask_irq_d(unsigned int irq)
119 unsigned int val, mask;
121 mask = 1 << (irq & 7);
122 val = iomd_readb(IOMD_IRQMASKD);
123 iomd_writeb(val | mask, IOMD_IRQMASKD);
126 static struct irqchip clps7500_d_chip = {
127 .ack = cl7500_mask_irq_d,
128 .mask = cl7500_mask_irq_d,
129 .unmask = cl7500_unmask_irq_d,
132 static void cl7500_mask_irq_dma(unsigned int irq)
134 unsigned int val, mask;
136 mask = 1 << (irq & 7);
137 val = iomd_readb(IOMD_DMAMASK);
138 iomd_writeb(val & ~mask, IOMD_DMAMASK);
141 static void cl7500_unmask_irq_dma(unsigned int irq)
143 unsigned int val, mask;
145 mask = 1 << (irq & 7);
146 val = iomd_readb(IOMD_DMAMASK);
147 iomd_writeb(val | mask, IOMD_DMAMASK);
150 static struct irqchip clps7500_dma_chip = {
151 .ack = cl7500_mask_irq_dma,
152 .mask = cl7500_mask_irq_dma,
153 .unmask = cl7500_unmask_irq_dma,
156 static void cl7500_mask_irq_fiq(unsigned int irq)
158 unsigned int val, mask;
160 mask = 1 << (irq & 7);
161 val = iomd_readb(IOMD_FIQMASK);
162 iomd_writeb(val & ~mask, IOMD_FIQMASK);
165 static void cl7500_unmask_irq_fiq(unsigned int irq)
167 unsigned int val, mask;
169 mask = 1 << (irq & 7);
170 val = iomd_readb(IOMD_FIQMASK);
171 iomd_writeb(val | mask, IOMD_FIQMASK);
174 static struct irqchip clps7500_fiq_chip = {
175 .ack = cl7500_mask_irq_fiq,
176 .mask = cl7500_mask_irq_fiq,
177 .unmask = cl7500_unmask_irq_fiq,
180 static void cl7500_no_action(unsigned int irq)
184 static struct irqchip clps7500_no_chip = {
185 .ack = cl7500_no_action,
186 .mask = cl7500_no_action,
187 .unmask = cl7500_no_action,
190 static struct irqaction irq_isa = { no_action, 0, 0, "isa", NULL, NULL };
192 static void __init clps7500_init_irq(void)
194 unsigned int irq, flags;
196 iomd_writeb(0, IOMD_IRQMASKA);
197 iomd_writeb(0, IOMD_IRQMASKB);
198 iomd_writeb(0, IOMD_FIQMASK);
199 iomd_writeb(0, IOMD_DMAMASK);
201 for (irq = 0; irq < NR_IRQS; irq++) {
204 if (irq <= 6 || (irq >= 9 && irq <= 15) ||
205 (irq >= 48 && irq <= 55))
210 set_irq_chip(irq, &clps7500_a_chip);
211 set_irq_handler(irq, do_level_IRQ);
212 set_irq_flags(irq, flags);
216 set_irq_chip(irq, &clps7500_b_chip);
217 set_irq_handler(irq, do_level_IRQ);
218 set_irq_flags(irq, flags);
222 set_irq_chip(irq, &clps7500_dma_chip);
223 set_irq_handler(irq, do_level_IRQ);
224 set_irq_flags(irq, flags);
228 set_irq_chip(irq, &clps7500_c_chip);
229 set_irq_handler(irq, do_level_IRQ);
230 set_irq_flags(irq, flags);
234 set_irq_chip(irq, &clps7500_d_chip);
235 set_irq_handler(irq, do_level_IRQ);
236 set_irq_flags(irq, flags);
240 set_irq_chip(irq, &clps7500_no_chip);
241 set_irq_handler(irq, do_level_IRQ);
242 set_irq_flags(irq, flags);
246 set_irq_chip(irq, &clps7500_fiq_chip);
247 set_irq_handler(irq, do_level_IRQ);
248 set_irq_flags(irq, flags);
253 setup_irq(IRQ_ISA, &irq_isa);
256 static struct map_desc cl7500_io_desc[] __initdata = {
257 { IO_BASE, IO_START, IO_SIZE, MT_DEVICE }, /* IO space */
258 { ISA_BASE, ISA_START, ISA_SIZE, MT_DEVICE }, /* ISA space */
259 { FLASH_BASE, FLASH_START, FLASH_SIZE, MT_DEVICE }, /* Flash */
260 { LED_BASE, LED_START, LED_SIZE, MT_DEVICE } /* LED */
263 static void __init clps7500_map_io(void)
265 iotable_init(cl7500_io_desc, ARRAY_SIZE(cl7500_io_desc));
268 MACHINE_START(CLPS7500, "CL-PS7500")
269 MAINTAINER("Philip Blundell")
270 BOOT_MEM(0x10000000, 0x03000000, 0xe0000000)
271 MAPIO(clps7500_map_io)
272 INITIRQ(clps7500_init_irq)