GNU Linux-libre 6.7.9-gnu
[releases.git] / arch / sh / kernel / cpu / sh4a / setup-sh7734.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * arch/sh/kernel/cpu/sh4a/setup-sh7734.c
4  *
5  * SH7734 Setup
6  *
7  * Copyright (C) 2011,2012 Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
8  * Copyright (C) 2011,2012 Renesas Solutions Corp.
9  */
10
11 #include <linux/platform_device.h>
12 #include <linux/init.h>
13 #include <linux/serial.h>
14 #include <linux/mm.h>
15 #include <linux/dma-mapping.h>
16 #include <linux/serial_sci.h>
17 #include <linux/sh_timer.h>
18 #include <linux/io.h>
19 #include <asm/clock.h>
20 #include <asm/irq.h>
21 #include <asm/platform_early.h>
22 #include <cpu/sh7734.h>
23
24 /* SCIF */
25 static struct plat_sci_port scif0_platform_data = {
26         .scscr          = SCSCR_REIE,
27         .type           = PORT_SCIF,
28         .regtype        = SCIx_SH4_SCIF_BRG_REGTYPE,
29 };
30
31 static struct resource scif0_resources[] = {
32         DEFINE_RES_MEM(0xffe40000, 0x100),
33         DEFINE_RES_IRQ(evt2irq(0x8c0)),
34 };
35
36 static struct platform_device scif0_device = {
37         .name           = "sh-sci",
38         .id             = 0,
39         .resource       = scif0_resources,
40         .num_resources  = ARRAY_SIZE(scif0_resources),
41         .dev            = {
42                 .platform_data  = &scif0_platform_data,
43         },
44 };
45
46 static struct plat_sci_port scif1_platform_data = {
47         .scscr          = SCSCR_REIE,
48         .type           = PORT_SCIF,
49         .regtype        = SCIx_SH4_SCIF_BRG_REGTYPE,
50 };
51
52 static struct resource scif1_resources[] = {
53         DEFINE_RES_MEM(0xffe41000, 0x100),
54         DEFINE_RES_IRQ(evt2irq(0x8e0)),
55 };
56
57 static struct platform_device scif1_device = {
58         .name           = "sh-sci",
59         .id             = 1,
60         .resource       = scif1_resources,
61         .num_resources  = ARRAY_SIZE(scif1_resources),
62         .dev            = {
63                 .platform_data = &scif1_platform_data,
64         },
65 };
66
67 static struct plat_sci_port scif2_platform_data = {
68         .scscr          = SCSCR_REIE,
69         .type           = PORT_SCIF,
70         .regtype        = SCIx_SH4_SCIF_BRG_REGTYPE,
71 };
72
73 static struct resource scif2_resources[] = {
74         DEFINE_RES_MEM(0xffe42000, 0x100),
75         DEFINE_RES_IRQ(evt2irq(0x900)),
76 };
77
78 static struct platform_device scif2_device = {
79         .name           = "sh-sci",
80         .id             = 2,
81         .resource       = scif2_resources,
82         .num_resources  = ARRAY_SIZE(scif2_resources),
83         .dev            = {
84                 .platform_data = &scif2_platform_data,
85         },
86 };
87
88 static struct plat_sci_port scif3_platform_data = {
89         .scscr          = SCSCR_REIE | SCSCR_TOIE,
90         .type           = PORT_SCIF,
91         .regtype        = SCIx_SH4_SCIF_BRG_REGTYPE,
92 };
93
94 static struct resource scif3_resources[] = {
95         DEFINE_RES_MEM(0xffe43000, 0x100),
96         DEFINE_RES_IRQ(evt2irq(0x920)),
97 };
98
99 static struct platform_device scif3_device = {
100         .name           = "sh-sci",
101         .id             = 3,
102         .resource       = scif3_resources,
103         .num_resources  = ARRAY_SIZE(scif3_resources),
104         .dev            = {
105                 .platform_data  = &scif3_platform_data,
106         },
107 };
108
109 static struct plat_sci_port scif4_platform_data = {
110         .scscr          = SCSCR_REIE,
111         .type           = PORT_SCIF,
112         .regtype        = SCIx_SH4_SCIF_BRG_REGTYPE,
113 };
114
115 static struct resource scif4_resources[] = {
116         DEFINE_RES_MEM(0xffe44000, 0x100),
117         DEFINE_RES_IRQ(evt2irq(0x940)),
118 };
119
120 static struct platform_device scif4_device = {
121         .name           = "sh-sci",
122         .id             = 4,
123         .resource       = scif4_resources,
124         .num_resources  = ARRAY_SIZE(scif4_resources),
125         .dev            = {
126                 .platform_data  = &scif4_platform_data,
127         },
128 };
129
130 static struct plat_sci_port scif5_platform_data = {
131         .scscr          = SCSCR_REIE,
132         .type           = PORT_SCIF,
133         .regtype        = SCIx_SH4_SCIF_BRG_REGTYPE,
134 };
135
136 static struct resource scif5_resources[] = {
137         DEFINE_RES_MEM(0xffe43000, 0x100),
138         DEFINE_RES_IRQ(evt2irq(0x960)),
139 };
140
141 static struct platform_device scif5_device = {
142         .name           = "sh-sci",
143         .id             = 5,
144         .resource       = scif5_resources,
145         .num_resources  = ARRAY_SIZE(scif5_resources),
146         .dev            = {
147                 .platform_data  = &scif5_platform_data,
148         },
149 };
150
151 /* RTC */
152 static struct resource rtc_resources[] = {
153         [0] = {
154                 .name   = "rtc",
155                 .start  = 0xFFFC5000,
156                 .end    = 0xFFFC5000 + 0x26 - 1,
157                 .flags  = IORESOURCE_IO,
158         },
159         [1] = {
160                 .start  = evt2irq(0xC00),
161                 .flags  = IORESOURCE_IRQ,
162         },
163 };
164
165 static struct platform_device rtc_device = {
166         .name           = "sh-rtc",
167         .id             = -1,
168         .num_resources  = ARRAY_SIZE(rtc_resources),
169         .resource       = rtc_resources,
170 };
171
172 /* I2C 0 */
173 static struct resource i2c0_resources[] = {
174         [0] = {
175                 .name   = "IIC0",
176                 .start  = 0xFFC70000,
177                 .end    = 0xFFC7000A - 1,
178                 .flags  = IORESOURCE_MEM,
179         },
180         [1] = {
181                 .start  = evt2irq(0x860),
182                 .flags  = IORESOURCE_IRQ,
183         },
184 };
185
186 static struct platform_device i2c0_device = {
187         .name           = "i2c-sh7734",
188         .id             = 0,
189         .num_resources  = ARRAY_SIZE(i2c0_resources),
190         .resource       = i2c0_resources,
191 };
192
193 /* TMU */
194 static struct sh_timer_config tmu0_platform_data = {
195         .channels_mask = 7,
196 };
197
198 static struct resource tmu0_resources[] = {
199         DEFINE_RES_MEM(0xffd80000, 0x30),
200         DEFINE_RES_IRQ(evt2irq(0x400)),
201         DEFINE_RES_IRQ(evt2irq(0x420)),
202         DEFINE_RES_IRQ(evt2irq(0x440)),
203 };
204
205 static struct platform_device tmu0_device = {
206         .name           = "sh-tmu",
207         .id             = 0,
208         .dev = {
209                 .platform_data  = &tmu0_platform_data,
210         },
211         .resource       = tmu0_resources,
212         .num_resources  = ARRAY_SIZE(tmu0_resources),
213 };
214
215 static struct sh_timer_config tmu1_platform_data = {
216         .channels_mask = 7,
217 };
218
219 static struct resource tmu1_resources[] = {
220         DEFINE_RES_MEM(0xffd81000, 0x30),
221         DEFINE_RES_IRQ(evt2irq(0x480)),
222         DEFINE_RES_IRQ(evt2irq(0x4a0)),
223         DEFINE_RES_IRQ(evt2irq(0x4c0)),
224 };
225
226 static struct platform_device tmu1_device = {
227         .name           = "sh-tmu",
228         .id             = 1,
229         .dev = {
230                 .platform_data  = &tmu1_platform_data,
231         },
232         .resource       = tmu1_resources,
233         .num_resources  = ARRAY_SIZE(tmu1_resources),
234 };
235
236 static struct sh_timer_config tmu2_platform_data = {
237         .channels_mask = 7,
238 };
239
240 static struct resource tmu2_resources[] = {
241         DEFINE_RES_MEM(0xffd82000, 0x30),
242         DEFINE_RES_IRQ(evt2irq(0x500)),
243         DEFINE_RES_IRQ(evt2irq(0x520)),
244         DEFINE_RES_IRQ(evt2irq(0x540)),
245 };
246
247 static struct platform_device tmu2_device = {
248         .name           = "sh-tmu",
249         .id             = 2,
250         .dev = {
251                 .platform_data  = &tmu2_platform_data,
252         },
253         .resource       = tmu2_resources,
254         .num_resources  = ARRAY_SIZE(tmu2_resources),
255 };
256
257 static struct platform_device *sh7734_devices[] __initdata = {
258         &scif0_device,
259         &scif1_device,
260         &scif2_device,
261         &scif3_device,
262         &scif4_device,
263         &scif5_device,
264         &tmu0_device,
265         &tmu1_device,
266         &tmu2_device,
267         &rtc_device,
268 };
269
270 static struct platform_device *sh7734_early_devices[] __initdata = {
271         &scif0_device,
272         &scif1_device,
273         &scif2_device,
274         &scif3_device,
275         &scif4_device,
276         &scif5_device,
277         &tmu0_device,
278         &tmu1_device,
279         &tmu2_device,
280 };
281
282 void __init plat_early_device_setup(void)
283 {
284         sh_early_platform_add_devices(sh7734_early_devices,
285                 ARRAY_SIZE(sh7734_early_devices));
286 }
287
288 #define GROUP 0
289 enum {
290         UNUSED = 0,
291
292         /* interrupt sources */
293
294         IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
295         IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
296         IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
297         IRL0_HHLL, IRL0_HHLH, IRL0_HHHL,
298
299         IRQ0, IRQ1, IRQ2, IRQ3,
300         DU,
301         TMU00, TMU10, TMU20, TMU21,
302         TMU30, TMU40, TMU50, TMU51,
303         TMU60, TMU70, TMU80,
304         RESET_WDT,
305         USB,
306         HUDI,
307         SHDMAC,
308         SSI0, SSI1,     SSI2, SSI3,
309         VIN0,
310         RGPVG,
311         _2DG,
312         MMC,
313         HSPI,
314         LBSCATA,
315         I2C0,
316         RCAN0,
317         MIMLB,
318         SCIF0, SCIF1, SCIF2, SCIF3, SCIF4, SCIF5,
319         LBSCDMAC0, LBSCDMAC1, LBSCDMAC2,
320         RCAN1,
321         SDHI0, SDHI1,
322         IEBUS,
323         HPBDMAC0_3, HPBDMAC4_10, HPBDMAC11_18, HPBDMAC19_22, HPBDMAC23_25_27_28,
324         RTC,
325         VIN1,
326         LCDC,
327         SRC0, SRC1,
328         GETHER,
329         SDHI2,
330         GPIO0_3, GPIO4_5,
331         STIF0, STIF1,
332         ADMAC,
333         HIF,
334         FLCTL,
335         ADC,
336         MTU2,
337         RSPI,
338         QSPI,
339         HSCIF,
340         VEU3F_VE3,
341
342         /* Group */
343         /* Mask */
344         STIF_M,
345         GPIO_M,
346         HPBDMAC_M,
347         LBSCDMAC_M,
348         RCAN_M,
349         SRC_M,
350         SCIF_M,
351         LCDC_M,
352         _2DG_M,
353         VIN_M,
354         TMU_3_M,
355         TMU_0_M,
356
357         /* Priority */
358         RCAN_P,
359         LBSCDMAC_P,
360
361         /* Common */
362         SDHI,
363         SSI,
364         SPI,
365 };
366
367 static struct intc_vect vectors[] __initdata = {
368         INTC_VECT(DU, 0x3E0),
369         INTC_VECT(TMU00, 0x400),
370         INTC_VECT(TMU10, 0x420),
371         INTC_VECT(TMU20, 0x440),
372         INTC_VECT(TMU30, 0x480),
373         INTC_VECT(TMU40, 0x4A0),
374         INTC_VECT(TMU50, 0x4C0),
375         INTC_VECT(TMU51, 0x4E0),
376         INTC_VECT(TMU60, 0x500),
377         INTC_VECT(TMU70, 0x520),
378         INTC_VECT(TMU80, 0x540),
379         INTC_VECT(RESET_WDT, 0x560),
380         INTC_VECT(USB, 0x580),
381         INTC_VECT(HUDI, 0x600),
382         INTC_VECT(SHDMAC, 0x620),
383         INTC_VECT(SSI0, 0x6C0),
384         INTC_VECT(SSI1, 0x6E0),
385         INTC_VECT(SSI2, 0x700),
386         INTC_VECT(SSI3, 0x720),
387         INTC_VECT(VIN0, 0x740),
388         INTC_VECT(RGPVG, 0x760),
389         INTC_VECT(_2DG, 0x780),
390         INTC_VECT(MMC, 0x7A0),
391         INTC_VECT(HSPI, 0x7E0),
392         INTC_VECT(LBSCATA, 0x840),
393         INTC_VECT(I2C0, 0x860),
394         INTC_VECT(RCAN0, 0x880),
395         INTC_VECT(SCIF0, 0x8A0),
396         INTC_VECT(SCIF1, 0x8C0),
397         INTC_VECT(SCIF2, 0x900),
398         INTC_VECT(SCIF3, 0x920),
399         INTC_VECT(SCIF4, 0x940),
400         INTC_VECT(SCIF5, 0x960),
401         INTC_VECT(LBSCDMAC0, 0x9E0),
402         INTC_VECT(LBSCDMAC1, 0xA00),
403         INTC_VECT(LBSCDMAC2, 0xA20),
404         INTC_VECT(RCAN1, 0xA60),
405         INTC_VECT(SDHI0, 0xAE0),
406         INTC_VECT(SDHI1, 0xB00),
407         INTC_VECT(IEBUS, 0xB20),
408         INTC_VECT(HPBDMAC0_3, 0xB60),
409         INTC_VECT(HPBDMAC4_10, 0xB80),
410         INTC_VECT(HPBDMAC11_18, 0xBA0),
411         INTC_VECT(HPBDMAC19_22, 0xBC0),
412         INTC_VECT(HPBDMAC23_25_27_28, 0xBE0),
413         INTC_VECT(RTC, 0xC00),
414         INTC_VECT(VIN1, 0xC20),
415         INTC_VECT(LCDC, 0xC40),
416         INTC_VECT(SRC0, 0xC60),
417         INTC_VECT(SRC1, 0xC80),
418         INTC_VECT(GETHER, 0xCA0),
419         INTC_VECT(SDHI2, 0xCC0),
420         INTC_VECT(GPIO0_3, 0xCE0),
421         INTC_VECT(GPIO4_5, 0xD00),
422         INTC_VECT(STIF0, 0xD20),
423         INTC_VECT(STIF1, 0xD40),
424         INTC_VECT(ADMAC, 0xDA0),
425         INTC_VECT(HIF, 0xDC0),
426         INTC_VECT(FLCTL, 0xDE0),
427         INTC_VECT(ADC, 0xE00),
428         INTC_VECT(MTU2, 0xE20),
429         INTC_VECT(RSPI, 0xE40),
430         INTC_VECT(QSPI, 0xE60),
431         INTC_VECT(HSCIF, 0xFC0),
432         INTC_VECT(VEU3F_VE3, 0xF40),
433 };
434
435 static struct intc_group groups[] __initdata = {
436         /* Common */
437         INTC_GROUP(SDHI, SDHI0, SDHI1, SDHI2),
438         INTC_GROUP(SPI, HSPI, RSPI, QSPI),
439         INTC_GROUP(SSI, SSI0, SSI1, SSI2, SSI3),
440
441         /* Mask group */
442         INTC_GROUP(STIF_M, STIF0, STIF1), /* 22 */
443         INTC_GROUP(GPIO_M, GPIO0_3, GPIO4_5), /* 21 */
444         INTC_GROUP(HPBDMAC_M, HPBDMAC0_3, HPBDMAC4_10, HPBDMAC11_18,
445                         HPBDMAC19_22, HPBDMAC23_25_27_28), /* 19 */
446         INTC_GROUP(LBSCDMAC_M, LBSCDMAC0, LBSCDMAC1, LBSCDMAC2), /* 18 */
447         INTC_GROUP(RCAN_M, RCAN0, RCAN1, IEBUS), /* 17 */
448         INTC_GROUP(SRC_M, SRC0, SRC1), /* 16 */
449         INTC_GROUP(SCIF_M, SCIF0, SCIF1, SCIF2, SCIF3, SCIF4, SCIF5,
450                         HSCIF), /* 14 */
451         INTC_GROUP(LCDC_M, LCDC, MIMLB), /* 13 */
452         INTC_GROUP(_2DG_M, _2DG, RGPVG), /* 12 */
453         INTC_GROUP(VIN_M, VIN0, VIN1), /* 10 */
454         INTC_GROUP(TMU_3_M, TMU30, TMU40, TMU50, TMU51,
455                         TMU60, TMU60, TMU70, TMU80), /* 2 */
456         INTC_GROUP(TMU_0_M, TMU00, TMU10, TMU20, TMU21), /* 1 */
457
458         /* Priority group*/
459         INTC_GROUP(RCAN_P, RCAN0, RCAN1), /* INT2PRI5 */
460         INTC_GROUP(LBSCDMAC_P, LBSCDMAC0, LBSCDMAC1), /* INT2PRI5 */
461 };
462
463 static struct intc_mask_reg mask_registers[] __initdata = {
464         { 0xFF804040, 0xFF804044, 32, /* INT2MSKRG / INT2MSKCR */
465           { 0,
466                 VEU3F_VE3,
467                 SDHI, /* SDHI 0-2 */
468                 ADMAC,
469                 FLCTL,
470                 RESET_WDT,
471                 HIF,
472                 ADC,
473                 MTU2,
474                 STIF_M, /* STIF 0,1 */
475                 GPIO_M, /* GPIO 0-5*/
476                 GETHER,
477                 HPBDMAC_M, /* HPBDMAC 0_3 - 23_25_27_28 */
478                 LBSCDMAC_M, /* LBSCDMAC 0 - 2 */
479                 RCAN_M, /* RCAN, IEBUS */
480                 SRC_M,  /* SRC 0,1 */
481                 LBSCATA,
482                 SCIF_M, /* SCIF 0-5, HSCIF */
483                 LCDC_M, /* LCDC, MIMLB */
484                 _2DG_M, /* 2DG, RGPVG */
485                 SPI, /* HSPI, RSPI, QSPI */
486                 VIN_M,  /* VIN0, 1 */
487                 SSI,    /* SSI 0-3 */
488                 USB,
489                 SHDMAC,
490                 HUDI,
491                 MMC,
492                 RTC,
493                 I2C0, /* I2C */ /* I2C 0, 1*/
494                 TMU_3_M, /* TMU30 - TMU80 */
495                 TMU_0_M, /* TMU00 - TMU21 */
496                 DU } },
497 };
498
499 static struct intc_prio_reg prio_registers[] __initdata = {
500         { 0xFF804000, 0, 32, 8, /* INT2PRI0 */
501                 { DU, TMU00, TMU10, TMU20 } },
502         { 0xFF804004, 0, 32, 8, /* INT2PRI1 */
503                 { TMU30, TMU60, RTC, SDHI } },
504         { 0xFF804008, 0, 32, 8, /* INT2PRI2 */
505                 { HUDI, SHDMAC, USB, SSI } },
506         { 0xFF80400C, 0, 32, 8, /* INT2PRI3 */
507                 { VIN0, SPI, _2DG, LBSCATA } },
508         { 0xFF804010, 0, 32, 8, /* INT2PRI4 */
509                 { SCIF0, SCIF3, HSCIF, LCDC } },
510         { 0xFF804014, 0, 32, 8, /* INT2PRI5 */
511                 { RCAN_P, LBSCDMAC_P, LBSCDMAC2, MMC } },
512         { 0xFF804018, 0, 32, 8, /* INT2PRI6 */
513                 { HPBDMAC0_3, HPBDMAC4_10, HPBDMAC11_18, HPBDMAC19_22 } },
514         { 0xFF80401C, 0, 32, 8, /* INT2PRI7 */
515                 { HPBDMAC23_25_27_28, I2C0, SRC0, SRC1 } },
516         { 0xFF804020, 0, 32, 8, /* INT2PRI8 */
517                 { 0 /* ADIF */, VIN1, RESET_WDT, HIF } },
518         { 0xFF804024, 0, 32, 8, /* INT2PRI9 */
519                 { ADMAC, FLCTL, GPIO0_3, GPIO4_5 } },
520         { 0xFF804028, 0, 32, 8, /* INT2PRI10 */
521                 { STIF0, STIF1, VEU3F_VE3, GETHER } },
522         { 0xFF80402C, 0, 32, 8, /* INT2PRI11 */
523                 { MTU2, RGPVG, MIMLB, IEBUS } },
524 };
525
526 static DECLARE_INTC_DESC(intc_desc, "sh7734", vectors, groups,
527         mask_registers, prio_registers, NULL);
528
529 /* Support for external interrupt pins in IRQ mode */
530
531 static struct intc_vect irq3210_vectors[] __initdata = {
532         INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280),
533         INTC_VECT(IRQ2, 0x2C0), INTC_VECT(IRQ3, 0x300),
534 };
535
536 static struct intc_sense_reg irq3210_sense_registers[] __initdata = {
537         { 0xFF80201C, 32, 2, /* ICR1 */
538         { IRQ0, IRQ1, IRQ2, IRQ3, } },
539 };
540
541 static struct intc_mask_reg irq3210_ack_registers[] __initdata = {
542         { 0xFF802024, 0, 32, /* INTREQ */
543         { IRQ0, IRQ1, IRQ2, IRQ3, } },
544 };
545
546 static struct intc_mask_reg irq3210_mask_registers[] __initdata = {
547         { 0xFF802044, 0xFF802064, 32, /* INTMSK0 / INTMSKCLR0 */
548         { IRQ0, IRQ1, IRQ2, IRQ3, } },
549 };
550
551 static struct intc_prio_reg irq3210_prio_registers[] __initdata = {
552         { 0xFF802010, 0, 32, 4, /* INTPRI */
553         { IRQ0, IRQ1, IRQ2, IRQ3, } },
554 };
555
556 static DECLARE_INTC_DESC_ACK(intc_desc_irq3210, "sh7734-irq3210",
557         irq3210_vectors, NULL,
558         irq3210_mask_registers, irq3210_prio_registers,
559         irq3210_sense_registers, irq3210_ack_registers);
560
561 /* External interrupt pins in IRL mode */
562
563 static struct intc_vect vectors_irl3210[] __initdata = {
564         INTC_VECT(IRL0_LLLL, 0x200), INTC_VECT(IRL0_LLLH, 0x220),
565         INTC_VECT(IRL0_LLHL, 0x240), INTC_VECT(IRL0_LLHH, 0x260),
566         INTC_VECT(IRL0_LHLL, 0x280), INTC_VECT(IRL0_LHLH, 0x2a0),
567         INTC_VECT(IRL0_LHHL, 0x2c0), INTC_VECT(IRL0_LHHH, 0x2e0),
568         INTC_VECT(IRL0_HLLL, 0x300), INTC_VECT(IRL0_HLLH, 0x320),
569         INTC_VECT(IRL0_HLHL, 0x340), INTC_VECT(IRL0_HLHH, 0x360),
570         INTC_VECT(IRL0_HHLL, 0x380), INTC_VECT(IRL0_HHLH, 0x3a0),
571         INTC_VECT(IRL0_HHHL, 0x3c0),
572 };
573
574 static DECLARE_INTC_DESC(intc_desc_irl3210, "sh7734-irl3210",
575         vectors_irl3210, NULL, mask_registers, NULL, NULL);
576
577 #define INTC_ICR0               0xFF802000
578 #define INTC_INTMSK0    0xFF802044
579 #define INTC_INTMSK1    0xFF802048
580 #define INTC_INTMSKCLR0 0xFF802064
581 #define INTC_INTMSKCLR1 0xFF802068
582
583 void __init plat_irq_setup(void)
584 {
585         /* disable IRQ3-0 */
586         __raw_writel(0xF0000000, INTC_INTMSK0);
587
588         /* disable IRL3-0 */
589         __raw_writel(0x80000000, INTC_INTMSK1);
590
591         /* select IRL mode for IRL3-0 */
592         __raw_writel(__raw_readl(INTC_ICR0) & ~0x00800000, INTC_ICR0);
593
594         /* disable holding function, ie enable "SH-4 Mode (LVLMODE)" */
595         __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0);
596
597         register_intc_controller(&intc_desc);
598 }
599
600 void __init plat_irq_setup_pins(int mode)
601 {
602         switch (mode) {
603         case IRQ_MODE_IRQ3210:
604                 /* select IRQ mode for IRL3-0 */
605                 __raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0);
606                 register_intc_controller(&intc_desc_irq3210);
607                 break;
608         case IRQ_MODE_IRL3210:
609                 /* enable IRL0-3 but don't provide any masking */
610                 __raw_writel(0x80000000, INTC_INTMSKCLR1);
611                 __raw_writel(0xf0000000, INTC_INTMSKCLR0);
612                 break;
613         case IRQ_MODE_IRL3210_MASK:
614                 /* enable IRL0-3 and mask using cpu intc controller */
615                 __raw_writel(0x80000000, INTC_INTMSKCLR0);
616                 register_intc_controller(&intc_desc_irl3210);
617                 break;
618         default:
619                 BUG();
620         }
621 }