1 #include <linux/kernel.h>
2 #include <linux/init.h>
3 #include <linux/suspend.h>
4 #include <asm/cacheflush.h>
5 #include <asm/tlbflush.h>
6 #include <asm/suspend.h>
7 #include <linux/delay.h>
12 /*************************dump reg********************************************/
14 void rkpm_ddr_reg_offset_dump(void __iomem * base_addr,u32 _offset)
16 rkpm_ddr_printhex(_offset);
17 rkpm_ddr_printch('-');
18 rkpm_ddr_printhex(readl_relaxed((base_addr + _offset)));
21 void rkpm_ddr_regs_dump(void __iomem * base_addr,u32 start_offset,u32 end_offset)
26 rkpm_ddr_printascii("start from:");
27 rkpm_ddr_printhex((u32)(base_addr +start_offset));
28 rkpm_ddr_printch('\n');
30 for(i=start_offset;i<=end_offset;)
32 rkpm_ddr_printhex(reg_readl((base_addr + i)));
34 if((line%4==0)||i==end_offset)
35 rkpm_ddr_printch('\n');
37 rkpm_ddr_printch('-');
43 static struct rkpm_ops pm_ops={NULL};
45 static struct rkpm_sram_ops *p_pm_sram_ops=NULL;//pie point for pm_sram_ops
46 static rkpm_sram_suspend_arg_cb p_suspend_pie_cb=NULL;
49 static u32 rkpm_ctrbits=0;
50 //for judging rkpm_ctrbits valid ,save ifself
51 static u32 rkpm_jdg_ctrbits=0;
52 static u32 rkpm_jdg_sram_ctrbits=0;
54 /**************************************ddr callback setting***************************************/
56 void rkpm_set_pie_info(struct rkpm_sram_ops *pm_sram_ops,rkpm_sram_suspend_arg_cb pie_cb)
59 p_pm_sram_ops=pm_sram_ops;
60 p_suspend_pie_cb=pie_cb;
65 void rkpm_set_ops_prepare_finish(rkpm_ops_void_callback prepare,rkpm_ops_void_callback finish)
67 pm_ops.prepare=prepare;
71 void rkpm_set_ops_pwr_dmns(rkpm_ops_void_callback pwr_dmns,rkpm_ops_void_callback re_pwr_dmns)
73 pm_ops.pwr_dmns=pwr_dmns;
74 pm_ops.re_pwr_dmns=re_pwr_dmns;
77 void rkpm_set_ops_gtclks(rkpm_ops_void_callback gtclks,rkpm_ops_void_callback re_gtclks)
80 pm_ops.re_gtclks=re_gtclks;
84 void rkpm_set_ops_plls(rkpm_ops_void_callback plls,rkpm_ops_void_callback re_plls)
87 pm_ops.re_plls=re_plls;
91 void rkpm_set_ops_gpios(rkpm_ops_void_callback gpios,rkpm_ops_void_callback re_gpios)
94 pm_ops.re_gpios=re_gpios;
96 void rkpm_set_ops_save_setting(rkpm_ops_paramter_u32_cb save_setting,rkpm_ops_void_callback re_save_setting)
98 pm_ops.save_setting=save_setting;
99 pm_ops.re_save_setting=re_save_setting;
104 void rkpm_set_ops_printch(rkpm_ops_printch_callback printch)
106 pm_ops.printch=printch;
109 void rkpm_set_ops_regs_pread(rkpm_ops_void_callback regs_pread)
111 pm_ops.regs_pread=regs_pread;
114 void rkpm_set_ops_regs_sleep(rkpm_ops_void_callback slp_setting,rkpm_ops_void_callback re_last)
117 pm_ops.slp_setting=slp_setting;
119 pm_ops.slp_re_first=re_last;
123 /**************************************sram callback setting***************************************/
124 void rkpm_set_sram_ops_volt(rkpm_ops_void_callback volts,rkpm_ops_void_callback re_volts)
128 p_pm_sram_ops->volts=volts;
129 p_pm_sram_ops->re_volts=re_volts;
133 void rkpm_set_sram_ops_gtclks(rkpm_ops_void_callback gtclks,rkpm_ops_void_callback re_gtclks)
137 p_pm_sram_ops->gtclks=gtclks;
138 p_pm_sram_ops->re_gtclks=re_gtclks;
142 void rkpm_set_sram_ops_sysclk(rkpm_ops_paramter_u32_cb sysclk,rkpm_ops_paramter_u32_cb re_sysclk)
146 p_pm_sram_ops->sysclk=sysclk;
147 p_pm_sram_ops->re_sysclk=re_sysclk;
151 void rkpm_set_sram_ops_pmic(rkpm_ops_void_callback pmic,rkpm_ops_void_callback re_pmic)
155 p_pm_sram_ops->pmic=pmic;
156 p_pm_sram_ops->re_pmic=re_pmic;
160 void rkpm_set_sram_ops_ddr(rkpm_ops_void_callback ddr,rkpm_ops_void_callback re_ddr)
164 p_pm_sram_ops->ddr=ddr;
165 p_pm_sram_ops->re_ddr=re_ddr;
168 void rkpm_set_sram_ops_printch(rkpm_ops_printch_callback printch)
171 p_pm_sram_ops->printch=printch;
174 /******************for user ************************/
175 void inline rkpm_set_ctrbits(u32 bits)
180 void inline rkpm_add_ctrbits(u32 bits)
182 rkpm_ctrbits |= bits;
185 u32 inline rkpm_get_ctrbits(void)
190 u32 inline rkpm_chk_ctrbits(u32 bits)
192 return (rkpm_ctrbits&bits);
196 void inline rkpm_clr_ctrbits(u32 bits)
201 /****************** for pm.c************************/
203 static void inline rkpm_set_jdg_ctrbits(u32 bits)
205 rkpm_jdg_ctrbits = bits;
208 static u32 inline rkpm_get_jdg_ctrbits(void)
210 return rkpm_jdg_ctrbits;
213 static void inline rkpm_add_jdg_ctrbits(int bit)
215 rkpm_jdg_ctrbits|=bit;
219 static u32 inline rkpm_chk_jdg_ctrbit(int bit)
221 return (rkpm_jdg_ctrbits&bit);
225 static u32 inline rkpm_chk_jdg_ctrbits(int bits)
227 return (rkpm_jdg_ctrbits&bits);
230 static void inline rkpm_clr_jdg_ctrbits(int bit)
232 rkpm_jdg_ctrbits&=~bit;
236 #define RKPM_DDR_FUN(fun) \
240 // fun with paramater param (p1,p2,p3)
241 #define RKPM_DDR_PFUN(fun,param) \
243 {(pm_ops.fun)param;} while(0)
245 #define RKPM_BITCTR_DDR_FUN(ctr,fun) \
246 if(rkpm_chk_jdg_ctrbits(RKPM_CTR_##ctr)&&pm_ops.fun)\
249 #define RKPM_BITSCTR_DDR_FUN(bits,fun) \
250 if(rkpm_chk_jdg_ctrbits(bits)&&pm_ops.fun)\
255 #define RKPM_LPMD_BITSCTR_DDR_PFUN(bits,fun,param) \
256 if(rkpm_chk_jdg_ctrbits(RKPM_CTRBITS_SOC_DLPMD)&&pm_ops.fun)\
259 #define RKPM_LPMD_BITSCTR_DDR_FUN(bits,fun) \
260 if(rkpm_chk_jdg_ctrbits(RKPM_CTRBITS_SOC_DLPMD)&&pm_ops.fun)\
265 void rkpm_ctrbits_prepare(void)
268 //rkpm_sram_ctrbits=rkpm_ctrbits;
270 rkpm_jdg_ctrbits=rkpm_ctrbits;
272 //if plls is no pd,clk rate is high, volts can not setting low,so we need to judge ctrbits
273 //if(rkpm_chk_jdg_ctrbits(RKPM_CTR_VOLTS))
275 //rkpm_clr_jdg_ctrbits(RKPM_CTR_VOLTS);
278 rkpm_jdg_sram_ctrbits=rkpm_jdg_ctrbits;
280 //clk gating will gate ddr clk in sram
281 if(!rkpm_chk_val_ctrbits(rkpm_jdg_sram_ctrbits,RKPM_CTR_DDR))
283 // rkpm_clr_val_ctrbit(rkpm_jdg_sram_ctrbits,RKPM_CTR_GTCLKS);
288 struct rk_soc_pm_info_st {
293 #define RK_SOC_PM_HELP_(id,NAME)\
295 .offset= RKPM_CTR_##id,\
299 struct rk_soc_pm_info_st rk_soc_pm_helps[]={
301 RK_SOC_PM_HELP_(NO_PD,"pd is not power dn"),
302 RK_SOC_PM_HELP_(NO_CLK_GATING,"clk is not gating"),
303 RK_SOC_PM_HELP_(NO_PLL,"pll is not power dn"),
304 RK_SOC_PM_HELP_(NO_VOLT,"volt is not set suspend"),
305 RK_SOC_PM_HELP_(NO_GPIO,"gpio is not control "),
306 //RK_SOC_PM_HELP_(NO_SRAM,"not enter sram code"),
307 RK_SOC_PM_HELP_(NO_DDR,"ddr is not reflash"),
308 RK_SOC_PM_HELP_(NO_PMIC,"pmic is not suspend"),
309 RK_SOC_PM_HELP_(RET_DIRT,"sys return from pm_enter directly"),
310 RK_SOC_PM_HELP_(SRAM_NO_WFI,"sys is not runing wfi in sram"),
311 RK_SOC_PM_HELP_(WAKE_UP_KEY,"send a power key to wake up lcd"),
315 ssize_t rk_soc_pm_helps_sprintf(char *buf)
320 for(i=0;i<ARRAY_SIZE(rk_soc_pm_helps);i++)
322 s += sprintf(s, "bit(%d): %s\n", rk_soc_pm_helps[i].offset,rk_soc_pm_helps[i].name);
328 void rk_soc_pm_helps_printk(void)
331 printk("**************rkpm_ctr_bits bits help***********:\n");
332 for(i=0;i<ARRAY_SIZE(rk_soc_pm_helps);i++)
334 printk("bit(%d): %s\n", rk_soc_pm_helps[i].offset,rk_soc_pm_helps[i].name);
339 static int __init early_param_rk_soc_pm_ctr(char *str)
341 get_option(&str, &rkpm_ctrbits);
343 printk("********rkpm_ctr_bits information is following:*********\n");
344 printk("rkpm_ctr_bits=%x\n",rkpm_ctrbits);
347 rk_soc_pm_helps_printk();
349 printk("********rkpm_ctr_bits information end*********\n");
354 /*******************************************log*********************************************/
359 extern void pm_emit_log_char(char c);
361 /********************************ddr print**********************************/
362 void rkpm_ddr_printch(char byte)
365 pm_ops.printch(byte);
367 //rkpm_ddr_printch('\r');
369 void rkpm_ddr_printascii(const char *s)
372 rkpm_ddr_printch(*s);
377 void rkpm_ddr_printhex(unsigned int hex)
380 rkpm_ddr_printch('0');
381 rkpm_ddr_printch('x');
383 unsigned char c = (hex & 0xF0000000) >> 28;
384 rkpm_ddr_printch(c < 0xa ? c + '0' : c - 0xa + 'a');
388 static int rk_lpmode_enter(unsigned long arg)
391 //RKPM_DDR_PFUN(slp_setting(rkpm_jdg_sram_ctrbits),slp_setting);
393 RKPM_DDR_FUN(slp_setting);
395 local_flush_tlb_all();
400 //outer_inv_all();// ???
401 // l2x0_inv_all_pm(); //rk319x is not need
404 rkpm_ddr_printch('d');
411 rkpm_ddr_printch('D');
416 int cpu_suspend(unsigned long arg, int (*fn)(unsigned long));
418 static int rkpm_enter(suspend_state_t state)
421 printk("%s\n",__FUNCTION__);
424 RKPM_DDR_FUN(prepare);
426 printk(KERN_DEBUG "pm: ");
428 rkpm_ctrbits_prepare();
430 // if(rkpm_chk_jdg_ctrbits(RKPM_CTR_RET_DIRT))
433 rkpm_ddr_printch('0');
435 RKPM_BITCTR_DDR_FUN(PWR_DMNS,pwr_dmns);
437 rkpm_ddr_printch('1');
441 RKPM_DDR_PFUN(save_setting,(rkpm_jdg_sram_ctrbits));
443 rkpm_ddr_printch('2');
445 RKPM_BITCTR_DDR_FUN(GTCLKS,gtclks);
447 rkpm_ddr_printch('3');
449 RKPM_BITCTR_DDR_FUN(PLLS,plls);
451 rkpm_ddr_printch('4');
453 RKPM_BITCTR_DDR_FUN(GPIOS,gpios);
455 RKPM_DDR_FUN(regs_pread);
457 rkpm_ddr_printch('5');
461 if(rkpm_chk_jdg_ctrbits(RKPM_CTRBITS_SOC_DLPMD))
463 if(cpu_suspend(0,rk_lpmode_enter)==0)
465 RKPM_DDR_FUN(slp_re_first);
466 rkpm_ddr_printch('D');
467 //rk_soc_pm_ctr_bits_prepare();
469 rkpm_ddr_printch('d');
471 else if(rkpm_chk_jdg_ctrbits(RKPM_CTR_IDLESRAM_MD)&&p_suspend_pie_cb)
473 call_with_stack(p_suspend_pie_cb,&rkpm_jdg_sram_ctrbits, rockchip_sram_stack);
483 rkpm_ddr_printch('5');
485 RKPM_BITCTR_DDR_FUN(GPIOS,re_gpios);
487 rkpm_ddr_printch('4');
489 RKPM_BITCTR_DDR_FUN(PLLS,re_plls);
491 rkpm_ddr_printch('3');
493 RKPM_BITCTR_DDR_FUN(GTCLKS,re_gtclks);
495 rkpm_ddr_printch('2');
497 RKPM_DDR_FUN(re_save_setting);
500 rkpm_ddr_printch('1');
504 RKPM_BITCTR_DDR_FUN(PWR_DMNS,re_pwr_dmns);
506 rkpm_ddr_printch('0');
511 printk(KERN_CONT "\n");
513 rkpm_ddr_printch('\n');
515 RKPM_DDR_FUN(finish);
520 static int rkpm_enter_tst(void)
523 return rkpm_enter(0);
527 static int rkpm_suspend_prepare(void)
529 /* disable entering idle by disable_hlt() */
534 static void rkpm_suspend_finish(void)
538 #if 0 //def CONFIG_KEYS_RK29
539 if(rkpm_check_ctrbits(1<<RKPM_CTR_WAKE_UP_KEY))
541 rk28_send_wakeup_key();
542 printk("rk30_pm_finish rk28_send_wakeup_key\n");
548 static struct platform_suspend_ops rockchip_suspend_ops = {
550 .valid = suspend_valid_only_mem,
551 .prepare = rkpm_suspend_prepare,
552 .finish = rkpm_suspend_finish,
554 void __init rockchip_suspend_init(void)
556 //printk("%s\n",__FUNCTION__);
557 suspend_set_ops(&rockchip_suspend_ops);