Full support for Ginger Console
[linux-ginger.git] / arch / sh / kernel / cpu / sh4a / setup-shx3.c
blobe848443deeb9823c847badcc48a5358b88ecc145
1 /*
2 * SH-X3 Prototype Setup
4 * Copyright (C) 2007 - 2009 Paul Mundt
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file "COPYING" in the main directory of this archive
8 * for more details.
9 */
10 #include <linux/platform_device.h>
11 #include <linux/init.h>
12 #include <linux/serial.h>
13 #include <linux/serial_sci.h>
14 #include <linux/io.h>
15 #include <linux/sh_timer.h>
16 #include <asm/mmzone.h>
18 static struct plat_sci_port sci_platform_data[] = {
20 .mapbase = 0xffc30000,
21 .flags = UPF_BOOT_AUTOCONF,
22 .type = PORT_SCIF,
23 .irqs = { 40, 41, 43, 42 },
24 }, {
25 .mapbase = 0xffc40000,
26 .flags = UPF_BOOT_AUTOCONF,
27 .type = PORT_SCIF,
28 .irqs = { 44, 45, 47, 46 },
29 }, {
30 .mapbase = 0xffc50000,
31 .flags = UPF_BOOT_AUTOCONF,
32 .type = PORT_SCIF,
33 .irqs = { 48, 49, 51, 50 },
34 }, {
35 .mapbase = 0xffc60000,
36 .flags = UPF_BOOT_AUTOCONF,
37 .type = PORT_SCIF,
38 .irqs = { 52, 53, 55, 54 },
39 }, {
40 .flags = 0,
44 static struct platform_device sci_device = {
45 .name = "sh-sci",
46 .id = -1,
47 .dev = {
48 .platform_data = sci_platform_data,
52 static struct sh_timer_config tmu0_platform_data = {
53 .name = "TMU0",
54 .channel_offset = 0x04,
55 .timer_bit = 0,
56 .clk = "peripheral_clk",
57 .clockevent_rating = 200,
60 static struct resource tmu0_resources[] = {
61 [0] = {
62 .name = "TMU0",
63 .start = 0xffc10008,
64 .end = 0xffc10013,
65 .flags = IORESOURCE_MEM,
67 [1] = {
68 .start = 16,
69 .flags = IORESOURCE_IRQ,
73 static struct platform_device tmu0_device = {
74 .name = "sh_tmu",
75 .id = 0,
76 .dev = {
77 .platform_data = &tmu0_platform_data,
79 .resource = tmu0_resources,
80 .num_resources = ARRAY_SIZE(tmu0_resources),
83 static struct sh_timer_config tmu1_platform_data = {
84 .name = "TMU1",
85 .channel_offset = 0x10,
86 .timer_bit = 1,
87 .clk = "peripheral_clk",
88 .clocksource_rating = 200,
91 static struct resource tmu1_resources[] = {
92 [0] = {
93 .name = "TMU1",
94 .start = 0xffc10014,
95 .end = 0xffc1001f,
96 .flags = IORESOURCE_MEM,
98 [1] = {
99 .start = 17,
100 .flags = IORESOURCE_IRQ,
104 static struct platform_device tmu1_device = {
105 .name = "sh_tmu",
106 .id = 1,
107 .dev = {
108 .platform_data = &tmu1_platform_data,
110 .resource = tmu1_resources,
111 .num_resources = ARRAY_SIZE(tmu1_resources),
114 static struct sh_timer_config tmu2_platform_data = {
115 .name = "TMU2",
116 .channel_offset = 0x1c,
117 .timer_bit = 2,
118 .clk = "peripheral_clk",
121 static struct resource tmu2_resources[] = {
122 [0] = {
123 .name = "TMU2",
124 .start = 0xffc10020,
125 .end = 0xffc1002f,
126 .flags = IORESOURCE_MEM,
128 [1] = {
129 .start = 18,
130 .flags = IORESOURCE_IRQ,
134 static struct platform_device tmu2_device = {
135 .name = "sh_tmu",
136 .id = 2,
137 .dev = {
138 .platform_data = &tmu2_platform_data,
140 .resource = tmu2_resources,
141 .num_resources = ARRAY_SIZE(tmu2_resources),
144 static struct sh_timer_config tmu3_platform_data = {
145 .name = "TMU3",
146 .channel_offset = 0x04,
147 .timer_bit = 0,
148 .clk = "peripheral_clk",
151 static struct resource tmu3_resources[] = {
152 [0] = {
153 .name = "TMU3",
154 .start = 0xffc20008,
155 .end = 0xffc20013,
156 .flags = IORESOURCE_MEM,
158 [1] = {
159 .start = 19,
160 .flags = IORESOURCE_IRQ,
164 static struct platform_device tmu3_device = {
165 .name = "sh_tmu",
166 .id = 3,
167 .dev = {
168 .platform_data = &tmu3_platform_data,
170 .resource = tmu3_resources,
171 .num_resources = ARRAY_SIZE(tmu3_resources),
174 static struct sh_timer_config tmu4_platform_data = {
175 .name = "TMU4",
176 .channel_offset = 0x10,
177 .timer_bit = 1,
178 .clk = "peripheral_clk",
181 static struct resource tmu4_resources[] = {
182 [0] = {
183 .name = "TMU4",
184 .start = 0xffc20014,
185 .end = 0xffc2001f,
186 .flags = IORESOURCE_MEM,
188 [1] = {
189 .start = 20,
190 .flags = IORESOURCE_IRQ,
194 static struct platform_device tmu4_device = {
195 .name = "sh_tmu",
196 .id = 4,
197 .dev = {
198 .platform_data = &tmu4_platform_data,
200 .resource = tmu4_resources,
201 .num_resources = ARRAY_SIZE(tmu4_resources),
204 static struct sh_timer_config tmu5_platform_data = {
205 .name = "TMU5",
206 .channel_offset = 0x1c,
207 .timer_bit = 2,
208 .clk = "peripheral_clk",
211 static struct resource tmu5_resources[] = {
212 [0] = {
213 .name = "TMU5",
214 .start = 0xffc20020,
215 .end = 0xffc2002b,
216 .flags = IORESOURCE_MEM,
218 [1] = {
219 .start = 21,
220 .flags = IORESOURCE_IRQ,
224 static struct platform_device tmu5_device = {
225 .name = "sh_tmu",
226 .id = 5,
227 .dev = {
228 .platform_data = &tmu5_platform_data,
230 .resource = tmu5_resources,
231 .num_resources = ARRAY_SIZE(tmu5_resources),
234 static struct platform_device *shx3_early_devices[] __initdata = {
235 &tmu0_device,
236 &tmu1_device,
237 &tmu2_device,
238 &tmu3_device,
239 &tmu4_device,
240 &tmu5_device,
243 static struct platform_device *shx3_devices[] __initdata = {
244 &sci_device,
247 static int __init shx3_devices_setup(void)
249 int ret;
251 ret = platform_add_devices(shx3_early_devices,
252 ARRAY_SIZE(shx3_early_devices));
253 if (unlikely(ret != 0))
254 return ret;
256 return platform_add_devices(shx3_devices,
257 ARRAY_SIZE(shx3_devices));
259 arch_initcall(shx3_devices_setup);
261 void __init plat_early_device_setup(void)
263 early_platform_add_devices(shx3_early_devices,
264 ARRAY_SIZE(shx3_early_devices));
267 enum {
268 UNUSED = 0,
270 /* interrupt sources */
271 IRL, IRQ0, IRQ1, IRQ2, IRQ3,
272 HUDII,
273 TMU0, TMU1, TMU2, TMU3, TMU4, TMU5,
274 PCII0, PCII1, PCII2, PCII3, PCII4,
275 PCII5, PCII6, PCII7, PCII8, PCII9,
276 SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI,
277 SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI,
278 SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI,
279 SCIF3_ERI, SCIF3_RXI, SCIF3_BRI, SCIF3_TXI,
280 DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2, DMAC0_DMINT3,
281 DMAC0_DMINT4, DMAC0_DMINT5, DMAC0_DMAE,
283 DMAC1_DMINT6, DMAC1_DMINT7, DMAC1_DMINT8, DMAC1_DMINT9,
284 DMAC1_DMINT10, DMAC1_DMINT11, DMAC1_DMAE,
285 IIC, VIN0, VIN1, VCORE0, ATAPI,
286 DTU0, DTU1, DTU2, DTU3,
287 FE0, FE1,
288 GPIO0, GPIO1, GPIO2, GPIO3,
289 PAM, IRM,
290 INTICI0, INTICI1, INTICI2, INTICI3,
291 INTICI4, INTICI5, INTICI6, INTICI7,
293 /* interrupt groups */
294 PCII56789, SCIF0, SCIF1, SCIF2, SCIF3,
295 DMAC0, DMAC1,
298 static struct intc_vect vectors[] __initdata = {
299 INTC_VECT(HUDII, 0x3e0),
300 INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420),
301 INTC_VECT(TMU2, 0x440), INTC_VECT(TMU3, 0x460),
302 INTC_VECT(TMU4, 0x480), INTC_VECT(TMU5, 0x4a0),
303 INTC_VECT(PCII0, 0x500), INTC_VECT(PCII1, 0x520),
304 INTC_VECT(PCII2, 0x540), INTC_VECT(PCII3, 0x560),
305 INTC_VECT(PCII4, 0x580), INTC_VECT(PCII5, 0x5a0),
306 INTC_VECT(PCII6, 0x5c0), INTC_VECT(PCII7, 0x5e0),
307 INTC_VECT(PCII8, 0x600), INTC_VECT(PCII9, 0x620),
308 INTC_VECT(SCIF0_ERI, 0x700), INTC_VECT(SCIF0_RXI, 0x720),
309 INTC_VECT(SCIF0_BRI, 0x740), INTC_VECT(SCIF0_TXI, 0x760),
310 INTC_VECT(SCIF1_ERI, 0x780), INTC_VECT(SCIF1_RXI, 0x7a0),
311 INTC_VECT(SCIF1_BRI, 0x7c0), INTC_VECT(SCIF1_TXI, 0x7e0),
312 INTC_VECT(SCIF2_ERI, 0x800), INTC_VECT(SCIF2_RXI, 0x820),
313 INTC_VECT(SCIF2_BRI, 0x840), INTC_VECT(SCIF2_TXI, 0x860),
314 INTC_VECT(SCIF3_ERI, 0x880), INTC_VECT(SCIF3_RXI, 0x8a0),
315 INTC_VECT(SCIF3_BRI, 0x8c0), INTC_VECT(SCIF3_TXI, 0x8e0),
316 INTC_VECT(DMAC0_DMINT0, 0x900), INTC_VECT(DMAC0_DMINT1, 0x920),
317 INTC_VECT(DMAC0_DMINT2, 0x940), INTC_VECT(DMAC0_DMINT3, 0x960),
318 INTC_VECT(DMAC0_DMINT4, 0x980), INTC_VECT(DMAC0_DMINT5, 0x9a0),
319 INTC_VECT(DMAC0_DMAE, 0x9c0),
320 INTC_VECT(DU, 0x9e0),
321 INTC_VECT(DMAC1_DMINT6, 0xa00), INTC_VECT(DMAC1_DMINT7, 0xa20),
322 INTC_VECT(DMAC1_DMINT8, 0xa40), INTC_VECT(DMAC1_DMINT9, 0xa60),
323 INTC_VECT(DMAC1_DMINT10, 0xa80), INTC_VECT(DMAC1_DMINT11, 0xaa0),
324 INTC_VECT(DMAC1_DMAE, 0xac0),
325 INTC_VECT(IIC, 0xae0),
326 INTC_VECT(VIN0, 0xb00), INTC_VECT(VIN1, 0xb20),
327 INTC_VECT(VCORE0, 0xb00), INTC_VECT(ATAPI, 0xb60),
328 INTC_VECT(DTU0, 0xc00), INTC_VECT(DTU0, 0xc20),
329 INTC_VECT(DTU0, 0xc40),
330 INTC_VECT(DTU1, 0xc60), INTC_VECT(DTU1, 0xc80),
331 INTC_VECT(DTU1, 0xca0),
332 INTC_VECT(DTU2, 0xcc0), INTC_VECT(DTU2, 0xce0),
333 INTC_VECT(DTU2, 0xd00),
334 INTC_VECT(DTU3, 0xd20), INTC_VECT(DTU3, 0xd40),
335 INTC_VECT(DTU3, 0xd60),
336 INTC_VECT(FE0, 0xe00), INTC_VECT(FE1, 0xe20),
337 INTC_VECT(GPIO0, 0xe40), INTC_VECT(GPIO1, 0xe60),
338 INTC_VECT(GPIO2, 0xe80), INTC_VECT(GPIO3, 0xea0),
339 INTC_VECT(PAM, 0xec0), INTC_VECT(IRM, 0xee0),
340 INTC_VECT(INTICI0, 0xf00), INTC_VECT(INTICI1, 0xf20),
341 INTC_VECT(INTICI2, 0xf40), INTC_VECT(INTICI3, 0xf60),
342 INTC_VECT(INTICI4, 0xf80), INTC_VECT(INTICI5, 0xfa0),
343 INTC_VECT(INTICI6, 0xfc0), INTC_VECT(INTICI7, 0xfe0),
346 static struct intc_group groups[] __initdata = {
347 INTC_GROUP(PCII56789, PCII5, PCII6, PCII7, PCII8, PCII9),
348 INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI),
349 INTC_GROUP(SCIF1, SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI),
350 INTC_GROUP(SCIF2, SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI),
351 INTC_GROUP(SCIF3, SCIF3_ERI, SCIF3_RXI, SCIF3_BRI, SCIF3_TXI),
352 INTC_GROUP(DMAC0, DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2,
353 DMAC0_DMINT3, DMAC0_DMINT4, DMAC0_DMINT5, DMAC0_DMAE),
354 INTC_GROUP(DMAC1, DMAC1_DMINT6, DMAC1_DMINT7, DMAC1_DMINT8,
355 DMAC1_DMINT9, DMAC1_DMINT10, DMAC1_DMINT11),
358 static struct intc_mask_reg mask_registers[] __initdata = {
359 { 0xfe410030, 0xfe410050, 32, /* CnINTMSK0 / CnINTMSKCLR0 */
360 { IRQ0, IRQ1, IRQ2, IRQ3 } },
361 { 0xfe410040, 0xfe410060, 32, /* CnINTMSK1 / CnINTMSKCLR1 */
362 { IRL } },
363 { 0xfe410820, 0xfe410850, 32, /* CnINT2MSK0 / CnINT2MSKCLR0 */
364 { FE1, FE0, 0, ATAPI, VCORE0, VIN1, VIN0, IIC,
365 DU, GPIO3, GPIO2, GPIO1, GPIO0, PAM, 0, 0,
366 0, 0, 0, 0, 0, 0, 0, 0, /* HUDI bits ignored */
367 0, TMU5, TMU4, TMU3, TMU2, TMU1, TMU0, 0, } },
368 { 0xfe410830, 0xfe410860, 32, /* CnINT2MSK1 / CnINT2MSKCLR1 */
369 { 0, 0, 0, 0, DTU3, DTU2, DTU1, DTU0, /* IRM bits ignored */
370 PCII9, PCII8, PCII7, PCII6, PCII5, PCII4, PCII3, PCII2,
371 PCII1, PCII0, DMAC1_DMAE, DMAC1_DMINT11,
372 DMAC1_DMINT10, DMAC1_DMINT9, DMAC1_DMINT8, DMAC1_DMINT7,
373 DMAC1_DMINT6, DMAC0_DMAE, DMAC0_DMINT5, DMAC0_DMINT4,
374 DMAC0_DMINT3, DMAC0_DMINT2, DMAC0_DMINT1, DMAC0_DMINT0 } },
375 { 0xfe410840, 0xfe410870, 32, /* CnINT2MSK2 / CnINT2MSKCLR2 */
376 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
377 SCIF3_TXI, SCIF3_BRI, SCIF3_RXI, SCIF3_ERI,
378 SCIF2_TXI, SCIF2_BRI, SCIF2_RXI, SCIF2_ERI,
379 SCIF1_TXI, SCIF1_BRI, SCIF1_RXI, SCIF1_ERI,
380 SCIF0_TXI, SCIF0_BRI, SCIF0_RXI, SCIF0_ERI } },
383 static struct intc_prio_reg prio_registers[] __initdata = {
384 { 0xfe410010, 0, 32, 4, /* INTPRI */ { IRQ0, IRQ1, IRQ2, IRQ3 } },
386 { 0xfe410800, 0, 32, 4, /* INT2PRI0 */ { 0, HUDII, TMU5, TMU4,
387 TMU3, TMU2, TMU1, TMU0 } },
388 { 0xfe410804, 0, 32, 4, /* INT2PRI1 */ { DTU3, DTU2, DTU1, DTU0,
389 SCIF3, SCIF2,
390 SCIF1, SCIF0 } },
391 { 0xfe410808, 0, 32, 4, /* INT2PRI2 */ { DMAC1, DMAC0,
392 PCII56789, PCII4,
393 PCII3, PCII2,
394 PCII1, PCII0 } },
395 { 0xfe41080c, 0, 32, 4, /* INT2PRI3 */ { FE1, FE0, ATAPI, VCORE0,
396 VIN1, VIN0, IIC, DU} },
397 { 0xfe410810, 0, 32, 4, /* INT2PRI4 */ { 0, 0, PAM, GPIO3,
398 GPIO2, GPIO1, GPIO0, IRM } },
399 { 0xfe410090, 0xfe4100a0, 32, 4, /* CnICIPRI / CnICIPRICLR */
400 { INTICI7, INTICI6, INTICI5, INTICI4,
401 INTICI3, INTICI2, INTICI1, INTICI0 }, INTC_SMP(4, 4) },
404 static DECLARE_INTC_DESC(intc_desc, "shx3", vectors, groups,
405 mask_registers, prio_registers, NULL);
407 /* Support for external interrupt pins in IRQ mode */
408 static struct intc_vect vectors_irq[] __initdata = {
409 INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280),
410 INTC_VECT(IRQ2, 0x2c0), INTC_VECT(IRQ3, 0x300),
413 static struct intc_sense_reg sense_registers[] __initdata = {
414 { 0xfe41001c, 32, 2, /* ICR1 */ { IRQ0, IRQ1, IRQ2, IRQ3 } },
417 static DECLARE_INTC_DESC(intc_desc_irq, "shx3-irq", vectors_irq, groups,
418 mask_registers, prio_registers, sense_registers);
420 /* External interrupt pins in IRL mode */
421 static struct intc_vect vectors_irl[] __initdata = {
422 INTC_VECT(IRL, 0x200), INTC_VECT(IRL, 0x220),
423 INTC_VECT(IRL, 0x240), INTC_VECT(IRL, 0x260),
424 INTC_VECT(IRL, 0x280), INTC_VECT(IRL, 0x2a0),
425 INTC_VECT(IRL, 0x2c0), INTC_VECT(IRL, 0x2e0),
426 INTC_VECT(IRL, 0x300), INTC_VECT(IRL, 0x320),
427 INTC_VECT(IRL, 0x340), INTC_VECT(IRL, 0x360),
428 INTC_VECT(IRL, 0x380), INTC_VECT(IRL, 0x3a0),
429 INTC_VECT(IRL, 0x3c0),
432 static DECLARE_INTC_DESC(intc_desc_irl, "shx3-irl", vectors_irl, groups,
433 mask_registers, prio_registers, NULL);
435 void __init plat_irq_setup_pins(int mode)
437 switch (mode) {
438 case IRQ_MODE_IRQ:
439 register_intc_controller(&intc_desc_irq);
440 break;
441 case IRQ_MODE_IRL3210:
442 register_intc_controller(&intc_desc_irl);
443 break;
444 default:
445 BUG();
449 void __init plat_irq_setup(void)
451 register_intc_controller(&intc_desc);
454 void __init plat_mem_setup(void)
456 unsigned int nid = 1;
458 /* Register CPU#0 URAM space as Node 1 */
459 setup_bootmem_node(nid++, 0x145f0000, 0x14610000); /* CPU0 */
461 #if 0
462 /* XXX: Not yet.. */
463 setup_bootmem_node(nid++, 0x14df0000, 0x14e10000); /* CPU1 */
464 setup_bootmem_node(nid++, 0x155f0000, 0x15610000); /* CPU2 */
465 setup_bootmem_node(nid++, 0x15df0000, 0x15e10000); /* CPU3 */
466 #endif
468 setup_bootmem_node(nid++, 0x16000000, 0x16020000); /* CSM */