1 /*
2  * Emma Mobile EV2 processor support
3  *
4  * Copyright (C) 2012  Magnus Damm
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; version 2 of the License.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18  */
19 #include <linux/kernel.h>
20 #include <linux/init.h>
21 #include <linux/interrupt.h>
22 #include <linux/irq.h>
23 #include <linux/platform_device.h>
24 #include <linux/platform_data/gpio-em.h>
25 #include <linux/of_platform.h>
26 #include <linux/delay.h>
27 #include <linux/input.h>
28 #include <linux/io.h>
29 #include <linux/of_irq.h>
30 #include <mach/hardware.h>
31 #include <mach/common.h>
32 #include <mach/emev2.h>
33 #include <mach/irqs.h>
34 #include <asm/mach-types.h>
35 #include <asm/mach/arch.h>
36 #include <asm/mach/map.h>
37 #include <asm/mach/time.h>
38 #include <asm/hardware/gic.h>
39 
40 static struct map_desc emev2_io_desc[] __initdata = {
41 #ifdef CONFIG_SMP
42 	/* 128K entity map for 0xe0100000 (SMU) */
43 	{
44 		.virtual	= 0xe0100000,
45 		.pfn		= __phys_to_pfn(0xe0100000),
46 		.length		= SZ_128K,
47 		.type		= MT_DEVICE
48 	},
49 	/* 2M mapping for SCU + L2 controller */
50 	{
51 		.virtual	= 0xf0000000,
52 		.pfn		= __phys_to_pfn(0x1e000000),
53 		.length		= SZ_2M,
54 		.type		= MT_DEVICE
55 	},
56 #endif
57 };
58 
59 void __init emev2_map_io(void)
60 {
61 	iotable_init(emev2_io_desc, ARRAY_SIZE(emev2_io_desc));
62 }
63 
64 /* UART */
65 static struct resource uart0_resources[] = {
66 	[0]	= {
67 		.start	= 0xe1020000,
68 		.end	= 0xe1020037,
69 		.flags	= IORESOURCE_MEM,
70 	},
71 	[1]	= {
72 		.start	= 40,
73 		.flags	= IORESOURCE_IRQ,
74 	}
75 };
76 
77 static struct platform_device uart0_device = {
78 	.name		= "serial8250-em",
79 	.id		= 0,
80 	.num_resources	= ARRAY_SIZE(uart0_resources),
81 	.resource	= uart0_resources,
82 };
83 
84 static struct resource uart1_resources[] = {
85 	[0]	= {
86 		.start	= 0xe1030000,
87 		.end	= 0xe1030037,
88 		.flags	= IORESOURCE_MEM,
89 	},
90 	[1]	= {
91 		.start	= 41,
92 		.flags	= IORESOURCE_IRQ,
93 	}
94 };
95 
96 static struct platform_device uart1_device = {
97 	.name		= "serial8250-em",
98 	.id		= 1,
99 	.num_resources	= ARRAY_SIZE(uart1_resources),
100 	.resource	= uart1_resources,
101 };
102 
103 static struct resource uart2_resources[] = {
104 	[0]	= {
105 		.start	= 0xe1040000,
106 		.end	= 0xe1040037,
107 		.flags	= IORESOURCE_MEM,
108 	},
109 	[1]	= {
110 		.start	= 42,
111 		.flags	= IORESOURCE_IRQ,
112 	}
113 };
114 
115 static struct platform_device uart2_device = {
116 	.name		= "serial8250-em",
117 	.id		= 2,
118 	.num_resources	= ARRAY_SIZE(uart2_resources),
119 	.resource	= uart2_resources,
120 };
121 
122 static struct resource uart3_resources[] = {
123 	[0]	= {
124 		.start	= 0xe1050000,
125 		.end	= 0xe1050037,
126 		.flags	= IORESOURCE_MEM,
127 	},
128 	[1]	= {
129 		.start	= 43,
130 		.flags	= IORESOURCE_IRQ,
131 	}
132 };
133 
134 static struct platform_device uart3_device = {
135 	.name		= "serial8250-em",
136 	.id		= 3,
137 	.num_resources	= ARRAY_SIZE(uart3_resources),
138 	.resource	= uart3_resources,
139 };
140 
141 /* STI */
142 static struct resource sti_resources[] = {
143 	[0] = {
144 		.name	= "STI",
145 		.start	= 0xe0180000,
146 		.end	= 0xe0180053,
147 		.flags	= IORESOURCE_MEM,
148 	},
149 	[1] = {
150 		.start	= 157,
151 		.flags	= IORESOURCE_IRQ,
152 	},
153 };
154 
155 static struct platform_device sti_device = {
156 	.name		= "em_sti",
157 	.id		= 0,
158 	.resource	= sti_resources,
159 	.num_resources	= ARRAY_SIZE(sti_resources),
160 };
161 
162 
163 /* GIO */
164 static struct gpio_em_config gio0_config = {
165 	.gpio_base = 0,
166 	.irq_base = EMEV2_GPIO_IRQ(0),
167 	.number_of_pins = 32,
168 };
169 
170 static struct resource gio0_resources[] = {
171 	[0] = {
172 		.name	= "GIO_000",
173 		.start	= 0xe0050000,
174 		.end	= 0xe005002b,
175 		.flags	= IORESOURCE_MEM,
176 	},
177 	[1] = {
178 		.name	= "GIO_000",
179 		.start	= 0xe0050040,
180 		.end	= 0xe005005f,
181 		.flags	= IORESOURCE_MEM,
182 	},
183 	[2] = {
184 		.start	= 99,
185 		.flags	= IORESOURCE_IRQ,
186 	},
187 	[3] = {
188 		.start	= 100,
189 		.flags	= IORESOURCE_IRQ,
190 	},
191 };
192 
193 static struct platform_device gio0_device = {
194 	.name		= "em_gio",
195 	.id		= 0,
196 	.resource	= gio0_resources,
197 	.num_resources	= ARRAY_SIZE(gio0_resources),
198 	.dev		= {
199 		.platform_data	= &gio0_config,
200 	},
201 };
202 
203 static struct gpio_em_config gio1_config = {
204 	.gpio_base = 32,
205 	.irq_base = EMEV2_GPIO_IRQ(32),
206 	.number_of_pins = 32,
207 };
208 
209 static struct resource gio1_resources[] = {
210 	[0] = {
211 		.name	= "GIO_032",
212 		.start	= 0xe0050080,
213 		.end	= 0xe00500ab,
214 		.flags	= IORESOURCE_MEM,
215 	},
216 	[1] = {
217 		.name	= "GIO_032",
218 		.start	= 0xe00500c0,
219 		.end	= 0xe00500df,
220 		.flags	= IORESOURCE_MEM,
221 	},
222 	[2] = {
223 		.start	= 101,
224 		.flags	= IORESOURCE_IRQ,
225 	},
226 	[3] = {
227 		.start	= 102,
228 		.flags	= IORESOURCE_IRQ,
229 	},
230 };
231 
232 static struct platform_device gio1_device = {
233 	.name		= "em_gio",
234 	.id		= 1,
235 	.resource	= gio1_resources,
236 	.num_resources	= ARRAY_SIZE(gio1_resources),
237 	.dev		= {
238 		.platform_data	= &gio1_config,
239 	},
240 };
241 
242 static struct gpio_em_config gio2_config = {
243 	.gpio_base = 64,
244 	.irq_base = EMEV2_GPIO_IRQ(64),
245 	.number_of_pins = 32,
246 };
247 
248 static struct resource gio2_resources[] = {
249 	[0] = {
250 		.name	= "GIO_064",
251 		.start	= 0xe0050100,
252 		.end	= 0xe005012b,
253 		.flags	= IORESOURCE_MEM,
254 	},
255 	[1] = {
256 		.name	= "GIO_064",
257 		.start	= 0xe0050140,
258 		.end	= 0xe005015f,
259 		.flags	= IORESOURCE_MEM,
260 	},
261 	[2] = {
262 		.start	= 103,
263 		.flags	= IORESOURCE_IRQ,
264 	},
265 	[3] = {
266 		.start	= 104,
267 		.flags	= IORESOURCE_IRQ,
268 	},
269 };
270 
271 static struct platform_device gio2_device = {
272 	.name		= "em_gio",
273 	.id		= 2,
274 	.resource	= gio2_resources,
275 	.num_resources	= ARRAY_SIZE(gio2_resources),
276 	.dev		= {
277 		.platform_data	= &gio2_config,
278 	},
279 };
280 
281 static struct gpio_em_config gio3_config = {
282 	.gpio_base = 96,
283 	.irq_base = EMEV2_GPIO_IRQ(96),
284 	.number_of_pins = 32,
285 };
286 
287 static struct resource gio3_resources[] = {
288 	[0] = {
289 		.name	= "GIO_096",
290 		.start	= 0xe0050100,
291 		.end	= 0xe005012b,
292 		.flags	= IORESOURCE_MEM,
293 	},
294 	[1] = {
295 		.name	= "GIO_096",
296 		.start	= 0xe0050140,
297 		.end	= 0xe005015f,
298 		.flags	= IORESOURCE_MEM,
299 	},
300 	[2] = {
301 		.start	= 105,
302 		.flags	= IORESOURCE_IRQ,
303 	},
304 	[3] = {
305 		.start	= 106,
306 		.flags	= IORESOURCE_IRQ,
307 	},
308 };
309 
310 static struct platform_device gio3_device = {
311 	.name		= "em_gio",
312 	.id		= 3,
313 	.resource	= gio3_resources,
314 	.num_resources	= ARRAY_SIZE(gio3_resources),
315 	.dev		= {
316 		.platform_data	= &gio3_config,
317 	},
318 };
319 
320 static struct gpio_em_config gio4_config = {
321 	.gpio_base = 128,
322 	.irq_base = EMEV2_GPIO_IRQ(128),
323 	.number_of_pins = 31,
324 };
325 
326 static struct resource gio4_resources[] = {
327 	[0] = {
328 		.name	= "GIO_128",
329 		.start	= 0xe0050200,
330 		.end	= 0xe005022b,
331 		.flags	= IORESOURCE_MEM,
332 	},
333 	[1] = {
334 		.name	= "GIO_128",
335 		.start	= 0xe0050240,
336 		.end	= 0xe005025f,
337 		.flags	= IORESOURCE_MEM,
338 	},
339 	[2] = {
340 		.start	= 107,
341 		.flags	= IORESOURCE_IRQ,
342 	},
343 	[3] = {
344 		.start	= 108,
345 		.flags	= IORESOURCE_IRQ,
346 	},
347 };
348 
349 static struct platform_device gio4_device = {
350 	.name		= "em_gio",
351 	.id		= 4,
352 	.resource	= gio4_resources,
353 	.num_resources	= ARRAY_SIZE(gio4_resources),
354 	.dev		= {
355 		.platform_data	= &gio4_config,
356 	},
357 };
358 
359 static struct platform_device *emev2_early_devices[] __initdata = {
360 	&uart0_device,
361 	&uart1_device,
362 	&uart2_device,
363 	&uart3_device,
364 };
365 
366 static struct platform_device *emev2_late_devices[] __initdata = {
367 	&sti_device,
368 	&gio0_device,
369 	&gio1_device,
370 	&gio2_device,
371 	&gio3_device,
372 	&gio4_device,
373 };
374 
375 void __init emev2_add_standard_devices(void)
376 {
377 	emev2_clock_init();
378 
379 	platform_add_devices(emev2_early_devices,
380 			     ARRAY_SIZE(emev2_early_devices));
381 
382 	platform_add_devices(emev2_late_devices,
383 			     ARRAY_SIZE(emev2_late_devices));
384 }
385 
386 void __init emev2_init_delay(void)
387 {
388 	shmobile_setup_delay(533, 1, 3); /* Cortex-A9 @ 533MHz */
389 }
390 
391 void __init emev2_add_early_devices(void)
392 {
393 	emev2_init_delay();
394 
395 	early_platform_add_devices(emev2_early_devices,
396 				   ARRAY_SIZE(emev2_early_devices));
397 
398 	/* setup early console here as well */
399 	shmobile_setup_console();
400 }
401 
402 void __init emev2_init_irq(void)
403 {
404 	void __iomem *gic_dist_base;
405 	void __iomem *gic_cpu_base;
406 
407 	/* Static mappings, never released */
408 	gic_dist_base = ioremap(0xe0028000, PAGE_SIZE);
409 	gic_cpu_base = ioremap(0xe0020000, PAGE_SIZE);
410 	BUG_ON(!gic_dist_base || !gic_cpu_base);
411 
412 	/* Use GIC to handle interrupts */
413 	gic_init(0, 29, gic_dist_base, gic_cpu_base);
414 }
415 
416 #ifdef CONFIG_USE_OF
417 static const struct of_dev_auxdata emev2_auxdata_lookup[] __initconst = {
418 	{ }
419 };
420 
421 void __init emev2_add_standard_devices_dt(void)
422 {
423 	of_platform_populate(NULL, of_default_bus_match_table,
424 			     emev2_auxdata_lookup, NULL);
425 }
426 
427 static const struct of_device_id emev2_dt_irq_match[] = {
428 	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, },
429 	{},
430 };
431 
432 static const char *emev2_boards_compat_dt[] __initdata = {
433 	"renesas,emev2",
434 	NULL,
435 };
436 
437 void __init emev2_init_irq_dt(void)
438 {
439 	of_irq_init(emev2_dt_irq_match);
440 }
441 
442 DT_MACHINE_START(EMEV2_DT, "Generic Emma Mobile EV2 (Flattened Device Tree)")
443 	.init_early	= emev2_init_delay,
444 	.nr_irqs	= NR_IRQS_LEGACY,
445 	.init_irq	= emev2_init_irq_dt,
446 	.handle_irq	= gic_handle_irq,
447 	.init_machine	= emev2_add_standard_devices_dt,
448 	.timer		= &shmobile_timer,
449 	.dt_compat	= emev2_boards_compat_dt,
450 MACHINE_END
451 
452 #endif /* CONFIG_USE_OF */
453