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