blob: eab1bae785a1e6b46f6b8badb21ec6886e17d924 [file] [log] [blame]
Magnus Damm6d9598e2010-11-17 10:59:31 +00001/*
2 * sh73a0 processor support
3 *
4 * Copyright (C) 2010 Takashi Yoshii
5 * Copyright (C) 2010 Magnus Damm
6 * Copyright (C) 2008 Yoshihiro Shimoda
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; version 2 of the License.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21#include <linux/kernel.h>
22#include <linux/init.h>
23#include <linux/interrupt.h>
24#include <linux/irq.h>
25#include <linux/platform_device.h>
26#include <linux/delay.h>
27#include <linux/input.h>
28#include <linux/io.h>
29#include <linux/serial_sci.h>
Magnus Damm681e1b32011-05-24 10:37:16 +000030#include <linux/sh_dma.h>
Magnus Damm6d9598e2010-11-17 10:59:31 +000031#include <linux/sh_intc.h>
32#include <linux/sh_timer.h>
Kuninori Morimoto6088b422012-06-25 03:43:28 -070033#include <mach/dma-register.h>
Magnus Damm6d9598e2010-11-17 10:59:31 +000034#include <mach/hardware.h>
Rob Herring250a2722012-01-03 16:57:33 -060035#include <mach/irqs.h>
Magnus Damm681e1b32011-05-24 10:37:16 +000036#include <mach/sh73a0.h>
Magnus Damm50e15c32012-02-29 21:37:27 +090037#include <mach/common.h>
Magnus Damm6d9598e2010-11-17 10:59:31 +000038#include <asm/mach-types.h>
Magnus Damm50e15c32012-02-29 21:37:27 +090039#include <asm/mach/map.h>
Magnus Damm6d9598e2010-11-17 10:59:31 +000040#include <asm/mach/arch.h>
Magnus Damm3be26fd2012-03-06 17:36:45 +090041#include <asm/mach/time.h>
Magnus Damm6d9598e2010-11-17 10:59:31 +000042
Magnus Damm50e15c32012-02-29 21:37:27 +090043static struct map_desc sh73a0_io_desc[] __initdata = {
44 /* create a 1:1 entity map for 0xe6xxxxxx
45 * used by CPGA, INTC and PFC.
46 */
47 {
48 .virtual = 0xe6000000,
49 .pfn = __phys_to_pfn(0xe6000000),
50 .length = 256 << 20,
51 .type = MT_DEVICE_NONSHARED
52 },
53};
54
55void __init sh73a0_map_io(void)
56{
57 iotable_init(sh73a0_io_desc, ARRAY_SIZE(sh73a0_io_desc));
58}
59
Laurent Pinchart994d66a2012-12-15 23:51:28 +010060static struct resource sh73a0_pfc_resources[] = {
61 [0] = {
62 .start = 0xe6050000,
63 .end = 0xe6057fff,
64 .flags = IORESOURCE_MEM,
65 },
66 [1] = {
67 .start = 0xe605801c,
68 .end = 0xe6058027,
69 .flags = IORESOURCE_MEM,
70 }
71};
72
73static struct platform_device sh73a0_pfc_device = {
74 .name = "pfc-sh73a0",
75 .id = -1,
76 .resource = sh73a0_pfc_resources,
77 .num_resources = ARRAY_SIZE(sh73a0_pfc_resources),
78};
79
80void __init sh73a0_pinmux_init(void)
81{
82 platform_device_register(&sh73a0_pfc_device);
83}
84
Magnus Damm6d9598e2010-11-17 10:59:31 +000085static struct plat_sci_port scif0_platform_data = {
86 .mapbase = 0xe6c40000,
87 .flags = UPF_BOOT_AUTOCONF,
Paul Mundtf43dc232011-01-13 15:06:28 +090088 .scscr = SCSCR_RE | SCSCR_TE,
89 .scbrr_algo_id = SCBRR_ALGO_4,
Magnus Damm6d9598e2010-11-17 10:59:31 +000090 .type = PORT_SCIFA,
91 .irqs = { gic_spi(72), gic_spi(72),
92 gic_spi(72), gic_spi(72) },
93};
94
95static struct platform_device scif0_device = {
96 .name = "sh-sci",
97 .id = 0,
98 .dev = {
99 .platform_data = &scif0_platform_data,
100 },
101};
102
103static struct plat_sci_port scif1_platform_data = {
104 .mapbase = 0xe6c50000,
105 .flags = UPF_BOOT_AUTOCONF,
Paul Mundtf43dc232011-01-13 15:06:28 +0900106 .scscr = SCSCR_RE | SCSCR_TE,
107 .scbrr_algo_id = SCBRR_ALGO_4,
Magnus Damm6d9598e2010-11-17 10:59:31 +0000108 .type = PORT_SCIFA,
109 .irqs = { gic_spi(73), gic_spi(73),
110 gic_spi(73), gic_spi(73) },
111};
112
113static struct platform_device scif1_device = {
114 .name = "sh-sci",
115 .id = 1,
116 .dev = {
117 .platform_data = &scif1_platform_data,
118 },
119};
120
121static struct plat_sci_port scif2_platform_data = {
122 .mapbase = 0xe6c60000,
123 .flags = UPF_BOOT_AUTOCONF,
Paul Mundtf43dc232011-01-13 15:06:28 +0900124 .scscr = SCSCR_RE | SCSCR_TE,
125 .scbrr_algo_id = SCBRR_ALGO_4,
Magnus Damm6d9598e2010-11-17 10:59:31 +0000126 .type = PORT_SCIFA,
127 .irqs = { gic_spi(74), gic_spi(74),
128 gic_spi(74), gic_spi(74) },
129};
130
131static struct platform_device scif2_device = {
132 .name = "sh-sci",
133 .id = 2,
134 .dev = {
135 .platform_data = &scif2_platform_data,
136 },
137};
138
139static struct plat_sci_port scif3_platform_data = {
140 .mapbase = 0xe6c70000,
141 .flags = UPF_BOOT_AUTOCONF,
Paul Mundtf43dc232011-01-13 15:06:28 +0900142 .scscr = SCSCR_RE | SCSCR_TE,
143 .scbrr_algo_id = SCBRR_ALGO_4,
Magnus Damm6d9598e2010-11-17 10:59:31 +0000144 .type = PORT_SCIFA,
145 .irqs = { gic_spi(75), gic_spi(75),
146 gic_spi(75), gic_spi(75) },
147};
148
149static struct platform_device scif3_device = {
150 .name = "sh-sci",
151 .id = 3,
152 .dev = {
153 .platform_data = &scif3_platform_data,
154 },
155};
156
157static struct plat_sci_port scif4_platform_data = {
158 .mapbase = 0xe6c80000,
159 .flags = UPF_BOOT_AUTOCONF,
Paul Mundtf43dc232011-01-13 15:06:28 +0900160 .scscr = SCSCR_RE | SCSCR_TE,
161 .scbrr_algo_id = SCBRR_ALGO_4,
Magnus Damm6d9598e2010-11-17 10:59:31 +0000162 .type = PORT_SCIFA,
163 .irqs = { gic_spi(78), gic_spi(78),
164 gic_spi(78), gic_spi(78) },
165};
166
167static struct platform_device scif4_device = {
168 .name = "sh-sci",
169 .id = 4,
170 .dev = {
171 .platform_data = &scif4_platform_data,
172 },
173};
174
175static struct plat_sci_port scif5_platform_data = {
176 .mapbase = 0xe6cb0000,
177 .flags = UPF_BOOT_AUTOCONF,
Paul Mundtf43dc232011-01-13 15:06:28 +0900178 .scscr = SCSCR_RE | SCSCR_TE,
179 .scbrr_algo_id = SCBRR_ALGO_4,
Magnus Damm6d9598e2010-11-17 10:59:31 +0000180 .type = PORT_SCIFA,
181 .irqs = { gic_spi(79), gic_spi(79),
182 gic_spi(79), gic_spi(79) },
183};
184
185static struct platform_device scif5_device = {
186 .name = "sh-sci",
187 .id = 5,
188 .dev = {
189 .platform_data = &scif5_platform_data,
190 },
191};
192
193static struct plat_sci_port scif6_platform_data = {
194 .mapbase = 0xe6cc0000,
195 .flags = UPF_BOOT_AUTOCONF,
Paul Mundtf43dc232011-01-13 15:06:28 +0900196 .scscr = SCSCR_RE | SCSCR_TE,
197 .scbrr_algo_id = SCBRR_ALGO_4,
Magnus Damm6d9598e2010-11-17 10:59:31 +0000198 .type = PORT_SCIFA,
199 .irqs = { gic_spi(156), gic_spi(156),
200 gic_spi(156), gic_spi(156) },
201};
202
203static struct platform_device scif6_device = {
204 .name = "sh-sci",
205 .id = 6,
206 .dev = {
207 .platform_data = &scif6_platform_data,
208 },
209};
210
211static struct plat_sci_port scif7_platform_data = {
212 .mapbase = 0xe6cd0000,
213 .flags = UPF_BOOT_AUTOCONF,
Paul Mundtf43dc232011-01-13 15:06:28 +0900214 .scscr = SCSCR_RE | SCSCR_TE,
215 .scbrr_algo_id = SCBRR_ALGO_4,
Magnus Damm6d9598e2010-11-17 10:59:31 +0000216 .type = PORT_SCIFA,
217 .irqs = { gic_spi(143), gic_spi(143),
218 gic_spi(143), gic_spi(143) },
219};
220
221static struct platform_device scif7_device = {
222 .name = "sh-sci",
223 .id = 7,
224 .dev = {
225 .platform_data = &scif7_platform_data,
226 },
227};
228
229static struct plat_sci_port scif8_platform_data = {
230 .mapbase = 0xe6c30000,
231 .flags = UPF_BOOT_AUTOCONF,
Paul Mundtf43dc232011-01-13 15:06:28 +0900232 .scscr = SCSCR_RE | SCSCR_TE,
233 .scbrr_algo_id = SCBRR_ALGO_4,
Magnus Damm6d9598e2010-11-17 10:59:31 +0000234 .type = PORT_SCIFB,
235 .irqs = { gic_spi(80), gic_spi(80),
236 gic_spi(80), gic_spi(80) },
237};
238
239static struct platform_device scif8_device = {
240 .name = "sh-sci",
241 .id = 8,
242 .dev = {
243 .platform_data = &scif8_platform_data,
244 },
245};
246
247static struct sh_timer_config cmt10_platform_data = {
248 .name = "CMT10",
249 .channel_offset = 0x10,
250 .timer_bit = 0,
251 .clockevent_rating = 125,
252 .clocksource_rating = 125,
253};
254
255static struct resource cmt10_resources[] = {
256 [0] = {
257 .name = "CMT10",
258 .start = 0xe6138010,
259 .end = 0xe613801b,
260 .flags = IORESOURCE_MEM,
261 },
262 [1] = {
263 .start = gic_spi(65),
264 .flags = IORESOURCE_IRQ,
265 },
266};
267
268static struct platform_device cmt10_device = {
269 .name = "sh_cmt",
270 .id = 10,
271 .dev = {
272 .platform_data = &cmt10_platform_data,
273 },
274 .resource = cmt10_resources,
275 .num_resources = ARRAY_SIZE(cmt10_resources),
276};
277
Magnus Damm5010f3d2010-12-21 08:40:59 +0000278/* TMU */
279static struct sh_timer_config tmu00_platform_data = {
280 .name = "TMU00",
281 .channel_offset = 0x4,
282 .timer_bit = 0,
283 .clockevent_rating = 200,
284};
285
286static struct resource tmu00_resources[] = {
287 [0] = {
288 .name = "TMU00",
289 .start = 0xfff60008,
290 .end = 0xfff60013,
291 .flags = IORESOURCE_MEM,
292 },
293 [1] = {
294 .start = intcs_evt2irq(0x0e80), /* TMU0_TUNI00 */
295 .flags = IORESOURCE_IRQ,
296 },
297};
298
299static struct platform_device tmu00_device = {
300 .name = "sh_tmu",
301 .id = 0,
302 .dev = {
303 .platform_data = &tmu00_platform_data,
304 },
305 .resource = tmu00_resources,
306 .num_resources = ARRAY_SIZE(tmu00_resources),
307};
308
309static struct sh_timer_config tmu01_platform_data = {
310 .name = "TMU01",
311 .channel_offset = 0x10,
312 .timer_bit = 1,
313 .clocksource_rating = 200,
314};
315
316static struct resource tmu01_resources[] = {
317 [0] = {
318 .name = "TMU01",
319 .start = 0xfff60014,
320 .end = 0xfff6001f,
321 .flags = IORESOURCE_MEM,
322 },
323 [1] = {
324 .start = intcs_evt2irq(0x0ea0), /* TMU0_TUNI01 */
325 .flags = IORESOURCE_IRQ,
326 },
327};
328
329static struct platform_device tmu01_device = {
330 .name = "sh_tmu",
331 .id = 1,
332 .dev = {
333 .platform_data = &tmu01_platform_data,
334 },
335 .resource = tmu01_resources,
336 .num_resources = ARRAY_SIZE(tmu01_resources),
337};
338
Yoshii Takashib028f942010-11-19 13:20:45 +0000339static struct resource i2c0_resources[] = {
340 [0] = {
341 .name = "IIC0",
342 .start = 0xe6820000,
343 .end = 0xe6820425 - 1,
344 .flags = IORESOURCE_MEM,
345 },
346 [1] = {
347 .start = gic_spi(167),
348 .end = gic_spi(170),
349 .flags = IORESOURCE_IRQ,
350 },
351};
352
353static struct resource i2c1_resources[] = {
354 [0] = {
355 .name = "IIC1",
356 .start = 0xe6822000,
357 .end = 0xe6822425 - 1,
358 .flags = IORESOURCE_MEM,
359 },
360 [1] = {
361 .start = gic_spi(51),
362 .end = gic_spi(54),
363 .flags = IORESOURCE_IRQ,
364 },
365};
366
367static struct resource i2c2_resources[] = {
368 [0] = {
369 .name = "IIC2",
370 .start = 0xe6824000,
371 .end = 0xe6824425 - 1,
372 .flags = IORESOURCE_MEM,
373 },
374 [1] = {
375 .start = gic_spi(171),
376 .end = gic_spi(174),
377 .flags = IORESOURCE_IRQ,
378 },
379};
380
381static struct resource i2c3_resources[] = {
382 [0] = {
383 .name = "IIC3",
384 .start = 0xe6826000,
385 .end = 0xe6826425 - 1,
386 .flags = IORESOURCE_MEM,
387 },
388 [1] = {
389 .start = gic_spi(183),
390 .end = gic_spi(186),
391 .flags = IORESOURCE_IRQ,
392 },
393};
394
395static struct resource i2c4_resources[] = {
396 [0] = {
397 .name = "IIC4",
398 .start = 0xe6828000,
399 .end = 0xe6828425 - 1,
400 .flags = IORESOURCE_MEM,
401 },
402 [1] = {
403 .start = gic_spi(187),
404 .end = gic_spi(190),
405 .flags = IORESOURCE_IRQ,
406 },
407};
408
409static struct platform_device i2c0_device = {
410 .name = "i2c-sh_mobile",
411 .id = 0,
412 .resource = i2c0_resources,
413 .num_resources = ARRAY_SIZE(i2c0_resources),
414};
415
416static struct platform_device i2c1_device = {
417 .name = "i2c-sh_mobile",
418 .id = 1,
419 .resource = i2c1_resources,
420 .num_resources = ARRAY_SIZE(i2c1_resources),
421};
422
423static struct platform_device i2c2_device = {
424 .name = "i2c-sh_mobile",
425 .id = 2,
426 .resource = i2c2_resources,
427 .num_resources = ARRAY_SIZE(i2c2_resources),
428};
429
430static struct platform_device i2c3_device = {
431 .name = "i2c-sh_mobile",
432 .id = 3,
433 .resource = i2c3_resources,
434 .num_resources = ARRAY_SIZE(i2c3_resources),
435};
436
437static struct platform_device i2c4_device = {
438 .name = "i2c-sh_mobile",
439 .id = 4,
440 .resource = i2c4_resources,
441 .num_resources = ARRAY_SIZE(i2c4_resources),
442};
443
Magnus Damm681e1b32011-05-24 10:37:16 +0000444static const struct sh_dmae_slave_config sh73a0_dmae_slaves[] = {
445 {
446 .slave_id = SHDMA_SLAVE_SCIF0_TX,
447 .addr = 0xe6c40020,
448 .chcr = CHCR_TX(XMIT_SZ_8BIT),
449 .mid_rid = 0x21,
450 }, {
451 .slave_id = SHDMA_SLAVE_SCIF0_RX,
452 .addr = 0xe6c40024,
453 .chcr = CHCR_RX(XMIT_SZ_8BIT),
454 .mid_rid = 0x22,
455 }, {
456 .slave_id = SHDMA_SLAVE_SCIF1_TX,
457 .addr = 0xe6c50020,
458 .chcr = CHCR_TX(XMIT_SZ_8BIT),
459 .mid_rid = 0x25,
460 }, {
461 .slave_id = SHDMA_SLAVE_SCIF1_RX,
462 .addr = 0xe6c50024,
463 .chcr = CHCR_RX(XMIT_SZ_8BIT),
464 .mid_rid = 0x26,
465 }, {
466 .slave_id = SHDMA_SLAVE_SCIF2_TX,
467 .addr = 0xe6c60020,
468 .chcr = CHCR_TX(XMIT_SZ_8BIT),
469 .mid_rid = 0x29,
470 }, {
471 .slave_id = SHDMA_SLAVE_SCIF2_RX,
472 .addr = 0xe6c60024,
473 .chcr = CHCR_RX(XMIT_SZ_8BIT),
474 .mid_rid = 0x2a,
475 }, {
476 .slave_id = SHDMA_SLAVE_SCIF3_TX,
477 .addr = 0xe6c70020,
478 .chcr = CHCR_TX(XMIT_SZ_8BIT),
479 .mid_rid = 0x2d,
480 }, {
481 .slave_id = SHDMA_SLAVE_SCIF3_RX,
482 .addr = 0xe6c70024,
483 .chcr = CHCR_RX(XMIT_SZ_8BIT),
484 .mid_rid = 0x2e,
485 }, {
486 .slave_id = SHDMA_SLAVE_SCIF4_TX,
487 .addr = 0xe6c80020,
488 .chcr = CHCR_TX(XMIT_SZ_8BIT),
489 .mid_rid = 0x39,
490 }, {
491 .slave_id = SHDMA_SLAVE_SCIF4_RX,
492 .addr = 0xe6c80024,
493 .chcr = CHCR_RX(XMIT_SZ_8BIT),
494 .mid_rid = 0x3a,
495 }, {
496 .slave_id = SHDMA_SLAVE_SCIF5_TX,
497 .addr = 0xe6cb0020,
498 .chcr = CHCR_TX(XMIT_SZ_8BIT),
499 .mid_rid = 0x35,
500 }, {
501 .slave_id = SHDMA_SLAVE_SCIF5_RX,
502 .addr = 0xe6cb0024,
503 .chcr = CHCR_RX(XMIT_SZ_8BIT),
504 .mid_rid = 0x36,
505 }, {
506 .slave_id = SHDMA_SLAVE_SCIF6_TX,
507 .addr = 0xe6cc0020,
508 .chcr = CHCR_TX(XMIT_SZ_8BIT),
509 .mid_rid = 0x1d,
510 }, {
511 .slave_id = SHDMA_SLAVE_SCIF6_RX,
512 .addr = 0xe6cc0024,
513 .chcr = CHCR_RX(XMIT_SZ_8BIT),
514 .mid_rid = 0x1e,
515 }, {
516 .slave_id = SHDMA_SLAVE_SCIF7_TX,
517 .addr = 0xe6cd0020,
518 .chcr = CHCR_TX(XMIT_SZ_8BIT),
519 .mid_rid = 0x19,
520 }, {
521 .slave_id = SHDMA_SLAVE_SCIF7_RX,
522 .addr = 0xe6cd0024,
523 .chcr = CHCR_RX(XMIT_SZ_8BIT),
524 .mid_rid = 0x1a,
525 }, {
526 .slave_id = SHDMA_SLAVE_SCIF8_TX,
527 .addr = 0xe6c30040,
528 .chcr = CHCR_TX(XMIT_SZ_8BIT),
529 .mid_rid = 0x3d,
530 }, {
531 .slave_id = SHDMA_SLAVE_SCIF8_RX,
532 .addr = 0xe6c30060,
533 .chcr = CHCR_RX(XMIT_SZ_8BIT),
534 .mid_rid = 0x3e,
535 }, {
536 .slave_id = SHDMA_SLAVE_SDHI0_TX,
537 .addr = 0xee100030,
538 .chcr = CHCR_TX(XMIT_SZ_16BIT),
539 .mid_rid = 0xc1,
540 }, {
541 .slave_id = SHDMA_SLAVE_SDHI0_RX,
542 .addr = 0xee100030,
543 .chcr = CHCR_RX(XMIT_SZ_16BIT),
544 .mid_rid = 0xc2,
545 }, {
546 .slave_id = SHDMA_SLAVE_SDHI1_TX,
547 .addr = 0xee120030,
548 .chcr = CHCR_TX(XMIT_SZ_16BIT),
549 .mid_rid = 0xc9,
550 }, {
551 .slave_id = SHDMA_SLAVE_SDHI1_RX,
552 .addr = 0xee120030,
553 .chcr = CHCR_RX(XMIT_SZ_16BIT),
554 .mid_rid = 0xca,
555 }, {
556 .slave_id = SHDMA_SLAVE_SDHI2_TX,
557 .addr = 0xee140030,
558 .chcr = CHCR_TX(XMIT_SZ_16BIT),
559 .mid_rid = 0xcd,
560 }, {
561 .slave_id = SHDMA_SLAVE_SDHI2_RX,
562 .addr = 0xee140030,
563 .chcr = CHCR_RX(XMIT_SZ_16BIT),
564 .mid_rid = 0xce,
565 }, {
566 .slave_id = SHDMA_SLAVE_MMCIF_TX,
567 .addr = 0xe6bd0034,
568 .chcr = CHCR_TX(XMIT_SZ_32BIT),
569 .mid_rid = 0xd1,
570 }, {
571 .slave_id = SHDMA_SLAVE_MMCIF_RX,
572 .addr = 0xe6bd0034,
573 .chcr = CHCR_RX(XMIT_SZ_32BIT),
574 .mid_rid = 0xd2,
575 },
576};
577
578#define DMAE_CHANNEL(_offset) \
579 { \
580 .offset = _offset - 0x20, \
581 .dmars = _offset - 0x20 + 0x40, \
582 }
583
584static const struct sh_dmae_channel sh73a0_dmae_channels[] = {
585 DMAE_CHANNEL(0x8000),
586 DMAE_CHANNEL(0x8080),
587 DMAE_CHANNEL(0x8100),
588 DMAE_CHANNEL(0x8180),
589 DMAE_CHANNEL(0x8200),
590 DMAE_CHANNEL(0x8280),
591 DMAE_CHANNEL(0x8300),
592 DMAE_CHANNEL(0x8380),
593 DMAE_CHANNEL(0x8400),
594 DMAE_CHANNEL(0x8480),
595 DMAE_CHANNEL(0x8500),
596 DMAE_CHANNEL(0x8580),
597 DMAE_CHANNEL(0x8600),
598 DMAE_CHANNEL(0x8680),
599 DMAE_CHANNEL(0x8700),
600 DMAE_CHANNEL(0x8780),
601 DMAE_CHANNEL(0x8800),
602 DMAE_CHANNEL(0x8880),
603 DMAE_CHANNEL(0x8900),
604 DMAE_CHANNEL(0x8980),
605};
606
Magnus Damm681e1b32011-05-24 10:37:16 +0000607static struct sh_dmae_pdata sh73a0_dmae_platform_data = {
608 .slave = sh73a0_dmae_slaves,
609 .slave_num = ARRAY_SIZE(sh73a0_dmae_slaves),
610 .channel = sh73a0_dmae_channels,
611 .channel_num = ARRAY_SIZE(sh73a0_dmae_channels),
Kuninori Morimoto6088b422012-06-25 03:43:28 -0700612 .ts_low_shift = TS_LOW_SHIFT,
613 .ts_low_mask = TS_LOW_BIT << TS_LOW_SHIFT,
614 .ts_high_shift = TS_HI_SHIFT,
615 .ts_high_mask = TS_HI_BIT << TS_HI_SHIFT,
616 .ts_shift = dma_ts_shift,
617 .ts_shift_num = ARRAY_SIZE(dma_ts_shift),
Magnus Damm681e1b32011-05-24 10:37:16 +0000618 .dmaor_init = DMAOR_DME,
619};
620
621static struct resource sh73a0_dmae_resources[] = {
622 {
623 /* Registers including DMAOR and channels including DMARSx */
624 .start = 0xfe000020,
625 .end = 0xfe008a00 - 1,
626 .flags = IORESOURCE_MEM,
627 },
628 {
Shimoda, Yoshihiro20052462012-01-10 14:21:31 +0900629 .name = "error_irq",
Magnus Damm681e1b32011-05-24 10:37:16 +0000630 .start = gic_spi(129),
631 .end = gic_spi(129),
632 .flags = IORESOURCE_IRQ,
633 },
634 {
635 /* IRQ for channels 0-19 */
636 .start = gic_spi(109),
637 .end = gic_spi(128),
638 .flags = IORESOURCE_IRQ,
639 },
640};
641
642static struct platform_device dma0_device = {
643 .name = "sh-dma-engine",
644 .id = 0,
645 .resource = sh73a0_dmae_resources,
646 .num_resources = ARRAY_SIZE(sh73a0_dmae_resources),
647 .dev = {
648 .platform_data = &sh73a0_dmae_platform_data,
649 },
650};
651
Kuninori Morimoto832290b2012-06-25 03:39:20 -0700652/* MPDMAC */
653static const struct sh_dmae_slave_config sh73a0_mpdma_slaves[] = {
654 {
655 .slave_id = SHDMA_SLAVE_FSI2A_RX,
656 .addr = 0xec230020,
657 .chcr = CHCR_RX(XMIT_SZ_32BIT),
658 .mid_rid = 0xd6, /* CHECK ME */
659 }, {
660 .slave_id = SHDMA_SLAVE_FSI2A_TX,
661 .addr = 0xec230024,
662 .chcr = CHCR_TX(XMIT_SZ_32BIT),
663 .mid_rid = 0xd5, /* CHECK ME */
664 }, {
665 .slave_id = SHDMA_SLAVE_FSI2C_RX,
666 .addr = 0xec230060,
667 .chcr = CHCR_RX(XMIT_SZ_32BIT),
668 .mid_rid = 0xda, /* CHECK ME */
669 }, {
670 .slave_id = SHDMA_SLAVE_FSI2C_TX,
671 .addr = 0xec230064,
672 .chcr = CHCR_TX(XMIT_SZ_32BIT),
673 .mid_rid = 0xd9, /* CHECK ME */
674 }, {
675 .slave_id = SHDMA_SLAVE_FSI2B_RX,
676 .addr = 0xec240020,
677 .chcr = CHCR_RX(XMIT_SZ_32BIT),
678 .mid_rid = 0x8e, /* CHECK ME */
679 }, {
680 .slave_id = SHDMA_SLAVE_FSI2B_TX,
681 .addr = 0xec240024,
682 .chcr = CHCR_RX(XMIT_SZ_32BIT),
683 .mid_rid = 0x8d, /* CHECK ME */
684 }, {
685 .slave_id = SHDMA_SLAVE_FSI2D_RX,
686 .addr = 0xec240060,
687 .chcr = CHCR_RX(XMIT_SZ_32BIT),
688 .mid_rid = 0x9a, /* CHECK ME */
689 },
690};
691
692#define MPDMA_CHANNEL(a, b, c) \
693{ \
694 .offset = a, \
695 .dmars = b, \
696 .dmars_bit = c, \
697 .chclr_offset = (0x220 - 0x20) + a \
698}
699
700static const struct sh_dmae_channel sh73a0_mpdma_channels[] = {
701 MPDMA_CHANNEL(0x00, 0, 0),
702 MPDMA_CHANNEL(0x10, 0, 8),
703 MPDMA_CHANNEL(0x20, 4, 0),
704 MPDMA_CHANNEL(0x30, 4, 8),
705 MPDMA_CHANNEL(0x50, 8, 0),
706 MPDMA_CHANNEL(0x70, 8, 8),
707};
708
709static struct sh_dmae_pdata sh73a0_mpdma_platform_data = {
710 .slave = sh73a0_mpdma_slaves,
711 .slave_num = ARRAY_SIZE(sh73a0_mpdma_slaves),
712 .channel = sh73a0_mpdma_channels,
713 .channel_num = ARRAY_SIZE(sh73a0_mpdma_channels),
Kuninori Morimoto6088b422012-06-25 03:43:28 -0700714 .ts_low_shift = TS_LOW_SHIFT,
715 .ts_low_mask = TS_LOW_BIT << TS_LOW_SHIFT,
716 .ts_high_shift = TS_HI_SHIFT,
717 .ts_high_mask = TS_HI_BIT << TS_HI_SHIFT,
718 .ts_shift = dma_ts_shift,
719 .ts_shift_num = ARRAY_SIZE(dma_ts_shift),
Kuninori Morimoto832290b2012-06-25 03:39:20 -0700720 .dmaor_init = DMAOR_DME,
721 .chclr_present = 1,
722};
723
724/* Resource order important! */
725static struct resource sh73a0_mpdma_resources[] = {
726 {
727 /* Channel registers and DMAOR */
728 .start = 0xec618020,
729 .end = 0xec61828f,
730 .flags = IORESOURCE_MEM,
731 },
732 {
733 /* DMARSx */
734 .start = 0xec619000,
735 .end = 0xec61900b,
736 .flags = IORESOURCE_MEM,
737 },
738 {
739 .name = "error_irq",
740 .start = gic_spi(181),
741 .end = gic_spi(181),
742 .flags = IORESOURCE_IRQ,
743 },
744 {
745 /* IRQ for channels 0-5 */
746 .start = gic_spi(175),
747 .end = gic_spi(180),
748 .flags = IORESOURCE_IRQ,
749 },
750};
751
752static struct platform_device mpdma0_device = {
753 .name = "sh-dma-engine",
754 .id = 1,
755 .resource = sh73a0_mpdma_resources,
756 .num_resources = ARRAY_SIZE(sh73a0_mpdma_resources),
757 .dev = {
758 .platform_data = &sh73a0_mpdma_platform_data,
759 },
760};
761
Tetsuyuki Kobayashif23f5be2012-09-06 20:14:06 +0900762static struct resource pmu_resources[] = {
763 [0] = {
764 .start = gic_spi(55),
765 .end = gic_spi(55),
766 .flags = IORESOURCE_IRQ,
767 },
768 [1] = {
769 .start = gic_spi(56),
770 .end = gic_spi(56),
771 .flags = IORESOURCE_IRQ,
772 },
773};
774
775static struct platform_device pmu_device = {
776 .name = "arm-pmu",
777 .id = -1,
778 .num_resources = ARRAY_SIZE(pmu_resources),
779 .resource = pmu_resources,
780};
781
Magnus Damm6d9598e2010-11-17 10:59:31 +0000782static struct platform_device *sh73a0_early_devices[] __initdata = {
783 &scif0_device,
784 &scif1_device,
785 &scif2_device,
786 &scif3_device,
787 &scif4_device,
788 &scif5_device,
789 &scif6_device,
790 &scif7_device,
791 &scif8_device,
792 &cmt10_device,
Magnus Damm5010f3d2010-12-21 08:40:59 +0000793 &tmu00_device,
794 &tmu01_device,
Magnus Damm6d9598e2010-11-17 10:59:31 +0000795};
796
Yoshii Takashib028f942010-11-19 13:20:45 +0000797static struct platform_device *sh73a0_late_devices[] __initdata = {
798 &i2c0_device,
799 &i2c1_device,
800 &i2c2_device,
801 &i2c3_device,
802 &i2c4_device,
Magnus Damm681e1b32011-05-24 10:37:16 +0000803 &dma0_device,
Kuninori Morimoto832290b2012-06-25 03:39:20 -0700804 &mpdma0_device,
Tetsuyuki Kobayashif23f5be2012-09-06 20:14:06 +0900805 &pmu_device,
Yoshii Takashib028f942010-11-19 13:20:45 +0000806};
807
Arnd Bergmann0a4b04d2012-09-14 20:08:08 +0000808#define SRCR2 IOMEM(0xe61580b0)
Magnus Damm681e1b32011-05-24 10:37:16 +0000809
Magnus Damm6d9598e2010-11-17 10:59:31 +0000810void __init sh73a0_add_standard_devices(void)
811{
Magnus Damm681e1b32011-05-24 10:37:16 +0000812 /* Clear software reset bit on SY-DMAC module */
813 __raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2);
814
Magnus Damm6d9598e2010-11-17 10:59:31 +0000815 platform_add_devices(sh73a0_early_devices,
816 ARRAY_SIZE(sh73a0_early_devices));
Yoshii Takashib028f942010-11-19 13:20:45 +0000817 platform_add_devices(sh73a0_late_devices,
818 ARRAY_SIZE(sh73a0_late_devices));
Magnus Damm6d9598e2010-11-17 10:59:31 +0000819}
820
Kuninori Morimotod6720002012-05-10 00:26:58 -0700821/* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */
822void __init __weak sh73a0_register_twd(void) { }
823
Magnus Damm3be26fd2012-03-06 17:36:45 +0900824static void __init sh73a0_earlytimer_init(void)
825{
826 sh73a0_clock_init();
827 shmobile_earlytimer_init();
Kuninori Morimotod6720002012-05-10 00:26:58 -0700828 sh73a0_register_twd();
Magnus Damm3be26fd2012-03-06 17:36:45 +0900829}
830
Magnus Damm6d9598e2010-11-17 10:59:31 +0000831void __init sh73a0_add_early_devices(void)
832{
833 early_platform_add_devices(sh73a0_early_devices,
834 ARRAY_SIZE(sh73a0_early_devices));
Magnus Damm50e15c32012-02-29 21:37:27 +0900835
836 /* setup early console here as well */
837 shmobile_setup_console();
Magnus Damm3be26fd2012-03-06 17:36:45 +0900838
839 /* override timer setup with soc-specific code */
840 shmobile_timer.init = sh73a0_earlytimer_init;
Magnus Damm6d9598e2010-11-17 10:59:31 +0000841}