rkpm sleep support
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rockchip / pm.h
1 #ifndef __MACH_ROCKCHIP_PM_H
2 #define __MACH_ROCKCHIP_PM_H
3
4
5
6 /******************************sleep data in bootram********************************/
7 #define PM_BOOT_CODE_OFFSET (0x0)
8 #define PM_BOOT_CODE_SIZE       (0x100)
9
10 // index data off in SLP_DATA_SAVE_BASE
11 // it may be include in *.s ,so con't use enum type define
12
13 #define SLPDATA_L2_CON                       (0)  //cpu resume sp
14 #define SLPDATA_SP_ADDR                       (SLPDATA_L2_CON+1)  //cpu resume sp
15 #define SLPDATA_SP_CPU_RESUME          (SLPDATA_SP_ADDR+1)  //cpu resume sp
16 #define SLPDATA_DDR_NEED_RES            (SLPDATA_SP_CPU_RESUME+1)  //ddr ctrl is need to resume
17 #define SLPDATA_DPLL_NEED_RES           (SLPDATA_DDR_NEED_RES+1) //ddr pll is need to resume
18 #define SLPDATA_DDR_CODE_PHY            (SLPDATA_DPLL_NEED_RES+1) //ddr resume code phy
19 #define SLPDATA_DDR_DATA_PHY            (SLPDATA_DDR_CODE_PHY+1) //ddr resume data phy
20 #define SLPDATA_SLEEP_RES_CON_CNT                     (SLPDATA_DDR_DATA_PHY+1)
21
22 #define PM_BOOT_DATA_SIZE   (SLPDATA_SLEEP_RES_CON_CNT*4) // all index
23
24
25 #define RKPM_CTRBITS_SOC_DLPMD RKPM_OR_5BITS(ARMDP_LPMD ,ARMOFF_LPMD ,ARMLOGDP_LPMD ,ARMOFF_LOGDP_LPMD,ARMLOGOFF_DLPMD)
26
27
28
29 #ifndef _RKPM_SEELP_S_INCLUDE_
30 #include <dt-bindings/suspend/rockchip-pm.h>
31
32 #define RKPM_LOOPS_PER_USEC     24
33 #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)
34 /* delay on slow mode */
35 #define rkpm_udelay(usecs)      RKPM_LOOP((usecs)*RKPM_LOOPS_PER_USEC)
36 /* delay on deep slow mode */
37 #define rkpm_32k_udelay(usecs)  RKPM_LOOP(((usecs)*RKPM_LOOPS_PER_USEC)/(24000000/32768))
38
39
40
41 typedef void (*rkpm_ops_void_callback)(void);
42 typedef void (*rkpm_ops_printch_callback)(char byte);
43 typedef void (*rkpm_ops_paramter_u32_cb)(u32 val);
44 typedef void (*rkpm_sram_suspend_arg_cb)(void *arg);
45
46 // ops in ddr callback
47 struct rkpm_ops {
48
49         rkpm_ops_void_callback prepare;
50         rkpm_ops_void_callback finish;
51         rkpm_ops_void_callback regs_pread;
52
53         rkpm_ops_void_callback pwr_dmns;
54         rkpm_ops_void_callback re_pwr_dmns;
55
56         rkpm_ops_void_callback gtclks;
57         rkpm_ops_void_callback re_gtclks;
58
59
60         rkpm_ops_void_callback plls;
61         rkpm_ops_void_callback re_plls;
62         
63         rkpm_ops_void_callback  gpios;
64         rkpm_ops_void_callback  re_gpios;
65
66         rkpm_ops_void_callback  slp_save;       
67         rkpm_ops_paramter_u32_cb  slp_setting;
68         rkpm_ops_void_callback  slp_re_first;
69         rkpm_ops_void_callback  slp_re_last;
70     
71         rkpm_ops_printch_callback printch;
72
73 };
74
75
76 // ops in intmen callback
77 struct rkpm_sram_ops{
78
79         rkpm_ops_void_callback volts;
80         rkpm_ops_void_callback re_volts;
81
82         rkpm_ops_void_callback gtclks;
83         rkpm_ops_void_callback re_gtclks;
84
85         rkpm_ops_paramter_u32_cb sysclk;
86         rkpm_ops_paramter_u32_cb re_sysclk;
87
88         rkpm_ops_void_callback pmic;
89         rkpm_ops_void_callback re_pmic;
90         
91         rkpm_ops_void_callback ddr;
92         rkpm_ops_void_callback re_ddr;
93     
94         rkpm_ops_printch_callback printch;
95 };
96
97 #if 0
98 struct rkpm_gpios_info_st{
99     u32 pins;
100     u32 in_out;
101     u32 level_pull;
102 };
103 #endif
104
105 /******************ctr bits setting  ************************/
106
107 #define rkpm_chk_val_ctrbit(val,bit) ((val)&(bit))//check bit
108 #define rkpm_chk_val_ctrbits(val,bits) ((val)&(bits))  //check bits
109
110 /************************************reg ops*****************************************************/
111 #define cru_readl(offset)       readl_relaxed(RK_CRU_VIRT + offset)
112 #define cru_writel(v, offset)   do { writel_relaxed(v, RK_CRU_VIRT + offset); dsb(); } while (0)
113
114 #define pmu_readl(offset)       readl_relaxed(RK_PMU_VIRT + offset)
115 #define pmu_writel(v,offset)    do { writel_relaxed(v, RK_PMU_VIRT + offset); dsb(); } while (0)
116
117 #define grf_readl(offset)       readl_relaxed(RK_GRF_VIRT + offset)
118 #define grf_writel(v, offset)   do { writel_relaxed(v, RK_GRF_VIRT + offset); dsb(); } while (0)
119
120 #define reg_readl(base) readl_relaxed(base)
121 #define reg_writel(v, base)     do { writel_relaxed(v, base); dsb(); } while (0)
122
123 #if 0
124 #define PM_ERR(fmt, args...) printk(KERN_ERR fmt, ##args)
125 #define PM_LOG(fmt, args...) printk(KERN_ERR fmt, ##args)
126 #define PM_WARNING(fmt, args...) printk(KERN_WARNING fmt, ##args)
127 #else
128
129 #define PM_ERR(fmt, args...) printk(fmt, ##args)
130 #define PM_LOG(fmt, args...) printk(fmt, ##args)
131 #define PM_WARNING(fmt, args...) printk(fmt, ##args)
132 #endif
133
134 /*********************************pm control******************************************/
135
136 extern void rkpm_slp_cpu_resume(void);
137 extern void rkpm_slp_cpu_while_tst(void);
138
139 //extern int  rkpm_slp_cpu_save(int state,int offset);
140 extern void rkpm_ddr_reg_offset_dump(void __iomem * base_addr,u32 _offset);
141 extern void  rkpm_ddr_regs_dump(void __iomem * base_addr,u32 start_offset,u32 end_offset);
142
143 extern void rkpm_set_pie_info(struct rkpm_sram_ops *pm_sram_ops,rkpm_sram_suspend_arg_cb pie_cb);
144 extern void rkpm_set_ops_prepare_finish(rkpm_ops_void_callback prepare,rkpm_ops_void_callback finish);
145 extern void rkpm_set_ops_pwr_dmns(rkpm_ops_void_callback pwr_dmns,rkpm_ops_void_callback re_pwr_dmns);
146 extern void rkpm_set_ops_gtclks(rkpm_ops_void_callback gtclks,rkpm_ops_void_callback re_gtclks);
147 extern void rkpm_set_ops_plls(rkpm_ops_void_callback plls,rkpm_ops_void_callback re_plls);
148 extern void rkpm_set_ops_gpios(rkpm_ops_void_callback gpios,rkpm_ops_void_callback re_gpios);
149 extern void rkpm_set_ops_printch(rkpm_ops_printch_callback printch);
150 extern void rkpm_set_ops_regs_pread(rkpm_ops_void_callback regs_pread);
151 extern void rkpm_set_ops_regs_sleep(rkpm_ops_void_callback save,rkpm_ops_paramter_u32_cb setting
152                                                                 ,rkpm_ops_void_callback re_first,rkpm_ops_void_callback re_last);
153
154 extern void rkpm_set_sram_ops_volt(rkpm_ops_void_callback volts,rkpm_ops_void_callback re_volts);
155 extern void rkpm_set_sram_ops_gtclks(rkpm_ops_void_callback gtclks,rkpm_ops_void_callback re_gtclks);
156 extern void rkpm_set_sram_ops_sysclk(rkpm_ops_paramter_u32_cb sysclk,rkpm_ops_paramter_u32_cb re_sysclk);
157 extern void rkpm_set_sram_ops_pmic(rkpm_ops_void_callback pmic,rkpm_ops_void_callback re_pmic);
158 extern void rkpm_set_sram_ops_ddr(rkpm_ops_void_callback ddr,rkpm_ops_void_callback re_ddr);
159 extern void rkpm_set_sram_ops_printch(rkpm_ops_printch_callback printch);
160
161 extern void inline rkpm_set_ctrbits(u32 bits);
162 extern u32  inline rkpm_get_ctrbits(void);
163 extern void inline  rkpm_set_ctrbit(int idxs);
164 extern u32 inline  rkpm_get_ctrbit(int idxs);
165 extern void inline rkpm_clr_ctrbit(int idxs);//clear
166
167 extern void rkpm_ddr_printch(char byte);
168 extern void rkpm_ddr_printascii(const char *s);
169 extern void  rkpm_ddr_printhex(unsigned int hex);
170
171 extern u32 clk_suspend_clkgt_info_get(u32 *clk_ungt_msk,u32 *clk_gt_last_set,u32 buf_cnt);
172
173
174 /********************************sram print**********************************/
175 #include "sram.h"
176
177 #if 1//def CPU
178 extern void PIE_FUNC(rkpm_sram_printch_pie)(char byte);
179 extern void  PIE_FUNC(rkpm_sram_printhex_pie)(unsigned int hex);
180
181 #define rkpm_sram_printch(byte)  FUNC(rkpm_sram_printch_pie)(byte)
182 //void __sramfunc rkpm_sram_printascii(const char *s);
183 #define rkpm_sram_printhex(hex) FUNC(rkpm_sram_printhex_pie)(hex)
184 #endif
185
186 #endif
187 #endif
188