2013-01-02 11:04:57 -08:00
/*
2006-06-24 21:21:27 +01:00
* Copyright ( c ) 2006 Simtec Electronics
* Ben Dooks < ben @ simtec . co . uk >
*
* http : //armlinux.simtec.co.uk/.
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# include <linux/kernel.h>
# include <linux/types.h>
# include <linux/interrupt.h>
# include <linux/list.h>
# include <linux/timer.h>
# include <linux/init.h>
2008-10-21 14:06:38 +01:00
# include <linux/clk.h>
2007-05-28 18:19:16 +01:00
# include <linux/delay.h>
2011-12-21 16:01:38 -08:00
# include <linux/device.h>
2011-04-22 22:03:21 +02:00
# include <linux/syscore_ops.h>
2006-12-17 23:22:26 +01:00
# include <linux/serial_core.h>
2014-02-14 10:32:45 +09:00
# include <linux/serial_s3c.h>
2006-06-24 21:21:27 +01:00
# include <linux/platform_device.h>
2008-09-06 12:10:45 +01:00
# include <linux/io.h>
2013-07-08 16:01:40 -07:00
# include <linux/reboot.h>
2006-06-24 21:21:27 +01:00
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
# include <asm/mach/irq.h>
2006-09-14 13:29:15 +01:00
# include <asm/proc-fns.h>
2006-06-24 21:21:27 +01:00
# include <asm/irq.h>
2012-03-28 18:30:01 +01:00
# include <asm/system_misc.h>
2006-06-24 21:21:27 +01:00
2013-01-02 11:04:57 -08:00
# include <mach/hardware.h>
2008-08-05 16:14:15 +01:00
# include <mach/regs-clock.h>
2013-01-02 11:04:57 -08:00
# include <mach/regs-gpio.h>
2006-06-24 21:21:27 +01:00
2008-10-07 22:26:09 +01:00
# include <plat/cpu.h>
2013-01-02 11:04:57 -08:00
# include <plat/cpu-freq.h>
2008-10-07 22:26:09 +01:00
# include <plat/devs.h>
2013-01-02 11:04:57 -08:00
# include <plat/pm.h>
# include <plat/regs-spi.h>
2013-01-29 10:25:22 -08:00
# include "common.h"
2015-07-30 02:00:35 +09:00
# include "nand-core.h"
2013-01-02 14:01:09 -08:00
# include "regs-dsc.h"
2013-02-01 21:49:35 -08:00
# include "s3c2412-power.h"
2013-01-02 14:01:09 -08:00
2006-06-24 21:21:27 +01:00
# ifndef CONFIG_CPU_S3C2412_ONLY
void __iomem * s3c24xx_va_gpio2 = S3C24XX_VA_GPIO ;
2006-09-18 10:19:06 +01:00
static inline void s3c2412_init_gpio2 ( void )
{
s3c24xx_va_gpio2 = S3C24XX_VA_GPIO + 0x10 ;
}
# else
# define s3c2412_init_gpio2() do { } while(0)
2006-06-24 21:21:27 +01:00
# endif
/* Initial IO mappings */
static struct map_desc s3c2412_iodesc [ ] __initdata = {
IODESC_ENT ( CLKPWR ) ,
IODESC_ENT ( TIMER ) ,
IODESC_ENT ( WATCHDOG ) ,
2009-07-30 23:23:36 +01:00
{
. virtual = ( unsigned long ) S3C2412_VA_SSMC ,
. pfn = __phys_to_pfn ( S3C2412_PA_SSMC ) ,
. length = SZ_1M ,
. type = MT_DEVICE ,
} ,
{
. virtual = ( unsigned long ) S3C2412_VA_EBI ,
. pfn = __phys_to_pfn ( S3C2412_PA_EBI ) ,
. length = SZ_1M ,
. type = MT_DEVICE ,
} ,
2006-06-24 21:21:27 +01:00
} ;
/* uart registration process */
void __init s3c2412_init_uarts ( struct s3c2410_uartcfg * cfg , int no )
{
s3c24xx_init_uartdevs ( " s3c2412-uart " , s3c2410_uart_resources , cfg , no ) ;
/* rename devices that are s3c2412/s3c2413 specific */
s3c_device_sdi . name = " s3c2412-sdi " ;
2006-09-20 20:46:09 +01:00
s3c_device_lcd . name = " s3c2412-lcd " ;
2010-10-18 19:56:45 +09:00
s3c_nand_setname ( " s3c2412-nand " ) ;
2007-05-16 10:51:45 +01:00
2007-10-04 21:41:20 +01:00
/* alter IRQ of SDI controller */
s3c_device_sdi . resource [ 1 ] . start = IRQ_S3C2412_SDI ;
s3c_device_sdi . resource [ 1 ] . end = IRQ_S3C2412_SDI ;
2007-05-16 10:51:45 +01:00
/* spi channel related changes, s3c2412/13 specific */
s3c_device_spi0 . name = " s3c2412-spi " ;
s3c_device_spi0 . resource [ 0 ] . end = S3C24XX_PA_SPI + 0x24 ;
s3c_device_spi1 . name = " s3c2412-spi " ;
s3c_device_spi1 . resource [ 0 ] . start = S3C24XX_PA_SPI + S3C2412_SPI1 ;
s3c_device_spi1 . resource [ 0 ] . end = S3C24XX_PA_SPI + S3C2412_SPI1 + 0x24 ;
2006-06-24 21:21:27 +01:00
}
2006-09-14 13:29:15 +01:00
/* s3c2412_idle
*
* use the standard idle call by ensuring the idle mode
* in power config , then issuing the idle co - processor
* instruction
*/
static void s3c2412_idle ( void )
{
unsigned long tmp ;
/* ensure our idle mode is to go to idle */
tmp = __raw_readl ( S3C2412_PWRCFG ) ;
tmp & = ~ S3C2412_PWRCFG_STANDBYWFI_MASK ;
tmp | = S3C2412_PWRCFG_STANDBYWFI_IDLE ;
__raw_writel ( tmp , S3C2412_PWRCFG ) ;
cpu_do_idle ( ) ;
}
2006-06-24 21:21:27 +01:00
/* s3c2412_map_io
*
* register the standard cpu IO areas , and any passed in from the
* machine specific initialisation .
*/
2008-10-21 14:06:31 +01:00
void __init s3c2412_map_io ( void )
2006-06-24 21:21:27 +01:00
{
/* move base of IO */
2006-09-18 10:19:06 +01:00
s3c2412_init_gpio2 ( ) ;
2006-06-24 21:21:27 +01:00
2006-09-14 13:29:15 +01:00
/* set our idle function */
2011-08-03 11:34:59 -04:00
arm_pm_idle = s3c2412_idle ;
2006-09-14 13:29:15 +01:00
2006-06-24 21:21:27 +01:00
/* register our io-tables */
iotable_init ( s3c2412_iodesc , ARRAY_SIZE ( s3c2412_iodesc ) ) ;
}
2011-12-21 16:01:38 -08:00
/* need to register the subsystem before we actually register the device, and
2006-06-24 21:21:27 +01:00
* we also need to ensure that it has been initialised before any of the
* drivers even try to use it ( even if not on an s3c2412 based system )
* as a driver which may support both 2410 and 2440 may try and use it .
*/
2011-12-21 16:01:38 -08:00
struct bus_type s3c2412_subsys = {
2007-12-20 02:09:39 +01:00
. name = " s3c2412-core " ,
2011-12-21 16:01:38 -08:00
. dev_name = " s3c2412-core " ,
2006-06-24 21:21:27 +01:00
} ;
static int __init s3c2412_core_init ( void )
{
2011-12-21 16:01:38 -08:00
return subsys_system_register ( & s3c2412_subsys , NULL ) ;
2006-06-24 21:21:27 +01:00
}
core_initcall ( s3c2412_core_init ) ;
2011-12-21 16:01:38 -08:00
static struct device s3c2412_dev = {
. bus = & s3c2412_subsys ,
2006-06-24 21:21:27 +01:00
} ;
int __init s3c2412_init ( void )
{
printk ( " S3C2412: Initialising architecture \n " ) ;
2015-02-27 05:50:22 +09:00
# ifdef CONFIG_PM_SLEEP
2011-04-22 22:03:21 +02:00
register_syscore_ops ( & s3c2412_pm_syscore_ops ) ;
register_syscore_ops ( & s3c24xx_irq_syscore_ops ) ;
2013-01-29 10:25:22 -08:00
# endif
2011-04-22 22:03:21 +02:00
2011-12-21 16:01:38 -08:00
return device_register ( & s3c2412_dev ) ;
2006-06-24 21:21:27 +01:00
}