2014-03-18 07:28:10 +09:00
/*
* Copyright ( C ) 2013 Samsung Electronics Co . , Ltd .
* Tomasz Figa < t . figa @ samsung . com >
* Copyright ( C ) 2008 Openmoko , Inc .
* Copyright ( C ) 2004 - 2008 Simtec Electronics
* Ben Dooks < ben @ simtec . co . uk >
* http : //armlinux.simtec.co.uk/
*
* Samsung common power management helper functions .
*
* 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/io.h>
# include <linux/kernel.h>
# include <plat/pm-common.h>
/* helper functions to save and restore register state */
/**
* s3c_pm_do_save ( ) - save a set of registers for restoration on resume .
* @ ptr : Pointer to an array of registers .
* @ count : Size of the ptr array .
*
* Run through the list of registers given , saving their contents in the
* array for later restoration when we wakeup .
*/
void s3c_pm_do_save ( struct sleep_save * ptr , int count )
{
for ( ; count > 0 ; count - - , ptr + + ) {
2016-06-21 11:20:27 +01:00
ptr - > val = readl_relaxed ( ptr - > reg ) ;
2014-03-18 07:28:10 +09:00
S3C_PMDBG ( " saved %p value %08lx \n " , ptr - > reg , ptr - > val ) ;
}
}
/**
* s3c_pm_do_restore ( ) - restore register values from the save list .
* @ ptr : Pointer to an array of registers .
* @ count : Size of the ptr array .
*
* Restore the register values saved from s3c_pm_do_save ( ) .
*
* Note , we do not use S3C_PMDBG ( ) in here , as the system may not have
* restore the UARTs state yet
*/
void s3c_pm_do_restore ( const struct sleep_save * ptr , int count )
{
for ( ; count > 0 ; count - - , ptr + + ) {
pr_debug ( " restore %p (restore %08lx, was %08x) \n " ,
2016-06-21 11:20:27 +01:00
ptr - > reg , ptr - > val , readl_relaxed ( ptr - > reg ) ) ;
2014-03-18 07:28:10 +09:00
2016-06-21 11:20:27 +01:00
writel_relaxed ( ptr - > val , ptr - > reg ) ;
2014-03-18 07:28:10 +09:00
}
}
/**
* s3c_pm_do_restore_core ( ) - early restore register values from save list .
*
* This is similar to s3c_pm_do_restore ( ) except we try and minimise the
* side effects of the function in case registers that hardware might need
* to work has been restored .
*
* WARNING : Do not put any debug in here that may effect memory or use
* peripherals , as things may be changing !
*/
void s3c_pm_do_restore_core ( const struct sleep_save * ptr , int count )
{
for ( ; count > 0 ; count - - , ptr + + )
2016-06-21 11:20:27 +01:00
writel_relaxed ( ptr - > val , ptr - > reg ) ;
2014-03-18 07:28:10 +09:00
}