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