ARM: rockchip: rk3228: implement function rk3228_restart
[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
8 #define RKPM_ALIGN(size,n_byte) (((size+n_byte-1)/n_byte)*n_byte)
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
14
15 #define RKPM_BOOTDATA_CPUSP            (0)  //cpu sp addr
16 #define RKPM_BOOTDATA_CPUCODE       (RKPM_BOOTDATA_CPUSP+1)  //cpu resume fun,phy base
17 #define RKPM_BOOTDATA_DDR_F            (RKPM_BOOTDATA_CPUCODE+1)  //ddr flag , 1 need to resume ddr ctr
18 #define RKPM_BOOTDATA_DPLL_F          (RKPM_BOOTDATA_DDR_F+1) //ddr pll flag, 1  need to resume dpll
19 #define RKPM_BOOTDATA_DDRCODE       (RKPM_BOOTDATA_DPLL_F+1) //ddr resume code ,phy base
20 #define RKPM_BOOTDATA_DDRDATA       (RKPM_BOOTDATA_DDRCODE+1) //ddr resume data ,phy base
21 // for l2 resume
22 #define RKPM_BOOTDATA_L2LTY_F             (RKPM_BOOTDATA_DDRDATA+1)  //save l2 latency val
23 #define RKPM_BOOTDATA_L2LTY             (RKPM_BOOTDATA_L2LTY_F+1)
24 // for arm errata 81835 resume
25 #define RKPM_BOOTDATA_ARM_ERRATA_818325_F            (RKPM_BOOTDATA_L2LTY+1)  //save l2 latency val
26 #define RKPM_BOOTDATA_ARM_ERRATA_818325             (RKPM_BOOTDATA_ARM_ERRATA_818325_F+1)
27
28 #define RKPM_BOOTDATA_ARR_SIZE  (RKPM_BOOTDATA_ARM_ERRATA_818325+1)
29
30
31
32 #define RKPM_BOOT_CODE_OFFSET (0x0)
33 #define RKPM_BOOT_CODE_SIZE     (0x100)
34
35 #define RKPM_BOOT_DATA_OFFSET (RKPM_BOOT_CODE_OFFSET+RKPM_BOOT_CODE_SIZE)
36 #define RKPM_BOOT_DATA_SIZE     (RKPM_BOOTDATA_ARR_SIZE*4)
37
38 #define RKPM_BOOT_DDRCODE_OFFSET (RKPM_BOOT_DATA_OFFSET+RKPM_BOOT_DATA_SIZE)
39
40
41
42
43
44 #define RKPM_CTRBITS_SOC_DLPMD RKPM_OR_5BITS(ARMDP_LPMD ,ARMOFF_LPMD ,ARMLOGDP_LPMD ,ARMOFF_LOGDP_LPMD,ARMLOGOFF_DLPMD)
45
46
47
48 #ifndef _RKPM_SEELP_S_INCLUDE_
49 #include <dt-bindings/suspend/rockchip-pm.h>
50
51 #define RKPM_LOOPS_PER_USEC     24
52 #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)
53 /* delay on slow mode */
54 #define rkpm_udelay(usecs)      RKPM_LOOP((usecs)*RKPM_LOOPS_PER_USEC)
55 /* delay on deep slow mode */
56 #define rkpm_32k_udelay(usecs)  RKPM_LOOP(((usecs)*RKPM_LOOPS_PER_USEC)/(24000000/32768))
57
58
59
60 typedef void (*rkpm_ops_void_callback)(void);
61 typedef void (*rkpm_ops_printch_callback)(char byte);
62 typedef void (*rkpm_ops_paramter_u32_cb)(u32 val);
63 typedef void (*rkpm_sram_suspend_arg_cb)(void *arg);
64
65 // ops in ddr callback
66 struct rkpm_ops {
67
68         rkpm_ops_void_callback prepare;
69         rkpm_ops_void_callback finish;
70         rkpm_ops_void_callback regs_pread;
71
72         rkpm_ops_void_callback pwr_dmns;
73         rkpm_ops_void_callback re_pwr_dmns;
74
75         rkpm_ops_void_callback gtclks;
76         rkpm_ops_void_callback re_gtclks;
77
78
79         rkpm_ops_void_callback plls;
80         rkpm_ops_void_callback re_plls;
81         
82         rkpm_ops_void_callback  gpios;
83         rkpm_ops_void_callback  re_gpios;
84     
85         rkpm_ops_paramter_u32_cb save_setting;  //idle \ sleep mode save and setting
86         rkpm_ops_void_callback re_save_setting;
87
88        
89         rkpm_ops_void_callback  slp_setting;
90         rkpm_ops_void_callback  slp_re_first;
91         //rkpm_ops_void_callback  slp_re_last;
92     
93         rkpm_ops_printch_callback printch;
94
95 };
96
97
98 // ops in intmen callback
99 struct rkpm_sram_ops{
100
101         rkpm_ops_void_callback volts;
102         rkpm_ops_void_callback re_volts;
103
104         rkpm_ops_void_callback gtclks;
105         rkpm_ops_void_callback re_gtclks;
106
107         rkpm_ops_paramter_u32_cb sysclk;
108         rkpm_ops_paramter_u32_cb re_sysclk;
109
110         rkpm_ops_void_callback pmic;
111         rkpm_ops_void_callback re_pmic;
112         
113         rkpm_ops_void_callback ddr;
114         rkpm_ops_void_callback re_ddr;
115
116         rkpm_ops_void_callback bus_idle_request;
117         rkpm_ops_printch_callback printch;
118 };
119
120 #if 0
121 struct rkpm_gpios_info_st{
122     u32 pins;
123     u32 in_out;
124     u32 level_pull;
125 };
126 #endif
127
128 /******************ctr bits setting  ************************/
129
130 //#define rkpm_chk_val_ctrbit(val,bit) ((val)&(bit))//check bit
131 #define rkpm_chk_val_ctrbits(val,bits) ((val)&(bits))  //check bits
132
133 /************************************reg ops*****************************************************/
134 #define cru_readl(offset)       readl_relaxed(RK_CRU_VIRT + offset)
135 #define cru_writel(v, offset)   do { writel_relaxed(v, RK_CRU_VIRT + offset); dsb(); } while (0)
136
137 #define pmu_readl(offset)       readl_relaxed(RK_PMU_VIRT + offset)
138 #define pmu_writel(v,offset)    do { writel_relaxed(v, RK_PMU_VIRT + offset); dsb(); } while (0)
139
140 #define grf_readl(offset)       readl_relaxed(RK_GRF_VIRT + offset)
141 #define grf_writel(v, offset)   do { writel_relaxed(v, RK_GRF_VIRT + offset); dsb(); } while (0)
142
143 #define reg_readl(base) readl_relaxed(base)
144 #define reg_writel(v, base)     do { writel_relaxed(v, base); dsb(); } while (0)
145
146 #if 0
147 #define PM_ERR(fmt, args...) printk(KERN_ERR fmt, ##args)
148 #define PM_LOG(fmt, args...) printk(KERN_ERR fmt, ##args)
149 #define PM_WARNING(fmt, args...) printk(KERN_WARNING fmt, ##args)
150 #else
151
152 #define PM_ERR(fmt, args...) printk(fmt, ##args)
153 #define PM_LOG(fmt, args...) printk(fmt, ##args)
154 #define PM_WARNING(fmt, args...) printk(fmt, ##args)
155 #endif
156
157 /*********************************pm control******************************************/
158
159 extern void rkpm_slp_cpu_resume(void);
160 extern void rkpm_slp_cpu_while_tst(void);
161
162 //extern int  rkpm_slp_cpu_save(int state,int offset);
163 extern void rkpm_ddr_reg_offset_dump(void __iomem * base_addr,u32 _offset);
164 extern void  rkpm_ddr_regs_dump(void __iomem * base_addr,u32 start_offset,u32 end_offset);
165
166 extern void rkpm_set_pie_info(struct rkpm_sram_ops *pm_sram_ops,rkpm_sram_suspend_arg_cb pie_cb);
167 extern void rkpm_set_ops_prepare_finish(rkpm_ops_void_callback prepare,rkpm_ops_void_callback finish);
168 extern void rkpm_set_ops_pwr_dmns(rkpm_ops_void_callback pwr_dmns,rkpm_ops_void_callback re_pwr_dmns);
169 extern void rkpm_set_ops_gtclks(rkpm_ops_void_callback gtclks,rkpm_ops_void_callback re_gtclks);
170 extern void rkpm_set_ops_plls(rkpm_ops_void_callback plls,rkpm_ops_void_callback re_plls);
171 extern void rkpm_set_ops_gpios(rkpm_ops_void_callback gpios,rkpm_ops_void_callback re_gpios);
172 extern void rkpm_set_ops_printch(rkpm_ops_printch_callback printch);
173 extern void rkpm_set_ops_regs_pread(rkpm_ops_void_callback regs_pread);
174 extern void rkpm_set_ops_save_setting(rkpm_ops_paramter_u32_cb save_setting,rkpm_ops_void_callback re_save_setting);
175 extern void rkpm_set_ops_regs_sleep(rkpm_ops_void_callback slp_setting,rkpm_ops_void_callback re_last);
176 void rkpm_set_sram_ops_bus(rkpm_ops_void_callback bus_idle_request);
177 extern void rkpm_set_sram_ops_volt(rkpm_ops_void_callback volts,rkpm_ops_void_callback re_volts);
178 extern void rkpm_set_sram_ops_gtclks(rkpm_ops_void_callback gtclks,rkpm_ops_void_callback re_gtclks);
179 extern void rkpm_set_sram_ops_sysclk(rkpm_ops_paramter_u32_cb sysclk,rkpm_ops_paramter_u32_cb re_sysclk);
180 extern void rkpm_set_sram_ops_pmic(rkpm_ops_void_callback pmic,rkpm_ops_void_callback re_pmic);
181 extern void rkpm_set_sram_ops_ddr(rkpm_ops_void_callback ddr,rkpm_ops_void_callback re_ddr);
182 extern void rkpm_set_sram_ops_printch(rkpm_ops_printch_callback printch);
183
184 u32 rkpm_chk_ctrbits(u32 bits);
185 extern void rkpm_set_ctrbits(u32 bits);
186 extern u32  rkpm_get_ctrbits(void);
187 extern void rkpm_clr_ctrbits(u32 bits);//clear
188
189 extern void rkpm_ddr_printch(char byte);
190 extern void rkpm_ddr_printascii(const char *s);
191 extern void  rkpm_ddr_printhex(unsigned int hex);
192
193 extern u32 clk_suspend_clkgt_info_get(u32 *clk_ungt_msk,u32 *clk_gt_last_set,u32 buf_cnt);
194
195
196 /********************************sram print**********************************/
197 #include "sram.h"
198
199 #if 1//def CPU
200 extern void PIE_FUNC(rkpm_sram_printch_pie)(char byte);
201 extern void  PIE_FUNC(rkpm_sram_printhex_pie)(unsigned int hex);
202
203 #define rkpm_sram_printch(byte)  FUNC(rkpm_sram_printch_pie)(byte)
204 //void __sramfunc rkpm_sram_printascii(const char *s);
205 #define rkpm_sram_printhex(hex) FUNC(rkpm_sram_printhex_pie)(hex)
206 #endif
207
208 #endif
209 #endif
210