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