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