1a21765a70ec06be175d3997320a83fa66fcc8955Ben Dooks/* linux/arch/arm/plat-s3c24xx/s3c244x.c 296ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks * 396ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks * Copyright (c) 2004-2006 Simtec Electronics 496ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks * Ben Dooks <ben@simtec.co.uk> 596ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks * 6e4d06e39530559513c7e335ef7ca4675f8146220Ben Dooks * Samsung S3C2440 and S3C2442 Mobile CPU support (not S3C2443) 796ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks * 896ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks * This program is free software; you can redistribute it and/or modify 996ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks * it under the terms of the GNU General Public License version 2 as 1096ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks * published by the Free Software Foundation. 1196ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks*/ 1296ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 1396ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks#include <linux/kernel.h> 1496ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks#include <linux/types.h> 1596ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks#include <linux/interrupt.h> 1696ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks#include <linux/list.h> 1796ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks#include <linux/timer.h> 1896ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks#include <linux/init.h> 19b6d1f542e3f44f8988b601e3ca6277c143282179Ben Dooks#include <linux/serial_core.h> 20334a1c70bb03d7077849e88d8571a32d1d36194dTushar Behera#include <linux/serial_s3c.h> 2196ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks#include <linux/platform_device.h> 227b6d864b48d95e6ea1df7df64475b9cb9616dcf9Robin Holt#include <linux/reboot.h> 234a858cfc9af87cc60b3113c3b7b377a4305eac6aKay Sievers#include <linux/device.h> 24bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki#include <linux/syscore_ops.h> 2596ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks#include <linux/clk.h> 26fced80c735941fa518ac67c0b61bbe153fb8c050Russell King#include <linux/io.h> 2796ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 289f97da78bf018206fb623cd351d454af2f105fe0David Howells#include <asm/system_misc.h> 2996ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks#include <asm/mach/arch.h> 3096ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks#include <asm/mach/map.h> 3196ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks#include <asm/mach/irq.h> 3296ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 33a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/hardware.h> 3496ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks#include <asm/irq.h> 3596ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 36e425382ed90d221ef9031a1b2d97d9bfedcf90c3Ben Dooks#include <plat/cpu-freq.h> 37e425382ed90d221ef9031a1b2d97d9bfedcf90c3Ben Dooks 38a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/regs-clock.h> 39a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/regs-gpio.h> 4096ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 41a2b7ba9ca471438c2bb0c3bdf0ff2ed7fdce3d2fBen Dooks#include <plat/devs.h> 42a2b7ba9ca471438c2bb0c3bdf0ff2ed7fdce3d2fBen Dooks#include <plat/cpu.h> 43a2b7ba9ca471438c2bb0c3bdf0ff2ed7fdce3d2fBen Dooks#include <plat/pm.h> 44ef3f2dd4810cca5bf5b1d3648968b50fb267d5e2Atul Dahiya#include <plat/nand-core.h> 4596ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 4651cb128987d96538fdea4ce3704e79257afad4a5Heiko Stuebner#include "common.h" 47b4353784ea6d5fd4cffa7498b656f5a72d20f2cdKukjin Kim#include "regs-dsc.h" 48b4353784ea6d5fd4cffa7498b656f5a72d20f2cdKukjin Kim 4996ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooksstatic struct map_desc s3c244x_iodesc[] __initdata = { 5096ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks IODESC_ENT(CLKPWR), 5196ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks IODESC_ENT(TIMER), 5296ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks IODESC_ENT(WATCHDOG), 5396ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks}; 5496ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 5596ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks/* uart initialisation */ 5696ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 5796ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooksvoid __init s3c244x_init_uarts(struct s3c2410_uartcfg *cfg, int no) 5896ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks{ 5996ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks s3c24xx_init_uartdevs("s3c2440-uart", s3c2410_uart_resources, cfg, no); 6096ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks} 6196ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 6274b265d4e0555b9fc9cc75eb8876140ecf8c6b8aBen Dooksvoid __init s3c244x_map_io(void) 6396ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks{ 6496ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks /* register our io-tables */ 6596ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 6696ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks iotable_init(s3c244x_iodesc, ARRAY_SIZE(s3c244x_iodesc)); 6796ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 6896ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks /* rename any peripherals used differing from the s3c2410 */ 6996ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 7090239bbd598c6a0fc7f2c7352e9886bd3be968d0Ben Dooks s3c_device_sdi.name = "s3c2440-sdi"; 713e1b776c2b9807d3af5945d5ece86dce9dfb0279Ben Dooks s3c_device_i2c0.name = "s3c2440-i2c"; 72ef3f2dd4810cca5bf5b1d3648968b50fb267d5e2Atul Dahiya s3c_nand_setname("s3c2440-nand"); 73ce8877b542d946ee4fb29b57dc9d6549648b1558Arnaud Patard s3c_device_ts.name = "s3c2440-ts"; 74b8ccca4a57c91dfd81b0a50e16942699bb01600aBen Dooks s3c_device_usbgadget.name = "s3c2440-usbgadget"; 7551cb128987d96538fdea4ce3704e79257afad4a5Heiko Stuebner s3c2410_device_dclk.name = "s3c2440-dclk"; 7696ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks} 7796ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 784a858cfc9af87cc60b3113c3b7b377a4305eac6aKay Sievers/* Since the S3C2442 and S3C2440 share items, put both subsystems here */ 7996ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 804a858cfc9af87cc60b3113c3b7b377a4305eac6aKay Sieversstruct bus_type s3c2440_subsys = { 81af5ca3f4ec5cc4432a42a73b050dd8898ce8fd00Kay Sievers .name = "s3c2440-core", 824a858cfc9af87cc60b3113c3b7b377a4305eac6aKay Sievers .dev_name = "s3c2440-core", 8396ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks}; 8496ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 854a858cfc9af87cc60b3113c3b7b377a4305eac6aKay Sieversstruct bus_type s3c2442_subsys = { 86af5ca3f4ec5cc4432a42a73b050dd8898ce8fd00Kay Sievers .name = "s3c2442-core", 874a858cfc9af87cc60b3113c3b7b377a4305eac6aKay Sievers .dev_name = "s3c2442-core", 8896ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks}; 8996ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 904a858cfc9af87cc60b3113c3b7b377a4305eac6aKay Sievers/* need to register the subsystem before we actually register the device, and 9196ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks * we also need to ensure that it has been initialised before any of the 9296ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks * drivers even try to use it (even if not on an s3c2440 based system) 9396ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks * as a driver which may support both 2410 and 2440 may try and use it. 9496ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks*/ 9596ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 9696ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooksstatic int __init s3c2440_core_init(void) 9796ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks{ 984a858cfc9af87cc60b3113c3b7b377a4305eac6aKay Sievers return subsys_system_register(&s3c2440_subsys, NULL); 9996ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks} 10096ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 10196ce2385dd2817da549910001a69ac0a2762a1b9Ben Dookscore_initcall(s3c2440_core_init); 10296ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 10396ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooksstatic int __init s3c2442_core_init(void) 10496ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks{ 1054a858cfc9af87cc60b3113c3b7b377a4305eac6aKay Sievers return subsys_system_register(&s3c2442_subsys, NULL); 10696ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks} 10796ce2385dd2817da549910001a69ac0a2762a1b9Ben Dooks 10896ce2385dd2817da549910001a69ac0a2762a1b9Ben Dookscore_initcall(s3c2442_core_init); 109bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki 110bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki 111bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki#ifdef CONFIG_PM 112bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysockistatic struct sleep_save s3c244x_sleep[] = { 113bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki SAVE_ITEM(S3C2440_DSC0), 114bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki SAVE_ITEM(S3C2440_DSC1), 115bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki SAVE_ITEM(S3C2440_GPJDAT), 116bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki SAVE_ITEM(S3C2440_GPJCON), 117bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki SAVE_ITEM(S3C2440_GPJUP) 118bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki}; 119bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki 120bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysockistatic int s3c244x_suspend(void) 121bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki{ 122bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki s3c_pm_do_save(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep)); 123bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki return 0; 124bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki} 125bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki 126bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysockistatic void s3c244x_resume(void) 127bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki{ 128bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki s3c_pm_do_restore(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep)); 129bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki} 130bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki#else 131bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki#define s3c244x_suspend NULL 132bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki#define s3c244x_resume NULL 133bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki#endif 134bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki 135bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysockistruct syscore_ops s3c244x_pm_syscore_ops = { 136bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki .suspend = s3c244x_suspend, 137bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki .resume = s3c244x_resume, 138bb072c3cf21d1c9a5a2eeb5a00679ee7bf39675bRafael J. Wysocki}; 139