mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 04:10:18 +09:00
add pm support
This commit is contained in:
109
arch/arm/mach-rockchip/pm-pie.c
Executable file
109
arch/arm/mach-rockchip/pm-pie.c
Executable file
@@ -0,0 +1,109 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/suspend.h>
|
||||
#include "pm.h"
|
||||
//#include "sram.h"
|
||||
|
||||
|
||||
struct rkpm_sram_ops DEFINE_PIE_DATA(pm_sram_ops);
|
||||
//for sram
|
||||
static __sramdata u32 rkpm_sram_ctrbits;
|
||||
|
||||
/****************** for pm.c and in sram***************************************/
|
||||
//only usr in sram function
|
||||
#define rkpm_chk_sram_ctrbit(bit) (rkpm_sram_ctrbits&(bit))
|
||||
#define rkpm_chk_sram_ctrbits(bits) (rkpm_sram_ctrbits&(bits))
|
||||
|
||||
#define RKPM_SRAM_FUN(fun) \
|
||||
if(DATA(pm_sram_ops).fun)\
|
||||
(DATA(pm_sram_ops).fun)()
|
||||
|
||||
#define RKPM_BITCTR_SRAM_FUN(ctr,fun) \
|
||||
if(rkpm_chk_sram_ctrbit(RKPM_CTR_##ctr)&&DATA(pm_sram_ops).fun)\
|
||||
(DATA(pm_sram_ops).fun)()
|
||||
|
||||
// fun with paramater
|
||||
#define RKPM_BITSCTR_SRAM_PFUN(bits,fun,fun_p) \
|
||||
if(rkpm_chk_sram_ctrbits(bits)&&DATA(pm_sram_ops).fun_p) \
|
||||
{DATA(pm_sram_ops).fun;} while(0)
|
||||
|
||||
/********************************sram print**********************************/
|
||||
|
||||
void PIE_FUNC(rkpm_sram_printch_pie)(char byte)
|
||||
{
|
||||
if(DATA(pm_sram_ops).printch)
|
||||
DATA(pm_sram_ops).printch(byte);
|
||||
|
||||
if (byte == '\n')
|
||||
FUNC(rkpm_sram_printch_pie)('\r');
|
||||
}
|
||||
|
||||
void PIE_FUNC(rkpm_sram_printhex_pie)(unsigned int hex)
|
||||
{
|
||||
int i = 8;
|
||||
FUNC(rkpm_sram_printch_pie)('0');
|
||||
FUNC(rkpm_sram_printch_pie)('x');
|
||||
while (i--) {
|
||||
unsigned char c = (hex & 0xF0000000) >> 28;
|
||||
FUNC(rkpm_sram_printch_pie)(c < 0xa ? c + '0' : c - 0xa + 'a');
|
||||
hex <<= 4;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/******************************************pm main function******************************************/
|
||||
#define RKPM_CTR_SYSCLK RKPM_OR_3BITS(SYSCLK_DIV,SYSCLK_32K,SYSCLK_OSC_DIS)
|
||||
|
||||
void __sramfunc rkpm_sram_suspend(u32 ctrbits)
|
||||
{
|
||||
|
||||
rkpm_sram_printch('5');
|
||||
RKPM_BITCTR_SRAM_FUN(DDR,ddr);
|
||||
|
||||
rkpm_sram_printch('6');
|
||||
RKPM_BITCTR_SRAM_FUN(VOLTS,volts);
|
||||
|
||||
rkpm_sram_printch('7');
|
||||
|
||||
RKPM_BITCTR_SRAM_FUN(GTCLKS,gtclks);
|
||||
|
||||
RKPM_BITSCTR_SRAM_PFUN(RKPM_CTR_SYSCLK,sysclk(rkpm_sram_ctrbits),sysclk);
|
||||
|
||||
RKPM_BITCTR_SRAM_FUN(PMIC,pmic);
|
||||
|
||||
// if(rkpm_chk_sram_ctrbit(RKPM_CTR_SRAM_NO_WFI))
|
||||
{
|
||||
dsb();
|
||||
wfi();
|
||||
}
|
||||
|
||||
RKPM_BITCTR_SRAM_FUN(PMIC,re_pmic);
|
||||
|
||||
RKPM_BITSCTR_SRAM_PFUN(RKPM_CTR_SYSCLK,re_sysclk(rkpm_sram_ctrbits),re_sysclk);
|
||||
|
||||
RKPM_BITCTR_SRAM_FUN(GTCLKS,re_gtclks);
|
||||
|
||||
rkpm_sram_printch('7');
|
||||
RKPM_BITCTR_SRAM_FUN(VOLTS,re_volts);
|
||||
|
||||
rkpm_sram_printch('6');
|
||||
RKPM_BITCTR_SRAM_FUN(DDR,re_ddr);
|
||||
|
||||
rkpm_sram_printch('5');
|
||||
}
|
||||
|
||||
void PIE_FUNC(rkpm_sram_suspend_arg)(void *arg)
|
||||
{
|
||||
rkpm_sram_ctrbits=*((u32 *)arg);
|
||||
|
||||
// rkpm_sram_printhex(rkpm_sram_ctrbits);
|
||||
//rkpm_sram_printhex(*((u32 *)arg));
|
||||
rkpm_sram_suspend(rkpm_sram_ctrbits);
|
||||
|
||||
|
||||
}
|
||||
void rkpm_pie_init(void)
|
||||
{
|
||||
rkpm_set_pie_info(kern_to_pie(rockchip_pie_chunk, &DATA(pm_sram_ops))
|
||||
,fn_to_pie(rockchip_pie_chunk, &FUNC(rkpm_sram_suspend_arg)));
|
||||
}
|
||||
@@ -1,17 +1,460 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/suspend.h>
|
||||
#include "pm.h"
|
||||
|
||||
static int rockchip_suspend_enter(suspend_state_t state)
|
||||
|
||||
static struct rkpm_ops pm_ops={NULL};
|
||||
|
||||
static struct rkpm_sram_ops *p_pm_sram_ops=NULL;//pie point for pm_sram_ops
|
||||
static rkpm_sram_suspend_arg_cb p_suspend_pie_cb=NULL;
|
||||
|
||||
// for user setting
|
||||
static u32 rkpm_ctrbits=0;
|
||||
//for judging rkpm_ctrbits valid ,save ifself
|
||||
static u32 rkpm_jdg_ctrbits=0;
|
||||
static u32 rkpm_jdg_sram_ctrbits=0;
|
||||
|
||||
/**************************************ddr callback setting***************************************/
|
||||
|
||||
void rkpm_set_pie_info(struct rkpm_sram_ops *pm_sram_ops,rkpm_sram_suspend_arg_cb pie_cb)
|
||||
{
|
||||
cpu_do_idle();
|
||||
|
||||
p_pm_sram_ops=pm_sram_ops;
|
||||
p_suspend_pie_cb=pie_cb;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void rkpm_set_ops_prepare_finish(rkpm_ops_void_callback prepare,rkpm_ops_void_callback finish)
|
||||
{
|
||||
pm_ops.prepare=prepare;
|
||||
pm_ops.finish=finish;
|
||||
}
|
||||
|
||||
void rkpm_set_ops_pwr_dmns(rkpm_ops_void_callback pwr_dmns,rkpm_ops_void_callback re_pwr_dmns)
|
||||
{
|
||||
pm_ops.pwr_dmns=pwr_dmns;
|
||||
pm_ops.re_pwr_dmns=re_pwr_dmns;
|
||||
}
|
||||
|
||||
void rkpm_set_ops_gtclks(rkpm_ops_void_callback gtclks,rkpm_ops_void_callback re_gtclks)
|
||||
{
|
||||
pm_ops.gtclks=gtclks;
|
||||
pm_ops.re_gtclks=re_gtclks;
|
||||
}
|
||||
|
||||
|
||||
void rkpm_set_ops_plls(rkpm_ops_void_callback plls,rkpm_ops_void_callback re_plls)
|
||||
{
|
||||
pm_ops.plls=plls;
|
||||
pm_ops.re_plls=re_plls;
|
||||
}
|
||||
|
||||
|
||||
void rkpm_set_ops_gpios(rkpm_ops_void_callback gpios,rkpm_ops_void_callback re_gpios)
|
||||
{
|
||||
pm_ops.gpios=gpios;
|
||||
pm_ops.re_gpios=re_gpios;
|
||||
}
|
||||
void rkpm_set_ops_printch(rkpm_ops_printch_callback printch)
|
||||
{
|
||||
pm_ops.printch=printch;
|
||||
}
|
||||
|
||||
void rkpm_set_ops_regs_pread(rkpm_ops_void_callback regs_pread)
|
||||
{
|
||||
pm_ops.regs_pread=regs_pread;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**************************************sram callback setting***************************************/
|
||||
void rkpm_set_sram_ops_volt(rkpm_ops_void_callback volts,rkpm_ops_void_callback re_volts)
|
||||
{
|
||||
if(p_pm_sram_ops)
|
||||
{
|
||||
p_pm_sram_ops->volts=volts;
|
||||
p_pm_sram_ops->re_volts=re_volts;
|
||||
}
|
||||
}
|
||||
|
||||
void rkpm_set_sram_ops_gtclks(rkpm_ops_void_callback gtclks,rkpm_ops_void_callback re_gtclks)
|
||||
{
|
||||
if(p_pm_sram_ops)
|
||||
{
|
||||
p_pm_sram_ops->gtclks=gtclks;
|
||||
p_pm_sram_ops->re_gtclks=re_gtclks;
|
||||
}
|
||||
}
|
||||
|
||||
void rkpm_set_sram_ops_sysclk(rkpm_ops_paramter_u32_cb sysclk,rkpm_ops_paramter_u32_cb re_sysclk)
|
||||
{
|
||||
if(p_pm_sram_ops)
|
||||
{
|
||||
p_pm_sram_ops->sysclk=sysclk;
|
||||
p_pm_sram_ops->re_sysclk=re_sysclk;
|
||||
}
|
||||
}
|
||||
|
||||
void rkpm_set_sram_ops_pmic(rkpm_ops_void_callback pmic,rkpm_ops_void_callback re_pmic)
|
||||
{
|
||||
if(p_pm_sram_ops)
|
||||
{
|
||||
p_pm_sram_ops->pmic=pmic;
|
||||
p_pm_sram_ops->re_pmic=re_pmic;
|
||||
}
|
||||
}
|
||||
|
||||
void rkpm_set_sram_ops_ddr(rkpm_ops_void_callback ddr,rkpm_ops_void_callback re_ddr)
|
||||
{
|
||||
if(p_pm_sram_ops)
|
||||
{
|
||||
p_pm_sram_ops->ddr=ddr;
|
||||
p_pm_sram_ops->re_ddr=re_ddr;
|
||||
}
|
||||
}
|
||||
void rkpm_set_sram_ops_printch(rkpm_ops_printch_callback printch)
|
||||
{
|
||||
if(p_pm_sram_ops)
|
||||
p_pm_sram_ops->printch=printch;
|
||||
}
|
||||
|
||||
/******************for user ************************/
|
||||
void inline rkpm_set_ctrbits(u32 bits)
|
||||
{
|
||||
rkpm_ctrbits = bits;
|
||||
|
||||
}
|
||||
void inline rkpm_add_ctrbits(u32 bits)
|
||||
{
|
||||
rkpm_ctrbits |= bits;
|
||||
|
||||
}
|
||||
u32 inline rkpm_get_ctrbits(void)
|
||||
{
|
||||
return rkpm_ctrbits;
|
||||
}
|
||||
void inline rkpm_add_ctrbit(int bit)
|
||||
{
|
||||
rkpm_ctrbits|=bit;
|
||||
}
|
||||
u32 inline rkpm_chk_ctrbit(int bit)
|
||||
{
|
||||
return (rkpm_ctrbits&bit);
|
||||
}
|
||||
|
||||
//clear
|
||||
void inline rkpm_clr_ctrbit(int bit)
|
||||
{
|
||||
rkpm_ctrbits&=~bit;
|
||||
}
|
||||
|
||||
/****************** for pm.c************************/
|
||||
|
||||
static void inline rkpm_set_jdg_ctrbits(u32 bits)
|
||||
{
|
||||
rkpm_jdg_ctrbits = bits;
|
||||
|
||||
}
|
||||
static u32 inline rkpm_get_jdg_ctrbits(void)
|
||||
{
|
||||
return rkpm_jdg_ctrbits;
|
||||
}
|
||||
|
||||
static void inline rkpm_add_jdg_ctrbit(int bit)
|
||||
{
|
||||
rkpm_jdg_ctrbits|=bit;
|
||||
}
|
||||
|
||||
static u32 inline rkpm_chk_jdg_ctrbit(int bit)
|
||||
{
|
||||
return (rkpm_jdg_ctrbits&bit);
|
||||
}
|
||||
static u32 inline rkpm_chk_jdg_ctrbits(int bits)
|
||||
{
|
||||
return (rkpm_jdg_ctrbits&bits);
|
||||
}
|
||||
//clear
|
||||
static void inline rkpm_clr_jdg_ctrbit(int bit)
|
||||
{
|
||||
rkpm_jdg_ctrbits&=~bit;
|
||||
}
|
||||
|
||||
|
||||
#define RKPM_DDR_FUN(fun) \
|
||||
if(pm_ops.fun)\
|
||||
(pm_ops.fun)()
|
||||
|
||||
|
||||
#define RKPM_BITCTR_DDR_FUN(ctr,fun) \
|
||||
if(rkpm_chk_jdg_ctrbit(RKPM_CTR_##ctr)&&pm_ops.fun)\
|
||||
(pm_ops.fun)()
|
||||
|
||||
|
||||
|
||||
void rkpm_ctrbits_prepare(void)
|
||||
{
|
||||
|
||||
//rkpm_sram_ctrbits=rkpm_ctrbits;
|
||||
|
||||
rkpm_jdg_ctrbits=rkpm_ctrbits;
|
||||
|
||||
//if plls is no pd,clk rate is high, volts can not setting low,so we need to judge ctrbits
|
||||
if(rkpm_chk_jdg_ctrbit(RKPM_CTR_VOLTS))
|
||||
{
|
||||
rkpm_clr_jdg_ctrbit(RKPM_CTR_VOLTS);
|
||||
}
|
||||
|
||||
rkpm_jdg_sram_ctrbits=rkpm_jdg_ctrbits;
|
||||
|
||||
//clk gating will gate ddr clk in sram
|
||||
if(!rkpm_chk_val_ctrbit(rkpm_jdg_sram_ctrbits,RKPM_CTR_DDR))
|
||||
{
|
||||
// rkpm_clr_val_ctrbit(rkpm_jdg_sram_ctrbits,RKPM_CTR_GTCLKS);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
struct rk_soc_pm_info_st {
|
||||
int offset;
|
||||
char *name;
|
||||
};
|
||||
|
||||
#define RK_SOC_PM_HELP_(id,NAME)\
|
||||
{\
|
||||
.offset= RKPM_CTR_##id,\
|
||||
.name= NAME,\
|
||||
}
|
||||
|
||||
struct rk_soc_pm_info_st rk_soc_pm_helps[]={
|
||||
#if 0
|
||||
RK_SOC_PM_HELP_(NO_PD,"pd is not power dn"),
|
||||
RK_SOC_PM_HELP_(NO_CLK_GATING,"clk is not gating"),
|
||||
RK_SOC_PM_HELP_(NO_PLL,"pll is not power dn"),
|
||||
RK_SOC_PM_HELP_(NO_VOLT,"volt is not set suspend"),
|
||||
RK_SOC_PM_HELP_(NO_GPIO,"gpio is not control "),
|
||||
//RK_SOC_PM_HELP_(NO_SRAM,"not enter sram code"),
|
||||
RK_SOC_PM_HELP_(NO_DDR,"ddr is not reflash"),
|
||||
RK_SOC_PM_HELP_(NO_PMIC,"pmic is not suspend"),
|
||||
RK_SOC_PM_HELP_(RET_DIRT,"sys return from pm_enter directly"),
|
||||
RK_SOC_PM_HELP_(SRAM_NO_WFI,"sys is not runing wfi in sram"),
|
||||
RK_SOC_PM_HELP_(WAKE_UP_KEY,"send a power key to wake up lcd"),
|
||||
#endif
|
||||
};
|
||||
|
||||
ssize_t rk_soc_pm_helps_sprintf(char *buf)
|
||||
{
|
||||
char *s = buf;
|
||||
int i;
|
||||
|
||||
for(i=0;i<ARRAY_SIZE(rk_soc_pm_helps);i++)
|
||||
{
|
||||
s += sprintf(s, "bit(%d): %s\n", rk_soc_pm_helps[i].offset,rk_soc_pm_helps[i].name);
|
||||
}
|
||||
|
||||
return (s-buf);
|
||||
}
|
||||
|
||||
void rk_soc_pm_helps_printk(void)
|
||||
{
|
||||
int i;
|
||||
printk("**************rkpm_ctr_bits bits help***********:\n");
|
||||
for(i=0;i<ARRAY_SIZE(rk_soc_pm_helps);i++)
|
||||
{
|
||||
printk("bit(%d): %s\n", rk_soc_pm_helps[i].offset,rk_soc_pm_helps[i].name);
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int __init early_param_rk_soc_pm_ctr(char *str)
|
||||
{
|
||||
get_option(&str, &rkpm_ctrbits);
|
||||
|
||||
printk("********rkpm_ctr_bits information is following:*********\n");
|
||||
printk("rkpm_ctr_bits=%x\n",rkpm_ctrbits);
|
||||
if(rkpm_ctrbits)
|
||||
{
|
||||
rk_soc_pm_helps_printk();
|
||||
}
|
||||
printk("********rkpm_ctr_bits information end*********\n");
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*******************************************log*********************************************/
|
||||
|
||||
|
||||
bool pm_log;
|
||||
|
||||
extern void pm_emit_log_char(char c);
|
||||
|
||||
/********************************ddr print**********************************/
|
||||
void rkpm_ddr_printch(char byte)
|
||||
{
|
||||
if(pm_ops.printch)
|
||||
pm_ops.printch(byte);
|
||||
|
||||
if (byte == '\n')
|
||||
rkpm_ddr_printch('\r');
|
||||
}
|
||||
void rkpm_ddr_printascii(const char *s)
|
||||
{
|
||||
while (*s) {
|
||||
rkpm_ddr_printch(*s);
|
||||
s++;
|
||||
}
|
||||
}
|
||||
|
||||
void rkpm_ddr_printhex(unsigned int hex)
|
||||
{
|
||||
int i = 8;
|
||||
rkpm_ddr_printch('0');
|
||||
rkpm_ddr_printch('x');
|
||||
while (i--) {
|
||||
unsigned char c = (hex & 0xF0000000) >> 28;
|
||||
rkpm_ddr_printch(c < 0xa ? c + '0' : c - 0xa + 'a');
|
||||
hex <<= 4;
|
||||
}
|
||||
}
|
||||
|
||||
inline int rkpm_dbgctr_enter(void)
|
||||
{
|
||||
if(rkpm_chk_jdg_ctrbits(RKPM_OR_2BITS(RET_DIRT,ONLY_WFI)))
|
||||
{
|
||||
if(rkpm_chk_jdg_ctrbit(RKPM_CTR_ONLY_WFI))
|
||||
{
|
||||
local_fiq_disable();
|
||||
dsb();
|
||||
wfi();
|
||||
local_fiq_enable();
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
void plls_resume(void);
|
||||
|
||||
static int rkpm_enter(suspend_state_t state)
|
||||
{
|
||||
|
||||
printk("%s\n",__FUNCTION__);
|
||||
printk(KERN_DEBUG "pm: ");
|
||||
|
||||
rkpm_ctrbits_prepare();
|
||||
|
||||
if(rkpm_dbgctr_enter())
|
||||
return 0;
|
||||
|
||||
RKPM_DDR_FUN(prepare);
|
||||
|
||||
|
||||
rkpm_ddr_printch('0');
|
||||
|
||||
RKPM_BITCTR_DDR_FUN(PWR_DMNS,pwr_dmns);
|
||||
|
||||
rkpm_ddr_printch('1');
|
||||
|
||||
local_fiq_disable();
|
||||
|
||||
RKPM_BITCTR_DDR_FUN(GTCLKS,gtclks);
|
||||
|
||||
rkpm_ddr_printch('2');
|
||||
|
||||
RKPM_BITCTR_DDR_FUN(PLLS,plls);
|
||||
|
||||
rkpm_ddr_printch('3');
|
||||
|
||||
RKPM_BITCTR_DDR_FUN(GPIOS,gpios);
|
||||
|
||||
RKPM_DDR_FUN(regs_pread);
|
||||
|
||||
rkpm_ddr_printch('4');
|
||||
|
||||
pm_log = false;
|
||||
|
||||
if(rkpm_chk_jdg_ctrbit(RKPM_CTR_NORIDLE_MD))
|
||||
call_with_stack(p_suspend_pie_cb,&rkpm_jdg_sram_ctrbits, rockchip_sram_stack);
|
||||
{
|
||||
dsb();
|
||||
wfi();
|
||||
}
|
||||
|
||||
pm_log = true;
|
||||
|
||||
rkpm_ddr_printch('4');
|
||||
|
||||
RKPM_BITCTR_DDR_FUN(GPIOS,re_gpios);
|
||||
|
||||
rkpm_ddr_printch('3');
|
||||
|
||||
RKPM_BITCTR_DDR_FUN(PLLS,re_plls);
|
||||
|
||||
rkpm_ddr_printch('2');
|
||||
|
||||
RKPM_BITCTR_DDR_FUN(GTCLKS,re_gtclks);
|
||||
|
||||
local_fiq_enable();
|
||||
|
||||
rkpm_ddr_printch('1');
|
||||
|
||||
RKPM_BITCTR_DDR_FUN(PWR_DMNS,re_pwr_dmns);
|
||||
|
||||
rkpm_ddr_printch('0');
|
||||
|
||||
pm_log = false;
|
||||
|
||||
printk(KERN_CONT "\n");
|
||||
|
||||
rkpm_ddr_printch('\n');
|
||||
|
||||
RKPM_DDR_FUN(finish);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rkpm_enter_tst(void)
|
||||
{
|
||||
|
||||
return rkpm_enter(0);
|
||||
|
||||
}
|
||||
|
||||
static int rkpm_suspend_prepare(void)
|
||||
{
|
||||
/* disable entering idle by disable_hlt() */
|
||||
//disable_hlt();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct platform_suspend_ops rockchip_suspend_ops = {
|
||||
.valid = suspend_valid_only_mem,
|
||||
.enter = rockchip_suspend_enter,
|
||||
};
|
||||
static void rkpm_suspend_finish(void)
|
||||
{
|
||||
//enable_hlt();
|
||||
|
||||
#if 0 //def CONFIG_KEYS_RK29
|
||||
if(rkpm_check_ctrbits(1<<RKPM_CTR_WAKE_UP_KEY))
|
||||
{
|
||||
rk28_send_wakeup_key();
|
||||
printk("rk30_pm_finish rk28_send_wakeup_key\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static struct platform_suspend_ops rockchip_suspend_ops = {
|
||||
.enter = rkpm_enter,
|
||||
.valid = suspend_valid_only_mem,
|
||||
.prepare = rkpm_suspend_prepare,
|
||||
.finish = rkpm_suspend_finish,
|
||||
};
|
||||
void __init rockchip_suspend_init(void)
|
||||
{
|
||||
suspend_set_ops(&rockchip_suspend_ops);
|
||||
printk("%s\n",__FUNCTION__);
|
||||
suspend_set_ops(&rockchip_suspend_ops);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
126
arch/arm/mach-rockchip/pm.h
Executable file
126
arch/arm/mach-rockchip/pm.h
Executable file
@@ -0,0 +1,126 @@
|
||||
#ifndef __MACH_ROCKCHIP_PM1_H
|
||||
#define __MACH_ROCKCHIP_PM1_H
|
||||
|
||||
#include <dt-bindings/suspend/rockchip-pm.h>
|
||||
|
||||
|
||||
|
||||
|
||||
#define RKPM_LOOPS_PER_USEC 24
|
||||
#define RKPM_LOOP(loops) do { unsigned int i = (loops); if (i < 7) i = 7; barrier(); asm volatile(".align 4; 1: subs %0, %0, #1; bne 1b;" : "+r" (i)); } while (0)
|
||||
/* delay on slow mode */
|
||||
#define rkpm_udelay(usecs) RKPM_LOOP((usecs)*RKPM_LOOPS_PER_USEC)
|
||||
/* delay on deep slow mode */
|
||||
#define rkpm_32k_udelay(usecs) RKPM_LOOP(((usecs)*RKPM_LOOPS_PER_USEC)/(24000000/32768))
|
||||
|
||||
|
||||
|
||||
typedef void (*rkpm_ops_void_callback)(void);
|
||||
typedef void (*rkpm_ops_printch_callback)(char byte);
|
||||
typedef void (*rkpm_ops_paramter_u32_cb)(u32 val);
|
||||
typedef void (*rkpm_sram_suspend_arg_cb)(void *arg);
|
||||
|
||||
// ops in ddr callback
|
||||
struct rkpm_ops {
|
||||
|
||||
rkpm_ops_void_callback prepare;
|
||||
rkpm_ops_void_callback finish;
|
||||
rkpm_ops_void_callback regs_pread;
|
||||
|
||||
rkpm_ops_void_callback pwr_dmns;
|
||||
rkpm_ops_void_callback re_pwr_dmns;
|
||||
|
||||
rkpm_ops_void_callback gtclks;
|
||||
rkpm_ops_void_callback re_gtclks;
|
||||
|
||||
|
||||
rkpm_ops_void_callback plls;
|
||||
rkpm_ops_void_callback re_plls;
|
||||
|
||||
rkpm_ops_void_callback gpios;
|
||||
rkpm_ops_void_callback re_gpios;
|
||||
|
||||
rkpm_ops_printch_callback printch;
|
||||
|
||||
};
|
||||
|
||||
|
||||
// ops in intmen callback
|
||||
struct rkpm_sram_ops{
|
||||
|
||||
rkpm_ops_void_callback volts;
|
||||
rkpm_ops_void_callback re_volts;
|
||||
|
||||
rkpm_ops_void_callback gtclks;
|
||||
rkpm_ops_void_callback re_gtclks;
|
||||
|
||||
rkpm_ops_paramter_u32_cb sysclk;
|
||||
rkpm_ops_paramter_u32_cb re_sysclk;
|
||||
|
||||
rkpm_ops_void_callback pmic;
|
||||
rkpm_ops_void_callback re_pmic;
|
||||
|
||||
rkpm_ops_void_callback ddr;
|
||||
rkpm_ops_void_callback re_ddr;
|
||||
|
||||
rkpm_ops_printch_callback printch;
|
||||
};
|
||||
|
||||
#if 0
|
||||
struct rkpm_gpios_info_st{
|
||||
u32 pins;
|
||||
u32 in_out;
|
||||
u32 level_pull;
|
||||
};
|
||||
#endif
|
||||
|
||||
/******************ctr bits setting ************************/
|
||||
#define rkpm_chk_val_ctrbit(val,bit) ((val)&(bit))//check bit
|
||||
#define rkpm_chk_val_ctrbits(val,bits) ((val)&(bits)) //check bits
|
||||
|
||||
/*********************************pm control******************************************/
|
||||
extern void rkpm_set_pie_info(struct rkpm_sram_ops *pm_sram_ops,rkpm_sram_suspend_arg_cb pie_cb);
|
||||
extern void rkpm_set_ops_prepare_finish(rkpm_ops_void_callback prepare,rkpm_ops_void_callback finish);
|
||||
extern void rkpm_set_ops_pwr_dmns(rkpm_ops_void_callback pwr_dmns,rkpm_ops_void_callback re_pwr_dmns);
|
||||
extern void rkpm_set_ops_gtclks(rkpm_ops_void_callback gtclks,rkpm_ops_void_callback re_gtclks);
|
||||
extern void rkpm_set_ops_plls(rkpm_ops_void_callback plls,rkpm_ops_void_callback re_plls);
|
||||
extern void rkpm_set_ops_gpios(rkpm_ops_void_callback gpios,rkpm_ops_void_callback re_gpios);
|
||||
extern void rkpm_set_ops_printch(rkpm_ops_printch_callback printch);
|
||||
extern void rkpm_set_ops_regs_pread(rkpm_ops_void_callback regs_pread);
|
||||
|
||||
|
||||
extern void rkpm_pie_init(void);
|
||||
extern void rkpm_set_sram_ops_volt(rkpm_ops_void_callback volts,rkpm_ops_void_callback re_volts);
|
||||
extern void rkpm_set_sram_ops_gtclks(rkpm_ops_void_callback gtclks,rkpm_ops_void_callback re_gtclks);
|
||||
extern void rkpm_set_sram_ops_sysclk(rkpm_ops_paramter_u32_cb sysclk,rkpm_ops_paramter_u32_cb re_sysclk);
|
||||
extern void rkpm_set_sram_ops_pmic(rkpm_ops_void_callback pmic,rkpm_ops_void_callback re_pmic);
|
||||
extern void rkpm_set_sram_ops_ddr(rkpm_ops_void_callback ddr,rkpm_ops_void_callback re_ddr);
|
||||
extern void rkpm_set_sram_ops_printch(rkpm_ops_printch_callback printch);
|
||||
|
||||
extern void inline rkpm_set_ctrbits(u32 bits);
|
||||
extern u32 inline rkpm_get_ctrbits(void);
|
||||
extern void inline rkpm_set_ctrbit(int idxs);
|
||||
extern u32 inline rkpm_get_ctrbit(int idxs);
|
||||
extern void inline rkpm_clr_ctrbit(int idxs);//clear
|
||||
|
||||
extern void rkpm_ddr_printch(char byte);
|
||||
extern void rkpm_ddr_printascii(const char *s);
|
||||
extern void rkpm_ddr_printhex(unsigned int hex);
|
||||
|
||||
extern u32 clk_suspend_clkgt_info_get(u32 *clk_ungt_msk,u32 *clk_gt_last_set,u32 buf_cnt);
|
||||
|
||||
|
||||
/********************************sram print**********************************/
|
||||
#include "sram.h"
|
||||
|
||||
#if 1//def CPU
|
||||
extern void PIE_FUNC(rkpm_sram_printch_pie)(char byte);
|
||||
extern void PIE_FUNC(rkpm_sram_printhex_pie)(unsigned int hex);
|
||||
|
||||
#define rkpm_sram_printch(byte) FUNC(rkpm_sram_printch_pie)(byte)
|
||||
//void __sramfunc rkpm_sram_printascii(const char *s);
|
||||
#define rkpm_sram_printhex(hex) FUNC(rkpm_sram_printhex_pie)(hex)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1291,13 +1291,13 @@ EXPORT_SYMBOL_GPL(rk_clk_test);
|
||||
|
||||
void rkclk_init_clks(struct device_node *node);
|
||||
|
||||
static struct device_node * clk_root_node=NULL;
|
||||
static void __init rk_clk_tree_init(struct device_node *np)
|
||||
{
|
||||
struct device_node *node, *node_tmp, *node_prd, *node_init;
|
||||
struct rkclk *rkclk;
|
||||
const char *compatible;
|
||||
|
||||
|
||||
|
||||
printk("%s start! cru base = 0x%08x\n", __func__, (u32)RK_CRU_VIRT);
|
||||
|
||||
node_init=of_find_node_by_name(NULL,"clocks-init");
|
||||
@@ -1305,6 +1305,7 @@ static void __init rk_clk_tree_init(struct device_node *np)
|
||||
clk_err("%s: can not get clocks-init node\n", __func__);
|
||||
return;
|
||||
}
|
||||
clk_root_node=np;
|
||||
|
||||
for_each_available_child_of_node(np, node) {
|
||||
clk_debug("\n");
|
||||
@@ -1466,7 +1467,7 @@ void rkclk_init_clks(struct device_node *np)
|
||||
cnt_parent = of_count_phandle_with_args(np,
|
||||
"rockchip,clocks-init-parent", "#clock-init-cells");
|
||||
|
||||
printk("%s: cnt_parent = %d\n",__FUNCTION__,cnt_parent);
|
||||
clk_debug("%s: cnt_parent = %d\n",__FUNCTION__,cnt_parent);
|
||||
|
||||
for (i = 0; i < cnt_parent; i++) {
|
||||
clk_parent_name=NULL;
|
||||
@@ -1490,7 +1491,7 @@ void rkclk_init_clks(struct device_node *np)
|
||||
cnt_rate = of_count_phandle_with_args(np, "rockchip,clocks-init-rate",
|
||||
"#clock-init-cells");
|
||||
|
||||
printk("%s: cnt_rate = %d\n",__FUNCTION__,cnt_rate);
|
||||
clk_debug("%s: cnt_rate = %d\n",__FUNCTION__,cnt_rate);
|
||||
|
||||
for (i = 0; i < cnt_rate; i++) {
|
||||
clk_name=of_clk_init_rate_get_info(np, i, &clk_rate);
|
||||
@@ -1508,9 +1509,89 @@ void rkclk_init_clks(struct device_node *np)
|
||||
|
||||
clk_set_rate(clk_c, clk_rate);
|
||||
|
||||
printk("%s: set %s rate = %u\n", __FUNCTION__, clk_name,
|
||||
clk_debug("%s: set %s rate = %u\n", __FUNCTION__, clk_name,
|
||||
clk_rate);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
u32 clk_suspend_clkgt_info_get(u32 *clk_ungt_msk,u32 *clk_ungt_msk_last,u32 buf_cnt)
|
||||
{
|
||||
|
||||
struct device_node *node,*node_gt;
|
||||
u32 temp_val[2];
|
||||
int gt_cnt;
|
||||
int ret;
|
||||
void __iomem *cru_base,*gt_base, *reg_n, *reg_p;
|
||||
|
||||
gt_cnt=0;
|
||||
cru_base= of_iomap(clk_root_node, 0);
|
||||
|
||||
for_each_available_child_of_node(clk_root_node, node) {
|
||||
|
||||
if (of_device_is_compatible(node,"rockchip,rk-gate-cons"))
|
||||
{
|
||||
|
||||
for_each_available_child_of_node(node, node_gt) {
|
||||
|
||||
if(gt_cnt>=buf_cnt)
|
||||
{
|
||||
clk_err("%s:save buf is overflow\n",__FUNCTION__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = of_property_read_u32_array(node_gt,"rockchip,suspend-clkgating-setting",temp_val,2);
|
||||
if(!ret)
|
||||
{
|
||||
clk_ungt_msk[gt_cnt]=temp_val[0];
|
||||
clk_ungt_msk_last[gt_cnt]=temp_val[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
clk_ungt_msk[gt_cnt]=0xffff;
|
||||
clk_ungt_msk_last[gt_cnt]=0xffff;
|
||||
}
|
||||
|
||||
if(gt_cnt==0)
|
||||
{
|
||||
gt_base=of_iomap(node_gt, 0);
|
||||
reg_p=gt_base;
|
||||
reg_n=gt_base;
|
||||
}
|
||||
else
|
||||
{
|
||||
reg_n=of_iomap(node_gt, 0);
|
||||
|
||||
if(((u32)reg_n-(u32)reg_p)!=4)
|
||||
{
|
||||
printk("%s: gt reg is not continue\n",__FUNCTION__);
|
||||
return 0;
|
||||
}
|
||||
reg_p=reg_n;
|
||||
}
|
||||
|
||||
clk_debug("%s:gt%d,reg=%x,val=(%x,%x)\n",__FUNCTION__,gt_cnt,(u32)reg_n,
|
||||
clk_ungt_msk[gt_cnt], clk_ungt_msk_last[gt_cnt]);
|
||||
|
||||
gt_cnt++;
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(gt_cnt!=buf_cnt)
|
||||
{
|
||||
clk_err("%s:save buf is not Enough\n",__FUNCTION__);
|
||||
return 0;
|
||||
}
|
||||
clk_debug("%s:crubase=%x,gtbase=%x\n",__FUNCTION__,cru_base,gt_base);
|
||||
|
||||
return (u32)(gt_base-cru_base);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
87
include/dt-bindings/suspend/rockchip-pm.h
Executable file
87
include/dt-bindings/suspend/rockchip-pm.h
Executable file
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Header providing constants for Rockchip pinctrl bindings.
|
||||
*
|
||||
* Copyright (c) 2013 MundoReader S.L.
|
||||
* Author: Heiko Stuebner <heiko@sntech.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __DT_BINDINGS_ROCKCHIP_PM_H__
|
||||
#define __DT_BINDINGS_ROCKCHIP_PM_H__
|
||||
|
||||
/*********************CTRBIT DEFINE*****************************/
|
||||
#define RKPM_CTR_PWR_DMNS (0x1<<0)
|
||||
#define RKPM_CTR_GTCLKS (0x1<<1)
|
||||
#define RKPM_CTR_PLLS (0x1<<2)
|
||||
#define RKPM_CTR_VOLTS (0x1<<3)
|
||||
#define RKPM_CTR_GPIOS (0x1<<4)
|
||||
#define RKPM_CTR_DDR (0x1<<5)
|
||||
#define RKPM_CTR_PMIC (0x1<<6)
|
||||
/*
|
||||
*sys_clk 24M div , it is mutex for
|
||||
**RKPM_CTR_SYSCLK_DIV and RKPM_CTR_SYSCLK_32K and RKPM_CTR_SYSCLK_OSC_DIS.
|
||||
**you can select only one
|
||||
*/
|
||||
#define RKPM_CTR_SYSCLK_DIV (0x1<<7)// system clk is 24M,and div to min
|
||||
#define RKPM_CTR_SYSCLK_32K (0x1<<8)// switch sysclk to 32k,need hardwart susport. and div to min
|
||||
#define RKPM_CTR_SYSCLK_OSC_DIS (0x1<<9) // switch sysclk to 32k,disable 24M OSC,need hardwart susport. and div to min
|
||||
|
||||
//pm mode Function Selection
|
||||
#define RKPM_CTR_NORIDLE_MD (0x1<<16)
|
||||
|
||||
//debug ctrl Selection
|
||||
#define RKPM_CTR_RET_DIRT (0x1<<24)
|
||||
#define RKPM_CTR_ONLY_WFI (0x1<<25)
|
||||
#define RKPM_CTR_SRAM_NO_WFI (0x1<<26)
|
||||
#define RKPM_CTR_WAKE_UP_KEY (0x1<<27)
|
||||
#define RKPM_CTR_ALL (0x1<<31)
|
||||
|
||||
/*********************CTRBIT DEFINE END*****************************/
|
||||
|
||||
|
||||
//RKPM_IDX_TO_BITS
|
||||
#define RKPM_OR_2BITS(bit1,bit2) ((RKPM_CTR_##bit1)|(RKPM_CTR_##bit2))
|
||||
#define RKPM_OR_3BITS(bit1,bit2,bit3) ((RKPM_CTR_##bit1)|RKPM_OR_2BITS(bit2,bit3))
|
||||
#define RKPM_OR_4BITS(bit1,bit2,bit3,bit4) ((RKPM_CTR_##bit1)|RKPM_OR_3BITS(bit2,bit3,bit4))
|
||||
#define RKPM_OR_5BITS(bit1,bit2,bit3,bit4,bit5) ((RKPM_CTR_##bit1)|RKPM_OR_4BITS(bit2,bit3,bit4,bit5))
|
||||
|
||||
/*********************CTRBIT DEFINE END*****************************/
|
||||
|
||||
#define RKPM_GPIOBITS_LEVEL_PULL (24)
|
||||
#define RKPM_GPIOBITS_MSK_LEVEL_PULL (0xf<<RKPM_GPIOBITS_LEVEL_PULL)
|
||||
|
||||
#define RKPM_GPIOBITS_INOUT (20)
|
||||
#define RKPM_GPIOBITS_MSK_INOUT (0xf<<RKPM_GPIOBITS_INOUT)
|
||||
|
||||
#define RKPM_GPIOBITS_PINS (0)
|
||||
#define RKPM_GPIOBITS_MSK_PINS (0xffff<<RKPM_GPIOBITS_PINS)
|
||||
|
||||
|
||||
#define RKPM_GPIOS_INPUT (0)
|
||||
#define RKPM_GPIOS_OUTPUT (1)
|
||||
|
||||
#define RKPM_GPIOS_OUT_H (1)
|
||||
#define RKPM_GPIOS_OUT_L (0)
|
||||
|
||||
#define RKPM_GPIOS_IN_PULLUP (0)
|
||||
#define RKPM_GPIOS_IN_PULLDN (0)
|
||||
#define RKPM_GPIOS_IN_PULLNULL (0)
|
||||
|
||||
|
||||
#define RKPM_GPIOS_SETTING(pins,in_out,level_pull) (\
|
||||
((pins)&RKPM_GPIOBITS_MSK_PINS)\
|
||||
|(((in_out)<<RKPM_GPIOBITS_INOUT)&RKPM_GPIOBITS_MSK_INOUT)\
|
||||
|(((level_pull)<<RKPM_GPIOBITS_LEVEL_PULL)&RKPM_GPIOBITS_MSK_LEVEL_PULL)\
|
||||
)
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user