2009-06-23 16:40:15 +04:00
/* linux/arch/arm/mach-s5pc100/cpu.c
*
* Copyright 2009 Samsung Electronics Co .
* Byungho Min < bhmin @ samsung . com >
*
* Based on mach - s3c6410 / cpu . c
*
* 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>
# include <linux/clk.h>
# include <linux/io.h>
# include <linux/sysdev.h>
# include <linux/serial_core.h>
# include <linux/platform_device.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
# include <asm/mach/irq.h>
2010-05-20 09:51:08 +04:00
# include <asm/proc-fns.h>
2009-06-23 16:40:15 +04:00
# include <mach/hardware.h>
# include <mach/map.h>
# include <asm/irq.h>
# include <plat/regs-serial.h>
2010-05-20 09:51:08 +04:00
# include <mach/regs-clock.h>
2009-06-23 16:40:15 +04:00
# include <plat/cpu.h>
# include <plat/devs.h>
# include <plat/clock.h>
2010-06-08 12:02:08 +04:00
# include <plat/ata-core.h>
2009-06-23 16:40:15 +04:00
# include <plat/iic-core.h>
2010-05-20 09:51:08 +04:00
# include <plat/sdhci.h>
2010-06-30 16:50:24 +04:00
# include <plat/adc-core.h>
2010-05-20 10:59:05 +04:00
# include <plat/onenand-core.h>
2010-08-11 05:02:37 +04:00
# include <plat/fb-core.h>
2010-05-20 10:59:05 +04:00
2009-06-23 16:40:15 +04:00
# include <plat/s5pc100.h>
/* Initial IO mappings */
static struct map_desc s5pc100_iodesc [ ] __initdata = {
2010-05-20 09:51:08 +04:00
{
. virtual = ( unsigned long ) S5P_VA_SYSTIMER ,
. pfn = __phys_to_pfn ( S5PC100_PA_SYSTIMER ) ,
. length = SZ_16K ,
. type = MT_DEVICE ,
} , {
. virtual = ( unsigned long ) VA_VIC2 ,
2010-05-23 19:17:10 +04:00
. pfn = __phys_to_pfn ( S5P_PA_VIC2 ) ,
2010-05-20 09:51:08 +04:00
. length = SZ_16K ,
. type = MT_DEVICE ,
} , {
. virtual = ( unsigned long ) S5PC100_VA_OTHERS ,
. pfn = __phys_to_pfn ( S5PC100_PA_OTHERS ) ,
. length = SZ_4K ,
. type = MT_DEVICE ,
}
2009-06-23 16:40:15 +04:00
} ;
2009-11-17 10:41:17 +03:00
static void s5pc100_idle ( void )
{
2010-05-20 09:51:08 +04:00
if ( ! need_resched ( ) )
cpu_do_idle ( ) ;
2009-11-17 10:41:17 +03:00
2010-05-20 09:51:08 +04:00
local_irq_enable ( ) ;
2009-11-17 10:41:17 +03:00
}
2009-06-23 16:40:15 +04:00
/* s5pc100_map_io
*
* register the standard cpu IO areas
*/
void __init s5pc100_map_io ( void )
{
iotable_init ( s5pc100_iodesc , ARRAY_SIZE ( s5pc100_iodesc ) ) ;
/* initialise device information early */
2009-11-17 10:41:23 +03:00
s5pc100_default_sdhci0 ( ) ;
s5pc100_default_sdhci1 ( ) ;
s5pc100_default_sdhci2 ( ) ;
2009-11-17 10:41:21 +03:00
2010-06-30 16:50:24 +04:00
s3c_adc_setname ( " s3c64xx-adc " ) ;
2009-11-17 10:41:21 +03:00
/* the i2c devices are directly compatible with s3c2440 */
s3c_i2c0_setname ( " s3c2440-i2c " ) ;
s3c_i2c1_setname ( " s3c2440-i2c " ) ;
2010-05-20 10:59:05 +04:00
s3c_onenand_setname ( " s5pc100-onenand " ) ;
2010-08-11 05:02:37 +04:00
s3c_fb_setname ( " s5pc100-fb " ) ;
2010-06-08 12:02:08 +04:00
s3c_cfcon_setname ( " s5pc100-pata " ) ;
2009-06-23 16:40:15 +04:00
}
void __init s5pc100_init_clocks ( int xtal )
{
2010-05-20 09:51:08 +04:00
printk ( KERN_DEBUG " %s: initializing clocks \n " , __func__ ) ;
2009-06-23 16:40:15 +04:00
s3c24xx_register_baseclocks ( xtal ) ;
2010-05-20 09:51:08 +04:00
s5p_register_clocks ( xtal ) ;
2009-06-23 16:40:15 +04:00
s5pc100_register_clocks ( ) ;
s5pc100_setup_clocks ( ) ;
}
void __init s5pc100_init_irq ( void )
{
2010-05-20 09:51:08 +04:00
u32 vic [ ] = { ~ 0 , ~ 0 , ~ 0 } ;
2009-06-23 16:40:15 +04:00
/* VIC0, VIC1, and VIC2 are fully populated. */
2010-05-20 09:51:08 +04:00
s5p_init_irq ( vic , ARRAY_SIZE ( vic ) ) ;
2009-06-23 16:40:15 +04:00
}
2010-05-20 09:51:08 +04:00
static struct sysdev_class s5pc100_sysclass = {
2009-06-23 16:40:15 +04:00
. name = " s5pc100-core " ,
} ;
static struct sys_device s5pc100_sysdev = {
. cls = & s5pc100_sysclass ,
} ;
static int __init s5pc100_core_init ( void )
{
return sysdev_class_register ( & s5pc100_sysclass ) ;
}
core_initcall ( s5pc100_core_init ) ;
int __init s5pc100_init ( void )
{
2010-05-20 09:51:08 +04:00
printk ( KERN_INFO " S5PC100: Initializing architecture \n " ) ;
2009-06-23 16:40:15 +04:00
2010-05-20 09:51:08 +04:00
/* set idle function */
pm_idle = s5pc100_idle ;
2009-11-17 10:41:17 +03:00
2009-06-23 16:40:15 +04:00
return sysdev_register ( & s5pc100_sysdev ) ;
}