1
2
3
4
5
6
7
8
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
25static struct plat_sci_port scif0_platform_data = {
26 .scscr = SCSCR_REIE,
27 .type = PORT_SCIF,
28 .regtype = SCIx_SH4_SCIF_BRG_REGTYPE,
29};
30
31static struct resource scif0_resources[] = {
32 DEFINE_RES_MEM(0xffe40000, 0x100),
33 DEFINE_RES_IRQ(evt2irq(0x8c0)),
34};
35
36static 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
46static struct plat_sci_port scif1_platform_data = {
47 .scscr = SCSCR_REIE,
48 .type = PORT_SCIF,
49 .regtype = SCIx_SH4_SCIF_BRG_REGTYPE,
50};
51
52static struct resource scif1_resources[] = {
53 DEFINE_RES_MEM(0xffe41000, 0x100),
54 DEFINE_RES_IRQ(evt2irq(0x8e0)),
55};
56
57static 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
67static struct plat_sci_port scif2_platform_data = {
68 .scscr = SCSCR_REIE,
69 .type = PORT_SCIF,
70 .regtype = SCIx_SH4_SCIF_BRG_REGTYPE,
71};
72
73static struct resource scif2_resources[] = {
74 DEFINE_RES_MEM(0xffe42000, 0x100),
75 DEFINE_RES_IRQ(evt2irq(0x900)),
76};
77
78static 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
88static 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
94static struct resource scif3_resources[] = {
95 DEFINE_RES_MEM(0xffe43000, 0x100),
96 DEFINE_RES_IRQ(evt2irq(0x920)),
97};
98
99static 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
109static struct plat_sci_port scif4_platform_data = {
110 .scscr = SCSCR_REIE,
111 .type = PORT_SCIF,
112 .regtype = SCIx_SH4_SCIF_BRG_REGTYPE,
113};
114
115static struct resource scif4_resources[] = {
116 DEFINE_RES_MEM(0xffe44000, 0x100),
117 DEFINE_RES_IRQ(evt2irq(0x940)),
118};
119
120static 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
130static struct plat_sci_port scif5_platform_data = {
131 .scscr = SCSCR_REIE,
132 .type = PORT_SCIF,
133 .regtype = SCIx_SH4_SCIF_BRG_REGTYPE,
134};
135
136static struct resource scif5_resources[] = {
137 DEFINE_RES_MEM(0xffe43000, 0x100),
138 DEFINE_RES_IRQ(evt2irq(0x960)),
139};
140
141static 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
152static 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
165static 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
173static 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
186static 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
194static struct sh_timer_config tmu0_platform_data = {
195 .channels_mask = 7,
196};
197
198static 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
205static 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
215static struct sh_timer_config tmu1_platform_data = {
216 .channels_mask = 7,
217};
218
219static 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
226static 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
236static struct sh_timer_config tmu2_platform_data = {
237 .channels_mask = 7,
238};
239
240static 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
247static 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
257static 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
270static 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
282void __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
289enum {
290 UNUSED = 0,
291
292
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
343
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
358 RCAN_P,
359 LBSCDMAC_P,
360
361
362 SDHI,
363 SSI,
364 SPI,
365};
366
367static 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
435static struct intc_group groups[] __initdata = {
436
437 INTC_GROUP(SDHI, SDHI0, SDHI1, SDHI2),
438 INTC_GROUP(SPI, HSPI, RSPI, QSPI),
439 INTC_GROUP(SSI, SSI0, SSI1, SSI2, SSI3),
440
441
442 INTC_GROUP(STIF_M, STIF0, STIF1),
443 INTC_GROUP(GPIO_M, GPIO0_3, GPIO4_5),
444 INTC_GROUP(HPBDMAC_M, HPBDMAC0_3, HPBDMAC4_10, HPBDMAC11_18,
445 HPBDMAC19_22, HPBDMAC23_25_27_28),
446 INTC_GROUP(LBSCDMAC_M, LBSCDMAC0, LBSCDMAC1, LBSCDMAC2),
447 INTC_GROUP(RCAN_M, RCAN0, RCAN1, IEBUS),
448 INTC_GROUP(SRC_M, SRC0, SRC1),
449 INTC_GROUP(SCIF_M, SCIF0, SCIF1, SCIF2, SCIF3, SCIF4, SCIF5,
450 HSCIF),
451 INTC_GROUP(LCDC_M, LCDC, MIMLB),
452 INTC_GROUP(_2DG_M, _2DG, RGPVG),
453 INTC_GROUP(VIN_M, VIN0, VIN1),
454 INTC_GROUP(TMU_3_M, TMU30, TMU40, TMU50, TMU51,
455 TMU60, TMU60, TMU70, TMU80),
456 INTC_GROUP(TMU_0_M, TMU00, TMU10, TMU20, TMU21),
457
458
459 INTC_GROUP(RCAN_P, RCAN0, RCAN1),
460 INTC_GROUP(LBSCDMAC_P, LBSCDMAC0, LBSCDMAC1),
461};
462
463static struct intc_mask_reg mask_registers[] __initdata = {
464 { 0xFF804040, 0xFF804044, 32,
465 { 0,
466 VEU3F_VE3,
467 SDHI,
468 ADMAC,
469 FLCTL,
470 RESET_WDT,
471 HIF,
472 ADC,
473 MTU2,
474 STIF_M,
475 GPIO_M,
476 GETHER,
477 HPBDMAC_M,
478 LBSCDMAC_M,
479 RCAN_M,
480 SRC_M,
481 LBSCATA,
482 SCIF_M,
483 LCDC_M,
484 _2DG_M,
485 SPI,
486 VIN_M,
487 SSI,
488 USB,
489 SHDMAC,
490 HUDI,
491 MMC,
492 RTC,
493 I2C0,
494 TMU_3_M,
495 TMU_0_M,
496 DU } },
497};
498
499static struct intc_prio_reg prio_registers[] __initdata = {
500 { 0xFF804000, 0, 32, 8,
501 { DU, TMU00, TMU10, TMU20 } },
502 { 0xFF804004, 0, 32, 8,
503 { TMU30, TMU60, RTC, SDHI } },
504 { 0xFF804008, 0, 32, 8,
505 { HUDI, SHDMAC, USB, SSI } },
506 { 0xFF80400C, 0, 32, 8,
507 { VIN0, SPI, _2DG, LBSCATA } },
508 { 0xFF804010, 0, 32, 8,
509 { SCIF0, SCIF3, HSCIF, LCDC } },
510 { 0xFF804014, 0, 32, 8,
511 { RCAN_P, LBSCDMAC_P, LBSCDMAC2, MMC } },
512 { 0xFF804018, 0, 32, 8,
513 { HPBDMAC0_3, HPBDMAC4_10, HPBDMAC11_18, HPBDMAC19_22 } },
514 { 0xFF80401C, 0, 32, 8,
515 { HPBDMAC23_25_27_28, I2C0, SRC0, SRC1 } },
516 { 0xFF804020, 0, 32, 8,
517 { 0 , VIN1, RESET_WDT, HIF } },
518 { 0xFF804024, 0, 32, 8,
519 { ADMAC, FLCTL, GPIO0_3, GPIO4_5 } },
520 { 0xFF804028, 0, 32, 8,
521 { STIF0, STIF1, VEU3F_VE3, GETHER } },
522 { 0xFF80402C, 0, 32, 8,
523 { MTU2, RGPVG, MIMLB, IEBUS } },
524};
525
526static DECLARE_INTC_DESC(intc_desc, "sh7734", vectors, groups,
527 mask_registers, prio_registers, NULL);
528
529
530
531static 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
536static struct intc_sense_reg irq3210_sense_registers[] __initdata = {
537 { 0xFF80201C, 32, 2,
538 { IRQ0, IRQ1, IRQ2, IRQ3, } },
539};
540
541static struct intc_mask_reg irq3210_ack_registers[] __initdata = {
542 { 0xFF802024, 0, 32,
543 { IRQ0, IRQ1, IRQ2, IRQ3, } },
544};
545
546static struct intc_mask_reg irq3210_mask_registers[] __initdata = {
547 { 0xFF802044, 0xFF802064, 32,
548 { IRQ0, IRQ1, IRQ2, IRQ3, } },
549};
550
551static struct intc_prio_reg irq3210_prio_registers[] __initdata = {
552 { 0xFF802010, 0, 32, 4,
553 { IRQ0, IRQ1, IRQ2, IRQ3, } },
554};
555
556static 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
562
563static 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
574static 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
583void __init plat_irq_setup(void)
584{
585
586 __raw_writel(0xF0000000, INTC_INTMSK0);
587
588
589 __raw_writel(0x80000000, INTC_INTMSK1);
590
591
592 __raw_writel(__raw_readl(INTC_ICR0) & ~0x00800000, INTC_ICR0);
593
594
595 __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0);
596
597 register_intc_controller(&intc_desc);
598}
599
600void __init plat_irq_setup_pins(int mode)
601{
602 switch (mode) {
603 case IRQ_MODE_IRQ3210:
604
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
610 __raw_writel(0x80000000, INTC_INTMSKCLR1);
611 __raw_writel(0xf0000000, INTC_INTMSKCLR0);
612 break;
613 case IRQ_MODE_IRL3210_MASK:
614
615 __raw_writel(0x80000000, INTC_INTMSKCLR0);
616 register_intc_controller(&intc_desc_irl3210);
617 break;
618 default:
619 BUG();
620 }
621}
622