Merge branch 'nfs-for-2.6.35' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6
[pandora-kernel.git] / arch / sh / kernel / cpu / sh4a / setup-sh7757.c
1 /*
2  * SH7757 Setup
3  *
4  * Copyright (C) 2009  Renesas Solutions Corp.
5  *
6  *  based on setup-sh7785.c : Copyright (C) 2007  Paul Mundt
7  *
8  * This file is subject to the terms and conditions of the GNU General Public
9  * License.  See the file "COPYING" in the main directory of this archive
10  * for more details.
11  */
12 #include <linux/platform_device.h>
13 #include <linux/init.h>
14 #include <linux/serial.h>
15 #include <linux/serial_sci.h>
16 #include <linux/io.h>
17 #include <linux/mm.h>
18 #include <linux/sh_timer.h>
19
20 static struct plat_sci_port scif2_platform_data = {
21         .mapbase        = 0xfe4b0000,           /* SCIF2 */
22         .flags          = UPF_BOOT_AUTOCONF,
23         .type           = PORT_SCIF,
24         .irqs           = { 40, 40, 40, 40 },
25 };
26
27 static struct platform_device scif2_device = {
28         .name           = "sh-sci",
29         .id             = 2,
30         .dev            = {
31                 .platform_data  = &scif2_platform_data,
32         },
33 };
34
35 static struct plat_sci_port scif3_platform_data = {
36         .mapbase        = 0xfe4c0000,           /* SCIF3 */
37         .flags          = UPF_BOOT_AUTOCONF,
38         .type           = PORT_SCIF,
39         .irqs           = { 76, 76, 76, 76 },
40 };
41
42 static struct platform_device scif3_device = {
43         .name           = "sh-sci",
44         .id             = 3,
45         .dev            = {
46                 .platform_data  = &scif3_platform_data,
47         },
48 };
49
50 static struct plat_sci_port scif4_platform_data = {
51         .mapbase        = 0xfe4d0000,           /* SCIF4 */
52         .flags          = UPF_BOOT_AUTOCONF,
53         .type           = PORT_SCIF,
54         .irqs           = { 104, 104, 104, 104 },
55 };
56
57 static struct platform_device scif4_device = {
58         .name           = "sh-sci",
59         .id             = 4,
60         .dev            = {
61                 .platform_data  = &scif4_platform_data,
62         },
63 };
64
65 static struct sh_timer_config tmu0_platform_data = {
66         .channel_offset = 0x04,
67         .timer_bit = 0,
68         .clockevent_rating = 200,
69 };
70
71 static struct resource tmu0_resources[] = {
72         [0] = {
73                 .start  = 0xfe430008,
74                 .end    = 0xfe430013,
75                 .flags  = IORESOURCE_MEM,
76         },
77         [1] = {
78                 .start  = 28,
79                 .flags  = IORESOURCE_IRQ,
80         },
81 };
82
83 static struct platform_device tmu0_device = {
84         .name           = "sh_tmu",
85         .id             = 0,
86         .dev = {
87                 .platform_data  = &tmu0_platform_data,
88         },
89         .resource       = tmu0_resources,
90         .num_resources  = ARRAY_SIZE(tmu0_resources),
91 };
92
93 static struct sh_timer_config tmu1_platform_data = {
94         .channel_offset = 0x10,
95         .timer_bit = 1,
96         .clocksource_rating = 200,
97 };
98
99 static struct resource tmu1_resources[] = {
100         [0] = {
101                 .start  = 0xfe430014,
102                 .end    = 0xfe43001f,
103                 .flags  = IORESOURCE_MEM,
104         },
105         [1] = {
106                 .start  = 29,
107                 .flags  = IORESOURCE_IRQ,
108         },
109 };
110
111 static struct platform_device tmu1_device = {
112         .name           = "sh_tmu",
113         .id             = 1,
114         .dev = {
115                 .platform_data  = &tmu1_platform_data,
116         },
117         .resource       = tmu1_resources,
118         .num_resources  = ARRAY_SIZE(tmu1_resources),
119 };
120
121 static struct platform_device *sh7757_devices[] __initdata = {
122         &scif2_device,
123         &scif3_device,
124         &scif4_device,
125         &tmu0_device,
126         &tmu1_device,
127 };
128
129 static int __init sh7757_devices_setup(void)
130 {
131         return platform_add_devices(sh7757_devices,
132                                     ARRAY_SIZE(sh7757_devices));
133 }
134 arch_initcall(sh7757_devices_setup);
135
136 static struct platform_device *sh7757_early_devices[] __initdata = {
137         &scif2_device,
138         &scif3_device,
139         &scif4_device,
140         &tmu0_device,
141         &tmu1_device,
142 };
143
144 void __init plat_early_device_setup(void)
145 {
146         early_platform_add_devices(sh7757_early_devices,
147                                    ARRAY_SIZE(sh7757_early_devices));
148 }
149
150 enum {
151         UNUSED = 0,
152
153         /* interrupt sources */
154
155         IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
156         IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
157         IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
158         IRL0_HHLL, IRL0_HHLH, IRL0_HHHL,
159
160         IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
161         IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
162         IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
163         IRL4_HHLL, IRL4_HHLH, IRL4_HHHL,
164         IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
165
166         SDHI,
167         DVC,
168         IRQ8, IRQ9, IRQ10,
169         WDT0,
170         TMU0, TMU1, TMU2, TMU2_TICPI,
171         HUDI,
172
173         ARC4,
174         DMAC0,
175         IRQ11,
176         SCIF2,
177         DMAC1_6,
178         USB0,
179         IRQ12,
180         JMC,
181         SPI1,
182         IRQ13, IRQ14,
183         USB1,
184         TMR01, TMR23, TMR45,
185         WDT1,
186         FRT,
187         LPC,
188         SCIF0, SCIF1, SCIF3,
189         PECI0I, PECI1I, PECI2I,
190         IRQ15,
191         ETHERC,
192         SPI0,
193         ADC1,
194         DMAC1_8,
195         SIM,
196         TMU3, TMU4, TMU5,
197         ADC0,
198         SCIF4,
199         IIC0_0, IIC0_1, IIC0_2, IIC0_3,
200         IIC1_0, IIC1_1, IIC1_2, IIC1_3,
201         IIC2_0, IIC2_1, IIC2_2, IIC2_3,
202         IIC3_0, IIC3_1, IIC3_2, IIC3_3,
203         IIC4_0, IIC4_1, IIC4_2, IIC4_3,
204         IIC5_0, IIC5_1, IIC5_2, IIC5_3,
205         IIC6_0, IIC6_1, IIC6_2, IIC6_3,
206         IIC7_0, IIC7_1, IIC7_2, IIC7_3,
207         IIC8_0, IIC8_1, IIC8_2, IIC8_3,
208         IIC9_0, IIC9_1, IIC9_2, IIC9_3,
209         PCIINTA,
210         PCIE,
211         SGPIO,
212
213         /* interrupt groups */
214
215         TMU012, TMU345,
216 };
217
218 static struct intc_vect vectors[] __initdata = {
219         INTC_VECT(SDHI, 0x480), INTC_VECT(SDHI, 0x04a0),
220         INTC_VECT(SDHI, 0x4c0),
221         INTC_VECT(DVC, 0x4e0),
222         INTC_VECT(IRQ8, 0x500), INTC_VECT(IRQ9, 0x520),
223         INTC_VECT(IRQ10, 0x540),
224         INTC_VECT(WDT0, 0x560),
225         INTC_VECT(TMU0, 0x580), INTC_VECT(TMU1, 0x5a0),
226         INTC_VECT(TMU2, 0x5c0), INTC_VECT(TMU2_TICPI, 0x5e0),
227         INTC_VECT(HUDI, 0x600),
228         INTC_VECT(ARC4, 0x620),
229         INTC_VECT(DMAC0, 0x640), INTC_VECT(DMAC0, 0x660),
230         INTC_VECT(DMAC0, 0x680), INTC_VECT(DMAC0, 0x6a0),
231         INTC_VECT(DMAC0, 0x6c0),
232         INTC_VECT(IRQ11, 0x6e0),
233         INTC_VECT(SCIF2, 0x700), INTC_VECT(SCIF2, 0x720),
234         INTC_VECT(SCIF2, 0x740), INTC_VECT(SCIF2, 0x760),
235         INTC_VECT(DMAC0, 0x780), INTC_VECT(DMAC0, 0x7a0),
236         INTC_VECT(DMAC1_6, 0x7c0), INTC_VECT(DMAC1_6, 0x7e0),
237         INTC_VECT(USB0, 0x840),
238         INTC_VECT(IRQ12, 0x880),
239         INTC_VECT(JMC, 0x8a0),
240         INTC_VECT(SPI1, 0x8c0),
241         INTC_VECT(IRQ13, 0x8e0), INTC_VECT(IRQ14, 0x900),
242         INTC_VECT(USB1, 0x920),
243         INTC_VECT(TMR01, 0xa00), INTC_VECT(TMR23, 0xa20),
244         INTC_VECT(TMR45, 0xa40),
245         INTC_VECT(WDT1, 0xa60),
246         INTC_VECT(FRT, 0xa80),
247         INTC_VECT(LPC, 0xaa0), INTC_VECT(LPC, 0xac0),
248         INTC_VECT(LPC, 0xae0), INTC_VECT(LPC, 0xb00),
249         INTC_VECT(LPC, 0xb20),
250         INTC_VECT(SCIF0, 0xb40), INTC_VECT(SCIF1, 0xb60),
251         INTC_VECT(SCIF3, 0xb80), INTC_VECT(SCIF3, 0xba0),
252         INTC_VECT(SCIF3, 0xbc0), INTC_VECT(SCIF3, 0xbe0),
253         INTC_VECT(PECI0I, 0xc00), INTC_VECT(PECI1I, 0xc20),
254         INTC_VECT(PECI2I, 0xc40),
255         INTC_VECT(IRQ15, 0xc60),
256         INTC_VECT(ETHERC, 0xc80), INTC_VECT(ETHERC, 0xca0),
257         INTC_VECT(SPI0, 0xcc0),
258         INTC_VECT(ADC1, 0xce0),
259         INTC_VECT(DMAC1_8, 0xd00), INTC_VECT(DMAC1_8, 0xd20),
260         INTC_VECT(DMAC1_8, 0xd40), INTC_VECT(DMAC1_8, 0xd60),
261         INTC_VECT(SIM, 0xd80), INTC_VECT(SIM, 0xda0),
262         INTC_VECT(SIM, 0xdc0), INTC_VECT(SIM, 0xde0),
263         INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20),
264         INTC_VECT(TMU5, 0xe40),
265         INTC_VECT(ADC0, 0xe60),
266         INTC_VECT(SCIF4, 0xf00), INTC_VECT(SCIF4, 0xf20),
267         INTC_VECT(SCIF4, 0xf40), INTC_VECT(SCIF4, 0xf60),
268         INTC_VECT(IIC0_0, 0x1400), INTC_VECT(IIC0_1, 0x1420),
269         INTC_VECT(IIC0_2, 0x1440), INTC_VECT(IIC0_3, 0x1460),
270         INTC_VECT(IIC1_0, 0x1480), INTC_VECT(IIC1_1, 0x14e0),
271         INTC_VECT(IIC1_2, 0x1500), INTC_VECT(IIC1_3, 0x1520),
272         INTC_VECT(IIC2_0, 0x1540), INTC_VECT(IIC2_1, 0x1560),
273         INTC_VECT(IIC2_2, 0x1580), INTC_VECT(IIC2_3, 0x1600),
274         INTC_VECT(IIC3_0, 0x1620), INTC_VECT(IIC3_1, 0x1640),
275         INTC_VECT(IIC3_2, 0x16e0), INTC_VECT(IIC3_3, 0x1700),
276         INTC_VECT(IIC4_0, 0x17c0), INTC_VECT(IIC4_1, 0x1800),
277         INTC_VECT(IIC4_2, 0x1820), INTC_VECT(IIC4_3, 0x1840),
278         INTC_VECT(IIC5_0, 0x1860), INTC_VECT(IIC5_1, 0x1880),
279         INTC_VECT(IIC5_2, 0x18a0), INTC_VECT(IIC5_3, 0x18c0),
280         INTC_VECT(IIC6_0, 0x18e0), INTC_VECT(IIC6_1, 0x1900),
281         INTC_VECT(IIC6_2, 0x1920), INTC_VECT(IIC6_3, 0x1980),
282         INTC_VECT(IIC7_0, 0x19a0), INTC_VECT(IIC7_1, 0x1a00),
283         INTC_VECT(IIC7_2, 0x1a20), INTC_VECT(IIC7_3, 0x1a40),
284         INTC_VECT(IIC8_0, 0x1a60), INTC_VECT(IIC8_1, 0x1a80),
285         INTC_VECT(IIC8_2, 0x1aa0), INTC_VECT(IIC8_3, 0x1b40),
286         INTC_VECT(IIC9_0, 0x1b60), INTC_VECT(IIC9_1, 0x1b80),
287         INTC_VECT(IIC9_2, 0x1c00), INTC_VECT(IIC9_3, 0x1c20),
288         INTC_VECT(PCIINTA, 0x1ce0),
289         INTC_VECT(PCIE, 0x1e00),
290         INTC_VECT(SGPIO, 0x1f80),
291         INTC_VECT(SGPIO, 0x1fa0),
292 };
293
294 static struct intc_group groups[] __initdata = {
295         INTC_GROUP(TMU012, TMU0, TMU1, TMU2, TMU2_TICPI),
296         INTC_GROUP(TMU345, TMU3, TMU4, TMU5),
297 };
298
299 static struct intc_mask_reg mask_registers[] __initdata = {
300         { 0xffd00044, 0xffd00064, 32, /* INTMSK0 / INTMSKCLR0 */
301           { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
302
303         { 0xffd40080, 0xffd40084, 32, /* INTMSK2 / INTMSKCLR2 */
304           { IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
305             IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
306             IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
307             IRL0_HHLL, IRL0_HHLH, IRL0_HHHL, 0,
308             IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
309             IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
310             IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
311             IRL4_HHLL, IRL4_HHLH, IRL4_HHHL, 0, } },
312
313         { 0xffd40038, 0xffd4003c, 32, /* INT2MSKR / INT2MSKCR */
314           { 0, 0, 0, 0, 0, 0, 0, 0,
315             0, DMAC1_8, 0, PECI0I, LPC, FRT, WDT1, TMR45,
316             TMR23, TMR01, 0, 0, 0, 0, 0, DMAC0,
317             HUDI, 0, WDT0, SCIF3, SCIF2, SDHI, TMU345, TMU012
318              } },
319
320         { 0xffd400d0, 0xffd400d4, 32, /* INT2MSKR1 / INT2MSKCR1 */
321           { IRQ15, IRQ14, IRQ13, IRQ12, IRQ11, IRQ10, SCIF4, ETHERC,
322             IRQ9, IRQ8, SCIF1, SCIF0, USB0, 0, 0, USB1,
323             ADC1, 0, DMAC1_6, ADC0, SPI0, SIM, PECI2I, PECI1I,
324             ARC4, 0, SPI1, JMC, 0, 0, 0, DVC
325              } },
326
327         { 0xffd10038, 0xffd1003c, 32, /* INT2MSKR2 / INT2MSKCR2 */
328           { IIC4_1, IIC4_2, IIC5_0, 0, 0, 0, SGPIO, 0,
329             0, 0, 0, IIC9_2, IIC8_2, IIC8_1, IIC8_0, IIC7_3,
330             IIC7_2, IIC7_1, IIC6_3, IIC0_0, IIC0_1, IIC0_2, IIC0_3, IIC3_1,
331             IIC2_3, 0, IIC2_1, IIC9_1, IIC3_3, IIC1_0, PCIE, IIC2_2
332              } },
333
334         { 0xffd100d0, 0xff1400d4, 32, /* INT2MSKR3 / INT2MSKCR4 */
335           { 0, IIC6_1, IIC6_0, IIC5_1, IIC3_2, IIC2_0, 0, 0,
336             IIC1_3, IIC1_2, IIC9_0, IIC8_3, IIC4_3, IIC7_0, 0, IIC6_2,
337             PCIINTA, 0, IIC4_0, 0, 0, 0, 0, IIC9_3,
338             IIC3_0, 0, IIC5_3, IIC5_2, 0, 0, 0, IIC1_1
339              } },
340 };
341
342 #define INTPRI          0xffd00010
343 #define INT2PRI0        0xffd40000
344 #define INT2PRI1        0xffd40004
345 #define INT2PRI2        0xffd40008
346 #define INT2PRI3        0xffd4000c
347 #define INT2PRI4        0xffd40010
348 #define INT2PRI5        0xffd40014
349 #define INT2PRI6        0xffd40018
350 #define INT2PRI7        0xffd4001c
351 #define INT2PRI8        0xffd400a0
352 #define INT2PRI9        0xffd400a4
353 #define INT2PRI10       0xffd400a8
354 #define INT2PRI11       0xffd400ac
355 #define INT2PRI12       0xffd400b0
356 #define INT2PRI13       0xffd400b4
357 #define INT2PRI14       0xffd400b8
358 #define INT2PRI15       0xffd400bc
359 #define INT2PRI16       0xffd10000
360 #define INT2PRI17       0xffd10004
361 #define INT2PRI18       0xffd10008
362 #define INT2PRI19       0xffd1000c
363 #define INT2PRI20       0xffd10010
364 #define INT2PRI21       0xffd10014
365 #define INT2PRI22       0xffd10018
366 #define INT2PRI23       0xffd1001c
367 #define INT2PRI24       0xffd100a0
368 #define INT2PRI25       0xffd100a4
369 #define INT2PRI26       0xffd100a8
370 #define INT2PRI27       0xffd100ac
371 #define INT2PRI28       0xffd100b0
372 #define INT2PRI29       0xffd100b4
373 #define INT2PRI30       0xffd100b8
374 #define INT2PRI31       0xffd100bc
375
376 static struct intc_prio_reg prio_registers[] __initdata = {
377         { INTPRI, 0, 32, 4, { IRQ0, IRQ1, IRQ2, IRQ3,
378                               IRQ4, IRQ5, IRQ6, IRQ7 } },
379
380         { INT2PRI0, 0, 32, 8, { TMU0, TMU1, TMU2, TMU2_TICPI } },
381         { INT2PRI1, 0, 32, 8, { TMU3, TMU4, TMU5, SDHI } },
382         { INT2PRI2, 0, 32, 8, { SCIF2, SCIF3, WDT0, IRQ8 } },
383         { INT2PRI3, 0, 32, 8, { HUDI, DMAC0, ADC0, IRQ9 } },
384         { INT2PRI4, 0, 32, 8, { IRQ10, 0, TMR01, TMR23 } },
385         { INT2PRI5, 0, 32, 8, { TMR45, WDT1, FRT, LPC } },
386         { INT2PRI6, 0, 32, 8, { PECI0I, ETHERC, DMAC1_8, 0 } },
387         { INT2PRI7, 0, 32, 8, { SCIF4, 0, IRQ11, IRQ12 } },
388         { INT2PRI8, 0, 32, 8, { 0, 0, 0, DVC } },
389         { INT2PRI9, 0, 32, 8, { ARC4, 0, SPI1, JMC } },
390         { INT2PRI10, 0, 32, 8, { SPI0, SIM, PECI2I, PECI1I } },
391         { INT2PRI11, 0, 32, 8, { ADC1, IRQ13, DMAC1_6, IRQ14 } },
392         { INT2PRI12, 0, 32, 8, { USB0, 0, IRQ15, USB1 } },
393         { INT2PRI13, 0, 32, 8, { 0, 0, SCIF1, SCIF0 } },
394
395         { INT2PRI16, 0, 32, 8, { IIC2_2, 0, 0, 0 } },
396         { INT2PRI17, 0, 32, 8, { PCIE, 0, 0, IIC1_0 } },
397         { INT2PRI18, 0, 32, 8, { IIC3_3, IIC9_1, IIC2_1, IIC1_2 } },
398         { INT2PRI19, 0, 32, 8, { IIC2_3, IIC3_1, 0, IIC1_3 } },
399         { INT2PRI20, 0, 32, 8, { IIC2_0, IIC6_3, IIC7_1, IIC7_2 } },
400         { INT2PRI21, 0, 32, 8, { IIC7_3, IIC8_0, IIC8_1, IIC8_2 } },
401         { INT2PRI22, 0, 32, 8, { IIC9_2, 0, 0, 0 } },
402         { INT2PRI23, 0, 32, 8, { 0, SGPIO, IIC3_2, IIC5_1 } },
403         { INT2PRI24, 0, 32, 8, { 0, 0, 0, IIC1_1 } },
404         { INT2PRI25, 0, 32, 8, { IIC3_0, 0, IIC5_3, IIC5_2 } },
405         { INT2PRI26, 0, 32, 8, { 0, 0, 0, IIC9_3 } },
406         { INT2PRI27, 0, 32, 8, { PCIINTA, IIC6_0, IIC4_0, IIC6_1 } },
407         { INT2PRI28, 0, 32, 8, { IIC4_3, IIC7_0, 0, IIC6_2 } },
408         { INT2PRI29, 0, 32, 8, { 0, 0, IIC9_0, IIC8_3 } },
409         { INT2PRI30, 0, 32, 8, { IIC4_1, IIC4_2, IIC5_0, 0 } },
410         { INT2PRI31, 0, 32, 8, { IIC0_0, IIC0_1, IIC0_2, IIC0_3 } },
411 };
412
413 static DECLARE_INTC_DESC(intc_desc, "sh7757", vectors, groups,
414                          mask_registers, prio_registers, NULL);
415
416 /* Support for external interrupt pins in IRQ mode */
417 static struct intc_vect vectors_irq0123[] __initdata = {
418         INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280),
419         INTC_VECT(IRQ2, 0x2c0), INTC_VECT(IRQ3, 0x300),
420 };
421
422 static struct intc_vect vectors_irq4567[] __initdata = {
423         INTC_VECT(IRQ4, 0x340), INTC_VECT(IRQ5, 0x380),
424         INTC_VECT(IRQ6, 0x3c0), INTC_VECT(IRQ7, 0x200),
425 };
426
427 static struct intc_sense_reg sense_registers[] __initdata = {
428         { 0xffd0001c, 32, 2, /* ICR1 */   { IRQ0, IRQ1, IRQ2, IRQ3,
429                                             IRQ4, IRQ5, IRQ6, IRQ7 } },
430 };
431
432 static struct intc_mask_reg ack_registers[] __initdata = {
433         { 0xffd00024, 0, 32, /* INTREQ */
434           { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
435 };
436
437 static DECLARE_INTC_DESC_ACK(intc_desc_irq0123, "sh7757-irq0123",
438                              vectors_irq0123, NULL, mask_registers,
439                              prio_registers, sense_registers, ack_registers);
440
441 static DECLARE_INTC_DESC_ACK(intc_desc_irq4567, "sh7757-irq4567",
442                              vectors_irq4567, NULL, mask_registers,
443                              prio_registers, sense_registers, ack_registers);
444
445 /* External interrupt pins in IRL mode */
446 static struct intc_vect vectors_irl0123[] __initdata = {
447         INTC_VECT(IRL0_LLLL, 0x200), INTC_VECT(IRL0_LLLH, 0x220),
448         INTC_VECT(IRL0_LLHL, 0x240), INTC_VECT(IRL0_LLHH, 0x260),
449         INTC_VECT(IRL0_LHLL, 0x280), INTC_VECT(IRL0_LHLH, 0x2a0),
450         INTC_VECT(IRL0_LHHL, 0x2c0), INTC_VECT(IRL0_LHHH, 0x2e0),
451         INTC_VECT(IRL0_HLLL, 0x300), INTC_VECT(IRL0_HLLH, 0x320),
452         INTC_VECT(IRL0_HLHL, 0x340), INTC_VECT(IRL0_HLHH, 0x360),
453         INTC_VECT(IRL0_HHLL, 0x380), INTC_VECT(IRL0_HHLH, 0x3a0),
454         INTC_VECT(IRL0_HHHL, 0x3c0),
455 };
456
457 static struct intc_vect vectors_irl4567[] __initdata = {
458         INTC_VECT(IRL4_LLLL, 0xb00), INTC_VECT(IRL4_LLLH, 0xb20),
459         INTC_VECT(IRL4_LLHL, 0xb40), INTC_VECT(IRL4_LLHH, 0xb60),
460         INTC_VECT(IRL4_LHLL, 0xb80), INTC_VECT(IRL4_LHLH, 0xba0),
461         INTC_VECT(IRL4_LHHL, 0xbc0), INTC_VECT(IRL4_LHHH, 0xbe0),
462         INTC_VECT(IRL4_HLLL, 0xc00), INTC_VECT(IRL4_HLLH, 0xc20),
463         INTC_VECT(IRL4_HLHL, 0xc40), INTC_VECT(IRL4_HLHH, 0xc60),
464         INTC_VECT(IRL4_HHLL, 0xc80), INTC_VECT(IRL4_HHLH, 0xca0),
465         INTC_VECT(IRL4_HHHL, 0xcc0),
466 };
467
468 static DECLARE_INTC_DESC(intc_desc_irl0123, "sh7757-irl0123", vectors_irl0123,
469                          NULL, mask_registers, NULL, NULL);
470
471 static DECLARE_INTC_DESC(intc_desc_irl4567, "sh7757-irl4567", vectors_irl4567,
472                          NULL, mask_registers, NULL, NULL);
473
474 #define INTC_ICR0       0xffd00000
475 #define INTC_INTMSK0    0xffd00044
476 #define INTC_INTMSK1    0xffd00048
477 #define INTC_INTMSK2    0xffd40080
478 #define INTC_INTMSKCLR1 0xffd00068
479 #define INTC_INTMSKCLR2 0xffd40084
480
481 void __init plat_irq_setup(void)
482 {
483         /* disable IRQ3-0 + IRQ7-4 */
484         __raw_writel(0xff000000, INTC_INTMSK0);
485
486         /* disable IRL3-0 + IRL7-4 */
487         __raw_writel(0xc0000000, INTC_INTMSK1);
488         __raw_writel(0xfffefffe, INTC_INTMSK2);
489
490         /* select IRL mode for IRL3-0 + IRL7-4 */
491         __raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
492
493         /* disable holding function, ie enable "SH-4 Mode" */
494         __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0);
495
496         register_intc_controller(&intc_desc);
497 }
498
499 void __init plat_irq_setup_pins(int mode)
500 {
501         switch (mode) {
502         case IRQ_MODE_IRQ7654:
503                 /* select IRQ mode for IRL7-4 */
504                 __raw_writel(__raw_readl(INTC_ICR0) | 0x00400000, INTC_ICR0);
505                 register_intc_controller(&intc_desc_irq4567);
506                 break;
507         case IRQ_MODE_IRQ3210:
508                 /* select IRQ mode for IRL3-0 */
509                 __raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0);
510                 register_intc_controller(&intc_desc_irq0123);
511                 break;
512         case IRQ_MODE_IRL7654:
513                 /* enable IRL7-4 but don't provide any masking */
514                 __raw_writel(0x40000000, INTC_INTMSKCLR1);
515                 __raw_writel(0x0000fffe, INTC_INTMSKCLR2);
516                 break;
517         case IRQ_MODE_IRL3210:
518                 /* enable IRL0-3 but don't provide any masking */
519                 __raw_writel(0x80000000, INTC_INTMSKCLR1);
520                 __raw_writel(0xfffe0000, INTC_INTMSKCLR2);
521                 break;
522         case IRQ_MODE_IRL7654_MASK:
523                 /* enable IRL7-4 and mask using cpu intc controller */
524                 __raw_writel(0x40000000, INTC_INTMSKCLR1);
525                 register_intc_controller(&intc_desc_irl4567);
526                 break;
527         case IRQ_MODE_IRL3210_MASK:
528                 /* enable IRL0-3 and mask using cpu intc controller */
529                 __raw_writel(0x80000000, INTC_INTMSKCLR1);
530                 register_intc_controller(&intc_desc_irl0123);
531                 break;
532         default:
533                 BUG();
534         }
535 }
536
537 void __init plat_mem_setup(void)
538 {
539 }