Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
setup-emev2.c
Go to the documentation of this file.
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>
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 resource pmu_resources[] = {
360  [0] = {
361  .start = 152,
362  .end = 152,
363  .flags = IORESOURCE_IRQ,
364  },
365  [1] = {
366  .start = 153,
367  .end = 153,
368  .flags = IORESOURCE_IRQ,
369  },
370 };
371 
372 static struct platform_device pmu_device = {
373  .name = "arm-pmu",
374  .id = -1,
375  .num_resources = ARRAY_SIZE(pmu_resources),
376  .resource = pmu_resources,
377 };
378 
379 static struct platform_device *emev2_early_devices[] __initdata = {
380  &uart0_device,
381  &uart1_device,
382  &uart2_device,
383  &uart3_device,
384 };
385 
386 static struct platform_device *emev2_late_devices[] __initdata = {
387  &sti_device,
388  &gio0_device,
389  &gio1_device,
390  &gio2_device,
391  &gio3_device,
392  &gio4_device,
393  &pmu_device,
394 };
395 
397 {
399 
400  platform_add_devices(emev2_early_devices,
401  ARRAY_SIZE(emev2_early_devices));
402 
403  platform_add_devices(emev2_late_devices,
404  ARRAY_SIZE(emev2_late_devices));
405 }
406 
408 {
409  shmobile_setup_delay(533, 1, 3); /* Cortex-A9 @ 533MHz */
410 }
411 
413 {
415 
416  early_platform_add_devices(emev2_early_devices,
417  ARRAY_SIZE(emev2_early_devices));
418 
419  /* setup early console here as well */
421 }
422 
424 {
425  void __iomem *gic_dist_base;
426  void __iomem *gic_cpu_base;
427 
428  /* Static mappings, never released */
429  gic_dist_base = ioremap(0xe0028000, PAGE_SIZE);
430  gic_cpu_base = ioremap(0xe0020000, PAGE_SIZE);
431  BUG_ON(!gic_dist_base || !gic_cpu_base);
432 
433  /* Use GIC to handle interrupts */
434  gic_init(0, 29, gic_dist_base, gic_cpu_base);
435 }
436 
437 #ifdef CONFIG_USE_OF
438 static const struct of_dev_auxdata emev2_auxdata_lookup[] __initconst = {
439  { }
440 };
441 
442 void __init emev2_add_standard_devices_dt(void)
443 {
444  of_platform_populate(NULL, of_default_bus_match_table,
445  emev2_auxdata_lookup, NULL);
446 }
447 
448 static const struct of_device_id emev2_dt_irq_match[] = {
449  { .compatible = "arm,cortex-a9-gic", .data = gic_of_init, },
450  {},
451 };
452 
453 static const char *emev2_boards_compat_dt[] __initdata = {
454  "renesas,emev2",
455  NULL,
456 };
457 
458 void __init emev2_init_irq_dt(void)
459 {
460  of_irq_init(emev2_dt_irq_match);
461 }
462 
463 DT_MACHINE_START(EMEV2_DT, "Generic Emma Mobile EV2 (Flattened Device Tree)")
464  .smp = smp_ops(emev2_smp_ops),
465  .init_early = emev2_init_delay,
466  .nr_irqs = NR_IRQS_LEGACY,
467  .init_irq = emev2_init_irq_dt,
468  .handle_irq = gic_handle_irq,
469  .init_machine = emev2_add_standard_devices_dt,
470  .timer = &shmobile_timer,
471  .dt_compat = emev2_boards_compat_dt,
473 
474 #endif /* CONFIG_USE_OF */