1/*
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>
30#include <linux/sh_dma.h>
31#include <linux/sh_intc.h>
32#include <linux/sh_timer.h>
33#include <mach/hardware.h>
34#include <mach/irqs.h>
35#include <mach/sh73a0.h>
36#include <mach/common.h>
37#include <asm/mach-types.h>
38#include <asm/mach/map.h>
39#include <asm/mach/arch.h>
40#include <asm/mach/time.h>
41
42static struct map_desc sh73a0_io_desc[] __initdata = {
43	/* create a 1:1 entity map for 0xe6xxxxxx
44	 * used by CPGA, INTC and PFC.
45	 */
46	{
47		.virtual	= 0xe6000000,
48		.pfn		= __phys_to_pfn(0xe6000000),
49		.length		= 256 << 20,
50		.type		= MT_DEVICE_NONSHARED
51	},
52};
53
54void __init sh73a0_map_io(void)
55{
56	iotable_init(sh73a0_io_desc, ARRAY_SIZE(sh73a0_io_desc));
57}
58
59static struct plat_sci_port scif0_platform_data = {
60	.mapbase	= 0xe6c40000,
61	.flags		= UPF_BOOT_AUTOCONF,
62	.scscr		= SCSCR_RE | SCSCR_TE,
63	.scbrr_algo_id	= SCBRR_ALGO_4,
64	.type		= PORT_SCIFA,
65	.irqs		= { gic_spi(72), gic_spi(72),
66			    gic_spi(72), gic_spi(72) },
67};
68
69static struct platform_device scif0_device = {
70	.name		= "sh-sci",
71	.id		= 0,
72	.dev		= {
73		.platform_data	= &scif0_platform_data,
74	},
75};
76
77static struct plat_sci_port scif1_platform_data = {
78	.mapbase	= 0xe6c50000,
79	.flags		= UPF_BOOT_AUTOCONF,
80	.scscr		= SCSCR_RE | SCSCR_TE,
81	.scbrr_algo_id	= SCBRR_ALGO_4,
82	.type		= PORT_SCIFA,
83	.irqs		= { gic_spi(73), gic_spi(73),
84			    gic_spi(73), gic_spi(73) },
85};
86
87static struct platform_device scif1_device = {
88	.name		= "sh-sci",
89	.id		= 1,
90	.dev		= {
91		.platform_data	= &scif1_platform_data,
92	},
93};
94
95static struct plat_sci_port scif2_platform_data = {
96	.mapbase	= 0xe6c60000,
97	.flags		= UPF_BOOT_AUTOCONF,
98	.scscr		= SCSCR_RE | SCSCR_TE,
99	.scbrr_algo_id	= SCBRR_ALGO_4,
100	.type		= PORT_SCIFA,
101	.irqs		= { gic_spi(74), gic_spi(74),
102			    gic_spi(74), gic_spi(74) },
103};
104
105static struct platform_device scif2_device = {
106	.name		= "sh-sci",
107	.id		= 2,
108	.dev		= {
109		.platform_data	= &scif2_platform_data,
110	},
111};
112
113static struct plat_sci_port scif3_platform_data = {
114	.mapbase	= 0xe6c70000,
115	.flags		= UPF_BOOT_AUTOCONF,
116	.scscr		= SCSCR_RE | SCSCR_TE,
117	.scbrr_algo_id	= SCBRR_ALGO_4,
118	.type		= PORT_SCIFA,
119	.irqs		= { gic_spi(75), gic_spi(75),
120			    gic_spi(75), gic_spi(75) },
121};
122
123static struct platform_device scif3_device = {
124	.name		= "sh-sci",
125	.id		= 3,
126	.dev		= {
127		.platform_data	= &scif3_platform_data,
128	},
129};
130
131static struct plat_sci_port scif4_platform_data = {
132	.mapbase	= 0xe6c80000,
133	.flags		= UPF_BOOT_AUTOCONF,
134	.scscr		= SCSCR_RE | SCSCR_TE,
135	.scbrr_algo_id	= SCBRR_ALGO_4,
136	.type		= PORT_SCIFA,
137	.irqs		= { gic_spi(78), gic_spi(78),
138			    gic_spi(78), gic_spi(78) },
139};
140
141static struct platform_device scif4_device = {
142	.name		= "sh-sci",
143	.id		= 4,
144	.dev		= {
145		.platform_data	= &scif4_platform_data,
146	},
147};
148
149static struct plat_sci_port scif5_platform_data = {
150	.mapbase	= 0xe6cb0000,
151	.flags		= UPF_BOOT_AUTOCONF,
152	.scscr		= SCSCR_RE | SCSCR_TE,
153	.scbrr_algo_id	= SCBRR_ALGO_4,
154	.type		= PORT_SCIFA,
155	.irqs		= { gic_spi(79), gic_spi(79),
156			    gic_spi(79), gic_spi(79) },
157};
158
159static struct platform_device scif5_device = {
160	.name		= "sh-sci",
161	.id		= 5,
162	.dev		= {
163		.platform_data	= &scif5_platform_data,
164	},
165};
166
167static struct plat_sci_port scif6_platform_data = {
168	.mapbase	= 0xe6cc0000,
169	.flags		= UPF_BOOT_AUTOCONF,
170	.scscr		= SCSCR_RE | SCSCR_TE,
171	.scbrr_algo_id	= SCBRR_ALGO_4,
172	.type		= PORT_SCIFA,
173	.irqs		= { gic_spi(156), gic_spi(156),
174			    gic_spi(156), gic_spi(156) },
175};
176
177static struct platform_device scif6_device = {
178	.name		= "sh-sci",
179	.id		= 6,
180	.dev		= {
181		.platform_data	= &scif6_platform_data,
182	},
183};
184
185static struct plat_sci_port scif7_platform_data = {
186	.mapbase	= 0xe6cd0000,
187	.flags		= UPF_BOOT_AUTOCONF,
188	.scscr		= SCSCR_RE | SCSCR_TE,
189	.scbrr_algo_id	= SCBRR_ALGO_4,
190	.type		= PORT_SCIFA,
191	.irqs		= { gic_spi(143), gic_spi(143),
192			    gic_spi(143), gic_spi(143) },
193};
194
195static struct platform_device scif7_device = {
196	.name		= "sh-sci",
197	.id		= 7,
198	.dev		= {
199		.platform_data	= &scif7_platform_data,
200	},
201};
202
203static struct plat_sci_port scif8_platform_data = {
204	.mapbase	= 0xe6c30000,
205	.flags		= UPF_BOOT_AUTOCONF,
206	.scscr		= SCSCR_RE | SCSCR_TE,
207	.scbrr_algo_id	= SCBRR_ALGO_4,
208	.type		= PORT_SCIFB,
209	.irqs		= { gic_spi(80), gic_spi(80),
210			    gic_spi(80), gic_spi(80) },
211};
212
213static struct platform_device scif8_device = {
214	.name		= "sh-sci",
215	.id		= 8,
216	.dev		= {
217		.platform_data	= &scif8_platform_data,
218	},
219};
220
221static struct sh_timer_config cmt10_platform_data = {
222	.name = "CMT10",
223	.channel_offset = 0x10,
224	.timer_bit = 0,
225	.clockevent_rating = 125,
226	.clocksource_rating = 125,
227};
228
229static struct resource cmt10_resources[] = {
230	[0] = {
231		.name	= "CMT10",
232		.start	= 0xe6138010,
233		.end	= 0xe613801b,
234		.flags	= IORESOURCE_MEM,
235	},
236	[1] = {
237		.start	= gic_spi(65),
238		.flags	= IORESOURCE_IRQ,
239	},
240};
241
242static struct platform_device cmt10_device = {
243	.name		= "sh_cmt",
244	.id		= 10,
245	.dev = {
246		.platform_data	= &cmt10_platform_data,
247	},
248	.resource	= cmt10_resources,
249	.num_resources	= ARRAY_SIZE(cmt10_resources),
250};
251
252/* TMU */
253static struct sh_timer_config tmu00_platform_data = {
254	.name = "TMU00",
255	.channel_offset = 0x4,
256	.timer_bit = 0,
257	.clockevent_rating = 200,
258};
259
260static struct resource tmu00_resources[] = {
261	[0] = {
262		.name	= "TMU00",
263		.start	= 0xfff60008,
264		.end	= 0xfff60013,
265		.flags	= IORESOURCE_MEM,
266	},
267	[1] = {
268		.start	= intcs_evt2irq(0x0e80), /* TMU0_TUNI00 */
269		.flags	= IORESOURCE_IRQ,
270	},
271};
272
273static struct platform_device tmu00_device = {
274	.name		= "sh_tmu",
275	.id		= 0,
276	.dev = {
277		.platform_data	= &tmu00_platform_data,
278	},
279	.resource	= tmu00_resources,
280	.num_resources	= ARRAY_SIZE(tmu00_resources),
281};
282
283static struct sh_timer_config tmu01_platform_data = {
284	.name = "TMU01",
285	.channel_offset = 0x10,
286	.timer_bit = 1,
287	.clocksource_rating = 200,
288};
289
290static struct resource tmu01_resources[] = {
291	[0] = {
292		.name	= "TMU01",
293		.start	= 0xfff60014,
294		.end	= 0xfff6001f,
295		.flags	= IORESOURCE_MEM,
296	},
297	[1] = {
298		.start	= intcs_evt2irq(0x0ea0), /* TMU0_TUNI01 */
299		.flags	= IORESOURCE_IRQ,
300	},
301};
302
303static struct platform_device tmu01_device = {
304	.name		= "sh_tmu",
305	.id		= 1,
306	.dev = {
307		.platform_data	= &tmu01_platform_data,
308	},
309	.resource	= tmu01_resources,
310	.num_resources	= ARRAY_SIZE(tmu01_resources),
311};
312
313static struct resource i2c0_resources[] = {
314	[0] = {
315		.name	= "IIC0",
316		.start	= 0xe6820000,
317		.end	= 0xe6820425 - 1,
318		.flags	= IORESOURCE_MEM,
319	},
320	[1] = {
321		.start	= gic_spi(167),
322		.end	= gic_spi(170),
323		.flags	= IORESOURCE_IRQ,
324	},
325};
326
327static struct resource i2c1_resources[] = {
328	[0] = {
329		.name	= "IIC1",
330		.start	= 0xe6822000,
331		.end	= 0xe6822425 - 1,
332		.flags	= IORESOURCE_MEM,
333	},
334	[1] = {
335		.start	= gic_spi(51),
336		.end	= gic_spi(54),
337		.flags	= IORESOURCE_IRQ,
338	},
339};
340
341static struct resource i2c2_resources[] = {
342	[0] = {
343		.name	= "IIC2",
344		.start	= 0xe6824000,
345		.end	= 0xe6824425 - 1,
346		.flags	= IORESOURCE_MEM,
347	},
348	[1] = {
349		.start	= gic_spi(171),
350		.end	= gic_spi(174),
351		.flags	= IORESOURCE_IRQ,
352	},
353};
354
355static struct resource i2c3_resources[] = {
356	[0] = {
357		.name	= "IIC3",
358		.start	= 0xe6826000,
359		.end	= 0xe6826425 - 1,
360		.flags	= IORESOURCE_MEM,
361	},
362	[1] = {
363		.start	= gic_spi(183),
364		.end	= gic_spi(186),
365		.flags	= IORESOURCE_IRQ,
366	},
367};
368
369static struct resource i2c4_resources[] = {
370	[0] = {
371		.name	= "IIC4",
372		.start	= 0xe6828000,
373		.end	= 0xe6828425 - 1,
374		.flags	= IORESOURCE_MEM,
375	},
376	[1] = {
377		.start	= gic_spi(187),
378		.end	= gic_spi(190),
379		.flags	= IORESOURCE_IRQ,
380	},
381};
382
383static struct platform_device i2c0_device = {
384	.name		= "i2c-sh_mobile",
385	.id		= 0,
386	.resource	= i2c0_resources,
387	.num_resources	= ARRAY_SIZE(i2c0_resources),
388};
389
390static struct platform_device i2c1_device = {
391	.name		= "i2c-sh_mobile",
392	.id		= 1,
393	.resource	= i2c1_resources,
394	.num_resources	= ARRAY_SIZE(i2c1_resources),
395};
396
397static struct platform_device i2c2_device = {
398	.name		= "i2c-sh_mobile",
399	.id		= 2,
400	.resource	= i2c2_resources,
401	.num_resources	= ARRAY_SIZE(i2c2_resources),
402};
403
404static struct platform_device i2c3_device = {
405	.name		= "i2c-sh_mobile",
406	.id		= 3,
407	.resource	= i2c3_resources,
408	.num_resources	= ARRAY_SIZE(i2c3_resources),
409};
410
411static struct platform_device i2c4_device = {
412	.name		= "i2c-sh_mobile",
413	.id		= 4,
414	.resource	= i2c4_resources,
415	.num_resources	= ARRAY_SIZE(i2c4_resources),
416};
417
418/* Transmit sizes and respective CHCR register values */
419enum {
420	XMIT_SZ_8BIT		= 0,
421	XMIT_SZ_16BIT		= 1,
422	XMIT_SZ_32BIT		= 2,
423	XMIT_SZ_64BIT		= 7,
424	XMIT_SZ_128BIT		= 3,
425	XMIT_SZ_256BIT		= 4,
426	XMIT_SZ_512BIT		= 5,
427};
428
429/* log2(size / 8) - used to calculate number of transfers */
430#define TS_SHIFT {			\
431	[XMIT_SZ_8BIT]		= 0,	\
432	[XMIT_SZ_16BIT]		= 1,	\
433	[XMIT_SZ_32BIT]		= 2,	\
434	[XMIT_SZ_64BIT]		= 3,	\
435	[XMIT_SZ_128BIT]	= 4,	\
436	[XMIT_SZ_256BIT]	= 5,	\
437	[XMIT_SZ_512BIT]	= 6,	\
438}
439
440#define TS_INDEX2VAL(i) ((((i) & 3) << 3) | (((i) & 0xc) << (20 - 2)))
441#define CHCR_TX(xmit_sz) (DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL((xmit_sz)))
442#define CHCR_RX(xmit_sz) (DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL((xmit_sz)))
443
444static 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
607static const unsigned int ts_shift[] = TS_SHIFT;
608
609static struct sh_dmae_pdata sh73a0_dmae_platform_data = {
610	.slave          = sh73a0_dmae_slaves,
611	.slave_num      = ARRAY_SIZE(sh73a0_dmae_slaves),
612	.channel        = sh73a0_dmae_channels,
613	.channel_num    = ARRAY_SIZE(sh73a0_dmae_channels),
614	.ts_low_shift   = 3,
615	.ts_low_mask    = 0x18,
616	.ts_high_shift  = (20 - 2),     /* 2 bits for shifted low TS */
617	.ts_high_mask   = 0x00300000,
618	.ts_shift       = ts_shift,
619	.ts_shift_num   = ARRAY_SIZE(ts_shift),
620	.dmaor_init     = DMAOR_DME,
621};
622
623static struct resource sh73a0_dmae_resources[] = {
624	{
625		/* Registers including DMAOR and channels including DMARSx */
626		.start  = 0xfe000020,
627		.end    = 0xfe008a00 - 1,
628		.flags  = IORESOURCE_MEM,
629	},
630	{
631		.name	= "error_irq",
632		.start  = gic_spi(129),
633		.end    = gic_spi(129),
634		.flags  = IORESOURCE_IRQ,
635	},
636	{
637		/* IRQ for channels 0-19 */
638		.start  = gic_spi(109),
639		.end    = gic_spi(128),
640		.flags  = IORESOURCE_IRQ,
641	},
642};
643
644static struct platform_device dma0_device = {
645	.name		= "sh-dma-engine",
646	.id		= 0,
647	.resource	= sh73a0_dmae_resources,
648	.num_resources	= ARRAY_SIZE(sh73a0_dmae_resources),
649	.dev		= {
650		.platform_data	= &sh73a0_dmae_platform_data,
651	},
652};
653
654static struct platform_device *sh73a0_early_devices[] __initdata = {
655	&scif0_device,
656	&scif1_device,
657	&scif2_device,
658	&scif3_device,
659	&scif4_device,
660	&scif5_device,
661	&scif6_device,
662	&scif7_device,
663	&scif8_device,
664	&cmt10_device,
665	&tmu00_device,
666	&tmu01_device,
667};
668
669static struct platform_device *sh73a0_late_devices[] __initdata = {
670	&i2c0_device,
671	&i2c1_device,
672	&i2c2_device,
673	&i2c3_device,
674	&i2c4_device,
675	&dma0_device,
676};
677
678#define SRCR2          0xe61580b0
679
680void __init sh73a0_add_standard_devices(void)
681{
682	/* Clear software reset bit on SY-DMAC module */
683	__raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2);
684
685	platform_add_devices(sh73a0_early_devices,
686			    ARRAY_SIZE(sh73a0_early_devices));
687	platform_add_devices(sh73a0_late_devices,
688			    ARRAY_SIZE(sh73a0_late_devices));
689}
690
691/* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */
692void __init __weak sh73a0_register_twd(void) { }
693
694static void __init sh73a0_earlytimer_init(void)
695{
696	sh73a0_clock_init();
697	shmobile_earlytimer_init();
698	sh73a0_register_twd();
699}
700
701void __init sh73a0_add_early_devices(void)
702{
703	early_platform_add_devices(sh73a0_early_devices,
704				   ARRAY_SIZE(sh73a0_early_devices));
705
706	/* setup early console here as well */
707	shmobile_setup_console();
708
709	/* override timer setup with soc-specific code */
710	shmobile_timer.init = sh73a0_earlytimer_init;
711}
712