Merge branch 'next/devel-dma-ops' of git://git.kernel.org/pub/scm/linux/kernel/git...
[platform/adaptation/renesas_rcar/renesas_kernel.git] / arch / sh / kernel / cpu / sh4a / setup-sh7734.c
1 /*
2  * arch/sh/kernel/cpu/sh4a/setup-sh7734.c
3
4  * SH7734 Setup
5  *
6  * Copyright (C) 2011,2012 Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
7  * Copyright (C) 2011,2012 Renesas Solutions Corp.
8  *
9  * This file is subject to the terms and conditions of the GNU General Public
10  * License.  See the file "COPYING" in the main directory of this archive
11  * for more details.
12  */
13
14 #include <linux/platform_device.h>
15 #include <linux/init.h>
16 #include <linux/serial.h>
17 #include <linux/mm.h>
18 #include <linux/dma-mapping.h>
19 #include <linux/serial_sci.h>
20 #include <linux/sh_timer.h>
21 #include <linux/io.h>
22 #include <asm/clock.h>
23 #include <asm/irq.h>
24 #include <cpu/sh7734.h>
25
26 /* SCIF */
27 static struct plat_sci_port scif0_platform_data = {
28         .mapbase        = 0xFFE40000,
29         .flags          = UPF_BOOT_AUTOCONF,
30         .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
31         .scbrr_algo_id  = SCBRR_ALGO_2,
32         .type           = PORT_SCIF,
33         .irqs           = SCIx_IRQ_MUXED(evt2irq(0x8C0)),
34         .regtype        = SCIx_SH4_SCIF_REGTYPE,
35 };
36
37 static struct platform_device scif0_device = {
38         .name           = "sh-sci",
39         .id                     = 0,
40         .dev            = {
41                 .platform_data  = &scif0_platform_data,
42         },
43 };
44
45 static struct plat_sci_port scif1_platform_data = {
46         .mapbase        = 0xFFE41000,
47         .flags          = UPF_BOOT_AUTOCONF,
48         .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
49         .scbrr_algo_id  = SCBRR_ALGO_2,
50         .type           = PORT_SCIF,
51         .irqs           = SCIx_IRQ_MUXED(evt2irq(0x8E0)),
52         .regtype        = SCIx_SH4_SCIF_REGTYPE,
53 };
54
55 static struct platform_device scif1_device = {
56         .name           = "sh-sci",
57         .id         = 1,
58         .dev            = {
59                 .platform_data = &scif1_platform_data,
60         },
61 };
62
63 static struct plat_sci_port scif2_platform_data = {
64         .mapbase        = 0xFFE42000,
65         .flags          = UPF_BOOT_AUTOCONF,
66         .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
67         .scbrr_algo_id  = SCBRR_ALGO_2,
68         .type           = PORT_SCIF,
69         .irqs           = SCIx_IRQ_MUXED(evt2irq(0x900)),
70         .regtype        = SCIx_SH4_SCIF_REGTYPE,
71 };
72
73 static struct platform_device scif2_device = {
74         .name           = "sh-sci",
75         .id         = 2,
76         .dev            = {
77                 .platform_data = &scif2_platform_data,
78         },
79 };
80
81 static struct plat_sci_port scif3_platform_data = {
82         .mapbase        = 0xFFE43000,
83         .flags          = UPF_BOOT_AUTOCONF,
84         .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
85         .scbrr_algo_id  = SCBRR_ALGO_2,
86         .type           = PORT_SCIF,
87         .irqs           = SCIx_IRQ_MUXED(evt2irq(0x920)),
88         .regtype        = SCIx_SH4_SCIF_REGTYPE,
89 };
90
91 static struct platform_device scif3_device = {
92         .name           = "sh-sci",
93         .id             = 3,
94         .dev            = {
95                 .platform_data  = &scif3_platform_data,
96         },
97 };
98
99 static struct plat_sci_port scif4_platform_data = {
100         .mapbase        = 0xFFE44000,
101         .flags          = UPF_BOOT_AUTOCONF,
102         .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
103         .scbrr_algo_id  = SCBRR_ALGO_2,
104         .type           = PORT_SCIF,
105         .irqs           = SCIx_IRQ_MUXED(evt2irq(0x940)),
106         .regtype        = SCIx_SH4_SCIF_REGTYPE,
107 };
108
109 static struct platform_device scif4_device = {
110         .name           = "sh-sci",
111         .id             = 4,
112         .dev            = {
113                 .platform_data  = &scif4_platform_data,
114         },
115 };
116
117 static struct plat_sci_port scif5_platform_data = {
118         .mapbase        = 0xFFE43000,
119         .flags          = UPF_BOOT_AUTOCONF,
120         .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
121         .scbrr_algo_id  = SCBRR_ALGO_2,
122         .type           = PORT_SCIF,
123         .irqs           = SCIx_IRQ_MUXED(evt2irq(0x960)),
124         .regtype                = SCIx_SH4_SCIF_REGTYPE,
125 };
126
127 static struct platform_device scif5_device = {
128         .name           = "sh-sci",
129         .id             = 5,
130         .dev            = {
131                 .platform_data  = &scif5_platform_data,
132         },
133 };
134
135 /* RTC */
136 static struct resource rtc_resources[] = {
137         [0] = {
138                 .name   = "rtc",
139                 .start  = 0xFFFC5000,
140                 .end    = 0xFFFC5000 + 0x26 - 1,
141                 .flags  = IORESOURCE_IO,
142         },
143         [1] = {
144                 .start  = evt2irq(0xC00),
145                 .flags  = IORESOURCE_IRQ,
146         },
147 };
148
149 static struct platform_device rtc_device = {
150         .name           = "sh-rtc",
151         .id             = -1,
152         .num_resources  = ARRAY_SIZE(rtc_resources),
153         .resource       = rtc_resources,
154 };
155
156 /* I2C 0 */
157 static struct resource i2c0_resources[] = {
158         [0] = {
159                 .name   = "IIC0",
160                 .start  = 0xFFC70000,
161                 .end    = 0xFFC7000A - 1,
162                 .flags  = IORESOURCE_MEM,
163         },
164         [1] = {
165                 .start  = evt2irq(0x860),
166                 .flags  = IORESOURCE_IRQ,
167         },
168 };
169
170 static struct platform_device i2c0_device = {
171         .name           = "i2c-sh7734",
172         .id             = 0,
173         .num_resources  = ARRAY_SIZE(i2c0_resources),
174         .resource       = i2c0_resources,
175 };
176
177 /* TMU */
178 static struct sh_timer_config tmu0_platform_data = {
179         .channel_offset = 0x04,
180         .timer_bit = 0,
181         .clockevent_rating = 200,
182 };
183
184 static struct resource tmu0_resources[] = {
185         [0] = {
186                 .start  = 0xFFD80008,
187                 .end    = 0xFFD80014 - 1,
188                 .flags  = IORESOURCE_MEM,
189         },
190         [1] = {
191                 .start  = evt2irq(0x400),
192                 .flags  = IORESOURCE_IRQ,
193         },
194 };
195
196 static struct platform_device tmu0_device = {
197         .name   = "sh_tmu",
198         .id             = 0,
199         .dev = {
200                 .platform_data  = &tmu0_platform_data,
201         },
202         .resource       = tmu0_resources,
203         .num_resources  = ARRAY_SIZE(tmu0_resources),
204 };
205
206 static struct sh_timer_config tmu1_platform_data = {
207         .channel_offset = 0x10,
208         .timer_bit = 1,
209         .clocksource_rating = 200,
210 };
211
212 static struct resource tmu1_resources[] = {
213         [0] = {
214                 .start  = 0xFFD80014,
215                 .end    = 0xFFD80020 - 1,
216                 .flags  = IORESOURCE_MEM,
217         },
218         [1] = {
219                 .start  = evt2irq(0x420),
220                 .flags  = IORESOURCE_IRQ,
221         },
222 };
223
224 static struct platform_device tmu1_device = {
225         .name           = "sh_tmu",
226         .id                     = 1,
227         .dev = {
228                 .platform_data  = &tmu1_platform_data,
229         },
230         .resource       = tmu1_resources,
231         .num_resources  = ARRAY_SIZE(tmu1_resources),
232 };
233
234 static struct sh_timer_config tmu2_platform_data = {
235         .channel_offset = 0x1c,
236         .timer_bit = 2,
237 };
238
239 static struct resource tmu2_resources[] = {
240         [0] = {
241                 .start  = 0xFFD80020,
242                 .end    = 0xFFD80030 - 1,
243                 .flags  = IORESOURCE_MEM,
244         },
245         [1] = {
246                 .start  = evt2irq(0x440),
247                 .flags  = IORESOURCE_IRQ,
248         },
249 };
250
251 static struct platform_device tmu2_device = {
252         .name           = "sh_tmu",
253         .id                     = 2,
254         .dev = {
255                 .platform_data  = &tmu2_platform_data,
256         },
257         .resource       = tmu2_resources,
258         .num_resources  = ARRAY_SIZE(tmu2_resources),
259 };
260
261
262 static struct sh_timer_config tmu3_platform_data = {
263         .channel_offset = 0x04,
264         .timer_bit = 0,
265 };
266
267 static struct resource tmu3_resources[] = {
268         [0] = {
269                 .start  = 0xFFD81008,
270                 .end    = 0xFFD81014 - 1,
271                 .flags  = IORESOURCE_MEM,
272         },
273         [1] = {
274                 .start  = evt2irq(0x480),
275                 .flags  = IORESOURCE_IRQ,
276         },
277 };
278
279 static struct platform_device tmu3_device = {
280         .name           = "sh_tmu",
281         .id                     = 3,
282         .dev = {
283                 .platform_data  = &tmu3_platform_data,
284         },
285         .resource       = tmu3_resources,
286         .num_resources  = ARRAY_SIZE(tmu3_resources),
287 };
288
289 static struct sh_timer_config tmu4_platform_data = {
290         .channel_offset = 0x10,
291         .timer_bit = 1,
292 };
293
294 static struct resource tmu4_resources[] = {
295         [0] = {
296                 .start  = 0xFFD81014,
297                 .end    = 0xFFD81020 - 1,
298                 .flags  = IORESOURCE_MEM,
299         },
300         [1] = {
301                 .start  = evt2irq(0x4A0),
302                 .flags  = IORESOURCE_IRQ,
303         },
304 };
305
306 static struct platform_device tmu4_device = {
307         .name           = "sh_tmu",
308         .id                     = 4,
309         .dev = {
310                 .platform_data  = &tmu4_platform_data,
311         },
312         .resource       = tmu4_resources,
313         .num_resources  = ARRAY_SIZE(tmu4_resources),
314 };
315
316 static struct sh_timer_config tmu5_platform_data = {
317         .channel_offset = 0x1c,
318         .timer_bit = 2,
319 };
320
321 static struct resource tmu5_resources[] = {
322         [0] = {
323                 .start  = 0xFFD81020,
324                 .end    = 0xFFD81030 - 1,
325                 .flags  = IORESOURCE_MEM,
326         },
327         [1] = {
328                 .start  = evt2irq(0x4C0),
329                 .flags  = IORESOURCE_IRQ,
330         },
331 };
332
333 static struct platform_device tmu5_device = {
334         .name           = "sh_tmu",
335         .id                     = 5,
336         .dev = {
337                 .platform_data  = &tmu5_platform_data,
338         },
339         .resource       = tmu5_resources,
340         .num_resources  = ARRAY_SIZE(tmu5_resources),
341 };
342
343 static struct sh_timer_config tmu6_platform_data = {
344         .channel_offset = 0x4,
345         .timer_bit = 0,
346 };
347
348 static struct resource tmu6_resources[] = {
349         [0] = {
350                 .start  = 0xFFD82008,
351                 .end    = 0xFFD82014 - 1,
352                 .flags  = IORESOURCE_MEM,
353         },
354         [1] = {
355                 .start  = evt2irq(0x500),
356                 .flags  = IORESOURCE_IRQ,
357         },
358 };
359
360 static struct platform_device tmu6_device = {
361         .name           = "sh_tmu",
362         .id                     = 6,
363         .dev = {
364                 .platform_data  = &tmu6_platform_data,
365         },
366         .resource       = tmu6_resources,
367         .num_resources  = ARRAY_SIZE(tmu6_resources),
368 };
369
370 static struct sh_timer_config tmu7_platform_data = {
371         .channel_offset = 0x10,
372         .timer_bit = 1,
373 };
374
375 static struct resource tmu7_resources[] = {
376         [0] = {
377                 .start  = 0xFFD82014,
378                 .end    = 0xFFD82020 - 1,
379                 .flags  = IORESOURCE_MEM,
380         },
381         [1] = {
382                 .start  = evt2irq(0x520),
383                 .flags  = IORESOURCE_IRQ,
384         },
385 };
386
387 static struct platform_device tmu7_device = {
388         .name           = "sh_tmu",
389         .id                     = 7,
390         .dev = {
391                 .platform_data  = &tmu7_platform_data,
392         },
393         .resource       = tmu7_resources,
394         .num_resources  = ARRAY_SIZE(tmu7_resources),
395 };
396
397 static struct sh_timer_config tmu8_platform_data = {
398         .channel_offset = 0x1c,
399         .timer_bit = 2,
400 };
401
402 static struct resource tmu8_resources[] = {
403         [0] = {
404                 .start  = 0xFFD82020,
405                 .end    = 0xFFD82030 - 1,
406                 .flags  = IORESOURCE_MEM,
407         },
408         [1] = {
409                 .start  = evt2irq(0x540),
410                 .flags  = IORESOURCE_IRQ,
411         },
412 };
413
414 static struct platform_device tmu8_device = {
415         .name           = "sh_tmu",
416         .id                     = 8,
417         .dev = {
418                 .platform_data  = &tmu8_platform_data,
419         },
420         .resource       = tmu8_resources,
421         .num_resources  = ARRAY_SIZE(tmu8_resources),
422 };
423
424 static struct platform_device *sh7734_devices[] __initdata = {
425         &scif0_device,
426         &scif1_device,
427         &scif2_device,
428         &scif3_device,
429         &scif4_device,
430         &scif5_device,
431         &tmu0_device,
432         &tmu1_device,
433         &tmu2_device,
434         &tmu3_device,
435         &tmu4_device,
436         &tmu5_device,
437         &tmu6_device,
438         &tmu7_device,
439         &tmu8_device,
440         &rtc_device,
441 };
442
443 static struct platform_device *sh7734_early_devices[] __initdata = {
444         &scif0_device,
445         &scif1_device,
446         &scif2_device,
447         &scif3_device,
448         &scif4_device,
449         &scif5_device,
450         &tmu0_device,
451         &tmu1_device,
452         &tmu2_device,
453         &tmu3_device,
454         &tmu4_device,
455         &tmu5_device,
456         &tmu6_device,
457         &tmu7_device,
458         &tmu8_device,
459 };
460
461 void __init plat_early_device_setup(void)
462 {
463         early_platform_add_devices(sh7734_early_devices,
464                 ARRAY_SIZE(sh7734_early_devices));
465 }
466
467 #define GROUP 0
468 enum {
469         UNUSED = 0,
470
471         /* interrupt sources */
472
473         IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
474         IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
475         IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
476         IRL0_HHLL, IRL0_HHLH, IRL0_HHHL,
477
478         IRQ0, IRQ1, IRQ2, IRQ3,
479         DU,
480         TMU00, TMU10, TMU20, TMU21,
481         TMU30, TMU40, TMU50, TMU51,
482         TMU60, TMU70, TMU80,
483         RESET_WDT,
484         USB,
485         HUDI,
486         SHDMAC,
487         SSI0, SSI1,     SSI2, SSI3,
488         VIN0,
489         RGPVG,
490         _2DG,
491         MMC,
492         HSPI,
493         LBSCATA,
494         I2C0,
495         RCAN0,
496         MIMLB,
497         SCIF0, SCIF1, SCIF2, SCIF3, SCIF4, SCIF5,
498         LBSCDMAC0, LBSCDMAC1, LBSCDMAC2,
499         RCAN1,
500         SDHI0, SDHI1,
501         IEBUS,
502         HPBDMAC0_3, HPBDMAC4_10, HPBDMAC11_18, HPBDMAC19_22, HPBDMAC23_25_27_28,
503         RTC,
504         VIN1,
505         LCDC,
506         SRC0, SRC1,
507         GETHER,
508         SDHI2,
509         GPIO0_3, GPIO4_5,
510         STIF0, STIF1,
511         ADMAC,
512         HIF,
513         FLCTL,
514         ADC,
515         MTU2,
516         RSPI,
517         QSPI,
518         HSCIF,
519         VEU3F_VE3,
520
521         /* Group */
522         /* Mask */
523         STIF_M,
524         GPIO_M,
525         HPBDMAC_M,
526         LBSCDMAC_M,
527         RCAN_M,
528         SRC_M,
529         SCIF_M,
530         LCDC_M,
531         _2DG_M,
532         VIN_M,
533         TMU_3_M,
534         TMU_0_M,
535
536         /* Priority */
537         RCAN_P,
538         LBSCDMAC_P,
539
540         /* Common */
541         SDHI,
542         SSI,
543         SPI,
544 };
545
546 static struct intc_vect vectors[] __initdata = {
547         INTC_VECT(DU, 0x3E0),
548         INTC_VECT(TMU00, 0x400),
549         INTC_VECT(TMU10, 0x420),
550         INTC_VECT(TMU20, 0x440),
551         INTC_VECT(TMU30, 0x480),
552         INTC_VECT(TMU40, 0x4A0),
553         INTC_VECT(TMU50, 0x4C0),
554         INTC_VECT(TMU51, 0x4E0),
555         INTC_VECT(TMU60, 0x500),
556         INTC_VECT(TMU70, 0x520),
557         INTC_VECT(TMU80, 0x540),
558         INTC_VECT(RESET_WDT, 0x560),
559         INTC_VECT(USB, 0x580),
560         INTC_VECT(HUDI, 0x600),
561         INTC_VECT(SHDMAC, 0x620),
562         INTC_VECT(SSI0, 0x6C0),
563         INTC_VECT(SSI1, 0x6E0),
564         INTC_VECT(SSI2, 0x700),
565         INTC_VECT(SSI3, 0x720),
566         INTC_VECT(VIN0, 0x740),
567         INTC_VECT(RGPVG, 0x760),
568         INTC_VECT(_2DG, 0x780),
569         INTC_VECT(MMC, 0x7A0),
570         INTC_VECT(HSPI, 0x7E0),
571         INTC_VECT(LBSCATA, 0x840),
572         INTC_VECT(I2C0, 0x860),
573         INTC_VECT(RCAN0, 0x880),
574         INTC_VECT(SCIF0, 0x8A0),
575         INTC_VECT(SCIF1, 0x8C0),
576         INTC_VECT(SCIF2, 0x900),
577         INTC_VECT(SCIF3, 0x920),
578         INTC_VECT(SCIF4, 0x940),
579         INTC_VECT(SCIF5, 0x960),
580         INTC_VECT(LBSCDMAC0, 0x9E0),
581         INTC_VECT(LBSCDMAC1, 0xA00),
582         INTC_VECT(LBSCDMAC2, 0xA20),
583         INTC_VECT(RCAN1, 0xA60),
584         INTC_VECT(SDHI0, 0xAE0),
585         INTC_VECT(SDHI1, 0xB00),
586         INTC_VECT(IEBUS, 0xB20),
587         INTC_VECT(HPBDMAC0_3, 0xB60),
588         INTC_VECT(HPBDMAC4_10, 0xB80),
589         INTC_VECT(HPBDMAC11_18, 0xBA0),
590         INTC_VECT(HPBDMAC19_22, 0xBC0),
591         INTC_VECT(HPBDMAC23_25_27_28, 0xBE0),
592         INTC_VECT(RTC, 0xC00),
593         INTC_VECT(VIN1, 0xC20),
594         INTC_VECT(LCDC, 0xC40),
595         INTC_VECT(SRC0, 0xC60),
596         INTC_VECT(SRC1, 0xC80),
597         INTC_VECT(GETHER, 0xCA0),
598         INTC_VECT(SDHI2, 0xCC0),
599         INTC_VECT(GPIO0_3, 0xCE0),
600         INTC_VECT(GPIO4_5, 0xD00),
601         INTC_VECT(STIF0, 0xD20),
602         INTC_VECT(STIF1, 0xD40),
603         INTC_VECT(ADMAC, 0xDA0),
604         INTC_VECT(HIF, 0xDC0),
605         INTC_VECT(FLCTL, 0xDE0),
606         INTC_VECT(ADC, 0xE00),
607         INTC_VECT(MTU2, 0xE20),
608         INTC_VECT(RSPI, 0xE40),
609         INTC_VECT(QSPI, 0xE60),
610         INTC_VECT(HSCIF, 0xFC0),
611         INTC_VECT(VEU3F_VE3, 0xF40),
612 };
613
614 static struct intc_group groups[] __initdata = {
615         /* Common */
616         INTC_GROUP(SDHI, SDHI0, SDHI1, SDHI2),
617         INTC_GROUP(SPI, HSPI, RSPI, QSPI),
618         INTC_GROUP(SSI, SSI0, SSI1, SSI2, SSI3),
619
620         /* Mask group */
621         INTC_GROUP(STIF_M, STIF0, STIF1), /* 22 */
622         INTC_GROUP(GPIO_M, GPIO0_3, GPIO4_5), /* 21 */
623         INTC_GROUP(HPBDMAC_M, HPBDMAC0_3, HPBDMAC4_10, HPBDMAC11_18,
624                         HPBDMAC19_22, HPBDMAC23_25_27_28), /* 19 */
625         INTC_GROUP(LBSCDMAC_M, LBSCDMAC0, LBSCDMAC1, LBSCDMAC2), /* 18 */
626         INTC_GROUP(RCAN_M, RCAN0, RCAN1, IEBUS), /* 17 */
627         INTC_GROUP(SRC_M, SRC0, SRC1), /* 16 */
628         INTC_GROUP(SCIF_M, SCIF0, SCIF1, SCIF2, SCIF3, SCIF4, SCIF5,
629                         HSCIF), /* 14 */
630         INTC_GROUP(LCDC_M, LCDC, MIMLB), /* 13 */
631         INTC_GROUP(_2DG_M, _2DG, RGPVG), /* 12 */
632         INTC_GROUP(VIN_M, VIN0, VIN1), /* 10 */
633         INTC_GROUP(TMU_3_M, TMU30, TMU40, TMU50, TMU51,
634                         TMU60, TMU60, TMU70, TMU80), /* 2 */
635         INTC_GROUP(TMU_0_M, TMU00, TMU10, TMU20, TMU21), /* 1 */
636
637         /* Priority group*/
638         INTC_GROUP(RCAN_P, RCAN0, RCAN1), /* INT2PRI5 */
639         INTC_GROUP(LBSCDMAC_P, LBSCDMAC0, LBSCDMAC1), /* INT2PRI5 */
640 };
641
642 static struct intc_mask_reg mask_registers[] __initdata = {
643         { 0xFF804040, 0xFF804044, 32, /* INT2MSKRG / INT2MSKCR */
644           { 0,
645                 VEU3F_VE3,
646                 SDHI, /* SDHI 0-2 */
647                 ADMAC,
648                 FLCTL,
649                 RESET_WDT,
650                 HIF,
651                 ADC,
652                 MTU2,
653                 STIF_M, /* STIF 0,1 */
654                 GPIO_M, /* GPIO 0-5*/
655                 GETHER,
656                 HPBDMAC_M, /* HPBDMAC 0_3 - 23_25_27_28 */
657                 LBSCDMAC_M, /* LBSCDMAC 0 - 2 */
658                 RCAN_M, /* RCAN, IEBUS */
659                 SRC_M,  /* SRC 0,1 */
660                 LBSCATA,
661                 SCIF_M, /* SCIF 0-5, HSCIF */
662                 LCDC_M, /* LCDC, MIMLB */
663                 _2DG_M, /* 2DG, RGPVG */
664                 SPI, /* HSPI, RSPI, QSPI */
665                 VIN_M,  /* VIN0, 1 */
666                 SSI,    /* SSI 0-3 */
667                 USB,
668                 SHDMAC,
669                 HUDI,
670                 MMC,
671                 RTC,
672                 I2C0, /* I2C */ /* I2C 0, 1*/
673                 TMU_3_M, /* TMU30 - TMU80 */
674                 TMU_0_M, /* TMU00 - TMU21 */
675                 DU } },
676 };
677
678 static struct intc_prio_reg prio_registers[] __initdata = {
679         { 0xFF804000, 0, 32, 8, /* INT2PRI0 */
680                 { DU, TMU00, TMU10, TMU20 } },
681         { 0xFF804004, 0, 32, 8, /* INT2PRI1 */
682                 { TMU30, TMU60, RTC, SDHI } },
683         { 0xFF804008, 0, 32, 8, /* INT2PRI2 */
684                 { HUDI, SHDMAC, USB, SSI } },
685         { 0xFF80400C, 0, 32, 8, /* INT2PRI3 */
686                 { VIN0, SPI, _2DG, LBSCATA } },
687         { 0xFF804010, 0, 32, 8, /* INT2PRI4 */
688                 { SCIF0, SCIF3, HSCIF, LCDC } },
689         { 0xFF804014, 0, 32, 8, /* INT2PRI5 */
690                 { RCAN_P, LBSCDMAC_P, LBSCDMAC2, MMC } },
691         { 0xFF804018, 0, 32, 8, /* INT2PRI6 */
692                 { HPBDMAC0_3, HPBDMAC4_10, HPBDMAC11_18, HPBDMAC19_22 } },
693         { 0xFF80401C, 0, 32, 8, /* INT2PRI7 */
694                 { HPBDMAC23_25_27_28, I2C0, SRC0, SRC1 } },
695         { 0xFF804020, 0, 32, 8, /* INT2PRI8 */
696                 { 0 /* ADIF */, VIN1, RESET_WDT, HIF } },
697         { 0xFF804024, 0, 32, 8, /* INT2PRI9 */
698                 { ADMAC, FLCTL, GPIO0_3, GPIO4_5 } },
699         { 0xFF804028, 0, 32, 8, /* INT2PRI10 */
700                 { STIF0, STIF1, VEU3F_VE3, GETHER } },
701         { 0xFF80402C, 0, 32, 8, /* INT2PRI11 */
702                 { MTU2, RGPVG, MIMLB, IEBUS } },
703 };
704
705 static DECLARE_INTC_DESC(intc_desc, "sh7734", vectors, groups,
706         mask_registers, prio_registers, NULL);
707
708 /* Support for external interrupt pins in IRQ mode */
709
710 static struct intc_vect irq3210_vectors[] __initdata = {
711         INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280),
712         INTC_VECT(IRQ2, 0x2C0), INTC_VECT(IRQ3, 0x300),
713 };
714
715 static struct intc_sense_reg irq3210_sense_registers[] __initdata = {
716         { 0xFF80201C, 32, 2, /* ICR1 */
717         { IRQ0, IRQ1, IRQ2, IRQ3, } },
718 };
719
720 static struct intc_mask_reg irq3210_ack_registers[] __initdata = {
721         { 0xFF802024, 0, 32, /* INTREQ */
722         { IRQ0, IRQ1, IRQ2, IRQ3, } },
723 };
724
725 static struct intc_mask_reg irq3210_mask_registers[] __initdata = {
726         { 0xFF802044, 0xFF802064, 32, /* INTMSK0 / INTMSKCLR0 */
727         { IRQ0, IRQ1, IRQ2, IRQ3, } },
728 };
729
730 static struct intc_prio_reg irq3210_prio_registers[] __initdata = {
731         { 0xFF802010, 0, 32, 4, /* INTPRI */
732         { IRQ0, IRQ1, IRQ2, IRQ3, } },
733 };
734
735 static DECLARE_INTC_DESC_ACK(intc_desc_irq3210, "sh7734-irq3210",
736         irq3210_vectors, NULL,
737         irq3210_mask_registers, irq3210_prio_registers,
738         irq3210_sense_registers, irq3210_ack_registers);
739
740 /* External interrupt pins in IRL mode */
741
742 static struct intc_vect vectors_irl3210[] __initdata = {
743         INTC_VECT(IRL0_LLLL, 0x200), INTC_VECT(IRL0_LLLH, 0x220),
744         INTC_VECT(IRL0_LLHL, 0x240), INTC_VECT(IRL0_LLHH, 0x260),
745         INTC_VECT(IRL0_LHLL, 0x280), INTC_VECT(IRL0_LHLH, 0x2a0),
746         INTC_VECT(IRL0_LHHL, 0x2c0), INTC_VECT(IRL0_LHHH, 0x2e0),
747         INTC_VECT(IRL0_HLLL, 0x300), INTC_VECT(IRL0_HLLH, 0x320),
748         INTC_VECT(IRL0_HLHL, 0x340), INTC_VECT(IRL0_HLHH, 0x360),
749         INTC_VECT(IRL0_HHLL, 0x380), INTC_VECT(IRL0_HHLH, 0x3a0),
750         INTC_VECT(IRL0_HHHL, 0x3c0),
751 };
752
753 static DECLARE_INTC_DESC(intc_desc_irl3210, "sh7734-irl3210",
754         vectors_irl3210, NULL, mask_registers, NULL, NULL);
755
756 #define INTC_ICR0               0xFF802000
757 #define INTC_INTMSK0    0xFF802044
758 #define INTC_INTMSK1    0xFF802048
759 #define INTC_INTMSKCLR0 0xFF802064
760 #define INTC_INTMSKCLR1 0xFF802068
761
762 void __init plat_irq_setup(void)
763 {
764         /* disable IRQ3-0 */
765         __raw_writel(0xF0000000, INTC_INTMSK0);
766
767         /* disable IRL3-0 */
768         __raw_writel(0x80000000, INTC_INTMSK1);
769
770         /* select IRL mode for IRL3-0 */
771         __raw_writel(__raw_readl(INTC_ICR0) & ~0x00800000, INTC_ICR0);
772
773         /* disable holding function, ie enable "SH-4 Mode (LVLMODE)" */
774         __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0);
775
776         register_intc_controller(&intc_desc);
777 }
778
779 void __init plat_irq_setup_pins(int mode)
780 {
781         switch (mode) {
782         case IRQ_MODE_IRQ3210:
783                 /* select IRQ mode for IRL3-0 */
784                 __raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0);
785                 register_intc_controller(&intc_desc_irq3210);
786                 break;
787         case IRQ_MODE_IRL3210:
788                 /* enable IRL0-3 but don't provide any masking */
789                 __raw_writel(0x80000000, INTC_INTMSKCLR1);
790                 __raw_writel(0xf0000000, INTC_INTMSKCLR0);
791                 break;
792         case IRQ_MODE_IRL3210_MASK:
793                 /* enable IRL0-3 and mask using cpu intc controller */
794                 __raw_writel(0x80000000, INTC_INTMSKCLR0);
795                 register_intc_controller(&intc_desc_irl3210);
796                 break;
797         default:
798                 BUG();
799         }
800 }