s3c244x.c (3006B)
1// SPDX-License-Identifier: GPL-2.0 2// 3// Copyright (c) 2004-2006 Simtec Electronics 4// Ben Dooks <ben@simtec.co.uk> 5// 6// Samsung S3C2440 and S3C2442 Mobile CPU support (not S3C2443) 7 8#include <linux/kernel.h> 9#include <linux/types.h> 10#include <linux/interrupt.h> 11#include <linux/list.h> 12#include <linux/timer.h> 13#include <linux/init.h> 14#include <linux/serial_core.h> 15#include <linux/serial_s3c.h> 16#include <linux/platform_device.h> 17#include <linux/reboot.h> 18#include <linux/device.h> 19#include <linux/syscore_ops.h> 20#include <linux/clk.h> 21#include <linux/io.h> 22 23#include <asm/system_misc.h> 24#include <asm/mach/arch.h> 25#include <asm/mach/map.h> 26#include <asm/mach/irq.h> 27 28#include "map.h" 29#include <asm/irq.h> 30 31#include "regs-clock.h" 32#include "regs-gpio.h" 33 34#include "devs.h" 35#include "cpu.h" 36#include "pm.h" 37 38#include "s3c24xx.h" 39#include "nand-core-s3c24xx.h" 40#include "regs-dsc-s3c24xx.h" 41 42static struct map_desc s3c244x_iodesc[] __initdata __maybe_unused = { 43 IODESC_ENT(CLKPWR), 44 IODESC_ENT(TIMER), 45 IODESC_ENT(WATCHDOG), 46}; 47 48/* uart initialisation */ 49 50void __init s3c244x_init_uarts(struct s3c2410_uartcfg *cfg, int no) 51{ 52 s3c24xx_init_uartdevs("s3c2440-uart", s3c2410_uart_resources, cfg, no); 53} 54 55void __init s3c244x_map_io(void) 56{ 57 /* register our io-tables */ 58 59 iotable_init(s3c244x_iodesc, ARRAY_SIZE(s3c244x_iodesc)); 60 61 /* rename any peripherals used differing from the s3c2410 */ 62 63 s3c_device_sdi.name = "s3c2440-sdi"; 64 s3c_device_i2c0.name = "s3c2440-i2c"; 65 s3c_nand_setname("s3c2440-nand"); 66 s3c_device_ts.name = "s3c2440-ts"; 67 s3c_device_usbgadget.name = "s3c2440-usbgadget"; 68 s3c2410_device_dclk.name = "s3c2440-dclk"; 69} 70 71/* Since the S3C2442 and S3C2440 share items, put both subsystems here */ 72 73struct bus_type s3c2440_subsys = { 74 .name = "s3c2440-core", 75 .dev_name = "s3c2440-core", 76}; 77 78struct bus_type s3c2442_subsys = { 79 .name = "s3c2442-core", 80 .dev_name = "s3c2442-core", 81}; 82 83/* need to register the subsystem before we actually register the device, and 84 * we also need to ensure that it has been initialised before any of the 85 * drivers even try to use it (even if not on an s3c2440 based system) 86 * as a driver which may support both 2410 and 2440 may try and use it. 87*/ 88 89static int __init s3c2440_core_init(void) 90{ 91 return subsys_system_register(&s3c2440_subsys, NULL); 92} 93 94core_initcall(s3c2440_core_init); 95 96static int __init s3c2442_core_init(void) 97{ 98 return subsys_system_register(&s3c2442_subsys, NULL); 99} 100 101core_initcall(s3c2442_core_init); 102 103 104#ifdef CONFIG_PM_SLEEP 105static struct sleep_save s3c244x_sleep[] = { 106 SAVE_ITEM(S3C2440_DSC0), 107 SAVE_ITEM(S3C2440_DSC1), 108 SAVE_ITEM(S3C2440_GPJDAT), 109 SAVE_ITEM(S3C2440_GPJCON), 110 SAVE_ITEM(S3C2440_GPJUP) 111}; 112 113static int s3c244x_suspend(void) 114{ 115 s3c_pm_do_save(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep)); 116 return 0; 117} 118 119static void s3c244x_resume(void) 120{ 121 s3c_pm_do_restore(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep)); 122} 123 124struct syscore_ops s3c244x_pm_syscore_ops = { 125 .suspend = s3c244x_suspend, 126 .resume = s3c244x_resume, 127}; 128#endif