oleavr-rgl-a500-mini-linux-.../drivers/soc/allwinner/pm_legacy/mem_tmr.c
Ole André Vadla Ravnås 169c65d57e Initial commit
2022-05-07 01:01:45 +02:00

206 lines
5.6 KiB
C

/*
* Copyright (c) 2007-2017 Allwinnertech Co., Ltd.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include "pm_i.h"
static __mem_tmr_reg_t *TmrReg;
static __u32 WatchDog1_Config_Reg_Bak, WatchDog1_Mod_Reg_Bak,
WatchDog1_Irq_En_Bak;
/*
*********************************************************************************************************
* TIMER save
*
* Description: save timer for mem.
*
* Arguments : none
*
* Returns : EPDK_TRUE/EPDK_FALSE;
*********************************************************************************************************
*/
__s32 mem_tmr_save(__mem_tmr_reg_t *ptmr_state)
{
/* set timer register base */
TmrReg = (__mem_tmr_reg_t *) IO_ADDRESS(SUNXI_TIMER_PBASE);
/* backup timer registers */
ptmr_state->IntCtl = TmrReg->IntCtl;
ptmr_state->Tmr0Ctl = TmrReg->Tmr0Ctl;
ptmr_state->Tmr0IntVal = TmrReg->Tmr0IntVal;
ptmr_state->Tmr0CntVal = TmrReg->Tmr0CntVal;
ptmr_state->Tmr1Ctl = TmrReg->Tmr1Ctl;
ptmr_state->Tmr1IntVal = TmrReg->Tmr1IntVal;
ptmr_state->Tmr1CntVal = TmrReg->Tmr1CntVal;
return 0;
}
/*
*********************************************************************************************************
* TIMER restore
*
* Description: restore timer for mem.
*
* Arguments : none
*
* Returns : EPDK_TRUE/EPDK_FALSE;
*********************************************************************************************************
*/
__s32 mem_tmr_restore(__mem_tmr_reg_t *ptmr_state)
{
/* restore timer0 parameters */
TmrReg->Tmr0IntVal = ptmr_state->Tmr0IntVal;
TmrReg->Tmr0CntVal = ptmr_state->Tmr0CntVal;
TmrReg->Tmr0Ctl = ptmr_state->Tmr0Ctl;
TmrReg->Tmr1IntVal = ptmr_state->Tmr1IntVal;
TmrReg->Tmr1CntVal = ptmr_state->Tmr1CntVal;
TmrReg->Tmr1Ctl = ptmr_state->Tmr1Ctl;
TmrReg->IntCtl = ptmr_state->IntCtl;
return 0;
}
/*=================================================use for normal standby ============================*/
/*
*********************************************************************************************************
* TIMER INIT
*
* Description: initialise timer for mem.
*
* Arguments : none
*
* Returns : EPDK_TRUE/EPDK_FALSE;
*********************************************************************************************************
*/
__s32 mem_tmr_init(void)
{
/* set timer register base */
TmrReg = (__mem_tmr_reg_t *) (IO_ADDRESS(SUNXI_TIMER_PBASE));
WatchDog1_Config_Reg_Bak = (TmrReg->WDog1_Cfg_Reg);
WatchDog1_Mod_Reg_Bak = (TmrReg->WDog1_Mode_Reg);
WatchDog1_Irq_En_Bak = (TmrReg->WDog1_Irq_En);
return 0;
}
/*
*********************************************************************************************************
* TIMER EXIT
*
* Description: exit timer for mem.
*
* Arguments : none
*
* Returns : EPDK_TRUE/EPDK_FALSE;
*********************************************************************************************************
*/
__s32 mem_tmr_exit(void)
{
(TmrReg->WDog1_Cfg_Reg) = WatchDog1_Config_Reg_Bak;
(TmrReg->WDog1_Mode_Reg) = WatchDog1_Mod_Reg_Bak;
(TmrReg->WDog1_Irq_En) = WatchDog1_Irq_En_Bak;
return 0;
}
/*
*********************************************************************************************************
* mem_tmr_enable_watchdog
*
*Description: enable watch-dog.
*
*Arguments : none.
*
*Return : none;
*
*Notes :
*
*********************************************************************************************************
*/
void mem_tmr_enable_watchdog(void)
{
/* set watch-dog reset to whole system */
(TmrReg->WDog1_Cfg_Reg) &= ~(0x3);
(TmrReg->WDog1_Cfg_Reg) |= 0x1;
/* timeout is 16 seconds */
(TmrReg->WDog1_Mode_Reg) = (0xb << 4);
/* enable watch-dog interrupt */
(TmrReg->WDog1_Irq_En) |= (1 << 0);
/* enable watch-dog */
(TmrReg->WDog1_Mode_Reg) |= (1 << 0);
return;
}
/*
*********************************************************************************************************
* mem_tmr_disable_watchdog
*
*Description: disable watch-dog.
*
*Arguments : none.
*
*Return : none;
*
*Notes :
*
*********************************************************************************************************
*/
void mem_tmr_disable_watchdog(void)
{
/* disable watch-dog reset: only intterupt */
(TmrReg->WDog1_Cfg_Reg) &= ~(0x3);
(TmrReg->WDog1_Cfg_Reg) |= 0x2;
/* disable watch-dog intterupt */
(TmrReg->WDog1_Irq_En) &= ~(1 << 0);
/* disable watch-dog */
TmrReg->WDog1_Mode_Reg &= ~(1 << 0);
}
/*
*********************************************************************************************************
* mem_tmr_set
*
*Description: set timer for wakeup system.
*
*Arguments : second time value for wakeup system.
*
*Return : result, 0 - successed, -1 - failed;
*
*Notes :
*
*********************************************************************************************************
*/
__s32 mem_tmr_set(__u32 second)
{
/* config timer interrrupt */
TmrReg->IntSta = 1;
TmrReg->IntCtl = 1;
/* config timer0 for mem */
TmrReg->Tmr0Ctl = 0;
TmrReg->Tmr0IntVal = second << 10;
TmrReg->Tmr0Ctl = (1 << 7) | (5 << 4);
TmrReg->Tmr0Ctl |= (1 << 1);
TmrReg->Tmr0Ctl |= (1 << 0);
return 0;
}