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>
8 #include <linux/moduleparam.h>
9 #include <linux/rockchip/common.h>
14 /*************************dump reg********************************************/
16 void rkpm_ddr_reg_offset_dump(void __iomem * base_addr,u32 _offset)
18 rkpm_ddr_printhex(_offset);
19 rkpm_ddr_printch('-');
20 rkpm_ddr_printhex(readl_relaxed((base_addr + _offset)));
23 void rkpm_ddr_regs_dump(void __iomem * base_addr,u32 start_offset,u32 end_offset)
28 rkpm_ddr_printascii("start from:");
29 rkpm_ddr_printhex((unsigned long)base_addr + start_offset);
30 rkpm_ddr_printch('\n');
33 for(i=start_offset;i<=end_offset;)
36 rkpm_ddr_printhex(reg_readl((base_addr + i)));
39 rkpm_ddr_printch('\n');
44 rkpm_ddr_printch('-');
46 rkpm_ddr_printch('\n');
54 static struct rkpm_ops pm_ops={NULL};
56 static struct rkpm_sram_ops *p_pm_sram_ops=NULL;//pie point for pm_sram_ops
57 static rkpm_sram_suspend_arg_cb p_suspend_pie_cb=NULL;
60 static u32 rkpm_ctrbits=0;
61 //for judging rkpm_ctrbits valid ,save ifself
62 static u32 rkpm_jdg_ctrbits=0;
63 static u32 rkpm_jdg_sram_ctrbits=0;
65 /**************************************ddr callback setting***************************************/
67 void rkpm_set_pie_info(struct rkpm_sram_ops *pm_sram_ops,rkpm_sram_suspend_arg_cb pie_cb)
70 p_pm_sram_ops=pm_sram_ops;
71 p_suspend_pie_cb=pie_cb;
76 void rkpm_set_ops_prepare_finish(rkpm_ops_void_callback prepare,rkpm_ops_void_callback finish)
78 pm_ops.prepare=prepare;
82 void rkpm_set_ops_pwr_dmns(rkpm_ops_void_callback pwr_dmns,rkpm_ops_void_callback re_pwr_dmns)
84 pm_ops.pwr_dmns=pwr_dmns;
85 pm_ops.re_pwr_dmns=re_pwr_dmns;
88 void rkpm_set_ops_gtclks(rkpm_ops_void_callback gtclks,rkpm_ops_void_callback re_gtclks)
91 pm_ops.re_gtclks=re_gtclks;
95 void rkpm_set_ops_plls(rkpm_ops_void_callback plls,rkpm_ops_void_callback re_plls)
98 pm_ops.re_plls=re_plls;
102 void rkpm_set_ops_gpios(rkpm_ops_void_callback gpios,rkpm_ops_void_callback re_gpios)
105 pm_ops.re_gpios=re_gpios;
107 void rkpm_set_ops_save_setting(rkpm_ops_paramter_u32_cb save_setting,rkpm_ops_void_callback re_save_setting)
109 pm_ops.save_setting=save_setting;
110 pm_ops.re_save_setting=re_save_setting;
115 void rkpm_set_ops_printch(rkpm_ops_printch_callback printch)
117 pm_ops.printch=printch;
120 void rkpm_set_ops_regs_pread(rkpm_ops_void_callback regs_pread)
122 pm_ops.regs_pread=regs_pread;
125 void rkpm_set_ops_regs_sleep(rkpm_ops_void_callback slp_setting,rkpm_ops_void_callback re_last)
128 pm_ops.slp_setting=slp_setting;
130 pm_ops.slp_re_first=re_last;
134 /**************************************sram callback setting***************************************/
135 void rkpm_set_sram_ops_volt(rkpm_ops_void_callback volts,rkpm_ops_void_callback re_volts)
139 p_pm_sram_ops->volts=volts;
140 p_pm_sram_ops->re_volts=re_volts;
144 void rkpm_set_sram_ops_gtclks(rkpm_ops_void_callback gtclks,rkpm_ops_void_callback re_gtclks)
148 p_pm_sram_ops->gtclks=gtclks;
149 p_pm_sram_ops->re_gtclks=re_gtclks;
153 void rkpm_set_sram_ops_sysclk(rkpm_ops_paramter_u32_cb sysclk,rkpm_ops_paramter_u32_cb re_sysclk)
157 p_pm_sram_ops->sysclk=sysclk;
158 p_pm_sram_ops->re_sysclk=re_sysclk;
162 void rkpm_set_sram_ops_pmic(rkpm_ops_void_callback pmic,rkpm_ops_void_callback re_pmic)
166 p_pm_sram_ops->pmic=pmic;
167 p_pm_sram_ops->re_pmic=re_pmic;
171 void rkpm_set_sram_ops_ddr(rkpm_ops_void_callback ddr,rkpm_ops_void_callback re_ddr)
175 p_pm_sram_ops->ddr=ddr;
176 p_pm_sram_ops->re_ddr=re_ddr;
180 void rkpm_set_sram_ops_bus(rkpm_ops_void_callback bus_idle_request)
183 p_pm_sram_ops->bus_idle_request = bus_idle_request;
185 void rkpm_set_sram_ops_printch(rkpm_ops_printch_callback printch)
188 p_pm_sram_ops->printch=printch;
191 /******************for user ************************/
192 void rkpm_set_ctrbits(u32 bits)
197 void rkpm_add_ctrbits(u32 bits)
199 rkpm_ctrbits |= bits;
202 u32 rkpm_get_ctrbits(void)
207 u32 rkpm_chk_ctrbits(u32 bits)
209 return (rkpm_ctrbits&bits);
213 void rkpm_clr_ctrbits(u32 bits)
218 /****************** for pm.c************************/
220 static void inline rkpm_set_jdg_ctrbits(u32 bits)
222 rkpm_jdg_ctrbits = bits;
225 static u32 inline rkpm_get_jdg_ctrbits(void)
227 return rkpm_jdg_ctrbits;
230 static void inline rkpm_add_jdg_ctrbits(int bit)
232 rkpm_jdg_ctrbits|=bit;
236 static u32 inline rkpm_chk_jdg_ctrbit(int bit)
238 return (rkpm_jdg_ctrbits&bit);
242 static u32 inline rkpm_chk_jdg_ctrbits(int bits)
244 return (rkpm_jdg_ctrbits&bits);
247 static void inline rkpm_clr_jdg_ctrbits(int bit)
249 rkpm_jdg_ctrbits&=~bit;
253 #define RKPM_DDR_FUN(fun) \
257 // fun with paramater param (p1,p2,p3)
258 #define RKPM_DDR_PFUN(fun,param) \
260 {(pm_ops.fun)param;} while(0)
262 #define RKPM_BITCTR_DDR_FUN(ctr,fun) \
263 if(rkpm_chk_jdg_ctrbits(RKPM_CTR_##ctr)&&pm_ops.fun)\
266 #define RKPM_BITSCTR_DDR_FUN(bits,fun) \
267 if(rkpm_chk_jdg_ctrbits(bits)&&pm_ops.fun)\
272 #define RKPM_LPMD_BITSCTR_DDR_PFUN(bits,fun,param) \
273 if(rkpm_chk_jdg_ctrbits(RKPM_CTRBITS_SOC_DLPMD)&&pm_ops.fun)\
276 #define RKPM_LPMD_BITSCTR_DDR_FUN(bits,fun) \
277 if(rkpm_chk_jdg_ctrbits(RKPM_CTRBITS_SOC_DLPMD)&&pm_ops.fun)\
282 void rkpm_ctrbits_prepare(void)
285 //rkpm_sram_ctrbits=rkpm_ctrbits;
287 rkpm_jdg_ctrbits=rkpm_ctrbits;
289 //if plls is no pd,clk rate is high, volts can not setting low,so we need to judge ctrbits
290 //if(rkpm_chk_jdg_ctrbits(RKPM_CTR_VOLTS))
292 //rkpm_clr_jdg_ctrbits(RKPM_CTR_VOLTS);
295 rkpm_jdg_sram_ctrbits=rkpm_jdg_ctrbits;
297 //clk gating will gate ddr clk in sram
298 if(!rkpm_chk_val_ctrbits(rkpm_jdg_sram_ctrbits,RKPM_CTR_DDR))
300 // rkpm_clr_val_ctrbit(rkpm_jdg_sram_ctrbits,RKPM_CTR_GTCLKS);
305 struct rk_soc_pm_info_st {
310 #define RK_SOC_PM_HELP_(id,NAME)\
312 .offset= RKPM_CTR_##id,\
316 struct rk_soc_pm_info_st rk_soc_pm_helps[]={
318 RK_SOC_PM_HELP_(NO_PD,"pd is not power dn"),
319 RK_SOC_PM_HELP_(NO_CLK_GATING,"clk is not gating"),
320 RK_SOC_PM_HELP_(NO_PLL,"pll is not power dn"),
321 RK_SOC_PM_HELP_(NO_VOLT,"volt is not set suspend"),
322 RK_SOC_PM_HELP_(NO_GPIO,"gpio is not control "),
323 //RK_SOC_PM_HELP_(NO_SRAM,"not enter sram code"),
324 RK_SOC_PM_HELP_(NO_DDR,"ddr is not reflash"),
325 RK_SOC_PM_HELP_(NO_PMIC,"pmic is not suspend"),
326 RK_SOC_PM_HELP_(RET_DIRT,"sys return from pm_enter directly"),
327 RK_SOC_PM_HELP_(SRAM_NO_WFI,"sys is not runing wfi in sram"),
328 RK_SOC_PM_HELP_(WAKE_UP_KEY,"send a power key to wake up lcd"),
332 ssize_t rk_soc_pm_helps_sprintf(char *buf)
337 for(i=0;i<ARRAY_SIZE(rk_soc_pm_helps);i++)
339 s += sprintf(s, "bit(%d): %s\n", rk_soc_pm_helps[i].offset,rk_soc_pm_helps[i].name);
345 void rk_soc_pm_helps_printk(void)
348 printk("**************rkpm_ctr_bits bits help***********:\n");
349 for(i=0;i<ARRAY_SIZE(rk_soc_pm_helps);i++)
351 printk("bit(%d): %s\n", rk_soc_pm_helps[i].offset,rk_soc_pm_helps[i].name);
356 static int __init early_param_rk_soc_pm_ctr(char *str)
358 get_option(&str, &rkpm_ctrbits);
360 printk("********rkpm_ctr_bits information is following:*********\n");
361 printk("rkpm_ctr_bits=%x\n",rkpm_ctrbits);
364 rk_soc_pm_helps_printk();
366 printk("********rkpm_ctr_bits information end*********\n");
371 /*******************************************log*********************************************/
376 extern void pm_emit_log_char(char c);
378 /********************************ddr print**********************************/
379 void rkpm_ddr_printch(char byte)
382 pm_ops.printch(byte);
384 //rkpm_ddr_printch('\r');
386 void rkpm_ddr_printascii(const char *s)
389 rkpm_ddr_printch(*s);
394 void rkpm_ddr_printhex(unsigned int hex)
397 rkpm_ddr_printch('0');
398 rkpm_ddr_printch('x');
400 unsigned char c = (hex & 0xF0000000) >> 28;
401 rkpm_ddr_printch(c < 0xa ? c + '0' : c - 0xa + 'a');
407 void rk_sram_suspend(void)
409 RKPM_DDR_FUN(regs_pread);
410 rkpm_ddr_printascii("sram");
411 call_with_stack(p_suspend_pie_cb
412 , &rkpm_jdg_sram_ctrbits, rockchip_sram_stack);
414 static int rk_lpmode_enter(unsigned long arg)
417 //RKPM_DDR_PFUN(slp_setting(rkpm_jdg_sram_ctrbits),slp_setting);
419 RKPM_DDR_FUN(slp_setting);
421 local_flush_tlb_all();
426 //outer_inv_all();// ???
427 // l2x0_inv_all_pm(); //rk319x is not need
430 rkpm_ddr_printch('d');
437 rkpm_ddr_printch('D');
441 int cpu_suspend(unsigned long arg, int (*fn)(unsigned long));
442 #endif /* CONFIG_ARM */
444 static int rkpm_enter(suspend_state_t state)
446 //static u32 test_count=0;
447 // printk(KERN_DEBUG"pm: ");
448 printk("%s:\n",__FUNCTION__);
449 //printk("pm test times=%d\n",++test_count);
451 RKPM_DDR_FUN(prepare);
453 rkpm_ctrbits_prepare();
455 // if(rkpm_chk_jdg_ctrbits(RKPM_CTR_RET_DIRT))
458 rkpm_ddr_printch('0');
460 RKPM_BITCTR_DDR_FUN(PWR_DMNS,pwr_dmns);
462 rkpm_ddr_printch('1');
466 RKPM_DDR_PFUN(save_setting,(rkpm_jdg_sram_ctrbits));
468 rkpm_ddr_printch('2');
470 RKPM_BITCTR_DDR_FUN(GTCLKS,gtclks);
472 rkpm_ddr_printch('3');
474 RKPM_BITCTR_DDR_FUN(PLLS,plls);
476 rkpm_ddr_printch('4');
478 RKPM_BITCTR_DDR_FUN(GPIOS,gpios);
480 RKPM_DDR_FUN(regs_pread);
482 rkpm_ddr_printch('5');
485 if(rkpm_chk_jdg_ctrbits(RKPM_CTRBITS_SOC_DLPMD))
487 if(cpu_suspend(0,rk_lpmode_enter)==0)
489 RKPM_DDR_FUN(slp_re_first);
490 rkpm_ddr_printch('K');
491 //rk_soc_pm_ctr_bits_prepare();
493 rkpm_ddr_printch('d');
495 else if(rkpm_chk_jdg_ctrbits(RKPM_CTR_IDLESRAM_MD)&&p_suspend_pie_cb)
497 call_with_stack(p_suspend_pie_cb,&rkpm_jdg_sram_ctrbits, rockchip_sram_stack);
509 rkpm_ddr_printch('5');
511 RKPM_BITCTR_DDR_FUN(GPIOS,re_gpios);
513 rkpm_ddr_printch('4');
515 RKPM_BITCTR_DDR_FUN(PLLS,re_plls);
517 rkpm_ddr_printch('3');
519 RKPM_BITCTR_DDR_FUN(GTCLKS,re_gtclks);
521 rkpm_ddr_printch('2');
523 RKPM_DDR_FUN(re_save_setting);
526 rkpm_ddr_printch('1');
528 RKPM_BITCTR_DDR_FUN(PWR_DMNS,re_pwr_dmns);
530 rkpm_ddr_printch('0');
531 rkpm_ddr_printch('\n');
533 RKPM_DDR_FUN(finish);
538 static int rkpm_enter_tst(void)
541 return rkpm_enter(0);
546 static int rkpm_suspend_prepare(void)
548 /* disable entering idle by disable_hlt() */
553 static void rkpm_suspend_finish(void)
557 #if 0 //def CONFIG_KEYS_RK29
558 if(rkpm_check_ctrbits(1<<RKPM_CTR_WAKE_UP_KEY))
560 rk28_send_wakeup_key();
561 printk("rk30_pm_finish rk28_send_wakeup_key\n");
567 static struct platform_suspend_ops rockchip_suspend_ops = {
569 .valid = suspend_valid_only_mem,
570 .prepare = rkpm_suspend_prepare,
571 .finish = rkpm_suspend_finish,
573 void __init rockchip_suspend_init(void)
575 //printk("%s\n",__FUNCTION__);
576 suspend_set_ops(&rockchip_suspend_ops);
581 static int __init rockchip_init_suspend(void)
583 suspend_set_ops(&rockchip_suspend_ops);
586 late_initcall_sync(rockchip_init_suspend);
587 #endif /* CONFIG_ARM */
589 static enum rockchip_pm_policy pm_policy;
590 static BLOCKING_NOTIFIER_HEAD(policy_notifier_list);
592 int rockchip_pm_policy_register_notifier(struct notifier_block *nb)
594 return blocking_notifier_chain_register(&policy_notifier_list, nb);
597 int rockchip_pm_policy_unregister_notifier(struct notifier_block *nb)
599 return blocking_notifier_chain_unregister(&policy_notifier_list, nb);
602 static int rockchip_pm_policy_notify(void)
604 return blocking_notifier_call_chain(&policy_notifier_list,
608 enum rockchip_pm_policy rockchip_pm_get_policy(void)
613 int rockchip_pm_set_policy(enum rockchip_pm_policy policy)
615 if (policy < ROCKCHIP_PM_NR_POLICYS && policy != pm_policy) {
616 printk(KERN_INFO "pm policy %d -> %d\n", pm_policy, policy);
618 rockchip_pm_policy_notify();
624 static unsigned int policy;
626 static int set_policy(const char *val, const struct kernel_param *kp)
630 ret = param_set_uint(val, kp);
634 rockchip_pm_set_policy(policy);
635 policy = rockchip_pm_get_policy();
640 static struct kernel_param_ops policy_param_ops = {
642 .get = param_get_uint,
645 module_param_cb(policy, &policy_param_ops, &policy, 0600);