pause SMP and fix idle clk gate when change ddr frequence
[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
22 //65 A   48 0  97 a
23 ENTRY(rkpm_slp_cpu_resume)
24 9:      mov r1,r1 
25        // b 9b
26         mov r1,r1 
27     #if 0    
28         ldr r4, = 0xFF690000
29         mov r5, #65
30         str r5,[r4]
31     #endif
32         setmode PSR_I_BIT | PSR_F_BIT | SVC_MODE, r1  @ set SVC, irqs off
33
34         MRC p15,0,R1,c0,c0,5
35         AND     R1,R1,#0xf
36         CMP     R1,#0
37         BEQ     cpu0Run
38
39 //cpu 1 stop here
40 cpu1loop:
41         mov r3, #50
42         //str r3,[r4]
43         WFENE                   // ; wait if it.s locked
44         B     cpu1loop           //  ; if any failure, loop
45         
46 cpu0Run:
47         //mov r3, #48
48         //str r3,[r0]
49 #if 0   
50 //v7_invalidate_l1
51 v7_invalidate_l1:
52         mov     r0, #0
53         mcr     p15, 0, r0, c7, c5, 0   @ invalidate I cache
54         mcr     p15, 2, r0, c0, c0, 0
55         mrc     p15, 1, r0, c0, c0, 0
56
57         ldr     r1, =0x7fff
58         and     r2, r1, r0, lsr #13
59
60         ldr     r1, =0x3ff
61
62         and     r3, r1, r0, lsr #3  @ NumWays - 1
63         add     r2, r2, #1          @ NumSets
64
65         and     r0, r0, #0x7
66         add     r0, r0, #4          @ SetShift
67
68         clz     r1, r3              @ WayShift
69         add     r4, r3, #1          @ NumWays
70 1:      sub     r2, r2, #1          @ NumSets--
71         mov     r3, r4              @ Temp = NumWays
72 2:      subs    r3, r3, #1          @ Temp--
73         mov     r5, r3, lsl r1
74         mov     r6, r2, lsl r0
75         orr     r5, r5, r6          @ Reg = (Temp<<WayShift)|(NumSets<<SetShift)
76         mcr     p15, 0, r5, c7, c6, 2
77         bgt     2b
78         cmp     r2, #0
79         bgt     1b
80         dsb
81         isb
82 #endif
83       #if 0 
84         ldr r1,=PM_BOOT_CODE_SP
85         mov sp, r1      //setting sp
86       #endif
87       1:  mov r1,r1 
88          //b 1b
89
90       
91         adr r1,9b     // boot ram base
92         ldr r5,8f     // resume data  offset ,from ram base
93         add r5,r5,r1 // resume data addr
94         
95         //l2
96         ldr r3 ,[r5,#(RKPM_BOOTDATA_L2LTY*4)]
97         mcr p15, 1, r3, c9, c0, 2
98
99         //sp
100         ldr sp,[r5,#(RKPM_BOOTDATA_CPUSP*4)]   //sp      
101         
102         ldr r3,[r5,#(RKPM_BOOTDATA_DDR_F*4)]   //get SLP_DDR_NEED_RES ,if it is 1 ,ddr need to reusme   
103         cmp r3,#1
104         bne res
105         ldr r1,[r5,#(RKPM_BOOTDATA_DDRCODE*4)]  // ddr resume code
106         ldr r0,[r5,#(RKPM_BOOTDATA_DDRDATA*4)]  //ddr resume data
107         blx r1
108 res:    
109         1:  mov r1,r1
110         //  b 1b
111        #if 0    
112         ldr r4, = (0xFF730000+0x18)
113         ldr r7,[r4]
114         ldr r6,=(0x3<<21)
115         orr r7, r7,r6
116         str r7,[r4]
117        #endif
118        
119         ldr     pc, [r5,#(RKPM_BOOTDATA_CPUCODE*4)]
120 8:      .long (RKPM_BOOT_CODE_OFFSET+RKPM_BOOT_CODE_SIZE)
121 ENDPROC(rkpm_slp_cpu_resume)