2017-12-25 20:54:35 +01:00
// SPDX-License-Identifier: GPL-2.0
//
// 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.
2014-03-18 07:28:10 +09:00
# include <linux/io.h>
# include <linux/kernel.h>
2019-09-02 18:37:30 +02:00
# include "pm-common.h"
2014-03-18 07:28:10 +09:00
/* 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 .
2020-07-29 09:43:25 +02:00
* @ ptr : Pointer to an array of registers .
* @ count : Size of the ptr array .
2014-03-18 07:28:10 +09:00
*
* 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
}