Linux 3.14.25
[platform/adaptation/renesas_rcar/renesas_kernel.git] / arch / sh / kernel / cpu / sh4a / setup-shx3.c
1 /*
2  * SH-X3 Prototype Setup
3  *
4  *  Copyright (C) 2007 - 2010  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/gpio.h>
16 #include <linux/sh_timer.h>
17 #include <linux/sh_intc.h>
18 #include <cpu/shx3.h>
19 #include <asm/mmzone.h>
20
21 /*
22  * This intentionally only registers SCIF ports 0, 1, and 3. SCIF 2
23  * INTEVT values overlap with the FPU EXPEVT ones, requiring special
24  * demuxing in the exception dispatch path.
25  *
26  * As this overlap is something that never should have made it in to
27  * silicon in the first place, we just refuse to deal with the port at
28  * all rather than adding infrastructure to hack around it.
29  */
30 static struct plat_sci_port scif0_platform_data = {
31         .flags          = UPF_BOOT_AUTOCONF,
32         .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
33         .type           = PORT_SCIF,
34 };
35
36 static struct resource scif0_resources[] = {
37         DEFINE_RES_MEM(0xffc30000, 0x100),
38         DEFINE_RES_IRQ(evt2irq(0x700)),
39         DEFINE_RES_IRQ(evt2irq(0x720)),
40         DEFINE_RES_IRQ(evt2irq(0x760)),
41         DEFINE_RES_IRQ(evt2irq(0x740)),
42 };
43
44 static struct platform_device scif0_device = {
45         .name           = "sh-sci",
46         .id             = 0,
47         .resource       = scif0_resources,
48         .num_resources  = ARRAY_SIZE(scif0_resources),
49         .dev            = {
50                 .platform_data  = &scif0_platform_data,
51         },
52 };
53
54 static struct plat_sci_port scif1_platform_data = {
55         .flags          = UPF_BOOT_AUTOCONF,
56         .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
57         .type           = PORT_SCIF,
58 };
59
60 static struct resource scif1_resources[] = {
61         DEFINE_RES_MEM(0xffc40000, 0x100),
62         DEFINE_RES_IRQ(evt2irq(0x780)),
63         DEFINE_RES_IRQ(evt2irq(0x7a0)),
64         DEFINE_RES_IRQ(evt2irq(0x7e0)),
65         DEFINE_RES_IRQ(evt2irq(0x7c0)),
66 };
67
68 static struct platform_device scif1_device = {
69         .name           = "sh-sci",
70         .id             = 1,
71         .resource       = scif1_resources,
72         .num_resources  = ARRAY_SIZE(scif1_resources),
73         .dev            = {
74                 .platform_data  = &scif1_platform_data,
75         },
76 };
77
78 static struct plat_sci_port scif2_platform_data = {
79         .flags          = UPF_BOOT_AUTOCONF,
80         .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
81         .type           = PORT_SCIF,
82 };
83
84 static struct resource scif2_resources[] = {
85         DEFINE_RES_MEM(0xffc60000, 0x100),
86         DEFINE_RES_IRQ(evt2irq(0x880)),
87         DEFINE_RES_IRQ(evt2irq(0x8a0)),
88         DEFINE_RES_IRQ(evt2irq(0x8e0)),
89         DEFINE_RES_IRQ(evt2irq(0x8c0)),
90 };
91
92 static struct platform_device scif2_device = {
93         .name           = "sh-sci",
94         .id             = 2,
95         .resource       = scif2_resources,
96         .num_resources  = ARRAY_SIZE(scif2_resources),
97         .dev            = {
98                 .platform_data  = &scif2_platform_data,
99         },
100 };
101
102 static struct sh_timer_config tmu0_platform_data = {
103         .channel_offset = 0x04,
104         .timer_bit = 0,
105         .clockevent_rating = 200,
106 };
107
108 static struct resource tmu0_resources[] = {
109         [0] = {
110                 .start  = 0xffc10008,
111                 .end    = 0xffc10013,
112                 .flags  = IORESOURCE_MEM,
113         },
114         [1] = {
115                 .start  = evt2irq(0x400),
116                 .flags  = IORESOURCE_IRQ,
117         },
118 };
119
120 static struct platform_device tmu0_device = {
121         .name           = "sh_tmu",
122         .id             = 0,
123         .dev = {
124                 .platform_data  = &tmu0_platform_data,
125         },
126         .resource       = tmu0_resources,
127         .num_resources  = ARRAY_SIZE(tmu0_resources),
128 };
129
130 static struct sh_timer_config tmu1_platform_data = {
131         .channel_offset = 0x10,
132         .timer_bit = 1,
133         .clocksource_rating = 200,
134 };
135
136 static struct resource tmu1_resources[] = {
137         [0] = {
138                 .start  = 0xffc10014,
139                 .end    = 0xffc1001f,
140                 .flags  = IORESOURCE_MEM,
141         },
142         [1] = {
143                 .start  = evt2irq(0x420),
144                 .flags  = IORESOURCE_IRQ,
145         },
146 };
147
148 static struct platform_device tmu1_device = {
149         .name           = "sh_tmu",
150         .id             = 1,
151         .dev = {
152                 .platform_data  = &tmu1_platform_data,
153         },
154         .resource       = tmu1_resources,
155         .num_resources  = ARRAY_SIZE(tmu1_resources),
156 };
157
158 static struct sh_timer_config tmu2_platform_data = {
159         .channel_offset = 0x1c,
160         .timer_bit = 2,
161 };
162
163 static struct resource tmu2_resources[] = {
164         [0] = {
165                 .start  = 0xffc10020,
166                 .end    = 0xffc1002f,
167                 .flags  = IORESOURCE_MEM,
168         },
169         [1] = {
170                 .start  = evt2irq(0x440),
171                 .flags  = IORESOURCE_IRQ,
172         },
173 };
174
175 static struct platform_device tmu2_device = {
176         .name           = "sh_tmu",
177         .id             = 2,
178         .dev = {
179                 .platform_data  = &tmu2_platform_data,
180         },
181         .resource       = tmu2_resources,
182         .num_resources  = ARRAY_SIZE(tmu2_resources),
183 };
184
185 static struct sh_timer_config tmu3_platform_data = {
186         .channel_offset = 0x04,
187         .timer_bit = 0,
188 };
189
190 static struct resource tmu3_resources[] = {
191         [0] = {
192                 .start  = 0xffc20008,
193                 .end    = 0xffc20013,
194                 .flags  = IORESOURCE_MEM,
195         },
196         [1] = {
197                 .start  = evt2irq(0x460),
198                 .flags  = IORESOURCE_IRQ,
199         },
200 };
201
202 static struct platform_device tmu3_device = {
203         .name           = "sh_tmu",
204         .id             = 3,
205         .dev = {
206                 .platform_data  = &tmu3_platform_data,
207         },
208         .resource       = tmu3_resources,
209         .num_resources  = ARRAY_SIZE(tmu3_resources),
210 };
211
212 static struct sh_timer_config tmu4_platform_data = {
213         .channel_offset = 0x10,
214         .timer_bit = 1,
215 };
216
217 static struct resource tmu4_resources[] = {
218         [0] = {
219                 .start  = 0xffc20014,
220                 .end    = 0xffc2001f,
221                 .flags  = IORESOURCE_MEM,
222         },
223         [1] = {
224                 .start  = evt2irq(0x480),
225                 .flags  = IORESOURCE_IRQ,
226         },
227 };
228
229 static struct platform_device tmu4_device = {
230         .name           = "sh_tmu",
231         .id             = 4,
232         .dev = {
233                 .platform_data  = &tmu4_platform_data,
234         },
235         .resource       = tmu4_resources,
236         .num_resources  = ARRAY_SIZE(tmu4_resources),
237 };
238
239 static struct sh_timer_config tmu5_platform_data = {
240         .channel_offset = 0x1c,
241         .timer_bit = 2,
242 };
243
244 static struct resource tmu5_resources[] = {
245         [0] = {
246                 .start  = 0xffc20020,
247                 .end    = 0xffc2002b,
248                 .flags  = IORESOURCE_MEM,
249         },
250         [1] = {
251                 .start  = evt2irq(0x4a0),
252                 .flags  = IORESOURCE_IRQ,
253         },
254 };
255
256 static struct platform_device tmu5_device = {
257         .name           = "sh_tmu",
258         .id             = 5,
259         .dev = {
260                 .platform_data  = &tmu5_platform_data,
261         },
262         .resource       = tmu5_resources,
263         .num_resources  = ARRAY_SIZE(tmu5_resources),
264 };
265
266 static struct platform_device *shx3_early_devices[] __initdata = {
267         &scif0_device,
268         &scif1_device,
269         &scif2_device,
270         &tmu0_device,
271         &tmu1_device,
272         &tmu2_device,
273         &tmu3_device,
274         &tmu4_device,
275         &tmu5_device,
276 };
277
278 static int __init shx3_devices_setup(void)
279 {
280         return platform_add_devices(shx3_early_devices,
281                                    ARRAY_SIZE(shx3_early_devices));
282 }
283 arch_initcall(shx3_devices_setup);
284
285 void __init plat_early_device_setup(void)
286 {
287         early_platform_add_devices(shx3_early_devices,
288                                    ARRAY_SIZE(shx3_early_devices));
289 }
290
291 enum {
292         UNUSED = 0,
293
294         /* interrupt sources */
295         IRL_LLLL, IRL_LLLH, IRL_LLHL, IRL_LLHH,
296         IRL_LHLL, IRL_LHLH, IRL_LHHL, IRL_LHHH,
297         IRL_HLLL, IRL_HLLH, IRL_HLHL, IRL_HLHH,
298         IRL_HHLL, IRL_HHLH, IRL_HHHL,
299         IRQ0, IRQ1, IRQ2, IRQ3,
300         HUDII,
301         TMU0, TMU1, TMU2, TMU3, TMU4, TMU5,
302         PCII0, PCII1, PCII2, PCII3, PCII4,
303         PCII5, PCII6, PCII7, PCII8, PCII9,
304         SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI,
305         SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI,
306         SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI,
307         SCIF3_ERI, SCIF3_RXI, SCIF3_BRI, SCIF3_TXI,
308         DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2, DMAC0_DMINT3,
309         DMAC0_DMINT4, DMAC0_DMINT5, DMAC0_DMAE,
310         DU,
311         DMAC1_DMINT6, DMAC1_DMINT7, DMAC1_DMINT8, DMAC1_DMINT9,
312         DMAC1_DMINT10, DMAC1_DMINT11, DMAC1_DMAE,
313         IIC, VIN0, VIN1, VCORE0, ATAPI,
314         DTU0, DTU1, DTU2, DTU3,
315         FE0, FE1,
316         GPIO0, GPIO1, GPIO2, GPIO3,
317         PAM, IRM,
318         INTICI0, INTICI1, INTICI2, INTICI3,
319         INTICI4, INTICI5, INTICI6, INTICI7,
320
321         /* interrupt groups */
322         IRL, PCII56789, SCIF0, SCIF1, SCIF2, SCIF3,
323         DMAC0, DMAC1,
324 };
325
326 static struct intc_vect vectors[] __initdata = {
327         INTC_VECT(HUDII, 0x3e0),
328         INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420),
329         INTC_VECT(TMU2, 0x440), INTC_VECT(TMU3, 0x460),
330         INTC_VECT(TMU4, 0x480), INTC_VECT(TMU5, 0x4a0),
331         INTC_VECT(PCII0, 0x500), INTC_VECT(PCII1, 0x520),
332         INTC_VECT(PCII2, 0x540), INTC_VECT(PCII3, 0x560),
333         INTC_VECT(PCII4, 0x580), INTC_VECT(PCII5, 0x5a0),
334         INTC_VECT(PCII6, 0x5c0), INTC_VECT(PCII7, 0x5e0),
335         INTC_VECT(PCII8, 0x600), INTC_VECT(PCII9, 0x620),
336         INTC_VECT(SCIF0_ERI, 0x700), INTC_VECT(SCIF0_RXI, 0x720),
337         INTC_VECT(SCIF0_BRI, 0x740), INTC_VECT(SCIF0_TXI, 0x760),
338         INTC_VECT(SCIF1_ERI, 0x780), INTC_VECT(SCIF1_RXI, 0x7a0),
339         INTC_VECT(SCIF1_BRI, 0x7c0), INTC_VECT(SCIF1_TXI, 0x7e0),
340         INTC_VECT(SCIF3_ERI, 0x880), INTC_VECT(SCIF3_RXI, 0x8a0),
341         INTC_VECT(SCIF3_BRI, 0x8c0), INTC_VECT(SCIF3_TXI, 0x8e0),
342         INTC_VECT(DMAC0_DMINT0, 0x900), INTC_VECT(DMAC0_DMINT1, 0x920),
343         INTC_VECT(DMAC0_DMINT2, 0x940), INTC_VECT(DMAC0_DMINT3, 0x960),
344         INTC_VECT(DMAC0_DMINT4, 0x980), INTC_VECT(DMAC0_DMINT5, 0x9a0),
345         INTC_VECT(DMAC0_DMAE, 0x9c0),
346         INTC_VECT(DU, 0x9e0),
347         INTC_VECT(DMAC1_DMINT6, 0xa00), INTC_VECT(DMAC1_DMINT7, 0xa20),
348         INTC_VECT(DMAC1_DMINT8, 0xa40), INTC_VECT(DMAC1_DMINT9, 0xa60),
349         INTC_VECT(DMAC1_DMINT10, 0xa80), INTC_VECT(DMAC1_DMINT11, 0xaa0),
350         INTC_VECT(DMAC1_DMAE, 0xac0),
351         INTC_VECT(IIC, 0xae0),
352         INTC_VECT(VIN0, 0xb00), INTC_VECT(VIN1, 0xb20),
353         INTC_VECT(VCORE0, 0xb00), INTC_VECT(ATAPI, 0xb60),
354         INTC_VECT(DTU0, 0xc00), INTC_VECT(DTU0, 0xc20),
355         INTC_VECT(DTU0, 0xc40),
356         INTC_VECT(DTU1, 0xc60), INTC_VECT(DTU1, 0xc80),
357         INTC_VECT(DTU1, 0xca0),
358         INTC_VECT(DTU2, 0xcc0), INTC_VECT(DTU2, 0xce0),
359         INTC_VECT(DTU2, 0xd00),
360         INTC_VECT(DTU3, 0xd20), INTC_VECT(DTU3, 0xd40),
361         INTC_VECT(DTU3, 0xd60),
362         INTC_VECT(FE0, 0xe00), INTC_VECT(FE1, 0xe20),
363         INTC_VECT(GPIO0, 0xe40), INTC_VECT(GPIO1, 0xe60),
364         INTC_VECT(GPIO2, 0xe80), INTC_VECT(GPIO3, 0xea0),
365         INTC_VECT(PAM, 0xec0), INTC_VECT(IRM, 0xee0),
366         INTC_VECT(INTICI0, 0xf00), INTC_VECT(INTICI1, 0xf20),
367         INTC_VECT(INTICI2, 0xf40), INTC_VECT(INTICI3, 0xf60),
368         INTC_VECT(INTICI4, 0xf80), INTC_VECT(INTICI5, 0xfa0),
369         INTC_VECT(INTICI6, 0xfc0), INTC_VECT(INTICI7, 0xfe0),
370 };
371
372 static struct intc_group groups[] __initdata = {
373         INTC_GROUP(IRL, IRL_LLLL, IRL_LLLH, IRL_LLHL, IRL_LLHH,
374                    IRL_LHLL, IRL_LHLH, IRL_LHHL, IRL_LHHH,
375                    IRL_HLLL, IRL_HLLH, IRL_HLHL, IRL_HLHH,
376                    IRL_HHLL, IRL_HHLH, IRL_HHHL),
377         INTC_GROUP(PCII56789, PCII5, PCII6, PCII7, PCII8, PCII9),
378         INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI),
379         INTC_GROUP(SCIF1, SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI),
380         INTC_GROUP(SCIF3, SCIF3_ERI, SCIF3_RXI, SCIF3_BRI, SCIF3_TXI),
381         INTC_GROUP(DMAC0, DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2,
382                    DMAC0_DMINT3, DMAC0_DMINT4, DMAC0_DMINT5, DMAC0_DMAE),
383         INTC_GROUP(DMAC1, DMAC1_DMINT6, DMAC1_DMINT7, DMAC1_DMINT8,
384                    DMAC1_DMINT9, DMAC1_DMINT10, DMAC1_DMINT11),
385 };
386
387 #define INT2DISTCR0     0xfe4108a0
388 #define INT2DISTCR1     0xfe4108a4
389 #define INT2DISTCR2     0xfe4108a8
390
391 static struct intc_mask_reg mask_registers[] __initdata = {
392         { 0xfe410030, 0xfe410050, 32, /* CnINTMSK0 / CnINTMSKCLR0 */
393           { IRQ0, IRQ1, IRQ2, IRQ3 } },
394         { 0xfe410040, 0xfe410060, 32, /* CnINTMSK1 / CnINTMSKCLR1 */
395           { IRL } },
396         { 0xfe410820, 0xfe410850, 32, /* CnINT2MSK0 / CnINT2MSKCLR0 */
397           { FE1, FE0, 0, ATAPI, VCORE0, VIN1, VIN0, IIC,
398             DU, GPIO3, GPIO2, GPIO1, GPIO0, PAM, 0, 0,
399             0, 0, 0, 0, 0, 0, 0, 0, /* HUDI bits ignored */
400             0, TMU5, TMU4, TMU3, TMU2, TMU1, TMU0, 0, },
401             INTC_SMP_BALANCING(INT2DISTCR0) },
402         { 0xfe410830, 0xfe410860, 32, /* CnINT2MSK1 / CnINT2MSKCLR1 */
403           { 0, 0, 0, 0, DTU3, DTU2, DTU1, DTU0, /* IRM bits ignored */
404             PCII9, PCII8, PCII7, PCII6, PCII5, PCII4, PCII3, PCII2,
405             PCII1, PCII0, DMAC1_DMAE, DMAC1_DMINT11,
406             DMAC1_DMINT10, DMAC1_DMINT9, DMAC1_DMINT8, DMAC1_DMINT7,
407             DMAC1_DMINT6, DMAC0_DMAE, DMAC0_DMINT5, DMAC0_DMINT4,
408             DMAC0_DMINT3, DMAC0_DMINT2, DMAC0_DMINT1, DMAC0_DMINT0 },
409             INTC_SMP_BALANCING(INT2DISTCR1) },
410         { 0xfe410840, 0xfe410870, 32, /* CnINT2MSK2 / CnINT2MSKCLR2 */
411           { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
412             SCIF3_TXI, SCIF3_BRI, SCIF3_RXI, SCIF3_ERI,
413             SCIF2_TXI, SCIF2_BRI, SCIF2_RXI, SCIF2_ERI,
414             SCIF1_TXI, SCIF1_BRI, SCIF1_RXI, SCIF1_ERI,
415             SCIF0_TXI, SCIF0_BRI, SCIF0_RXI, SCIF0_ERI },
416             INTC_SMP_BALANCING(INT2DISTCR2) },
417 };
418
419 static struct intc_prio_reg prio_registers[] __initdata = {
420         { 0xfe410010, 0, 32, 4, /* INTPRI */ { IRQ0, IRQ1, IRQ2, IRQ3 } },
421
422         { 0xfe410800, 0, 32, 4, /* INT2PRI0 */ { 0, HUDII, TMU5, TMU4,
423                                                  TMU3, TMU2, TMU1, TMU0 } },
424         { 0xfe410804, 0, 32, 4, /* INT2PRI1 */ { DTU3, DTU2, DTU1, DTU0,
425                                                  SCIF3, SCIF2,
426                                                  SCIF1, SCIF0 } },
427         { 0xfe410808, 0, 32, 4, /* INT2PRI2 */ { DMAC1, DMAC0,
428                                                  PCII56789, PCII4,
429                                                  PCII3, PCII2,
430                                                  PCII1, PCII0 } },
431         { 0xfe41080c, 0, 32, 4, /* INT2PRI3 */ { FE1, FE0, ATAPI, VCORE0,
432                                                  VIN1, VIN0, IIC, DU} },
433         { 0xfe410810, 0, 32, 4, /* INT2PRI4 */ { 0, 0, PAM, GPIO3,
434                                                  GPIO2, GPIO1, GPIO0, IRM } },
435         { 0xfe410090, 0xfe4100a0, 32, 4, /* CnICIPRI / CnICIPRICLR */
436           { INTICI7, INTICI6, INTICI5, INTICI4,
437             INTICI3, INTICI2, INTICI1, INTICI0 }, INTC_SMP(4, 4) },
438 };
439
440 static DECLARE_INTC_DESC(intc_desc, "shx3", vectors, groups,
441                          mask_registers, prio_registers, NULL);
442
443 /* Support for external interrupt pins in IRQ mode */
444 static struct intc_vect vectors_irq[] __initdata = {
445         INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280),
446         INTC_VECT(IRQ2, 0x2c0), INTC_VECT(IRQ3, 0x300),
447 };
448
449 static struct intc_sense_reg sense_registers[] __initdata = {
450         { 0xfe41001c, 32, 2, /* ICR1 */   { IRQ0, IRQ1, IRQ2, IRQ3 } },
451 };
452
453 static DECLARE_INTC_DESC(intc_desc_irq, "shx3-irq", vectors_irq, groups,
454                          mask_registers, prio_registers, sense_registers);
455
456 /* External interrupt pins in IRL mode */
457 static struct intc_vect vectors_irl[] __initdata = {
458         INTC_VECT(IRL_LLLL, 0x200), INTC_VECT(IRL_LLLH, 0x220),
459         INTC_VECT(IRL_LLHL, 0x240), INTC_VECT(IRL_LLHH, 0x260),
460         INTC_VECT(IRL_LHLL, 0x280), INTC_VECT(IRL_LHLH, 0x2a0),
461         INTC_VECT(IRL_LHHL, 0x2c0), INTC_VECT(IRL_LHHH, 0x2e0),
462         INTC_VECT(IRL_HLLL, 0x300), INTC_VECT(IRL_HLLH, 0x320),
463         INTC_VECT(IRL_HLHL, 0x340), INTC_VECT(IRL_HLHH, 0x360),
464         INTC_VECT(IRL_HHLL, 0x380), INTC_VECT(IRL_HHLH, 0x3a0),
465         INTC_VECT(IRL_HHHL, 0x3c0),
466 };
467
468 static DECLARE_INTC_DESC(intc_desc_irl, "shx3-irl", vectors_irl, groups,
469                          mask_registers, prio_registers, NULL);
470
471 void __init plat_irq_setup_pins(int mode)
472 {
473         int ret = 0;
474
475         switch (mode) {
476         case IRQ_MODE_IRQ:
477                 ret |= gpio_request(GPIO_FN_IRQ3, intc_desc_irq.name);
478                 ret |= gpio_request(GPIO_FN_IRQ2, intc_desc_irq.name);
479                 ret |= gpio_request(GPIO_FN_IRQ1, intc_desc_irq.name);
480                 ret |= gpio_request(GPIO_FN_IRQ0, intc_desc_irq.name);
481
482                 if (unlikely(ret)) {
483                         pr_err("Failed to set IRQ mode\n");
484                         return;
485                 }
486
487                 register_intc_controller(&intc_desc_irq);
488                 break;
489         case IRQ_MODE_IRL3210:
490                 ret |= gpio_request(GPIO_FN_IRL3, intc_desc_irl.name);
491                 ret |= gpio_request(GPIO_FN_IRL2, intc_desc_irl.name);
492                 ret |= gpio_request(GPIO_FN_IRL1, intc_desc_irl.name);
493                 ret |= gpio_request(GPIO_FN_IRL0, intc_desc_irl.name);
494
495                 if (unlikely(ret)) {
496                         pr_err("Failed to set IRL mode\n");
497                         return;
498                 }
499
500                 register_intc_controller(&intc_desc_irl);
501                 break;
502         default:
503                 BUG();
504         }
505 }
506
507 void __init plat_irq_setup(void)
508 {
509         register_intc_controller(&intc_desc);
510 }
511
512 void __init plat_mem_setup(void)
513 {
514         unsigned int nid = 1;
515
516         /* Register CPU#0 URAM space as Node 1 */
517         setup_bootmem_node(nid++, 0x145f0000, 0x14610000);      /* CPU0 */
518
519 #if 0
520         /* XXX: Not yet.. */
521         setup_bootmem_node(nid++, 0x14df0000, 0x14e10000);      /* CPU1 */
522         setup_bootmem_node(nid++, 0x155f0000, 0x15610000);      /* CPU2 */
523         setup_bootmem_node(nid++, 0x15df0000, 0x15e10000);      /* CPU3 */
524 #endif
525
526         setup_bootmem_node(nid++, 0x16000000, 0x16020000);      /* CSM */
527 }