dvfs: add pvtm support
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rockchip / sleep.S
1
2 #include <linux/linkage.h>
3 #include <asm/assembler.h>
4 #include <asm/memory.h>
5 //#include <asm/suspend.h>
6
7 #define _RKPM_SEELP_S_INCLUDE_
8 #include "pm.h"
9
10 .text
11 ENTRY(rkpm_slp_cpu_while_tst)
12 stmfd   sp!, { r3 - r12, lr }
13
14 1: mov r3,r3
15    b 1b
16
17 ldmfd   sp!, { r3 - r12, pc }
18
19 ENDPROC(rkpm_slp_cpu_while_tst)
20
21 .data
22 .align
23 //65 A   48 0  97 a
24 ENTRY(rkpm_slp_cpu_resume)
25 9:      mov r1,r1 
26        // b 9b
27         mov r1,r1 
28     #if 0    
29         ldr r4, = 0xFF690000
30         mov r5, #65
31         str r5,[r4]
32     #endif
33         setmode PSR_I_BIT | PSR_F_BIT | SVC_MODE, r1  @ set SVC, irqs off
34
35         MRC p15,0,R1,c0,c0,5
36         AND     R1,R1,#0xf
37         CMP     R1,#0
38         BEQ     cpu0Run
39
40 //cpu 1 stop here
41 cpu1loop:
42         mov r3, #50
43         //str r3,[r4]
44         WFENE                   // ; wait if it.s locked
45         B     cpu1loop           //  ; if any failure, loop
46         
47 cpu0Run:
48         //mov r3, #48
49         //str r3,[r0]
50 #if 0   
51 //v7_invalidate_l1
52 v7_invalidate_l1:
53         mov     r0, #0
54         mcr     p15, 0, r0, c7, c5, 0   @ invalidate I cache
55         mcr     p15, 2, r0, c0, c0, 0
56         mrc     p15, 1, r0, c0, c0, 0
57
58         ldr     r1, =0x7fff
59         and     r2, r1, r0, lsr #13
60
61         ldr     r1, =0x3ff
62
63         and     r3, r1, r0, lsr #3  @ NumWays - 1
64         add     r2, r2, #1          @ NumSets
65
66         and     r0, r0, #0x7
67         add     r0, r0, #4          @ SetShift
68
69         clz     r1, r3              @ WayShift
70         add     r4, r3, #1          @ NumWays
71 1:      sub     r2, r2, #1          @ NumSets--
72         mov     r3, r4              @ Temp = NumWays
73 2:      subs    r3, r3, #1          @ Temp--
74         mov     r5, r3, lsl r1
75         mov     r6, r2, lsl r0
76         orr     r5, r5, r6          @ Reg = (Temp<<WayShift)|(NumSets<<SetShift)
77         mcr     p15, 0, r5, c7, c6, 2
78         bgt     2b
79         cmp     r2, #0
80         bgt     1b
81         dsb
82         isb
83 #endif
84       #if 0 
85         ldr r1,=PM_BOOT_CODE_SP
86         mov sp, r1      //setting sp
87       #endif
88       1:  mov r1,r1 
89          //b 1b
90
91       
92         adr r1,9b     // boot ram base
93         ldr r5,8f     // resume data  offset ,from ram base
94         add r5,r5,r1 // resume data addr
95         
96         //l2 resume 
97         ldr r3 ,[r5,#(RKPM_BOOTDATA_L2LTY_F*4)] // l2 resume flags
98         cmp r3,#1
99         bne arm_errata__818325
100         ldr r3 ,[r5,#(RKPM_BOOTDATA_L2LTY*4)]
101         mcr p15, 1, r3, c9, c0, 2   
102         
103 arm_errata__818325:
104         ldr r3 ,[r5,#(RKPM_BOOTDATA_ARM_ERRATA_818325_F*4)]
105         cmp r3,#1
106         bne sp_set
107         ldr r3 ,[r5,#(RKPM_BOOTDATA_ARM_ERRATA_818325*4)]
108         mcreq   p15, 0, r3, c15, c0, 1
109
110 sp_set:        //sp
111         ldr sp,[r5,#(RKPM_BOOTDATA_CPUSP*4)]   //sp      
112         
113         ldr r3,[r5,#(RKPM_BOOTDATA_DDR_F*4)]   //get SLP_DDR_NEED_RES ,if it is 1 ,ddr need to reusme   
114         cmp r3,#1
115         bne res
116         ldr r1,[r5,#(RKPM_BOOTDATA_DDRCODE*4)]  // ddr resume code
117         ldr r0,[r5,#(RKPM_BOOTDATA_DDRDATA*4)]  //ddr resume data
118         blx r1
119 res:    
120         1:  mov r1,r1
121         //  b 1b
122        #if 0    
123         ldr r4, = (0xFF730000+0x18)
124         ldr r7,[r4]
125         ldr r6,=(0x3<<21)
126         orr r7, r7,r6
127         str r7,[r4]
128        #endif
129        
130         ldr     pc, [r5,#(RKPM_BOOTDATA_CPUCODE*4)]
131 8:      .long (RKPM_BOOT_CODE_OFFSET+RKPM_BOOT_CODE_SIZE)
132 ENDPROC(rkpm_slp_cpu_resume)