Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/sh/kernel/cpu/sh4a/setup-sh7785.c
17498 views
1
/*
2
* SH7785 Setup
3
*
4
* Copyright (C) 2007 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/mm.h>
16
#include <linux/sh_dma.h>
17
#include <linux/sh_timer.h>
18
19
#include <asm/mmzone.h>
20
21
#include <cpu/dma-register.h>
22
23
static struct plat_sci_port scif0_platform_data = {
24
.mapbase = 0xffea0000,
25
.flags = UPF_BOOT_AUTOCONF,
26
.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
27
.scbrr_algo_id = SCBRR_ALGO_1,
28
.type = PORT_SCIF,
29
.irqs = { 40, 40, 40, 40 },
30
};
31
32
static struct platform_device scif0_device = {
33
.name = "sh-sci",
34
.id = 0,
35
.dev = {
36
.platform_data = &scif0_platform_data,
37
},
38
};
39
40
static struct plat_sci_port scif1_platform_data = {
41
.mapbase = 0xffeb0000,
42
.flags = UPF_BOOT_AUTOCONF,
43
.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
44
.scbrr_algo_id = SCBRR_ALGO_1,
45
.type = PORT_SCIF,
46
.irqs = { 44, 44, 44, 44 },
47
};
48
49
static struct platform_device scif1_device = {
50
.name = "sh-sci",
51
.id = 1,
52
.dev = {
53
.platform_data = &scif1_platform_data,
54
},
55
};
56
57
static struct plat_sci_port scif2_platform_data = {
58
.mapbase = 0xffec0000,
59
.flags = UPF_BOOT_AUTOCONF,
60
.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
61
.scbrr_algo_id = SCBRR_ALGO_1,
62
.type = PORT_SCIF,
63
.irqs = { 60, 60, 60, 60 },
64
};
65
66
static struct platform_device scif2_device = {
67
.name = "sh-sci",
68
.id = 2,
69
.dev = {
70
.platform_data = &scif2_platform_data,
71
},
72
};
73
74
static struct plat_sci_port scif3_platform_data = {
75
.mapbase = 0xffed0000,
76
.flags = UPF_BOOT_AUTOCONF,
77
.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
78
.scbrr_algo_id = SCBRR_ALGO_1,
79
.type = PORT_SCIF,
80
.irqs = { 61, 61, 61, 61 },
81
};
82
83
static struct platform_device scif3_device = {
84
.name = "sh-sci",
85
.id = 3,
86
.dev = {
87
.platform_data = &scif3_platform_data,
88
},
89
};
90
91
static struct plat_sci_port scif4_platform_data = {
92
.mapbase = 0xffee0000,
93
.flags = UPF_BOOT_AUTOCONF,
94
.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
95
.scbrr_algo_id = SCBRR_ALGO_1,
96
.type = PORT_SCIF,
97
.irqs = { 62, 62, 62, 62 },
98
};
99
100
static struct platform_device scif4_device = {
101
.name = "sh-sci",
102
.id = 4,
103
.dev = {
104
.platform_data = &scif4_platform_data,
105
},
106
};
107
108
static struct plat_sci_port scif5_platform_data = {
109
.mapbase = 0xffef0000,
110
.flags = UPF_BOOT_AUTOCONF,
111
.scscr = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
112
.scbrr_algo_id = SCBRR_ALGO_1,
113
.type = PORT_SCIF,
114
.irqs = { 63, 63, 63, 63 },
115
};
116
117
static struct platform_device scif5_device = {
118
.name = "sh-sci",
119
.id = 5,
120
.dev = {
121
.platform_data = &scif5_platform_data,
122
},
123
};
124
125
static struct sh_timer_config tmu0_platform_data = {
126
.channel_offset = 0x04,
127
.timer_bit = 0,
128
.clockevent_rating = 200,
129
};
130
131
static struct resource tmu0_resources[] = {
132
[0] = {
133
.start = 0xffd80008,
134
.end = 0xffd80013,
135
.flags = IORESOURCE_MEM,
136
},
137
[1] = {
138
.start = 28,
139
.flags = IORESOURCE_IRQ,
140
},
141
};
142
143
static struct platform_device tmu0_device = {
144
.name = "sh_tmu",
145
.id = 0,
146
.dev = {
147
.platform_data = &tmu0_platform_data,
148
},
149
.resource = tmu0_resources,
150
.num_resources = ARRAY_SIZE(tmu0_resources),
151
};
152
153
static struct sh_timer_config tmu1_platform_data = {
154
.channel_offset = 0x10,
155
.timer_bit = 1,
156
.clocksource_rating = 200,
157
};
158
159
static struct resource tmu1_resources[] = {
160
[0] = {
161
.start = 0xffd80014,
162
.end = 0xffd8001f,
163
.flags = IORESOURCE_MEM,
164
},
165
[1] = {
166
.start = 29,
167
.flags = IORESOURCE_IRQ,
168
},
169
};
170
171
static struct platform_device tmu1_device = {
172
.name = "sh_tmu",
173
.id = 1,
174
.dev = {
175
.platform_data = &tmu1_platform_data,
176
},
177
.resource = tmu1_resources,
178
.num_resources = ARRAY_SIZE(tmu1_resources),
179
};
180
181
static struct sh_timer_config tmu2_platform_data = {
182
.channel_offset = 0x1c,
183
.timer_bit = 2,
184
};
185
186
static struct resource tmu2_resources[] = {
187
[0] = {
188
.start = 0xffd80020,
189
.end = 0xffd8002f,
190
.flags = IORESOURCE_MEM,
191
},
192
[1] = {
193
.start = 30,
194
.flags = IORESOURCE_IRQ,
195
},
196
};
197
198
static struct platform_device tmu2_device = {
199
.name = "sh_tmu",
200
.id = 2,
201
.dev = {
202
.platform_data = &tmu2_platform_data,
203
},
204
.resource = tmu2_resources,
205
.num_resources = ARRAY_SIZE(tmu2_resources),
206
};
207
208
static struct sh_timer_config tmu3_platform_data = {
209
.channel_offset = 0x04,
210
.timer_bit = 0,
211
};
212
213
static struct resource tmu3_resources[] = {
214
[0] = {
215
.start = 0xffdc0008,
216
.end = 0xffdc0013,
217
.flags = IORESOURCE_MEM,
218
},
219
[1] = {
220
.start = 96,
221
.flags = IORESOURCE_IRQ,
222
},
223
};
224
225
static struct platform_device tmu3_device = {
226
.name = "sh_tmu",
227
.id = 3,
228
.dev = {
229
.platform_data = &tmu3_platform_data,
230
},
231
.resource = tmu3_resources,
232
.num_resources = ARRAY_SIZE(tmu3_resources),
233
};
234
235
static struct sh_timer_config tmu4_platform_data = {
236
.channel_offset = 0x10,
237
.timer_bit = 1,
238
};
239
240
static struct resource tmu4_resources[] = {
241
[0] = {
242
.start = 0xffdc0014,
243
.end = 0xffdc001f,
244
.flags = IORESOURCE_MEM,
245
},
246
[1] = {
247
.start = 97,
248
.flags = IORESOURCE_IRQ,
249
},
250
};
251
252
static struct platform_device tmu4_device = {
253
.name = "sh_tmu",
254
.id = 4,
255
.dev = {
256
.platform_data = &tmu4_platform_data,
257
},
258
.resource = tmu4_resources,
259
.num_resources = ARRAY_SIZE(tmu4_resources),
260
};
261
262
static struct sh_timer_config tmu5_platform_data = {
263
.channel_offset = 0x1c,
264
.timer_bit = 2,
265
};
266
267
static struct resource tmu5_resources[] = {
268
[0] = {
269
.start = 0xffdc0020,
270
.end = 0xffdc002b,
271
.flags = IORESOURCE_MEM,
272
},
273
[1] = {
274
.start = 98,
275
.flags = IORESOURCE_IRQ,
276
},
277
};
278
279
static struct platform_device tmu5_device = {
280
.name = "sh_tmu",
281
.id = 5,
282
.dev = {
283
.platform_data = &tmu5_platform_data,
284
},
285
.resource = tmu5_resources,
286
.num_resources = ARRAY_SIZE(tmu5_resources),
287
};
288
289
/* DMA */
290
static const struct sh_dmae_channel sh7785_dmae0_channels[] = {
291
{
292
.offset = 0,
293
.dmars = 0,
294
.dmars_bit = 0,
295
}, {
296
.offset = 0x10,
297
.dmars = 0,
298
.dmars_bit = 8,
299
}, {
300
.offset = 0x20,
301
.dmars = 4,
302
.dmars_bit = 0,
303
}, {
304
.offset = 0x30,
305
.dmars = 4,
306
.dmars_bit = 8,
307
}, {
308
.offset = 0x50,
309
.dmars = 8,
310
.dmars_bit = 0,
311
}, {
312
.offset = 0x60,
313
.dmars = 8,
314
.dmars_bit = 8,
315
}
316
};
317
318
static const struct sh_dmae_channel sh7785_dmae1_channels[] = {
319
{
320
.offset = 0,
321
}, {
322
.offset = 0x10,
323
}, {
324
.offset = 0x20,
325
}, {
326
.offset = 0x30,
327
}, {
328
.offset = 0x50,
329
}, {
330
.offset = 0x60,
331
}
332
};
333
334
static const unsigned int ts_shift[] = TS_SHIFT;
335
336
static struct sh_dmae_pdata dma0_platform_data = {
337
.channel = sh7785_dmae0_channels,
338
.channel_num = ARRAY_SIZE(sh7785_dmae0_channels),
339
.ts_low_shift = CHCR_TS_LOW_SHIFT,
340
.ts_low_mask = CHCR_TS_LOW_MASK,
341
.ts_high_shift = CHCR_TS_HIGH_SHIFT,
342
.ts_high_mask = CHCR_TS_HIGH_MASK,
343
.ts_shift = ts_shift,
344
.ts_shift_num = ARRAY_SIZE(ts_shift),
345
.dmaor_init = DMAOR_INIT,
346
};
347
348
static struct sh_dmae_pdata dma1_platform_data = {
349
.channel = sh7785_dmae1_channels,
350
.channel_num = ARRAY_SIZE(sh7785_dmae1_channels),
351
.ts_low_shift = CHCR_TS_LOW_SHIFT,
352
.ts_low_mask = CHCR_TS_LOW_MASK,
353
.ts_high_shift = CHCR_TS_HIGH_SHIFT,
354
.ts_high_mask = CHCR_TS_HIGH_MASK,
355
.ts_shift = ts_shift,
356
.ts_shift_num = ARRAY_SIZE(ts_shift),
357
.dmaor_init = DMAOR_INIT,
358
};
359
360
static struct resource sh7785_dmae0_resources[] = {
361
[0] = {
362
/* Channel registers and DMAOR */
363
.start = 0xfc808020,
364
.end = 0xfc80808f,
365
.flags = IORESOURCE_MEM,
366
},
367
[1] = {
368
/* DMARSx */
369
.start = 0xfc809000,
370
.end = 0xfc80900b,
371
.flags = IORESOURCE_MEM,
372
},
373
{
374
/* Real DMA error IRQ is 39, and channel IRQs are 33-38 */
375
.start = 33,
376
.end = 33,
377
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
378
},
379
};
380
381
static struct resource sh7785_dmae1_resources[] = {
382
[0] = {
383
/* Channel registers and DMAOR */
384
.start = 0xfcc08020,
385
.end = 0xfcc0808f,
386
.flags = IORESOURCE_MEM,
387
},
388
/* DMAC1 has no DMARS */
389
{
390
/* Real DMA error IRQ is 58, and channel IRQs are 52-57 */
391
.start = 52,
392
.end = 52,
393
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
394
},
395
};
396
397
static struct platform_device dma0_device = {
398
.name = "sh-dma-engine",
399
.id = 0,
400
.resource = sh7785_dmae0_resources,
401
.num_resources = ARRAY_SIZE(sh7785_dmae0_resources),
402
.dev = {
403
.platform_data = &dma0_platform_data,
404
},
405
};
406
407
static struct platform_device dma1_device = {
408
.name = "sh-dma-engine",
409
.id = 1,
410
.resource = sh7785_dmae1_resources,
411
.num_resources = ARRAY_SIZE(sh7785_dmae1_resources),
412
.dev = {
413
.platform_data = &dma1_platform_data,
414
},
415
};
416
417
static struct platform_device *sh7785_devices[] __initdata = {
418
&scif0_device,
419
&scif1_device,
420
&scif2_device,
421
&scif3_device,
422
&scif4_device,
423
&scif5_device,
424
&tmu0_device,
425
&tmu1_device,
426
&tmu2_device,
427
&tmu3_device,
428
&tmu4_device,
429
&tmu5_device,
430
&dma0_device,
431
&dma1_device,
432
};
433
434
static int __init sh7785_devices_setup(void)
435
{
436
return platform_add_devices(sh7785_devices,
437
ARRAY_SIZE(sh7785_devices));
438
}
439
arch_initcall(sh7785_devices_setup);
440
441
static struct platform_device *sh7785_early_devices[] __initdata = {
442
&scif0_device,
443
&scif1_device,
444
&scif2_device,
445
&scif3_device,
446
&scif4_device,
447
&scif5_device,
448
&tmu0_device,
449
&tmu1_device,
450
&tmu2_device,
451
&tmu3_device,
452
&tmu4_device,
453
&tmu5_device,
454
};
455
456
void __init plat_early_device_setup(void)
457
{
458
early_platform_add_devices(sh7785_early_devices,
459
ARRAY_SIZE(sh7785_early_devices));
460
}
461
462
enum {
463
UNUSED = 0,
464
465
/* interrupt sources */
466
467
IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
468
IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
469
IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
470
IRL0_HHLL, IRL0_HHLH, IRL0_HHHL,
471
472
IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
473
IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
474
IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
475
IRL4_HHLL, IRL4_HHLH, IRL4_HHHL,
476
477
IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
478
WDT, TMU0, TMU1, TMU2, TMU2_TICPI,
479
HUDI, DMAC0, SCIF0, SCIF1, DMAC1, HSPI,
480
SCIF2, SCIF3, SCIF4, SCIF5,
481
PCISERR, PCIINTA, PCIINTB, PCIINTC, PCIINTD, PCIC5,
482
SIOF, MMCIF, DU, GDTA,
483
TMU3, TMU4, TMU5,
484
SSI0, SSI1,
485
HAC0, HAC1,
486
FLCTL, GPIO,
487
488
/* interrupt groups */
489
490
TMU012, TMU345
491
};
492
493
static struct intc_vect vectors[] __initdata = {
494
INTC_VECT(WDT, 0x560),
495
INTC_VECT(TMU0, 0x580), INTC_VECT(TMU1, 0x5a0),
496
INTC_VECT(TMU2, 0x5c0), INTC_VECT(TMU2_TICPI, 0x5e0),
497
INTC_VECT(HUDI, 0x600),
498
INTC_VECT(DMAC0, 0x620), INTC_VECT(DMAC0, 0x640),
499
INTC_VECT(DMAC0, 0x660), INTC_VECT(DMAC0, 0x680),
500
INTC_VECT(DMAC0, 0x6a0), INTC_VECT(DMAC0, 0x6c0),
501
INTC_VECT(DMAC0, 0x6e0),
502
INTC_VECT(SCIF0, 0x700), INTC_VECT(SCIF0, 0x720),
503
INTC_VECT(SCIF0, 0x740), INTC_VECT(SCIF0, 0x760),
504
INTC_VECT(SCIF1, 0x780), INTC_VECT(SCIF1, 0x7a0),
505
INTC_VECT(SCIF1, 0x7c0), INTC_VECT(SCIF1, 0x7e0),
506
INTC_VECT(DMAC1, 0x880), INTC_VECT(DMAC1, 0x8a0),
507
INTC_VECT(DMAC1, 0x8c0), INTC_VECT(DMAC1, 0x8e0),
508
INTC_VECT(DMAC1, 0x900), INTC_VECT(DMAC1, 0x920),
509
INTC_VECT(DMAC1, 0x940),
510
INTC_VECT(HSPI, 0x960),
511
INTC_VECT(SCIF2, 0x980), INTC_VECT(SCIF3, 0x9a0),
512
INTC_VECT(SCIF4, 0x9c0), INTC_VECT(SCIF5, 0x9e0),
513
INTC_VECT(PCISERR, 0xa00), INTC_VECT(PCIINTA, 0xa20),
514
INTC_VECT(PCIINTB, 0xa40), INTC_VECT(PCIINTC, 0xa60),
515
INTC_VECT(PCIINTD, 0xa80), INTC_VECT(PCIC5, 0xaa0),
516
INTC_VECT(PCIC5, 0xac0), INTC_VECT(PCIC5, 0xae0),
517
INTC_VECT(PCIC5, 0xb00), INTC_VECT(PCIC5, 0xb20),
518
INTC_VECT(SIOF, 0xc00),
519
INTC_VECT(MMCIF, 0xd00), INTC_VECT(MMCIF, 0xd20),
520
INTC_VECT(MMCIF, 0xd40), INTC_VECT(MMCIF, 0xd60),
521
INTC_VECT(DU, 0xd80),
522
INTC_VECT(GDTA, 0xda0), INTC_VECT(GDTA, 0xdc0),
523
INTC_VECT(GDTA, 0xde0),
524
INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20),
525
INTC_VECT(TMU5, 0xe40),
526
INTC_VECT(SSI0, 0xe80), INTC_VECT(SSI1, 0xea0),
527
INTC_VECT(HAC0, 0xec0), INTC_VECT(HAC1, 0xee0),
528
INTC_VECT(FLCTL, 0xf00), INTC_VECT(FLCTL, 0xf20),
529
INTC_VECT(FLCTL, 0xf40), INTC_VECT(FLCTL, 0xf60),
530
INTC_VECT(GPIO, 0xf80), INTC_VECT(GPIO, 0xfa0),
531
INTC_VECT(GPIO, 0xfc0), INTC_VECT(GPIO, 0xfe0),
532
};
533
534
static struct intc_group groups[] __initdata = {
535
INTC_GROUP(TMU012, TMU0, TMU1, TMU2, TMU2_TICPI),
536
INTC_GROUP(TMU345, TMU3, TMU4, TMU5),
537
};
538
539
static struct intc_mask_reg mask_registers[] __initdata = {
540
{ 0xffd00044, 0xffd00064, 32, /* INTMSK0 / INTMSKCLR0 */
541
{ IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
542
543
{ 0xffd40080, 0xffd40084, 32, /* INTMSK2 / INTMSKCLR2 */
544
{ IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
545
IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
546
IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
547
IRL0_HHLL, IRL0_HHLH, IRL0_HHHL, 0,
548
IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
549
IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
550
IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
551
IRL4_HHLL, IRL4_HHLH, IRL4_HHHL, 0, } },
552
553
{ 0xffd40038, 0xffd4003c, 32, /* INT2MSKR / INT2MSKCR */
554
{ 0, 0, 0, GDTA, DU, SSI0, SSI1, GPIO,
555
FLCTL, MMCIF, HSPI, SIOF, PCIC5, PCIINTD, PCIINTC, PCIINTB,
556
PCIINTA, PCISERR, HAC1, HAC0, DMAC1, DMAC0, HUDI, WDT,
557
SCIF5, SCIF4, SCIF3, SCIF2, SCIF1, SCIF0, TMU345, TMU012 } },
558
};
559
560
static struct intc_prio_reg prio_registers[] __initdata = {
561
{ 0xffd00010, 0, 32, 4, /* INTPRI */ { IRQ0, IRQ1, IRQ2, IRQ3,
562
IRQ4, IRQ5, IRQ6, IRQ7 } },
563
{ 0xffd40000, 0, 32, 8, /* INT2PRI0 */ { TMU0, TMU1,
564
TMU2, TMU2_TICPI } },
565
{ 0xffd40004, 0, 32, 8, /* INT2PRI1 */ { TMU3, TMU4, TMU5, } },
566
{ 0xffd40008, 0, 32, 8, /* INT2PRI2 */ { SCIF0, SCIF1,
567
SCIF2, SCIF3 } },
568
{ 0xffd4000c, 0, 32, 8, /* INT2PRI3 */ { SCIF4, SCIF5, WDT, } },
569
{ 0xffd40010, 0, 32, 8, /* INT2PRI4 */ { HUDI, DMAC0, DMAC1, } },
570
{ 0xffd40014, 0, 32, 8, /* INT2PRI5 */ { HAC0, HAC1,
571
PCISERR, PCIINTA } },
572
{ 0xffd40018, 0, 32, 8, /* INT2PRI6 */ { PCIINTB, PCIINTC,
573
PCIINTD, PCIC5 } },
574
{ 0xffd4001c, 0, 32, 8, /* INT2PRI7 */ { SIOF, HSPI, MMCIF, } },
575
{ 0xffd40020, 0, 32, 8, /* INT2PRI8 */ { FLCTL, GPIO, SSI0, SSI1, } },
576
{ 0xffd40024, 0, 32, 8, /* INT2PRI9 */ { DU, GDTA, } },
577
};
578
579
static DECLARE_INTC_DESC(intc_desc, "sh7785", vectors, groups,
580
mask_registers, prio_registers, NULL);
581
582
/* Support for external interrupt pins in IRQ mode */
583
584
static struct intc_vect vectors_irq0123[] __initdata = {
585
INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280),
586
INTC_VECT(IRQ2, 0x2c0), INTC_VECT(IRQ3, 0x300),
587
};
588
589
static struct intc_vect vectors_irq4567[] __initdata = {
590
INTC_VECT(IRQ4, 0x340), INTC_VECT(IRQ5, 0x380),
591
INTC_VECT(IRQ6, 0x3c0), INTC_VECT(IRQ7, 0x200),
592
};
593
594
static struct intc_sense_reg sense_registers[] __initdata = {
595
{ 0xffd0001c, 32, 2, /* ICR1 */ { IRQ0, IRQ1, IRQ2, IRQ3,
596
IRQ4, IRQ5, IRQ6, IRQ7 } },
597
};
598
599
static struct intc_mask_reg ack_registers[] __initdata = {
600
{ 0xffd00024, 0, 32, /* INTREQ */
601
{ IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
602
};
603
604
static DECLARE_INTC_DESC_ACK(intc_desc_irq0123, "sh7785-irq0123",
605
vectors_irq0123, NULL, mask_registers,
606
prio_registers, sense_registers, ack_registers);
607
608
static DECLARE_INTC_DESC_ACK(intc_desc_irq4567, "sh7785-irq4567",
609
vectors_irq4567, NULL, mask_registers,
610
prio_registers, sense_registers, ack_registers);
611
612
/* External interrupt pins in IRL mode */
613
614
static struct intc_vect vectors_irl0123[] __initdata = {
615
INTC_VECT(IRL0_LLLL, 0x200), INTC_VECT(IRL0_LLLH, 0x220),
616
INTC_VECT(IRL0_LLHL, 0x240), INTC_VECT(IRL0_LLHH, 0x260),
617
INTC_VECT(IRL0_LHLL, 0x280), INTC_VECT(IRL0_LHLH, 0x2a0),
618
INTC_VECT(IRL0_LHHL, 0x2c0), INTC_VECT(IRL0_LHHH, 0x2e0),
619
INTC_VECT(IRL0_HLLL, 0x300), INTC_VECT(IRL0_HLLH, 0x320),
620
INTC_VECT(IRL0_HLHL, 0x340), INTC_VECT(IRL0_HLHH, 0x360),
621
INTC_VECT(IRL0_HHLL, 0x380), INTC_VECT(IRL0_HHLH, 0x3a0),
622
INTC_VECT(IRL0_HHHL, 0x3c0),
623
};
624
625
static struct intc_vect vectors_irl4567[] __initdata = {
626
INTC_VECT(IRL4_LLLL, 0xb00), INTC_VECT(IRL4_LLLH, 0xb20),
627
INTC_VECT(IRL4_LLHL, 0xb40), INTC_VECT(IRL4_LLHH, 0xb60),
628
INTC_VECT(IRL4_LHLL, 0xb80), INTC_VECT(IRL4_LHLH, 0xba0),
629
INTC_VECT(IRL4_LHHL, 0xbc0), INTC_VECT(IRL4_LHHH, 0xbe0),
630
INTC_VECT(IRL4_HLLL, 0xc00), INTC_VECT(IRL4_HLLH, 0xc20),
631
INTC_VECT(IRL4_HLHL, 0xc40), INTC_VECT(IRL4_HLHH, 0xc60),
632
INTC_VECT(IRL4_HHLL, 0xc80), INTC_VECT(IRL4_HHLH, 0xca0),
633
INTC_VECT(IRL4_HHHL, 0xcc0),
634
};
635
636
static DECLARE_INTC_DESC(intc_desc_irl0123, "sh7785-irl0123", vectors_irl0123,
637
NULL, mask_registers, NULL, NULL);
638
639
static DECLARE_INTC_DESC(intc_desc_irl4567, "sh7785-irl4567", vectors_irl4567,
640
NULL, mask_registers, NULL, NULL);
641
642
#define INTC_ICR0 0xffd00000
643
#define INTC_INTMSK0 0xffd00044
644
#define INTC_INTMSK1 0xffd00048
645
#define INTC_INTMSK2 0xffd40080
646
#define INTC_INTMSKCLR1 0xffd00068
647
#define INTC_INTMSKCLR2 0xffd40084
648
649
void __init plat_irq_setup(void)
650
{
651
/* disable IRQ3-0 + IRQ7-4 */
652
__raw_writel(0xff000000, INTC_INTMSK0);
653
654
/* disable IRL3-0 + IRL7-4 */
655
__raw_writel(0xc0000000, INTC_INTMSK1);
656
__raw_writel(0xfffefffe, INTC_INTMSK2);
657
658
/* select IRL mode for IRL3-0 + IRL7-4 */
659
__raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
660
661
/* disable holding function, ie enable "SH-4 Mode" */
662
__raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0);
663
664
register_intc_controller(&intc_desc);
665
}
666
667
void __init plat_irq_setup_pins(int mode)
668
{
669
switch (mode) {
670
case IRQ_MODE_IRQ7654:
671
/* select IRQ mode for IRL7-4 */
672
__raw_writel(__raw_readl(INTC_ICR0) | 0x00400000, INTC_ICR0);
673
register_intc_controller(&intc_desc_irq4567);
674
break;
675
case IRQ_MODE_IRQ3210:
676
/* select IRQ mode for IRL3-0 */
677
__raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0);
678
register_intc_controller(&intc_desc_irq0123);
679
break;
680
case IRQ_MODE_IRL7654:
681
/* enable IRL7-4 but don't provide any masking */
682
__raw_writel(0x40000000, INTC_INTMSKCLR1);
683
__raw_writel(0x0000fffe, INTC_INTMSKCLR2);
684
break;
685
case IRQ_MODE_IRL3210:
686
/* enable IRL0-3 but don't provide any masking */
687
__raw_writel(0x80000000, INTC_INTMSKCLR1);
688
__raw_writel(0xfffe0000, INTC_INTMSKCLR2);
689
break;
690
case IRQ_MODE_IRL7654_MASK:
691
/* enable IRL7-4 and mask using cpu intc controller */
692
__raw_writel(0x40000000, INTC_INTMSKCLR1);
693
register_intc_controller(&intc_desc_irl4567);
694
break;
695
case IRQ_MODE_IRL3210_MASK:
696
/* enable IRL0-3 and mask using cpu intc controller */
697
__raw_writel(0x80000000, INTC_INTMSKCLR1);
698
register_intc_controller(&intc_desc_irl0123);
699
break;
700
default:
701
BUG();
702
}
703
}
704
705
void __init plat_mem_setup(void)
706
{
707
/* Register the URAM space as Node 1 */
708
setup_bootmem_node(1, 0xe55f0000, 0xe5610000);
709
}
710
711