1/* linux/arch/arm/mach-s3c2410/s3c2410.c 2 * 3 * Copyright (c) 2003-2005 Simtec Electronics 4 * Ben Dooks <ben@simtec.co.uk> 5 * 6 * http://www.simtec.co.uk/products/EB2410ITX/ 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 version 2 as 10 * published by the Free Software Foundation. 11*/ 12 13#include <linux/kernel.h> 14#include <linux/types.h> 15#include <linux/interrupt.h> 16#include <linux/list.h> 17#include <linux/timer.h> 18#include <linux/init.h> 19#include <linux/gpio.h> 20#include <linux/clk.h> 21#include <linux/device.h> 22#include <linux/syscore_ops.h> 23#include <linux/serial_core.h> 24#include <linux/serial_s3c.h> 25#include <linux/platform_device.h> 26#include <linux/reboot.h> 27#include <linux/io.h> 28 29#include <asm/mach/arch.h> 30#include <asm/mach/map.h> 31#include <asm/mach/irq.h> 32 33#include <mach/hardware.h> 34#include <mach/gpio-samsung.h> 35#include <asm/irq.h> 36#include <asm/system_misc.h> 37 38#include <plat/cpu-freq.h> 39 40#include <mach/regs-clock.h> 41 42#include <plat/cpu.h> 43#include <plat/devs.h> 44#include <plat/pm.h> 45 46#include <plat/gpio-core.h> 47#include <plat/gpio-cfg.h> 48#include <plat/gpio-cfg-helpers.h> 49 50#include "common.h" 51 52/* Initial IO mappings */ 53 54static struct map_desc s3c2410_iodesc[] __initdata = { 55 IODESC_ENT(CLKPWR), 56 IODESC_ENT(TIMER), 57 IODESC_ENT(WATCHDOG), 58}; 59 60/* our uart devices */ 61 62/* uart registration process */ 63 64void __init s3c2410_init_uarts(struct s3c2410_uartcfg *cfg, int no) 65{ 66 s3c24xx_init_uartdevs("s3c2410-uart", s3c2410_uart_resources, cfg, no); 67} 68 69/* s3c2410_map_io 70 * 71 * register the standard cpu IO areas, and any passed in from the 72 * machine specific initialisation. 73*/ 74 75void __init s3c2410_map_io(void) 76{ 77 s3c24xx_gpiocfg_default.set_pull = s3c24xx_gpio_setpull_1up; 78 s3c24xx_gpiocfg_default.get_pull = s3c24xx_gpio_getpull_1up; 79 80 iotable_init(s3c2410_iodesc, ARRAY_SIZE(s3c2410_iodesc)); 81} 82 83struct bus_type s3c2410_subsys = { 84 .name = "s3c2410-core", 85 .dev_name = "s3c2410-core", 86}; 87 88/* Note, we would have liked to name this s3c2410-core, but we cannot 89 * register two subsystems with the same name. 90 */ 91struct bus_type s3c2410a_subsys = { 92 .name = "s3c2410a-core", 93 .dev_name = "s3c2410a-core", 94}; 95 96static struct device s3c2410_dev = { 97 .bus = &s3c2410_subsys, 98}; 99 100/* need to register the subsystem before we actually register the device, and 101 * we also need to ensure that it has been initialised before any of the 102 * drivers even try to use it (even if not on an s3c2410 based system) 103 * as a driver which may support both 2410 and 2440 may try and use it. 104*/ 105 106static int __init s3c2410_core_init(void) 107{ 108 return subsys_system_register(&s3c2410_subsys, NULL); 109} 110 111core_initcall(s3c2410_core_init); 112 113static int __init s3c2410a_core_init(void) 114{ 115 return subsys_system_register(&s3c2410a_subsys, NULL); 116} 117 118core_initcall(s3c2410a_core_init); 119 120int __init s3c2410_init(void) 121{ 122 printk("S3C2410: Initialising architecture\n"); 123 124#ifdef CONFIG_PM_SLEEP 125 register_syscore_ops(&s3c2410_pm_syscore_ops); 126 register_syscore_ops(&s3c24xx_irq_syscore_ops); 127#endif 128 129 return device_register(&s3c2410_dev); 130} 131 132int __init s3c2410a_init(void) 133{ 134 s3c2410_dev.bus = &s3c2410a_subsys; 135 return s3c2410_init(); 136} 137