2010-10-20 14:43:35 +04:00
/* linux/arch/arm/mach-s3c2416/pm.c
*
* Copyright ( c ) 2010 Samsung Electronics Co . , Ltd .
* http : //www.samsung.com
*
* S3C2416 - PM support ( Based on Ben Dooks ' S3C2412 PM support )
*
* 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/sysdev.h>
2011-04-23 00:03:21 +04:00
# include <linux/syscore_ops.h>
2010-10-20 14:43:35 +04:00
# include <linux/io.h>
# include <asm/cacheflush.h>
# include <mach/regs-power.h>
# include <mach/regs-s3c2443-clock.h>
# include <plat/cpu.h>
# include <plat/pm.h>
extern void s3c2412_sleep_enter ( void ) ;
2011-06-21 22:29:26 +04:00
static void s3c2416_cpu_suspend ( unsigned long arg )
2010-10-20 14:43:35 +04:00
{
/* enable wakeup sources regardless of battery state */
__raw_writel ( S3C2443_PWRCFG_SLEEP , S3C2443_PWRCFG ) ;
/* set the mode as sleep, 2BED represents "Go to BED" */
__raw_writel ( 0x2BED , S3C2443_PWRMODE ) ;
s3c2412_sleep_enter ( ) ;
}
static void s3c2416_pm_prepare ( void )
{
/*
* write the magic value u - boot uses to check for resume into
* the INFORM0 register , and ensure INFORM1 is set to the
* correct address to resume from .
*/
__raw_writel ( 0x2BED , S3C2412_INFORM0 ) ;
__raw_writel ( virt_to_phys ( s3c_cpu_resume ) , S3C2412_INFORM1 ) ;
}
static int s3c2416_pm_add ( struct sys_device * sysdev )
{
pm_cpu_prep = s3c2416_pm_prepare ;
pm_cpu_sleep = s3c2416_cpu_suspend ;
return 0 ;
}
2011-04-23 00:03:21 +04:00
static struct sysdev_driver s3c2416_pm_driver = {
. add = s3c2416_pm_add ,
} ;
static __init int s3c2416_pm_init ( void )
2010-10-20 14:43:35 +04:00
{
2011-04-23 00:03:21 +04:00
return sysdev_driver_register ( & s3c2416_sysclass , & s3c2416_pm_driver ) ;
2010-10-20 14:43:35 +04:00
}
2011-04-23 00:03:21 +04:00
arch_initcall ( s3c2416_pm_init ) ;
static void s3c2416_pm_resume ( void )
2010-10-20 14:43:35 +04:00
{
/* unset the return-from-sleep amd inform flags */
__raw_writel ( 0x0 , S3C2443_PWRMODE ) ;
__raw_writel ( 0x0 , S3C2412_INFORM0 ) ;
__raw_writel ( 0x0 , S3C2412_INFORM1 ) ;
}
2011-04-23 00:03:21 +04:00
struct syscore_ops s3c2416_pm_syscore_ops = {
2010-10-20 14:43:35 +04:00
. resume = s3c2416_pm_resume ,
} ;