Merge tag 'v4.4-rc6'
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rockchip / rk312x_sleep.S
1 #include <linux/linkage.h>
2 #include <asm/assembler.h>
3 #include <asm/memory.h>
4
5 #define _RKPM_SEELP_S_INCLUDE_
6 #include "pm.h"
7
8 .text
9 ENTRY(rk312x_pm_slp_cpu_while_tst)
10 stmfd  sp!, { r3 - r12, lr }
11
12 1: mov r3,r3
13         b 1b
14
15 ldmfd  sp!, { r3 - r12, pc }
16
17 .data
18 .align
19 ENTRY(rk312x_pm_slp_cpu_resume)
20 9:      mov r1,r1
21
22 #if 0
23         ldr r4, = 0x20068000
24         mov r5, #67
25         str r5,[r4]
26 #endif
27         setmode PSR_I_BIT | PSR_F_BIT | SVC_MODE, r1  @ set SVC, irqs off
28
29         MRC p15,0,R1,c0,c0,5
30         AND     R1,R1,#0xf
31         CMP     R1,#0
32         BEQ     cpu0Run
33
34 cpu1loop:
35         mov r3, #50
36         //str r3,[r4]
37         WFENE                   // ; wait if it.s locked
38         B     cpu1loop           //  ; if any failure, loop
39
40 cpu0Run:
41         1:  mov r1,r1
42
43         adr r1,9b     // boot ram base
44         ldr r5,8f     // resume data  offset ,from ram base
45         add r5,r5,r1 // resume data addr
46
47         ldr r3 ,[r5,#(RKPM_BOOTDATA_ARM_ERRATA_818325_F*4)]
48         ldr r4, = 0x200080b4 // armvoltage pwm resume
49         and r2, r3, #1
50         cmp r2, #0
51         beq pwm1
52         ldr r2, = 0x00100010  //pwm0
53         str r2, [r4]
54 pwm1:
55         and r2, r3, #2
56         cmp r2, #0
57         beq pwm2
58         ldr r2, = 0x00400040 //pwm1
59         str r2, [r4]
60 pwm2:
61         and r2, r3, #4
62         cmp r2, #0
63         beq sp_set
64         ldr r2, = 0x01000100//pwm2
65         str r2, [r4]
66
67 sp_set:        //sp
68         ldr sp,[r5,#(RKPM_BOOTDATA_CPUSP*4)]   //sp
69
70         ldr r3,[r5,#(RKPM_BOOTDATA_DDR_F*4)]
71         //get SLP_DDR_NEED_RES ,if it is 1 ,ddr need to reusme
72         cmp r3,#1
73         bne res
74         ldr r1,[r5,#(RKPM_BOOTDATA_DDRCODE*4)]  // ddr resume code
75         ldr r0,[r5,#(RKPM_BOOTDATA_DDRDATA*4)]  //ddr resume data
76         blx r1
77 res:
78         1:  mov r1,r1
79         //  b 1b
80 /*****************************************************************************/
81 dram_resume:
82         ;//push {lr}
83         mov r2,#0x20000000 ;/*cru PA*/
84         mov r3,#0x20000000
85
86         str r3,[r2,#0x14];/*PLL no power-down*/
87
88         dsb sy
89         mov r2,r2
90         mov r2,r2
91
92 dpll_lock:
93         ldr r3,[r2,#0x14]
94         tst r3,#400;/*DPLL lock*/
95
96         bne dpll_lock
97
98         ldr r3,=0x00100010;/*DPLL normal mode*/
99         str r3,[r2,#0x40]
100         dsb sy
101
102         mov r3,#0x40000
103         str r3,[r2,#0xd0];/*enable DDR PHY clock*/
104         mov r0,#1
105
106 dealyus_uncache:
107         mov r1,#5
108         mul r0, r0, r1
109 delay_loop:
110         subs r0, r0, #1
111         bne delay_loop
112
113         ldr r2,=0x2000a000
114         ldr r3,[r2,#0]
115         orr r3, r3, #0x4;/*phy soft de-reset dll*/
116         str r3,[r2,#0]
117         mov r0,#5
118         mov r1,#5
119         mul r0, r0, r1
120 delay5us_loop:
121         subs r0, r0, #1
122         bne delay5us_loop
123         orr r3, r3, #0x8;/*phy soft de-reset*/
124         str r3,[r2,#0]
125
126         sub r2,r2,#0x2000;/*0x20008000*/
127         ldr r3,[r2,#0x300];/*get chip id*/
128         sub r3,r3,#0x3100
129         subs r3,r3,#0x12
130         bne rk3126b_buffer_en;/*RK3126B*/
131         ldr r3,=0x40004
132         str r3,[r2,#0x148];/*buffer en*/
133         b move_access
134 rk3126b_buffer_en:
135         ldr r2,=0x2000a000
136         mov r3,#0x2
137         str r3,[r2,#0x264]
138
139 move_access:
140         /*move to access status*/
141         ldr r2,=0x20004000
142         mov r3, #4
143         str r3,[r2,#0x4];/*wake up */
144         dsb sy
145
146 wait_access:
147         ldr r3,[r2,#0x8]
148         and r3, r3, #0x7
149         cmp r3, #3
150         bne wait_access
151
152
153         ldr r4, = 0x100a000c //printk
154         mov r1, #0x0e //msch ce xiao
155         str r1,[r4]
156
157         ldr r4, = 0x100a0010 //printk
158         mov r1, #0x0e //msch ce xiao
159
160         ldr     pc, [r5,#(RKPM_BOOTDATA_CPUCODE*4)]
161 8:      .long (0x00+0x700)//RKPM_BOOT_CODE_OFFSET+RKPM_BOOT_CODE_SIZE
162 ENDPROC(rk312x_pm_slp_cpu_resume)
163