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