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_intc.h>
31 #include <linux/sh_timer.h>
32 #include <mach/hardware.h>
33 #include <asm/mach-types.h>
34 #include <asm/mach/arch.h>
35 
36 static struct plat_sci_port scif0_platform_data = {
37 	.mapbase	= 0xe6c40000,
38 	.flags		= UPF_BOOT_AUTOCONF,
39 	.type		= PORT_SCIFA,
40 	.irqs		= { gic_spi(72), gic_spi(72),
41 			    gic_spi(72), gic_spi(72) },
42 };
43 
44 static struct platform_device scif0_device = {
45 	.name		= "sh-sci",
46 	.id		= 0,
47 	.dev		= {
48 		.platform_data	= &scif0_platform_data,
49 	},
50 };
51 
52 static struct plat_sci_port scif1_platform_data = {
53 	.mapbase	= 0xe6c50000,
54 	.flags		= UPF_BOOT_AUTOCONF,
55 	.type		= PORT_SCIFA,
56 	.irqs		= { gic_spi(73), gic_spi(73),
57 			    gic_spi(73), gic_spi(73) },
58 };
59 
60 static struct platform_device scif1_device = {
61 	.name		= "sh-sci",
62 	.id		= 1,
63 	.dev		= {
64 		.platform_data	= &scif1_platform_data,
65 	},
66 };
67 
68 static struct plat_sci_port scif2_platform_data = {
69 	.mapbase	= 0xe6c60000,
70 	.flags		= UPF_BOOT_AUTOCONF,
71 	.type		= PORT_SCIFA,
72 	.irqs		= { gic_spi(74), gic_spi(74),
73 			    gic_spi(74), gic_spi(74) },
74 };
75 
76 static struct platform_device scif2_device = {
77 	.name		= "sh-sci",
78 	.id		= 2,
79 	.dev		= {
80 		.platform_data	= &scif2_platform_data,
81 	},
82 };
83 
84 static struct plat_sci_port scif3_platform_data = {
85 	.mapbase	= 0xe6c70000,
86 	.flags		= UPF_BOOT_AUTOCONF,
87 	.type		= PORT_SCIFA,
88 	.irqs		= { gic_spi(75), gic_spi(75),
89 			    gic_spi(75), gic_spi(75) },
90 };
91 
92 static struct platform_device scif3_device = {
93 	.name		= "sh-sci",
94 	.id		= 3,
95 	.dev		= {
96 		.platform_data	= &scif3_platform_data,
97 	},
98 };
99 
100 static struct plat_sci_port scif4_platform_data = {
101 	.mapbase	= 0xe6c80000,
102 	.flags		= UPF_BOOT_AUTOCONF,
103 	.type		= PORT_SCIFA,
104 	.irqs		= { gic_spi(78), gic_spi(78),
105 			    gic_spi(78), gic_spi(78) },
106 };
107 
108 static struct platform_device scif4_device = {
109 	.name		= "sh-sci",
110 	.id		= 4,
111 	.dev		= {
112 		.platform_data	= &scif4_platform_data,
113 	},
114 };
115 
116 static struct plat_sci_port scif5_platform_data = {
117 	.mapbase	= 0xe6cb0000,
118 	.flags		= UPF_BOOT_AUTOCONF,
119 	.type		= PORT_SCIFA,
120 	.irqs		= { gic_spi(79), gic_spi(79),
121 			    gic_spi(79), gic_spi(79) },
122 };
123 
124 static struct platform_device scif5_device = {
125 	.name		= "sh-sci",
126 	.id		= 5,
127 	.dev		= {
128 		.platform_data	= &scif5_platform_data,
129 	},
130 };
131 
132 static struct plat_sci_port scif6_platform_data = {
133 	.mapbase	= 0xe6cc0000,
134 	.flags		= UPF_BOOT_AUTOCONF,
135 	.type		= PORT_SCIFA,
136 	.irqs		= { gic_spi(156), gic_spi(156),
137 			    gic_spi(156), gic_spi(156) },
138 };
139 
140 static struct platform_device scif6_device = {
141 	.name		= "sh-sci",
142 	.id		= 6,
143 	.dev		= {
144 		.platform_data	= &scif6_platform_data,
145 	},
146 };
147 
148 static struct plat_sci_port scif7_platform_data = {
149 	.mapbase	= 0xe6cd0000,
150 	.flags		= UPF_BOOT_AUTOCONF,
151 	.type		= PORT_SCIFA,
152 	.irqs		= { gic_spi(143), gic_spi(143),
153 			    gic_spi(143), gic_spi(143) },
154 };
155 
156 static struct platform_device scif7_device = {
157 	.name		= "sh-sci",
158 	.id		= 7,
159 	.dev		= {
160 		.platform_data	= &scif7_platform_data,
161 	},
162 };
163 
164 static struct plat_sci_port scif8_platform_data = {
165 	.mapbase	= 0xe6c30000,
166 	.flags		= UPF_BOOT_AUTOCONF,
167 	.type		= PORT_SCIFB,
168 	.irqs		= { gic_spi(80), gic_spi(80),
169 			    gic_spi(80), gic_spi(80) },
170 };
171 
172 static struct platform_device scif8_device = {
173 	.name		= "sh-sci",
174 	.id		= 8,
175 	.dev		= {
176 		.platform_data	= &scif8_platform_data,
177 	},
178 };
179 
180 static struct sh_timer_config cmt10_platform_data = {
181 	.name = "CMT10",
182 	.channel_offset = 0x10,
183 	.timer_bit = 0,
184 	.clockevent_rating = 125,
185 	.clocksource_rating = 125,
186 };
187 
188 static struct resource cmt10_resources[] = {
189 	[0] = {
190 		.name	= "CMT10",
191 		.start	= 0xe6138010,
192 		.end	= 0xe613801b,
193 		.flags	= IORESOURCE_MEM,
194 	},
195 	[1] = {
196 		.start	= gic_spi(65),
197 		.flags	= IORESOURCE_IRQ,
198 	},
199 };
200 
201 static struct platform_device cmt10_device = {
202 	.name		= "sh_cmt",
203 	.id		= 10,
204 	.dev = {
205 		.platform_data	= &cmt10_platform_data,
206 	},
207 	.resource	= cmt10_resources,
208 	.num_resources	= ARRAY_SIZE(cmt10_resources),
209 };
210 
211 /* TMU */
212 static struct sh_timer_config tmu00_platform_data = {
213 	.name = "TMU00",
214 	.channel_offset = 0x4,
215 	.timer_bit = 0,
216 	.clockevent_rating = 200,
217 };
218 
219 static struct resource tmu00_resources[] = {
220 	[0] = {
221 		.name	= "TMU00",
222 		.start	= 0xfff60008,
223 		.end	= 0xfff60013,
224 		.flags	= IORESOURCE_MEM,
225 	},
226 	[1] = {
227 		.start	= intcs_evt2irq(0x0e80), /* TMU0_TUNI00 */
228 		.flags	= IORESOURCE_IRQ,
229 	},
230 };
231 
232 static struct platform_device tmu00_device = {
233 	.name		= "sh_tmu",
234 	.id		= 0,
235 	.dev = {
236 		.platform_data	= &tmu00_platform_data,
237 	},
238 	.resource	= tmu00_resources,
239 	.num_resources	= ARRAY_SIZE(tmu00_resources),
240 };
241 
242 static struct sh_timer_config tmu01_platform_data = {
243 	.name = "TMU01",
244 	.channel_offset = 0x10,
245 	.timer_bit = 1,
246 	.clocksource_rating = 200,
247 };
248 
249 static struct resource tmu01_resources[] = {
250 	[0] = {
251 		.name	= "TMU01",
252 		.start	= 0xfff60014,
253 		.end	= 0xfff6001f,
254 		.flags	= IORESOURCE_MEM,
255 	},
256 	[1] = {
257 		.start	= intcs_evt2irq(0x0ea0), /* TMU0_TUNI01 */
258 		.flags	= IORESOURCE_IRQ,
259 	},
260 };
261 
262 static struct platform_device tmu01_device = {
263 	.name		= "sh_tmu",
264 	.id		= 1,
265 	.dev = {
266 		.platform_data	= &tmu01_platform_data,
267 	},
268 	.resource	= tmu01_resources,
269 	.num_resources	= ARRAY_SIZE(tmu01_resources),
270 };
271 
272 static struct resource i2c0_resources[] = {
273 	[0] = {
274 		.name	= "IIC0",
275 		.start	= 0xe6820000,
276 		.end	= 0xe6820425 - 1,
277 		.flags	= IORESOURCE_MEM,
278 	},
279 	[1] = {
280 		.start	= gic_spi(167),
281 		.end	= gic_spi(170),
282 		.flags	= IORESOURCE_IRQ,
283 	},
284 };
285 
286 static struct resource i2c1_resources[] = {
287 	[0] = {
288 		.name	= "IIC1",
289 		.start	= 0xe6822000,
290 		.end	= 0xe6822425 - 1,
291 		.flags	= IORESOURCE_MEM,
292 	},
293 	[1] = {
294 		.start	= gic_spi(51),
295 		.end	= gic_spi(54),
296 		.flags	= IORESOURCE_IRQ,
297 	},
298 };
299 
300 static struct resource i2c2_resources[] = {
301 	[0] = {
302 		.name	= "IIC2",
303 		.start	= 0xe6824000,
304 		.end	= 0xe6824425 - 1,
305 		.flags	= IORESOURCE_MEM,
306 	},
307 	[1] = {
308 		.start	= gic_spi(171),
309 		.end	= gic_spi(174),
310 		.flags	= IORESOURCE_IRQ,
311 	},
312 };
313 
314 static struct resource i2c3_resources[] = {
315 	[0] = {
316 		.name	= "IIC3",
317 		.start	= 0xe6826000,
318 		.end	= 0xe6826425 - 1,
319 		.flags	= IORESOURCE_MEM,
320 	},
321 	[1] = {
322 		.start	= gic_spi(183),
323 		.end	= gic_spi(186),
324 		.flags	= IORESOURCE_IRQ,
325 	},
326 };
327 
328 static struct resource i2c4_resources[] = {
329 	[0] = {
330 		.name	= "IIC4",
331 		.start	= 0xe6828000,
332 		.end	= 0xe6828425 - 1,
333 		.flags	= IORESOURCE_MEM,
334 	},
335 	[1] = {
336 		.start	= gic_spi(187),
337 		.end	= gic_spi(190),
338 		.flags	= IORESOURCE_IRQ,
339 	},
340 };
341 
342 static struct platform_device i2c0_device = {
343 	.name		= "i2c-sh_mobile",
344 	.id		= 0,
345 	.resource	= i2c0_resources,
346 	.num_resources	= ARRAY_SIZE(i2c0_resources),
347 };
348 
349 static struct platform_device i2c1_device = {
350 	.name		= "i2c-sh_mobile",
351 	.id		= 1,
352 	.resource	= i2c1_resources,
353 	.num_resources	= ARRAY_SIZE(i2c1_resources),
354 };
355 
356 static struct platform_device i2c2_device = {
357 	.name		= "i2c-sh_mobile",
358 	.id		= 2,
359 	.resource	= i2c2_resources,
360 	.num_resources	= ARRAY_SIZE(i2c2_resources),
361 };
362 
363 static struct platform_device i2c3_device = {
364 	.name		= "i2c-sh_mobile",
365 	.id		= 3,
366 	.resource	= i2c3_resources,
367 	.num_resources	= ARRAY_SIZE(i2c3_resources),
368 };
369 
370 static struct platform_device i2c4_device = {
371 	.name		= "i2c-sh_mobile",
372 	.id		= 4,
373 	.resource	= i2c4_resources,
374 	.num_resources	= ARRAY_SIZE(i2c4_resources),
375 };
376 
377 static struct platform_device *sh73a0_early_devices[] __initdata = {
378 	&scif0_device,
379 	&scif1_device,
380 	&scif2_device,
381 	&scif3_device,
382 	&scif4_device,
383 	&scif5_device,
384 	&scif6_device,
385 	&scif7_device,
386 	&scif8_device,
387 	&cmt10_device,
388 	&tmu00_device,
389 	&tmu01_device,
390 };
391 
392 static struct platform_device *sh73a0_late_devices[] __initdata = {
393 	&i2c0_device,
394 	&i2c1_device,
395 	&i2c2_device,
396 	&i2c3_device,
397 	&i2c4_device,
398 };
399 
400 void __init sh73a0_add_standard_devices(void)
401 {
402 	platform_add_devices(sh73a0_early_devices,
403 			    ARRAY_SIZE(sh73a0_early_devices));
404 	platform_add_devices(sh73a0_late_devices,
405 			    ARRAY_SIZE(sh73a0_late_devices));
406 }
407 
408 void __init sh73a0_add_early_devices(void)
409 {
410 	early_platform_add_devices(sh73a0_early_devices,
411 				   ARRAY_SIZE(sh73a0_early_devices));
412 }
413