Loading...
1/*
2 * SH7785 Setup
3 *
4 * Copyright (C) 2007 Paul Mundt
5 *
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/mm.h>
16#include <linux/sh_dma.h>
17#include <linux/sh_timer.h>
18#include <linux/sh_intc.h>
19#include <asm/mmzone.h>
20#include <cpu/dma-register.h>
21
22static struct plat_sci_port scif0_platform_data = {
23 .mapbase = 0xffea0000,
24 .flags = UPF_BOOT_AUTOCONF,
25 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
26 .scbrr_algo_id = SCBRR_ALGO_1,
27 .type = PORT_SCIF,
28 .irqs = SCIx_IRQ_MUXED(evt2irq(0x700)),
29 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE,
30};
31
32static struct platform_device scif0_device = {
33 .name = "sh-sci",
34 .id = 0,
35 .dev = {
36 .platform_data = &scif0_platform_data,
37 },
38};
39
40static struct plat_sci_port scif1_platform_data = {
41 .mapbase = 0xffeb0000,
42 .flags = UPF_BOOT_AUTOCONF,
43 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
44 .scbrr_algo_id = SCBRR_ALGO_1,
45 .type = PORT_SCIF,
46 .irqs = SCIx_IRQ_MUXED(evt2irq(0x780)),
47 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE,
48};
49
50static struct platform_device scif1_device = {
51 .name = "sh-sci",
52 .id = 1,
53 .dev = {
54 .platform_data = &scif1_platform_data,
55 },
56};
57
58static struct plat_sci_port scif2_platform_data = {
59 .mapbase = 0xffec0000,
60 .flags = UPF_BOOT_AUTOCONF,
61 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
62 .scbrr_algo_id = SCBRR_ALGO_1,
63 .type = PORT_SCIF,
64 .irqs = SCIx_IRQ_MUXED(evt2irq(0x980)),
65 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE,
66};
67
68static struct platform_device scif2_device = {
69 .name = "sh-sci",
70 .id = 2,
71 .dev = {
72 .platform_data = &scif2_platform_data,
73 },
74};
75
76static struct plat_sci_port scif3_platform_data = {
77 .mapbase = 0xffed0000,
78 .flags = UPF_BOOT_AUTOCONF,
79 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
80 .scbrr_algo_id = SCBRR_ALGO_1,
81 .type = PORT_SCIF,
82 .irqs = SCIx_IRQ_MUXED(evt2irq(0x9a0)),
83 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE,
84};
85
86static struct platform_device scif3_device = {
87 .name = "sh-sci",
88 .id = 3,
89 .dev = {
90 .platform_data = &scif3_platform_data,
91 },
92};
93
94static struct plat_sci_port scif4_platform_data = {
95 .mapbase = 0xffee0000,
96 .flags = UPF_BOOT_AUTOCONF,
97 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
98 .scbrr_algo_id = SCBRR_ALGO_1,
99 .type = PORT_SCIF,
100 .irqs = SCIx_IRQ_MUXED(evt2irq(0x9c0)),
101 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE,
102};
103
104static struct platform_device scif4_device = {
105 .name = "sh-sci",
106 .id = 4,
107 .dev = {
108 .platform_data = &scif4_platform_data,
109 },
110};
111
112static struct plat_sci_port scif5_platform_data = {
113 .mapbase = 0xffef0000,
114 .flags = UPF_BOOT_AUTOCONF,
115 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
116 .scbrr_algo_id = SCBRR_ALGO_1,
117 .type = PORT_SCIF,
118 .irqs = SCIx_IRQ_MUXED(evt2irq(0x9e0)),
119 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE,
120};
121
122static struct platform_device scif5_device = {
123 .name = "sh-sci",
124 .id = 5,
125 .dev = {
126 .platform_data = &scif5_platform_data,
127 },
128};
129
130static struct sh_timer_config tmu0_platform_data = {
131 .channel_offset = 0x04,
132 .timer_bit = 0,
133 .clockevent_rating = 200,
134};
135
136static struct resource tmu0_resources[] = {
137 [0] = {
138 .start = 0xffd80008,
139 .end = 0xffd80013,
140 .flags = IORESOURCE_MEM,
141 },
142 [1] = {
143 .start = evt2irq(0x580),
144 .flags = IORESOURCE_IRQ,
145 },
146};
147
148static struct platform_device tmu0_device = {
149 .name = "sh_tmu",
150 .id = 0,
151 .dev = {
152 .platform_data = &tmu0_platform_data,
153 },
154 .resource = tmu0_resources,
155 .num_resources = ARRAY_SIZE(tmu0_resources),
156};
157
158static struct sh_timer_config tmu1_platform_data = {
159 .channel_offset = 0x10,
160 .timer_bit = 1,
161 .clocksource_rating = 200,
162};
163
164static struct resource tmu1_resources[] = {
165 [0] = {
166 .start = 0xffd80014,
167 .end = 0xffd8001f,
168 .flags = IORESOURCE_MEM,
169 },
170 [1] = {
171 .start = evt2irq(0x5a0),
172 .flags = IORESOURCE_IRQ,
173 },
174};
175
176static struct platform_device tmu1_device = {
177 .name = "sh_tmu",
178 .id = 1,
179 .dev = {
180 .platform_data = &tmu1_platform_data,
181 },
182 .resource = tmu1_resources,
183 .num_resources = ARRAY_SIZE(tmu1_resources),
184};
185
186static struct sh_timer_config tmu2_platform_data = {
187 .channel_offset = 0x1c,
188 .timer_bit = 2,
189};
190
191static struct resource tmu2_resources[] = {
192 [0] = {
193 .start = 0xffd80020,
194 .end = 0xffd8002f,
195 .flags = IORESOURCE_MEM,
196 },
197 [1] = {
198 .start = evt2irq(0x5c0),
199 .flags = IORESOURCE_IRQ,
200 },
201};
202
203static struct platform_device tmu2_device = {
204 .name = "sh_tmu",
205 .id = 2,
206 .dev = {
207 .platform_data = &tmu2_platform_data,
208 },
209 .resource = tmu2_resources,
210 .num_resources = ARRAY_SIZE(tmu2_resources),
211};
212
213static struct sh_timer_config tmu3_platform_data = {
214 .channel_offset = 0x04,
215 .timer_bit = 0,
216};
217
218static struct resource tmu3_resources[] = {
219 [0] = {
220 .start = 0xffdc0008,
221 .end = 0xffdc0013,
222 .flags = IORESOURCE_MEM,
223 },
224 [1] = {
225 .start = evt2irq(0xe00),
226 .flags = IORESOURCE_IRQ,
227 },
228};
229
230static struct platform_device tmu3_device = {
231 .name = "sh_tmu",
232 .id = 3,
233 .dev = {
234 .platform_data = &tmu3_platform_data,
235 },
236 .resource = tmu3_resources,
237 .num_resources = ARRAY_SIZE(tmu3_resources),
238};
239
240static struct sh_timer_config tmu4_platform_data = {
241 .channel_offset = 0x10,
242 .timer_bit = 1,
243};
244
245static struct resource tmu4_resources[] = {
246 [0] = {
247 .start = 0xffdc0014,
248 .end = 0xffdc001f,
249 .flags = IORESOURCE_MEM,
250 },
251 [1] = {
252 .start = evt2irq(0xe20),
253 .flags = IORESOURCE_IRQ,
254 },
255};
256
257static struct platform_device tmu4_device = {
258 .name = "sh_tmu",
259 .id = 4,
260 .dev = {
261 .platform_data = &tmu4_platform_data,
262 },
263 .resource = tmu4_resources,
264 .num_resources = ARRAY_SIZE(tmu4_resources),
265};
266
267static struct sh_timer_config tmu5_platform_data = {
268 .channel_offset = 0x1c,
269 .timer_bit = 2,
270};
271
272static struct resource tmu5_resources[] = {
273 [0] = {
274 .start = 0xffdc0020,
275 .end = 0xffdc002b,
276 .flags = IORESOURCE_MEM,
277 },
278 [1] = {
279 .start = evt2irq(0xe40),
280 .flags = IORESOURCE_IRQ,
281 },
282};
283
284static struct platform_device tmu5_device = {
285 .name = "sh_tmu",
286 .id = 5,
287 .dev = {
288 .platform_data = &tmu5_platform_data,
289 },
290 .resource = tmu5_resources,
291 .num_resources = ARRAY_SIZE(tmu5_resources),
292};
293
294/* DMA */
295static const struct sh_dmae_channel sh7785_dmae0_channels[] = {
296 {
297 .offset = 0,
298 .dmars = 0,
299 .dmars_bit = 0,
300 }, {
301 .offset = 0x10,
302 .dmars = 0,
303 .dmars_bit = 8,
304 }, {
305 .offset = 0x20,
306 .dmars = 4,
307 .dmars_bit = 0,
308 }, {
309 .offset = 0x30,
310 .dmars = 4,
311 .dmars_bit = 8,
312 }, {
313 .offset = 0x50,
314 .dmars = 8,
315 .dmars_bit = 0,
316 }, {
317 .offset = 0x60,
318 .dmars = 8,
319 .dmars_bit = 8,
320 }
321};
322
323static const struct sh_dmae_channel sh7785_dmae1_channels[] = {
324 {
325 .offset = 0,
326 }, {
327 .offset = 0x10,
328 }, {
329 .offset = 0x20,
330 }, {
331 .offset = 0x30,
332 }, {
333 .offset = 0x50,
334 }, {
335 .offset = 0x60,
336 }
337};
338
339static const unsigned int ts_shift[] = TS_SHIFT;
340
341static struct sh_dmae_pdata dma0_platform_data = {
342 .channel = sh7785_dmae0_channels,
343 .channel_num = ARRAY_SIZE(sh7785_dmae0_channels),
344 .ts_low_shift = CHCR_TS_LOW_SHIFT,
345 .ts_low_mask = CHCR_TS_LOW_MASK,
346 .ts_high_shift = CHCR_TS_HIGH_SHIFT,
347 .ts_high_mask = CHCR_TS_HIGH_MASK,
348 .ts_shift = ts_shift,
349 .ts_shift_num = ARRAY_SIZE(ts_shift),
350 .dmaor_init = DMAOR_INIT,
351};
352
353static struct sh_dmae_pdata dma1_platform_data = {
354 .channel = sh7785_dmae1_channels,
355 .channel_num = ARRAY_SIZE(sh7785_dmae1_channels),
356 .ts_low_shift = CHCR_TS_LOW_SHIFT,
357 .ts_low_mask = CHCR_TS_LOW_MASK,
358 .ts_high_shift = CHCR_TS_HIGH_SHIFT,
359 .ts_high_mask = CHCR_TS_HIGH_MASK,
360 .ts_shift = ts_shift,
361 .ts_shift_num = ARRAY_SIZE(ts_shift),
362 .dmaor_init = DMAOR_INIT,
363};
364
365static struct resource sh7785_dmae0_resources[] = {
366 [0] = {
367 /* Channel registers and DMAOR */
368 .start = 0xfc808020,
369 .end = 0xfc80808f,
370 .flags = IORESOURCE_MEM,
371 },
372 [1] = {
373 /* DMARSx */
374 .start = 0xfc809000,
375 .end = 0xfc80900b,
376 .flags = IORESOURCE_MEM,
377 },
378 {
379 /*
380 * Real DMA error vector is 0x6e0, and channel
381 * vectors are 0x620-0x6c0
382 */
383 .name = "error_irq",
384 .start = evt2irq(0x620),
385 .end = evt2irq(0x620),
386 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
387 },
388};
389
390static struct resource sh7785_dmae1_resources[] = {
391 [0] = {
392 /* Channel registers and DMAOR */
393 .start = 0xfcc08020,
394 .end = 0xfcc0808f,
395 .flags = IORESOURCE_MEM,
396 },
397 /* DMAC1 has no DMARS */
398 {
399 /*
400 * Real DMA error vector is 0x940, and channel
401 * vectors are 0x880-0x920
402 */
403 .name = "error_irq",
404 .start = evt2irq(0x880),
405 .end = evt2irq(0x880),
406 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
407 },
408};
409
410static struct platform_device dma0_device = {
411 .name = "sh-dma-engine",
412 .id = 0,
413 .resource = sh7785_dmae0_resources,
414 .num_resources = ARRAY_SIZE(sh7785_dmae0_resources),
415 .dev = {
416 .platform_data = &dma0_platform_data,
417 },
418};
419
420static struct platform_device dma1_device = {
421 .name = "sh-dma-engine",
422 .id = 1,
423 .resource = sh7785_dmae1_resources,
424 .num_resources = ARRAY_SIZE(sh7785_dmae1_resources),
425 .dev = {
426 .platform_data = &dma1_platform_data,
427 },
428};
429
430static struct platform_device *sh7785_devices[] __initdata = {
431 &scif0_device,
432 &scif1_device,
433 &scif2_device,
434 &scif3_device,
435 &scif4_device,
436 &scif5_device,
437 &tmu0_device,
438 &tmu1_device,
439 &tmu2_device,
440 &tmu3_device,
441 &tmu4_device,
442 &tmu5_device,
443 &dma0_device,
444 &dma1_device,
445};
446
447static int __init sh7785_devices_setup(void)
448{
449 return platform_add_devices(sh7785_devices,
450 ARRAY_SIZE(sh7785_devices));
451}
452arch_initcall(sh7785_devices_setup);
453
454static struct platform_device *sh7785_early_devices[] __initdata = {
455 &scif0_device,
456 &scif1_device,
457 &scif2_device,
458 &scif3_device,
459 &scif4_device,
460 &scif5_device,
461 &tmu0_device,
462 &tmu1_device,
463 &tmu2_device,
464 &tmu3_device,
465 &tmu4_device,
466 &tmu5_device,
467};
468
469void __init plat_early_device_setup(void)
470{
471 early_platform_add_devices(sh7785_early_devices,
472 ARRAY_SIZE(sh7785_early_devices));
473}
474
475enum {
476 UNUSED = 0,
477
478 /* interrupt sources */
479
480 IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
481 IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
482 IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
483 IRL0_HHLL, IRL0_HHLH, IRL0_HHHL,
484
485 IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
486 IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
487 IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
488 IRL4_HHLL, IRL4_HHLH, IRL4_HHHL,
489
490 IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
491 WDT, TMU0, TMU1, TMU2, TMU2_TICPI,
492 HUDI, DMAC0, SCIF0, SCIF1, DMAC1, HSPI,
493 SCIF2, SCIF3, SCIF4, SCIF5,
494 PCISERR, PCIINTA, PCIINTB, PCIINTC, PCIINTD, PCIC5,
495 SIOF, MMCIF, DU, GDTA,
496 TMU3, TMU4, TMU5,
497 SSI0, SSI1,
498 HAC0, HAC1,
499 FLCTL, GPIO,
500
501 /* interrupt groups */
502
503 TMU012, TMU345
504};
505
506static struct intc_vect vectors[] __initdata = {
507 INTC_VECT(WDT, 0x560),
508 INTC_VECT(TMU0, 0x580), INTC_VECT(TMU1, 0x5a0),
509 INTC_VECT(TMU2, 0x5c0), INTC_VECT(TMU2_TICPI, 0x5e0),
510 INTC_VECT(HUDI, 0x600),
511 INTC_VECT(DMAC0, 0x620), INTC_VECT(DMAC0, 0x640),
512 INTC_VECT(DMAC0, 0x660), INTC_VECT(DMAC0, 0x680),
513 INTC_VECT(DMAC0, 0x6a0), INTC_VECT(DMAC0, 0x6c0),
514 INTC_VECT(DMAC0, 0x6e0),
515 INTC_VECT(SCIF0, 0x700), INTC_VECT(SCIF0, 0x720),
516 INTC_VECT(SCIF0, 0x740), INTC_VECT(SCIF0, 0x760),
517 INTC_VECT(SCIF1, 0x780), INTC_VECT(SCIF1, 0x7a0),
518 INTC_VECT(SCIF1, 0x7c0), INTC_VECT(SCIF1, 0x7e0),
519 INTC_VECT(DMAC1, 0x880), INTC_VECT(DMAC1, 0x8a0),
520 INTC_VECT(DMAC1, 0x8c0), INTC_VECT(DMAC1, 0x8e0),
521 INTC_VECT(DMAC1, 0x900), INTC_VECT(DMAC1, 0x920),
522 INTC_VECT(DMAC1, 0x940),
523 INTC_VECT(HSPI, 0x960),
524 INTC_VECT(SCIF2, 0x980), INTC_VECT(SCIF3, 0x9a0),
525 INTC_VECT(SCIF4, 0x9c0), INTC_VECT(SCIF5, 0x9e0),
526 INTC_VECT(PCISERR, 0xa00), INTC_VECT(PCIINTA, 0xa20),
527 INTC_VECT(PCIINTB, 0xa40), INTC_VECT(PCIINTC, 0xa60),
528 INTC_VECT(PCIINTD, 0xa80), INTC_VECT(PCIC5, 0xaa0),
529 INTC_VECT(PCIC5, 0xac0), INTC_VECT(PCIC5, 0xae0),
530 INTC_VECT(PCIC5, 0xb00), INTC_VECT(PCIC5, 0xb20),
531 INTC_VECT(SIOF, 0xc00),
532 INTC_VECT(MMCIF, 0xd00), INTC_VECT(MMCIF, 0xd20),
533 INTC_VECT(MMCIF, 0xd40), INTC_VECT(MMCIF, 0xd60),
534 INTC_VECT(DU, 0xd80),
535 INTC_VECT(GDTA, 0xda0), INTC_VECT(GDTA, 0xdc0),
536 INTC_VECT(GDTA, 0xde0),
537 INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20),
538 INTC_VECT(TMU5, 0xe40),
539 INTC_VECT(SSI0, 0xe80), INTC_VECT(SSI1, 0xea0),
540 INTC_VECT(HAC0, 0xec0), INTC_VECT(HAC1, 0xee0),
541 INTC_VECT(FLCTL, 0xf00), INTC_VECT(FLCTL, 0xf20),
542 INTC_VECT(FLCTL, 0xf40), INTC_VECT(FLCTL, 0xf60),
543 INTC_VECT(GPIO, 0xf80), INTC_VECT(GPIO, 0xfa0),
544 INTC_VECT(GPIO, 0xfc0), INTC_VECT(GPIO, 0xfe0),
545};
546
547static struct intc_group groups[] __initdata = {
548 INTC_GROUP(TMU012, TMU0, TMU1, TMU2, TMU2_TICPI),
549 INTC_GROUP(TMU345, TMU3, TMU4, TMU5),
550};
551
552static struct intc_mask_reg mask_registers[] __initdata = {
553 { 0xffd00044, 0xffd00064, 32, /* INTMSK0 / INTMSKCLR0 */
554 { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
555
556 { 0xffd40080, 0xffd40084, 32, /* INTMSK2 / INTMSKCLR2 */
557 { IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
558 IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
559 IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
560 IRL0_HHLL, IRL0_HHLH, IRL0_HHHL, 0,
561 IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
562 IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
563 IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
564 IRL4_HHLL, IRL4_HHLH, IRL4_HHHL, 0, } },
565
566 { 0xffd40038, 0xffd4003c, 32, /* INT2MSKR / INT2MSKCR */
567 { 0, 0, 0, GDTA, DU, SSI0, SSI1, GPIO,
568 FLCTL, MMCIF, HSPI, SIOF, PCIC5, PCIINTD, PCIINTC, PCIINTB,
569 PCIINTA, PCISERR, HAC1, HAC0, DMAC1, DMAC0, HUDI, WDT,
570 SCIF5, SCIF4, SCIF3, SCIF2, SCIF1, SCIF0, TMU345, TMU012 } },
571};
572
573static struct intc_prio_reg prio_registers[] __initdata = {
574 { 0xffd00010, 0, 32, 4, /* INTPRI */ { IRQ0, IRQ1, IRQ2, IRQ3,
575 IRQ4, IRQ5, IRQ6, IRQ7 } },
576 { 0xffd40000, 0, 32, 8, /* INT2PRI0 */ { TMU0, TMU1,
577 TMU2, TMU2_TICPI } },
578 { 0xffd40004, 0, 32, 8, /* INT2PRI1 */ { TMU3, TMU4, TMU5, } },
579 { 0xffd40008, 0, 32, 8, /* INT2PRI2 */ { SCIF0, SCIF1,
580 SCIF2, SCIF3 } },
581 { 0xffd4000c, 0, 32, 8, /* INT2PRI3 */ { SCIF4, SCIF5, WDT, } },
582 { 0xffd40010, 0, 32, 8, /* INT2PRI4 */ { HUDI, DMAC0, DMAC1, } },
583 { 0xffd40014, 0, 32, 8, /* INT2PRI5 */ { HAC0, HAC1,
584 PCISERR, PCIINTA } },
585 { 0xffd40018, 0, 32, 8, /* INT2PRI6 */ { PCIINTB, PCIINTC,
586 PCIINTD, PCIC5 } },
587 { 0xffd4001c, 0, 32, 8, /* INT2PRI7 */ { SIOF, HSPI, MMCIF, } },
588 { 0xffd40020, 0, 32, 8, /* INT2PRI8 */ { FLCTL, GPIO, SSI0, SSI1, } },
589 { 0xffd40024, 0, 32, 8, /* INT2PRI9 */ { DU, GDTA, } },
590};
591
592static DECLARE_INTC_DESC(intc_desc, "sh7785", vectors, groups,
593 mask_registers, prio_registers, NULL);
594
595/* Support for external interrupt pins in IRQ mode */
596
597static struct intc_vect vectors_irq0123[] __initdata = {
598 INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280),
599 INTC_VECT(IRQ2, 0x2c0), INTC_VECT(IRQ3, 0x300),
600};
601
602static struct intc_vect vectors_irq4567[] __initdata = {
603 INTC_VECT(IRQ4, 0x340), INTC_VECT(IRQ5, 0x380),
604 INTC_VECT(IRQ6, 0x3c0), INTC_VECT(IRQ7, 0x200),
605};
606
607static struct intc_sense_reg sense_registers[] __initdata = {
608 { 0xffd0001c, 32, 2, /* ICR1 */ { IRQ0, IRQ1, IRQ2, IRQ3,
609 IRQ4, IRQ5, IRQ6, IRQ7 } },
610};
611
612static struct intc_mask_reg ack_registers[] __initdata = {
613 { 0xffd00024, 0, 32, /* INTREQ */
614 { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
615};
616
617static DECLARE_INTC_DESC_ACK(intc_desc_irq0123, "sh7785-irq0123",
618 vectors_irq0123, NULL, mask_registers,
619 prio_registers, sense_registers, ack_registers);
620
621static DECLARE_INTC_DESC_ACK(intc_desc_irq4567, "sh7785-irq4567",
622 vectors_irq4567, NULL, mask_registers,
623 prio_registers, sense_registers, ack_registers);
624
625/* External interrupt pins in IRL mode */
626
627static struct intc_vect vectors_irl0123[] __initdata = {
628 INTC_VECT(IRL0_LLLL, 0x200), INTC_VECT(IRL0_LLLH, 0x220),
629 INTC_VECT(IRL0_LLHL, 0x240), INTC_VECT(IRL0_LLHH, 0x260),
630 INTC_VECT(IRL0_LHLL, 0x280), INTC_VECT(IRL0_LHLH, 0x2a0),
631 INTC_VECT(IRL0_LHHL, 0x2c0), INTC_VECT(IRL0_LHHH, 0x2e0),
632 INTC_VECT(IRL0_HLLL, 0x300), INTC_VECT(IRL0_HLLH, 0x320),
633 INTC_VECT(IRL0_HLHL, 0x340), INTC_VECT(IRL0_HLHH, 0x360),
634 INTC_VECT(IRL0_HHLL, 0x380), INTC_VECT(IRL0_HHLH, 0x3a0),
635 INTC_VECT(IRL0_HHHL, 0x3c0),
636};
637
638static struct intc_vect vectors_irl4567[] __initdata = {
639 INTC_VECT(IRL4_LLLL, 0xb00), INTC_VECT(IRL4_LLLH, 0xb20),
640 INTC_VECT(IRL4_LLHL, 0xb40), INTC_VECT(IRL4_LLHH, 0xb60),
641 INTC_VECT(IRL4_LHLL, 0xb80), INTC_VECT(IRL4_LHLH, 0xba0),
642 INTC_VECT(IRL4_LHHL, 0xbc0), INTC_VECT(IRL4_LHHH, 0xbe0),
643 INTC_VECT(IRL4_HLLL, 0xc00), INTC_VECT(IRL4_HLLH, 0xc20),
644 INTC_VECT(IRL4_HLHL, 0xc40), INTC_VECT(IRL4_HLHH, 0xc60),
645 INTC_VECT(IRL4_HHLL, 0xc80), INTC_VECT(IRL4_HHLH, 0xca0),
646 INTC_VECT(IRL4_HHHL, 0xcc0),
647};
648
649static DECLARE_INTC_DESC(intc_desc_irl0123, "sh7785-irl0123", vectors_irl0123,
650 NULL, mask_registers, NULL, NULL);
651
652static DECLARE_INTC_DESC(intc_desc_irl4567, "sh7785-irl4567", vectors_irl4567,
653 NULL, mask_registers, NULL, NULL);
654
655#define INTC_ICR0 0xffd00000
656#define INTC_INTMSK0 0xffd00044
657#define INTC_INTMSK1 0xffd00048
658#define INTC_INTMSK2 0xffd40080
659#define INTC_INTMSKCLR1 0xffd00068
660#define INTC_INTMSKCLR2 0xffd40084
661
662void __init plat_irq_setup(void)
663{
664 /* disable IRQ3-0 + IRQ7-4 */
665 __raw_writel(0xff000000, INTC_INTMSK0);
666
667 /* disable IRL3-0 + IRL7-4 */
668 __raw_writel(0xc0000000, INTC_INTMSK1);
669 __raw_writel(0xfffefffe, INTC_INTMSK2);
670
671 /* select IRL mode for IRL3-0 + IRL7-4 */
672 __raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
673
674 /* disable holding function, ie enable "SH-4 Mode" */
675 __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0);
676
677 register_intc_controller(&intc_desc);
678}
679
680void __init plat_irq_setup_pins(int mode)
681{
682 switch (mode) {
683 case IRQ_MODE_IRQ7654:
684 /* select IRQ mode for IRL7-4 */
685 __raw_writel(__raw_readl(INTC_ICR0) | 0x00400000, INTC_ICR0);
686 register_intc_controller(&intc_desc_irq4567);
687 break;
688 case IRQ_MODE_IRQ3210:
689 /* select IRQ mode for IRL3-0 */
690 __raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0);
691 register_intc_controller(&intc_desc_irq0123);
692 break;
693 case IRQ_MODE_IRL7654:
694 /* enable IRL7-4 but don't provide any masking */
695 __raw_writel(0x40000000, INTC_INTMSKCLR1);
696 __raw_writel(0x0000fffe, INTC_INTMSKCLR2);
697 break;
698 case IRQ_MODE_IRL3210:
699 /* enable IRL0-3 but don't provide any masking */
700 __raw_writel(0x80000000, INTC_INTMSKCLR1);
701 __raw_writel(0xfffe0000, INTC_INTMSKCLR2);
702 break;
703 case IRQ_MODE_IRL7654_MASK:
704 /* enable IRL7-4 and mask using cpu intc controller */
705 __raw_writel(0x40000000, INTC_INTMSKCLR1);
706 register_intc_controller(&intc_desc_irl4567);
707 break;
708 case IRQ_MODE_IRL3210_MASK:
709 /* enable IRL0-3 and mask using cpu intc controller */
710 __raw_writel(0x80000000, INTC_INTMSKCLR1);
711 register_intc_controller(&intc_desc_irl0123);
712 break;
713 default:
714 BUG();
715 }
716}
717
718void __init plat_mem_setup(void)
719{
720 /* Register the URAM space as Node 1 */
721 setup_bootmem_node(1, 0xe55f0000, 0xe5610000);
722}
1/*
2 * SH7785 Setup
3 *
4 * Copyright (C) 2007 Paul Mundt
5 *
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/mm.h>
16#include <linux/sh_dma.h>
17#include <linux/sh_timer.h>
18#include <asm/mmzone.h>
19#include <cpu/dma-register.h>
20
21static struct plat_sci_port scif0_platform_data = {
22 .mapbase = 0xffea0000,
23 .flags = UPF_BOOT_AUTOCONF,
24 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
25 .scbrr_algo_id = SCBRR_ALGO_1,
26 .type = PORT_SCIF,
27 .irqs = { 40, 40, 40, 40 },
28 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE,
29};
30
31static struct platform_device scif0_device = {
32 .name = "sh-sci",
33 .id = 0,
34 .dev = {
35 .platform_data = &scif0_platform_data,
36 },
37};
38
39static struct plat_sci_port scif1_platform_data = {
40 .mapbase = 0xffeb0000,
41 .flags = UPF_BOOT_AUTOCONF,
42 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
43 .scbrr_algo_id = SCBRR_ALGO_1,
44 .type = PORT_SCIF,
45 .irqs = { 44, 44, 44, 44 },
46 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE,
47};
48
49static struct platform_device scif1_device = {
50 .name = "sh-sci",
51 .id = 1,
52 .dev = {
53 .platform_data = &scif1_platform_data,
54 },
55};
56
57static struct plat_sci_port scif2_platform_data = {
58 .mapbase = 0xffec0000,
59 .flags = UPF_BOOT_AUTOCONF,
60 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
61 .scbrr_algo_id = SCBRR_ALGO_1,
62 .type = PORT_SCIF,
63 .irqs = { 60, 60, 60, 60 },
64 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE,
65};
66
67static struct platform_device scif2_device = {
68 .name = "sh-sci",
69 .id = 2,
70 .dev = {
71 .platform_data = &scif2_platform_data,
72 },
73};
74
75static struct plat_sci_port scif3_platform_data = {
76 .mapbase = 0xffed0000,
77 .flags = UPF_BOOT_AUTOCONF,
78 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
79 .scbrr_algo_id = SCBRR_ALGO_1,
80 .type = PORT_SCIF,
81 .irqs = { 61, 61, 61, 61 },
82 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE,
83};
84
85static struct platform_device scif3_device = {
86 .name = "sh-sci",
87 .id = 3,
88 .dev = {
89 .platform_data = &scif3_platform_data,
90 },
91};
92
93static struct plat_sci_port scif4_platform_data = {
94 .mapbase = 0xffee0000,
95 .flags = UPF_BOOT_AUTOCONF,
96 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
97 .scbrr_algo_id = SCBRR_ALGO_1,
98 .type = PORT_SCIF,
99 .irqs = { 62, 62, 62, 62 },
100 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE,
101};
102
103static struct platform_device scif4_device = {
104 .name = "sh-sci",
105 .id = 4,
106 .dev = {
107 .platform_data = &scif4_platform_data,
108 },
109};
110
111static struct plat_sci_port scif5_platform_data = {
112 .mapbase = 0xffef0000,
113 .flags = UPF_BOOT_AUTOCONF,
114 .scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
115 .scbrr_algo_id = SCBRR_ALGO_1,
116 .type = PORT_SCIF,
117 .irqs = { 63, 63, 63, 63 },
118 .regtype = SCIx_SH4_SCIF_FIFODATA_REGTYPE,
119};
120
121static struct platform_device scif5_device = {
122 .name = "sh-sci",
123 .id = 5,
124 .dev = {
125 .platform_data = &scif5_platform_data,
126 },
127};
128
129static struct sh_timer_config tmu0_platform_data = {
130 .channel_offset = 0x04,
131 .timer_bit = 0,
132 .clockevent_rating = 200,
133};
134
135static struct resource tmu0_resources[] = {
136 [0] = {
137 .start = 0xffd80008,
138 .end = 0xffd80013,
139 .flags = IORESOURCE_MEM,
140 },
141 [1] = {
142 .start = 28,
143 .flags = IORESOURCE_IRQ,
144 },
145};
146
147static struct platform_device tmu0_device = {
148 .name = "sh_tmu",
149 .id = 0,
150 .dev = {
151 .platform_data = &tmu0_platform_data,
152 },
153 .resource = tmu0_resources,
154 .num_resources = ARRAY_SIZE(tmu0_resources),
155};
156
157static struct sh_timer_config tmu1_platform_data = {
158 .channel_offset = 0x10,
159 .timer_bit = 1,
160 .clocksource_rating = 200,
161};
162
163static struct resource tmu1_resources[] = {
164 [0] = {
165 .start = 0xffd80014,
166 .end = 0xffd8001f,
167 .flags = IORESOURCE_MEM,
168 },
169 [1] = {
170 .start = 29,
171 .flags = IORESOURCE_IRQ,
172 },
173};
174
175static struct platform_device tmu1_device = {
176 .name = "sh_tmu",
177 .id = 1,
178 .dev = {
179 .platform_data = &tmu1_platform_data,
180 },
181 .resource = tmu1_resources,
182 .num_resources = ARRAY_SIZE(tmu1_resources),
183};
184
185static struct sh_timer_config tmu2_platform_data = {
186 .channel_offset = 0x1c,
187 .timer_bit = 2,
188};
189
190static struct resource tmu2_resources[] = {
191 [0] = {
192 .start = 0xffd80020,
193 .end = 0xffd8002f,
194 .flags = IORESOURCE_MEM,
195 },
196 [1] = {
197 .start = 30,
198 .flags = IORESOURCE_IRQ,
199 },
200};
201
202static struct platform_device tmu2_device = {
203 .name = "sh_tmu",
204 .id = 2,
205 .dev = {
206 .platform_data = &tmu2_platform_data,
207 },
208 .resource = tmu2_resources,
209 .num_resources = ARRAY_SIZE(tmu2_resources),
210};
211
212static struct sh_timer_config tmu3_platform_data = {
213 .channel_offset = 0x04,
214 .timer_bit = 0,
215};
216
217static struct resource tmu3_resources[] = {
218 [0] = {
219 .start = 0xffdc0008,
220 .end = 0xffdc0013,
221 .flags = IORESOURCE_MEM,
222 },
223 [1] = {
224 .start = 96,
225 .flags = IORESOURCE_IRQ,
226 },
227};
228
229static struct platform_device tmu3_device = {
230 .name = "sh_tmu",
231 .id = 3,
232 .dev = {
233 .platform_data = &tmu3_platform_data,
234 },
235 .resource = tmu3_resources,
236 .num_resources = ARRAY_SIZE(tmu3_resources),
237};
238
239static struct sh_timer_config tmu4_platform_data = {
240 .channel_offset = 0x10,
241 .timer_bit = 1,
242};
243
244static struct resource tmu4_resources[] = {
245 [0] = {
246 .start = 0xffdc0014,
247 .end = 0xffdc001f,
248 .flags = IORESOURCE_MEM,
249 },
250 [1] = {
251 .start = 97,
252 .flags = IORESOURCE_IRQ,
253 },
254};
255
256static struct platform_device tmu4_device = {
257 .name = "sh_tmu",
258 .id = 4,
259 .dev = {
260 .platform_data = &tmu4_platform_data,
261 },
262 .resource = tmu4_resources,
263 .num_resources = ARRAY_SIZE(tmu4_resources),
264};
265
266static struct sh_timer_config tmu5_platform_data = {
267 .channel_offset = 0x1c,
268 .timer_bit = 2,
269};
270
271static struct resource tmu5_resources[] = {
272 [0] = {
273 .start = 0xffdc0020,
274 .end = 0xffdc002b,
275 .flags = IORESOURCE_MEM,
276 },
277 [1] = {
278 .start = 98,
279 .flags = IORESOURCE_IRQ,
280 },
281};
282
283static struct platform_device tmu5_device = {
284 .name = "sh_tmu",
285 .id = 5,
286 .dev = {
287 .platform_data = &tmu5_platform_data,
288 },
289 .resource = tmu5_resources,
290 .num_resources = ARRAY_SIZE(tmu5_resources),
291};
292
293/* DMA */
294static const struct sh_dmae_channel sh7785_dmae0_channels[] = {
295 {
296 .offset = 0,
297 .dmars = 0,
298 .dmars_bit = 0,
299 }, {
300 .offset = 0x10,
301 .dmars = 0,
302 .dmars_bit = 8,
303 }, {
304 .offset = 0x20,
305 .dmars = 4,
306 .dmars_bit = 0,
307 }, {
308 .offset = 0x30,
309 .dmars = 4,
310 .dmars_bit = 8,
311 }, {
312 .offset = 0x50,
313 .dmars = 8,
314 .dmars_bit = 0,
315 }, {
316 .offset = 0x60,
317 .dmars = 8,
318 .dmars_bit = 8,
319 }
320};
321
322static const struct sh_dmae_channel sh7785_dmae1_channels[] = {
323 {
324 .offset = 0,
325 }, {
326 .offset = 0x10,
327 }, {
328 .offset = 0x20,
329 }, {
330 .offset = 0x30,
331 }, {
332 .offset = 0x50,
333 }, {
334 .offset = 0x60,
335 }
336};
337
338static const unsigned int ts_shift[] = TS_SHIFT;
339
340static struct sh_dmae_pdata dma0_platform_data = {
341 .channel = sh7785_dmae0_channels,
342 .channel_num = ARRAY_SIZE(sh7785_dmae0_channels),
343 .ts_low_shift = CHCR_TS_LOW_SHIFT,
344 .ts_low_mask = CHCR_TS_LOW_MASK,
345 .ts_high_shift = CHCR_TS_HIGH_SHIFT,
346 .ts_high_mask = CHCR_TS_HIGH_MASK,
347 .ts_shift = ts_shift,
348 .ts_shift_num = ARRAY_SIZE(ts_shift),
349 .dmaor_init = DMAOR_INIT,
350};
351
352static struct sh_dmae_pdata dma1_platform_data = {
353 .channel = sh7785_dmae1_channels,
354 .channel_num = ARRAY_SIZE(sh7785_dmae1_channels),
355 .ts_low_shift = CHCR_TS_LOW_SHIFT,
356 .ts_low_mask = CHCR_TS_LOW_MASK,
357 .ts_high_shift = CHCR_TS_HIGH_SHIFT,
358 .ts_high_mask = CHCR_TS_HIGH_MASK,
359 .ts_shift = ts_shift,
360 .ts_shift_num = ARRAY_SIZE(ts_shift),
361 .dmaor_init = DMAOR_INIT,
362};
363
364static struct resource sh7785_dmae0_resources[] = {
365 [0] = {
366 /* Channel registers and DMAOR */
367 .start = 0xfc808020,
368 .end = 0xfc80808f,
369 .flags = IORESOURCE_MEM,
370 },
371 [1] = {
372 /* DMARSx */
373 .start = 0xfc809000,
374 .end = 0xfc80900b,
375 .flags = IORESOURCE_MEM,
376 },
377 {
378 /* Real DMA error IRQ is 39, and channel IRQs are 33-38 */
379 .start = 33,
380 .end = 33,
381 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
382 },
383};
384
385static struct resource sh7785_dmae1_resources[] = {
386 [0] = {
387 /* Channel registers and DMAOR */
388 .start = 0xfcc08020,
389 .end = 0xfcc0808f,
390 .flags = IORESOURCE_MEM,
391 },
392 /* DMAC1 has no DMARS */
393 {
394 /* Real DMA error IRQ is 58, and channel IRQs are 52-57 */
395 .start = 52,
396 .end = 52,
397 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
398 },
399};
400
401static struct platform_device dma0_device = {
402 .name = "sh-dma-engine",
403 .id = 0,
404 .resource = sh7785_dmae0_resources,
405 .num_resources = ARRAY_SIZE(sh7785_dmae0_resources),
406 .dev = {
407 .platform_data = &dma0_platform_data,
408 },
409};
410
411static struct platform_device dma1_device = {
412 .name = "sh-dma-engine",
413 .id = 1,
414 .resource = sh7785_dmae1_resources,
415 .num_resources = ARRAY_SIZE(sh7785_dmae1_resources),
416 .dev = {
417 .platform_data = &dma1_platform_data,
418 },
419};
420
421static struct platform_device *sh7785_devices[] __initdata = {
422 &scif0_device,
423 &scif1_device,
424 &scif2_device,
425 &scif3_device,
426 &scif4_device,
427 &scif5_device,
428 &tmu0_device,
429 &tmu1_device,
430 &tmu2_device,
431 &tmu3_device,
432 &tmu4_device,
433 &tmu5_device,
434 &dma0_device,
435 &dma1_device,
436};
437
438static int __init sh7785_devices_setup(void)
439{
440 return platform_add_devices(sh7785_devices,
441 ARRAY_SIZE(sh7785_devices));
442}
443arch_initcall(sh7785_devices_setup);
444
445static struct platform_device *sh7785_early_devices[] __initdata = {
446 &scif0_device,
447 &scif1_device,
448 &scif2_device,
449 &scif3_device,
450 &scif4_device,
451 &scif5_device,
452 &tmu0_device,
453 &tmu1_device,
454 &tmu2_device,
455 &tmu3_device,
456 &tmu4_device,
457 &tmu5_device,
458};
459
460void __init plat_early_device_setup(void)
461{
462 early_platform_add_devices(sh7785_early_devices,
463 ARRAY_SIZE(sh7785_early_devices));
464}
465
466enum {
467 UNUSED = 0,
468
469 /* interrupt sources */
470
471 IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
472 IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
473 IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
474 IRL0_HHLL, IRL0_HHLH, IRL0_HHHL,
475
476 IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
477 IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
478 IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
479 IRL4_HHLL, IRL4_HHLH, IRL4_HHHL,
480
481 IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
482 WDT, TMU0, TMU1, TMU2, TMU2_TICPI,
483 HUDI, DMAC0, SCIF0, SCIF1, DMAC1, HSPI,
484 SCIF2, SCIF3, SCIF4, SCIF5,
485 PCISERR, PCIINTA, PCIINTB, PCIINTC, PCIINTD, PCIC5,
486 SIOF, MMCIF, DU, GDTA,
487 TMU3, TMU4, TMU5,
488 SSI0, SSI1,
489 HAC0, HAC1,
490 FLCTL, GPIO,
491
492 /* interrupt groups */
493
494 TMU012, TMU345
495};
496
497static struct intc_vect vectors[] __initdata = {
498 INTC_VECT(WDT, 0x560),
499 INTC_VECT(TMU0, 0x580), INTC_VECT(TMU1, 0x5a0),
500 INTC_VECT(TMU2, 0x5c0), INTC_VECT(TMU2_TICPI, 0x5e0),
501 INTC_VECT(HUDI, 0x600),
502 INTC_VECT(DMAC0, 0x620), INTC_VECT(DMAC0, 0x640),
503 INTC_VECT(DMAC0, 0x660), INTC_VECT(DMAC0, 0x680),
504 INTC_VECT(DMAC0, 0x6a0), INTC_VECT(DMAC0, 0x6c0),
505 INTC_VECT(DMAC0, 0x6e0),
506 INTC_VECT(SCIF0, 0x700), INTC_VECT(SCIF0, 0x720),
507 INTC_VECT(SCIF0, 0x740), INTC_VECT(SCIF0, 0x760),
508 INTC_VECT(SCIF1, 0x780), INTC_VECT(SCIF1, 0x7a0),
509 INTC_VECT(SCIF1, 0x7c0), INTC_VECT(SCIF1, 0x7e0),
510 INTC_VECT(DMAC1, 0x880), INTC_VECT(DMAC1, 0x8a0),
511 INTC_VECT(DMAC1, 0x8c0), INTC_VECT(DMAC1, 0x8e0),
512 INTC_VECT(DMAC1, 0x900), INTC_VECT(DMAC1, 0x920),
513 INTC_VECT(DMAC1, 0x940),
514 INTC_VECT(HSPI, 0x960),
515 INTC_VECT(SCIF2, 0x980), INTC_VECT(SCIF3, 0x9a0),
516 INTC_VECT(SCIF4, 0x9c0), INTC_VECT(SCIF5, 0x9e0),
517 INTC_VECT(PCISERR, 0xa00), INTC_VECT(PCIINTA, 0xa20),
518 INTC_VECT(PCIINTB, 0xa40), INTC_VECT(PCIINTC, 0xa60),
519 INTC_VECT(PCIINTD, 0xa80), INTC_VECT(PCIC5, 0xaa0),
520 INTC_VECT(PCIC5, 0xac0), INTC_VECT(PCIC5, 0xae0),
521 INTC_VECT(PCIC5, 0xb00), INTC_VECT(PCIC5, 0xb20),
522 INTC_VECT(SIOF, 0xc00),
523 INTC_VECT(MMCIF, 0xd00), INTC_VECT(MMCIF, 0xd20),
524 INTC_VECT(MMCIF, 0xd40), INTC_VECT(MMCIF, 0xd60),
525 INTC_VECT(DU, 0xd80),
526 INTC_VECT(GDTA, 0xda0), INTC_VECT(GDTA, 0xdc0),
527 INTC_VECT(GDTA, 0xde0),
528 INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20),
529 INTC_VECT(TMU5, 0xe40),
530 INTC_VECT(SSI0, 0xe80), INTC_VECT(SSI1, 0xea0),
531 INTC_VECT(HAC0, 0xec0), INTC_VECT(HAC1, 0xee0),
532 INTC_VECT(FLCTL, 0xf00), INTC_VECT(FLCTL, 0xf20),
533 INTC_VECT(FLCTL, 0xf40), INTC_VECT(FLCTL, 0xf60),
534 INTC_VECT(GPIO, 0xf80), INTC_VECT(GPIO, 0xfa0),
535 INTC_VECT(GPIO, 0xfc0), INTC_VECT(GPIO, 0xfe0),
536};
537
538static struct intc_group groups[] __initdata = {
539 INTC_GROUP(TMU012, TMU0, TMU1, TMU2, TMU2_TICPI),
540 INTC_GROUP(TMU345, TMU3, TMU4, TMU5),
541};
542
543static struct intc_mask_reg mask_registers[] __initdata = {
544 { 0xffd00044, 0xffd00064, 32, /* INTMSK0 / INTMSKCLR0 */
545 { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
546
547 { 0xffd40080, 0xffd40084, 32, /* INTMSK2 / INTMSKCLR2 */
548 { IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
549 IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
550 IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
551 IRL0_HHLL, IRL0_HHLH, IRL0_HHHL, 0,
552 IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
553 IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
554 IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
555 IRL4_HHLL, IRL4_HHLH, IRL4_HHHL, 0, } },
556
557 { 0xffd40038, 0xffd4003c, 32, /* INT2MSKR / INT2MSKCR */
558 { 0, 0, 0, GDTA, DU, SSI0, SSI1, GPIO,
559 FLCTL, MMCIF, HSPI, SIOF, PCIC5, PCIINTD, PCIINTC, PCIINTB,
560 PCIINTA, PCISERR, HAC1, HAC0, DMAC1, DMAC0, HUDI, WDT,
561 SCIF5, SCIF4, SCIF3, SCIF2, SCIF1, SCIF0, TMU345, TMU012 } },
562};
563
564static struct intc_prio_reg prio_registers[] __initdata = {
565 { 0xffd00010, 0, 32, 4, /* INTPRI */ { IRQ0, IRQ1, IRQ2, IRQ3,
566 IRQ4, IRQ5, IRQ6, IRQ7 } },
567 { 0xffd40000, 0, 32, 8, /* INT2PRI0 */ { TMU0, TMU1,
568 TMU2, TMU2_TICPI } },
569 { 0xffd40004, 0, 32, 8, /* INT2PRI1 */ { TMU3, TMU4, TMU5, } },
570 { 0xffd40008, 0, 32, 8, /* INT2PRI2 */ { SCIF0, SCIF1,
571 SCIF2, SCIF3 } },
572 { 0xffd4000c, 0, 32, 8, /* INT2PRI3 */ { SCIF4, SCIF5, WDT, } },
573 { 0xffd40010, 0, 32, 8, /* INT2PRI4 */ { HUDI, DMAC0, DMAC1, } },
574 { 0xffd40014, 0, 32, 8, /* INT2PRI5 */ { HAC0, HAC1,
575 PCISERR, PCIINTA } },
576 { 0xffd40018, 0, 32, 8, /* INT2PRI6 */ { PCIINTB, PCIINTC,
577 PCIINTD, PCIC5 } },
578 { 0xffd4001c, 0, 32, 8, /* INT2PRI7 */ { SIOF, HSPI, MMCIF, } },
579 { 0xffd40020, 0, 32, 8, /* INT2PRI8 */ { FLCTL, GPIO, SSI0, SSI1, } },
580 { 0xffd40024, 0, 32, 8, /* INT2PRI9 */ { DU, GDTA, } },
581};
582
583static DECLARE_INTC_DESC(intc_desc, "sh7785", vectors, groups,
584 mask_registers, prio_registers, NULL);
585
586/* Support for external interrupt pins in IRQ mode */
587
588static struct intc_vect vectors_irq0123[] __initdata = {
589 INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280),
590 INTC_VECT(IRQ2, 0x2c0), INTC_VECT(IRQ3, 0x300),
591};
592
593static struct intc_vect vectors_irq4567[] __initdata = {
594 INTC_VECT(IRQ4, 0x340), INTC_VECT(IRQ5, 0x380),
595 INTC_VECT(IRQ6, 0x3c0), INTC_VECT(IRQ7, 0x200),
596};
597
598static struct intc_sense_reg sense_registers[] __initdata = {
599 { 0xffd0001c, 32, 2, /* ICR1 */ { IRQ0, IRQ1, IRQ2, IRQ3,
600 IRQ4, IRQ5, IRQ6, IRQ7 } },
601};
602
603static struct intc_mask_reg ack_registers[] __initdata = {
604 { 0xffd00024, 0, 32, /* INTREQ */
605 { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
606};
607
608static DECLARE_INTC_DESC_ACK(intc_desc_irq0123, "sh7785-irq0123",
609 vectors_irq0123, NULL, mask_registers,
610 prio_registers, sense_registers, ack_registers);
611
612static DECLARE_INTC_DESC_ACK(intc_desc_irq4567, "sh7785-irq4567",
613 vectors_irq4567, NULL, mask_registers,
614 prio_registers, sense_registers, ack_registers);
615
616/* External interrupt pins in IRL mode */
617
618static struct intc_vect vectors_irl0123[] __initdata = {
619 INTC_VECT(IRL0_LLLL, 0x200), INTC_VECT(IRL0_LLLH, 0x220),
620 INTC_VECT(IRL0_LLHL, 0x240), INTC_VECT(IRL0_LLHH, 0x260),
621 INTC_VECT(IRL0_LHLL, 0x280), INTC_VECT(IRL0_LHLH, 0x2a0),
622 INTC_VECT(IRL0_LHHL, 0x2c0), INTC_VECT(IRL0_LHHH, 0x2e0),
623 INTC_VECT(IRL0_HLLL, 0x300), INTC_VECT(IRL0_HLLH, 0x320),
624 INTC_VECT(IRL0_HLHL, 0x340), INTC_VECT(IRL0_HLHH, 0x360),
625 INTC_VECT(IRL0_HHLL, 0x380), INTC_VECT(IRL0_HHLH, 0x3a0),
626 INTC_VECT(IRL0_HHHL, 0x3c0),
627};
628
629static struct intc_vect vectors_irl4567[] __initdata = {
630 INTC_VECT(IRL4_LLLL, 0xb00), INTC_VECT(IRL4_LLLH, 0xb20),
631 INTC_VECT(IRL4_LLHL, 0xb40), INTC_VECT(IRL4_LLHH, 0xb60),
632 INTC_VECT(IRL4_LHLL, 0xb80), INTC_VECT(IRL4_LHLH, 0xba0),
633 INTC_VECT(IRL4_LHHL, 0xbc0), INTC_VECT(IRL4_LHHH, 0xbe0),
634 INTC_VECT(IRL4_HLLL, 0xc00), INTC_VECT(IRL4_HLLH, 0xc20),
635 INTC_VECT(IRL4_HLHL, 0xc40), INTC_VECT(IRL4_HLHH, 0xc60),
636 INTC_VECT(IRL4_HHLL, 0xc80), INTC_VECT(IRL4_HHLH, 0xca0),
637 INTC_VECT(IRL4_HHHL, 0xcc0),
638};
639
640static DECLARE_INTC_DESC(intc_desc_irl0123, "sh7785-irl0123", vectors_irl0123,
641 NULL, mask_registers, NULL, NULL);
642
643static DECLARE_INTC_DESC(intc_desc_irl4567, "sh7785-irl4567", vectors_irl4567,
644 NULL, mask_registers, NULL, NULL);
645
646#define INTC_ICR0 0xffd00000
647#define INTC_INTMSK0 0xffd00044
648#define INTC_INTMSK1 0xffd00048
649#define INTC_INTMSK2 0xffd40080
650#define INTC_INTMSKCLR1 0xffd00068
651#define INTC_INTMSKCLR2 0xffd40084
652
653void __init plat_irq_setup(void)
654{
655 /* disable IRQ3-0 + IRQ7-4 */
656 __raw_writel(0xff000000, INTC_INTMSK0);
657
658 /* disable IRL3-0 + IRL7-4 */
659 __raw_writel(0xc0000000, INTC_INTMSK1);
660 __raw_writel(0xfffefffe, INTC_INTMSK2);
661
662 /* select IRL mode for IRL3-0 + IRL7-4 */
663 __raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
664
665 /* disable holding function, ie enable "SH-4 Mode" */
666 __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0);
667
668 register_intc_controller(&intc_desc);
669}
670
671void __init plat_irq_setup_pins(int mode)
672{
673 switch (mode) {
674 case IRQ_MODE_IRQ7654:
675 /* select IRQ mode for IRL7-4 */
676 __raw_writel(__raw_readl(INTC_ICR0) | 0x00400000, INTC_ICR0);
677 register_intc_controller(&intc_desc_irq4567);
678 break;
679 case IRQ_MODE_IRQ3210:
680 /* select IRQ mode for IRL3-0 */
681 __raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0);
682 register_intc_controller(&intc_desc_irq0123);
683 break;
684 case IRQ_MODE_IRL7654:
685 /* enable IRL7-4 but don't provide any masking */
686 __raw_writel(0x40000000, INTC_INTMSKCLR1);
687 __raw_writel(0x0000fffe, INTC_INTMSKCLR2);
688 break;
689 case IRQ_MODE_IRL3210:
690 /* enable IRL0-3 but don't provide any masking */
691 __raw_writel(0x80000000, INTC_INTMSKCLR1);
692 __raw_writel(0xfffe0000, INTC_INTMSKCLR2);
693 break;
694 case IRQ_MODE_IRL7654_MASK:
695 /* enable IRL7-4 and mask using cpu intc controller */
696 __raw_writel(0x40000000, INTC_INTMSKCLR1);
697 register_intc_controller(&intc_desc_irl4567);
698 break;
699 case IRQ_MODE_IRL3210_MASK:
700 /* enable IRL0-3 and mask using cpu intc controller */
701 __raw_writel(0x80000000, INTC_INTMSKCLR1);
702 register_intc_controller(&intc_desc_irl0123);
703 break;
704 default:
705 BUG();
706 }
707}
708
709void __init plat_mem_setup(void)
710{
711 /* Register the URAM space as Node 1 */
712 setup_bootmem_node(1, 0xe55f0000, 0xe5610000);
713}