2017-12-25 20:54:32 +01:00
// SPDX-License-Identifier: GPL-2.0+
//
// Copyright (c) 2004-2006 Simtec Electronics
// Ben Dooks <ben@simtec.co.uk>
//
// S3C24XX Power Manager (Suspend-To-RAM) support
//
// See Documentation/arm/Samsung-S3C24XX/Suspend.txt for more information
//
// Parts based on arch/arm/mach-pxa/pm.c
//
// Thanks to Dimitry Andric for debugging
2007-02-11 18:31:01 +01:00
# include <linux/init.h>
# include <linux/suspend.h>
# include <linux/errno.h>
# include <linux/time.h>
2009-05-13 22:52:24 +01:00
# include <linux/gpio.h>
2007-02-11 18:31:01 +01:00
# include <linux/interrupt.h>
# include <linux/serial_core.h>
2014-02-14 10:32:45 +09:00
# include <linux/serial_s3c.h>
2008-09-06 12:10:45 +01:00
# include <linux/io.h>
2007-02-11 18:31:01 +01:00
2008-08-05 16:14:15 +01:00
# include <mach/regs-clock.h>
# include <mach/regs-gpio.h>
# include <mach/regs-irq.h>
2014-01-14 14:24:24 +01:00
# include <mach/gpio-samsung.h>
2007-02-11 18:31:01 +01:00
# include <asm/mach/time.h>
2010-05-04 14:38:49 +09:00
# include <plat/gpio-cfg.h>
2008-10-07 22:26:09 +01:00
# include <plat/pm.h>
2007-02-11 18:31:01 +01:00
2013-02-03 17:00:11 -08:00
# include "regs-mem.h"
2007-02-11 18:31:01 +01:00
# define PFX "s3c24xx-pm: "
2015-02-27 05:50:22 +09:00
# ifdef CONFIG_PM_SLEEP
2007-02-11 18:31:01 +01:00
static struct sleep_save core_save [ ] = {
/* we restore the timings here, with the proviso that the board
* brings the system up in an slower , or equal frequency setting
* to the original system .
*
* if we cannot guarantee this , then things are going to go very
* wrong here , as we modify the refresh and both pll settings .
*/
SAVE_ITEM ( S3C2410_BWSCON ) ,
SAVE_ITEM ( S3C2410_BANKCON0 ) ,
SAVE_ITEM ( S3C2410_BANKCON1 ) ,
SAVE_ITEM ( S3C2410_BANKCON2 ) ,
SAVE_ITEM ( S3C2410_BANKCON3 ) ,
SAVE_ITEM ( S3C2410_BANKCON4 ) ,
SAVE_ITEM ( S3C2410_BANKCON5 ) ,
} ;
2015-02-27 05:50:22 +09:00
# endif
2007-02-11 18:31:01 +01:00
2008-12-12 00:24:07 +00:00
/* s3c_pm_check_resume_pin
2007-02-11 18:31:01 +01:00
*
* check to see if the pin is configured correctly for sleep mode , and
* make any necessary adjustments if it is not
*/
2008-12-12 00:24:07 +00:00
static void s3c_pm_check_resume_pin ( unsigned int pin , unsigned int irqoffs )
2007-02-11 18:31:01 +01:00
{
unsigned long irqstate ;
unsigned long pinstate ;
2010-05-04 17:14:10 +09:00
int irq = gpio_to_irq ( pin ) ;
2007-02-11 18:31:01 +01:00
if ( irqoffs < 4 )
irqstate = s3c_irqwake_intmask & ( 1L < < irqoffs ) ;
else
irqstate = s3c_irqwake_eintmask & ( 1L < < irqoffs ) ;
2010-05-06 10:50:42 +09:00
pinstate = s3c_gpio_getcfg ( pin ) ;
2007-02-11 18:31:01 +01:00
if ( ! irqstate ) {
if ( pinstate = = S3C2410_GPIO_IRQ )
2010-05-06 10:50:42 +09:00
S3C_PMDBG ( " Leaving IRQ %d (pin %d) as is \n " , irq , pin ) ;
2007-02-11 18:31:01 +01:00
} else {
if ( pinstate = = S3C2410_GPIO_IRQ ) {
2008-12-12 00:24:06 +00:00
S3C_PMDBG ( " Disabling IRQ %d (pin %d) \n " , irq , pin ) ;
2010-05-04 14:38:49 +09:00
s3c_gpio_cfgpin ( pin , S3C2410_GPIO_INPUT ) ;
2007-02-11 18:31:01 +01:00
}
}
}
2008-12-12 00:24:08 +00:00
/* s3c_pm_configure_extint
2007-02-11 18:31:01 +01:00
*
* configure all external interrupt pins
*/
2008-12-12 00:24:08 +00:00
void s3c_pm_configure_extint ( void )
2007-02-11 18:31:01 +01:00
{
int pin ;
/* for each of the external interrupts (EINT0..EINT15) we
2012-09-19 21:48:00 -04:00
* need to check whether it is an external interrupt source ,
2007-02-11 18:31:01 +01:00
* and then configure it as an input if it is not
*/
2009-05-17 22:32:23 +01:00
for ( pin = S3C2410_GPF ( 0 ) ; pin < = S3C2410_GPF ( 7 ) ; pin + + ) {
s3c_pm_check_resume_pin ( pin , pin - S3C2410_GPF ( 0 ) ) ;
2007-02-11 18:31:01 +01:00
}
2009-05-17 22:32:23 +01:00
for ( pin = S3C2410_GPG ( 0 ) ; pin < = S3C2410_GPG ( 7 ) ; pin + + ) {
s3c_pm_check_resume_pin ( pin , ( pin - S3C2410_GPG ( 0 ) ) + 8 ) ;
2007-02-11 18:31:01 +01:00
}
}
2015-02-27 05:50:22 +09:00
# ifdef CONFIG_PM_SLEEP
2008-12-12 00:24:08 +00:00
void s3c_pm_restore_core ( void )
2007-02-11 18:31:01 +01:00
{
2008-12-12 00:24:06 +00:00
s3c_pm_do_restore_core ( core_save , ARRAY_SIZE ( core_save ) ) ;
2007-02-11 18:31:01 +01:00
}
2008-12-12 00:24:08 +00:00
void s3c_pm_save_core ( void )
2007-02-11 18:31:01 +01:00
{
2008-12-12 00:24:08 +00:00
s3c_pm_do_save ( core_save , ARRAY_SIZE ( core_save ) ) ;
2007-02-11 18:31:01 +01:00
}
2015-02-27 05:50:22 +09:00
# endif