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 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 396 void __init emev2_add_standard_devices(void) 397 { 398 emev2_clock_init(); 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 407 void __init emev2_init_delay(void) 408 { 409 shmobile_setup_delay(533, 1, 3); /* Cortex-A9 @ 533MHz */ 410 } 411 412 void __init emev2_add_early_devices(void) 413 { 414 emev2_init_delay(); 415 416 early_platform_add_devices(emev2_early_devices, 417 ARRAY_SIZE(emev2_early_devices)); 418 419 /* setup early console here as well */ 420 shmobile_setup_console(); 421 } 422 423 void __init emev2_init_irq(void) 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 .init_time = shmobile_timer_init, 471 .dt_compat = emev2_boards_compat_dt, 472 MACHINE_END 473 474 #endif /* CONFIG_USE_OF */ 475