ARM: OMAP: AM33XX: Update the suspend code for DS1
[sitara-epos/sitara-epos-kernel.git] / arch / arm / mach-omap2 / sleep33xx.S
1 /*
2  * Low level suspend code for AM33XX SoCs
3  *
4  * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation version 2.
9  *
10  * This program is distributed "as is" WITHOUT ANY WARRANTY of any
11  * kind, whether express or implied; without even the implied warranty
12  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  */
16 #include <linux/linkage.h>
17 #include <linux/init.h>
18 #include <asm/memory.h>
19 #include <asm/assembler.h>
20 #include <mach/io.h>
22 #include <plat/emif.h>
23 #include <plat/sram.h>
25 #include "cm33xx.h"
26 #include "pm33xx.h"
28         .align 3
29 ENTRY(am33xx_do_wfi)
30         stmfd   sp!, {r4 - r11, lr}     @ save registers on stack
32         /* Put DDR in Self-Refresh */
33         ldr     r0, emif_addr_func
34         blx     r0
35         add     r0, r0, #EMIF4_0_SDRAM_MGMT_CTRL
36         ldr     r3, [r0]
37         orr     r3, r3, #0xa0           @ a reasonable delay for entering SR
38         str     r3, [r0, #0]
40         ldr     r2, ddr_start
41         ldr     r1, [r2, #0]
42         ldr     r1, [r0, #0]
43         orr     r1, r1, #0x200
44         str     r1, [r0, #0]
46         mov     r0, #0x1000
47 wait_sr:
48         subs    r0, r0, #1
49         bne     wait_sr
51         /* Put the PLLs to LP bypass */
52 #if 0
53         ldr     r0, virt_mpu_pll_clk_mode_addr
54         ldr     r1, [r0]
55         bic     r1, r1, #(7 << 0)
56         orr     r1, r1, #0x5
57         str     r1, [r0]
58         ldr     r0, virt_mpu_pll_idlest_addr
59 wait_pll_by1:
60         ldr     r1, [r0]
61         tst     r1, #0x0
62         bne     wait_pll_by1
64         ldr     r0, virt_per_pll_clk_mode_addr
65         ldr     r1, [r0]
66         bic     r1, r1, #(7 << 0)
67         orr     r1, r1, #0x5
68         str     r1, [r0]
69         ldr     r0, virt_per_pll_idlest_addr
70 wait_pll_by2:
71         ldr     r1, [r0]
72         tst     r1, #0x0
73         bne     wait_pll_by2
75         ldr     r0, virt_disp_pll_clk_mode_addr
76         ldr     r1, [r0]
77         bic     r1, r1, #(7 << 0)
78         orr     r1, r1, #0x5
79         str     r1, [r0]
80         ldr     r0, virt_disp_pll_idlest_addr
81 wait_pll_by3:
82         ldr     r1, [r0]
83         tst     r1, #0x0
84         bne     wait_pll_by3
86         ldr     r0, virt_ddr_pll_clk_mode_addr
87         ldr     r1, [r0]
88         bic     r1, r1, #(7 << 0)
89         orr     r1, r1, #0x5
90         str     r1, [r0]
91         ldr     r0, virt_ddr_pll_idlest_addr
92 wait_pll_by4:
93         ldr     r1, [r0]
94         tst     r1, #0x0
95         bne     wait_pll_by4
97         ldr     r0, virt_core_pll_clk_mode_addr
98         ldr     r1, [r0]
99         bic     r1, r1, #(7 << 0)
100         orr     r1, r1, #0x5
101         str     r1, [r0]
102         ldr     r0, virt_core_pll_idlest_addr
103 wait_pll_by5:
104         ldr     r1, [r0]
105         tst     r1, #0x0
106         bne     wait_pll_by5
107 #endif
109         dsb
110         dmb
111         isb
113         wfi
114         nop
115         nop
116         nop
117         nop
118         nop
119         nop
120         nop
121         nop
122         nop
123         nop
124         nop
126         /* We come here in case of an abort */
127         ldmfd   sp!, {r4 - r11, pc}     @ restore regs and return
130         /* Take the PLLs out of LP_BYPASS */
131 #if 0
132         ldr     r1, phys_mpu_pll_clk_mode_addr
133         ldr     r2, [r1]
134         bic     r2, r2, #(7 << 0)
135         orr     r2, r2, #0x7
136         str     r2, [r1]
137         ldr     r1, phys_mpu_pll_idlest_addr
138 wait_pll_lock1:
139         ldr     r2, [r1]
140         tst     r2, #0x1
141         bne     wait_pll_lock1
143         ldr     r1, phys_core_pll_clk_mode_addr
144         ldr     r2, [r1]
145         bic     r2, r2, #(7 << 0)
146         orr     r2, r2, #0x7
147         str     r2, [r1]
148         ldr     r1, phys_core_pll_idlest_addr
149 wait_pll_lock2:
150         ldr     r2, [r1]
151         tst     r2, #0x1
152         bne     wait_pll_lock2
154         ldr     r1, phys_per_pll_clk_mode_addr
155         ldr     r2, [r1]
156         bic     r2, r2, #(7 << 0)
157         orr     r2, r2, #0x7
158         str     r2, [r1]
159         ldr     r1, phys_per_pll_idlest_addr
160 wait_pll_lock3:
161         ldr     r2, [r1]
162         tst     r2, #0x1
163         bne     wait_pll_lock3
165         ldr     r1, phys_disp_pll_clk_mode_addr
166         ldr     r2, [r1]
167         bic     r2, r2, #(7 << 0)
168         orr     r2, r2, #0x7
169         str     r2, [r1]
170         ldr     r1, phys_disp_pll_idlest_addr
171 wait_pll_lock4:
172         ldr     r2, [r1]
173         tst     r2, #0x1
174         bne     wait_pll_lock4
176         ldr     r1, phys_ddr_pll_clk_mode_addr
177         ldr     r2, [r1]
178         bic     r2, r2, #(7 << 0)
179         orr     r2, r2, #0x7
180         str     r2, [r1]
181         ldr     r1, phys_ddr_pll_idlest_addr
182 wait_pll_lock5:
183         ldr     r2, [r1]
184         tst     r2, #0x1
185         bne     wait_pll_lock5
187         ldr     r0, emif_phys_addr
188         add     r0, r0, #EMIF4_0_SDRAM_MGMT_CTRL
189         ldr     r1, [r0]
190         bic     r1, r1, #(0x7 << 7)
191         str     r1, [r0]
192 #endif
194         nop
195         nop
196         nop
197         nop
198         nop
199         nop
200         nop
201         /* Assume the PLL is locked at this point */
202 restore_emif:
203         nop
204         nop
206 config_vtp:
207         ldr     r0, vtp0_addr
208         ldr     r1, [r0]
209         ldr     r2, vtp_enable
210         orr     r1, r2
211         str     r1, [r0]
213         ldr     r1, [r0]
214         bic     r1, #1
215         str     r1, [r0]
217         ldr     r1, [r0]
218         orr     r1, #1
219         str     r1, [r0]
221 poll_vtp_ready:
222         ldr     r1, [r0]
223         tst     r1, #(1 << 5)
224         beq     poll_vtp_ready
226 cmd_macro_config:
227         ldr     r0, ddr_phy_base
228         ldr     r1, [r0]
229         ldr     r2, ddr2_ratio_val
230         mov     r3, r2
231         @ TODO: Need to use proper variable here
232         mov     r4, #0
233         str     r3, [r0, #28]   @cmd0
234         str     r4, [r0, #32]
235         str     r4, [r0, #36]
236         str     r4, [r0, #40]
237         str     r4, [r0, #44]
238         str     r3, [r0, #80]   @cmd1
239         str     r4, [r0, #84]
240         str     r4, [r0, #88]
241         str     r4, [r0, #92]
242         str     r4, [r0, #96]
243         str     r3, [r0, #132]  @cmd2
244         str     r4, [r0, #136]
245         str     r4, [r0, #140]
246         str     r4, [r0, #144]
247         str     r4, [r0, #148]
249         mov     r3, #0x0
250         bl      data_macro_config
251         mov     r3, #0xa4
252         bl      data_macro_config
253         b       setup_rank_delays
255 data_macro_config:
256         ldr     r0, ddr_phy_base
257         add     r0, r0, r3
258 rd_dqs:
259         ldr     r1, data0_rd_dqs_slave_ratio0_val
260         mov     r2, r1
261         /* shift by 30, 20, 10 and orr */
262         mov     r5, r2, lsl #10
263         mov     r6, r2, lsl #20
264         mov     r7, r2, lsl #30
265         orr     r2, r2, r5
266         orr     r2, r2, r6
267         orr     r2, r2, r7
268         /* Done with crazy bit ops. store it now */
269         str     r2, [r0, #200]
270         ldr     r1, data0_rd_dqs_slave_ratio1_val
271         mov     r2, r1
272         mov     r5, r2, lsr #2
273         mov     r2, r5
274         str     r2, [r0, #204]
275 wr_dqs:
276         ldr     r1, data0_wr_dqs_slave_ratio0_val
277         mov     r2, r1
278         /* shift by 30, 20, 10 and orr */
279         mov     r5, r2, lsl #10
280         mov     r6, r2, lsl #20
281         mov     r7, r2, lsl #30
282         orr     r2, r2, r5
283         orr     r2, r2, r6
284         orr     r2, r2, r7
285         str     r2, [r0, #220]
286         ldr     r1, data0_wr_dqs_slave_ratio1_val
287         mov     r2, r1
288         mov     r5, r2, lsr #2
289         mov     r2, r5
290         str     r2, [r0, #224]
291 wr_lvl:
292         ldr     r1, data0_wr_lvl_init_ratio0_val
293         mov     r2, r1
294         /* shift by 30, 20, 10 and orr */
295         mov     r5, r2, lsl #10
296         mov     r6, r2, lsl #20
297         mov     r7, r2, lsl #30
298         orr     r2, r2, r5
299         orr     r2, r2, r6
300         orr     r2, r2, r7
301         str     r2, [r0, #240]
302         ldr     r1, data0_wr_lvl_init_ratio1_val
303         mov     r2, r1
304         mov     r5, r2, lsr #2
305         mov     r2, r5
306         str     r2, [r0, #244]
307 gate_lvl:
308         ldr     r1, data0_gate_lvl_init_ratio0_val
309         mov     r2, r1
310         /* shift by 30, 20, 10 and orr */
311         mov     r5, r2, lsl #10
312         mov     r6, r2, lsl #20
313         mov     r7, r2, lsl #30
314         orr     r2, r2, r5
315         orr     r2, r2, r6
316         orr     r2, r2, r7
317         str     r2, [r0, #248]
318         ldr     r1, data0_gate_lvl_init_ratio1_val
319         mov     r2, r1
320         mov     r5, r2, lsr #2
321         mov     r2, r5
322         str     r2, [r0, #256]
323 we_slv:
324         ldr     r1, data0_wr_lvl_slave_ratio0_val
325         mov     r2, r1
326         /* shift by 30, 20, 10 and orr */
327         mov     r5, r2, lsl #10
328         mov     r6, r2, lsl #20
329         mov     r7, r2, lsl #30
330         orr     r2, r2, r5
331         orr     r2, r2, r6
332         orr     r2, r2, r7
333         str     r2, [r0, #264]
334         ldr     r1, data0_wr_lvl_slave_ratio1_val
335         mov     r2, r1
336         mov     r5, r2, lsr #2
337         mov     r2, r5
338         str     r2, [r0, #268]
339 wr_data:
340         ldr     r1, data0_wr_data_slave_ratio0_val
341         mov     r2, r1
342         /* shift by 30, 20, 10 and orr */
343         mov     r5, r2, lsl #10
344         mov     r6, r2, lsl #20
345         mov     r7, r2, lsl #30
346         orr     r2, r2, r5
347         orr     r2, r2, r6
348         orr     r2, r2, r7
349         str     r2, [r0, #288]
350         ldr     r1, data0_wr_data_slave_ratio1_val
351         mov     r2, r1
352         mov     r5, r2, lsr #2
353         mov     r2, r5
354         str     r2, [r0, #292]
355 dll_lock:
356         ldr     r1, data0_dll_lock_diff_val
357         mov     r2, r1
358         str     r2, [r0, #312]
360 setup_rank_delays:
361         ldr     r1, data0_rank0_delay0_val
362         mov     r2, r1
363         str     r2, [r0, #308]
364         ldr     r1, data1_rank0_delay1_val
365         mov     r2, r1
366         str     r2, [r0, #472]
368 setup_io_ctrl:
369         ldr     r0, control_base
370         ldr     r1, ddr_ioctrl_val
371         mov     r2, r1
372         ldr     r4, ddr_cmd_offset
373         mov     r3, r4
374         str     r2, [r0, r3]    @cmd0 0x1404
375         add     r3, r3, #4
376         str     r2, [r0, r3]    @cmd1 0x1408
377         add     r3, r3, #4
378         str     r2, [r0, r3]    @cmd2 0x140c
379         ldr     r4, ddr_data_offset
380         mov     r3, r4
381         str     r2, [r0, r3]    @data0 0x1440
382         add     r3, r3, #4
383         str     r2, [r0, r3]    @data1 0x1444
385 misc_config:
386         ldr     r1, ddr_io_ctrl_addr
387         ldr     r2, [r1]
388         and     r2, #0xefffffff
389         str     r2, [r1]
390         ldr     r1, ddr_cke_addr
391         ldr     r2, [r1]
392         orr     r2, #0x00000001
393         str     r2, [r1]
395 config_emif_timings:
396         mov     r3, #1275068416 @ 0x4c000000
397         ldr     r4, emif_rd_lat_val
398         mov     r2, r4
399 rd_lat:
400         str     r2, [r3, #228]  @ 0xe4
401         str     r2, [r3, #232]  @ 0xe8
402         str     r2, [r3, #236]  @ 0xec
403 timing1:
404         ldr     r4, emif_timing1_val
405         mov     r2, r4
406         str     r2, [r3, #24]
407         str     r2, [r3, #28]
408 timing2:
409         ldr     r4, emif_timing2_val
410         mov     r2, r4
411         str     r2, [r3, #32]
412         str     r2, [r3, #36]   @ 0x24
413 timing3:
414         ldr     r4, emif_timing3_val
415         mov     r2, r4
416         str     r2, [r3, #40]   @ 0x28
417         str     r2, [r3, #44]   @ 0x2c
418 sdcfg1:
419         ldr     r4, emif_sdcfg_val
420         mov     r2, r4
421         str     r2, [r3, #8]
422         str     r2, [r3, #12]
423 ref_ctrl_const:
424         ldr     r4, emif_ref_ctrl_const_val
425         mov     r2, r4
426         str     r2, [r3, #16]
427         str     r2, [r3, #20]
429         /* GEL had a loop with init value of 5000 */
430         mov     r0, #0x1000
431 wait_loop1:
432         subs    r0, r0, #1
433         bne     wait_loop1
435 ref_ctrl_actual:
436         ldr     r4, emif_ref_ctrl_val
437         mov     r2, r4
438         str     r2, [r3, #16]
439         str     r2, [r3, #20]
440 sdcfg2:
441         ldr     r4, emif_sdcfg_val
442         mov     r2, r4
443         str     r2, [r3, #8]
444         str     r2, [r3, #12]
446         /* Back from la-la-land. Kill some time for sanity to settle in */
447         mov     r0, #0x1000
448 wait_loop2:
449         subs    r0, r0, #1
450         bne     wait_loop2
452         /* We are back. Branch to the common CPU resume routine */
453 ENTRY(am33xx_resume_vector)
454         ldr     pc, resume_addr
456 /*
457  * Local variables
458  */
460 resume_addr:
461         .word   cpu_resume - PAGE_OFFSET + 0x80000000
463 #define DPLL_LP_BYP_MODE        0x5
464 #define DPLL_LOCK_MODE          0x7
466 emif_addr_func:
467         .word   am33xx_get_ram_base
468 emif_phys_addr:
469         .word   AM33XX_EMIF0_BASE
471 emif_pm_ctrl:
472         .word EMIF4_0_SDRAM_MGMT_CTRL
473 ddr_start:
474         .word PAGE_OFFSET
476 mpu_pll_n:
477         .word   0xDEADBEEF
478 mpu_pll_m:
479         .word   0xDEADBEEF
480 mpu_pll_m2:
481         .word   0xDEADBEEF
482 ddr_pll_m2:
483         .word   0xDEADBEEF
484 ddr_pll_n:
485         .word   0xDEADBEEF
486 ddr_pll_m:
487         .word   0xDEADBEEF
488 per_pll_n:
489         .word   0xDEADBEEF
490 per_pll_m:
491         .word   0xDEADBEEF
492 per_pll_m2:
493         .word   0xDEADBEEF
495 virt_mpu_pll_idlest_addr:
496         .word   AM33XX_CM_IDLEST_DPLL_MPU
497 virt_mpu_pll_clk_mode_addr:
498         .word   AM33XX_CM_CLKMODE_DPLL_MPU
500 phys_pll_mod:
501         .word   AM33XX_CM_BASE + AM33XX_CM_WKUP_MOD
502 phys_mpu_pll_idlest_addr:
503         .word   AM33XX_CM_CLKMODE_DPLL_MPU_OFFSET
504 phys_mpu_pll_clk_mode_addr:
505         .word   AM33XX_CM_IDLEST_DPLL_MPU_OFFSET
507 virt_core_pll_idlest_addr:
508         .word   AM33XX_CM_IDLEST_DPLL_CORE
509 virt_core_pll_clk_mode_addr:
510         .word   AM33XX_CM_CLKMODE_DPLL_CORE
511 phys_core_pll_idlest_addr:
512         .word   AM33XX_CM_CLKMODE_DPLL_CORE_OFFSET
513 phys_core_pll_clk_mode_addr:
514         .word   AM33XX_CM_IDLEST_DPLL_CORE_OFFSET
516 virt_per_pll_idlest_addr:
517         .word   AM33XX_CM_IDLEST_DPLL_PER
518 virt_per_pll_clk_mode_addr:
519         .word   AM33XX_CM_CLKMODE_DPLL_PER
520 phys_per_pll_idlest_addr:
521         .word   AM33XX_CM_CLKMODE_DPLL_PER_OFFSET
522 phys_per_pll_clk_mode_addr:
523         .word   AM33XX_CM_IDLEST_DPLL_PER_OFFSET
525 virt_disp_pll_idlest_addr:
526         .word   AM33XX_CM_IDLEST_DPLL_DISP
527 virt_disp_pll_clk_mode_addr:
528         .word   AM33XX_CM_CLKMODE_DPLL_DISP
529 phys_disp_pll_idlest_addr:
530         .word   AM33XX_CM_CLKMODE_DPLL_DISP_OFFSET
531 phys_disp_pll_clk_mode_addr:
532         .word   AM33XX_CM_IDLEST_DPLL_DISP_OFFSET
534 virt_ddr_pll_idlest_addr:
535         .word   AM33XX_CM_IDLEST_DPLL_DDR
536 virt_ddr_pll_clk_mode_addr:
537         .word   AM33XX_CM_CLKMODE_DPLL_DDR
538 phys_ddr_pll_idlest_addr:
539         .word   AM33XX_CM_CLKMODE_DPLL_DDR_OFFSET
540 phys_ddr_pll_clk_mode_addr:
541         .word   AM33XX_CM_IDLEST_DPLL_DDR_OFFSET
544 /* DDR related stuff */
545 vtp0_addr:
546         .word   VTP0_CTRL_REG
547 vtp_enable:
548         .word   VTP_CTRL_ENABLE
549 vtp_start_en:
550         .word   VTP_CTRL_START_EN
551 vtp_ready:
552         .word   VTP_CTRL_READY
554 ddr_phy_base:
555         .word   DDR_PHY_BASE_ADDR
557 ddr2_ratio_val:
558         .word   DDR2_RATIO
559 data0_rd_dqs_slave_ratio0_val:
560         .word   DDR2_RD_DQS
561 data0_rd_dqs_slave_ratio1_val:
562         .word   DDR2_RD_DQS
563 data0_wr_dqs_slave_ratio0_val:
564         .word   DDR2_WR_DQS
565 data0_wr_dqs_slave_ratio1_val:
566         .word   DDR2_WR_DQS
567 data0_wr_lvl_init_ratio0_val:
568         .word   DDR2_PHY_WRLVL
569 data0_wr_lvl_init_ratio1_val:
570         .word   DDR2_PHY_WRLVL
571 data0_gate_lvl_init_ratio0_val:
572         .word   DDR2_PHY_GATELVL
573 data0_gate_lvl_init_ratio1_val:
574         .word   DDR2_PHY_GATELVL
575 data0_wr_lvl_slave_ratio0_val:
576         .word   DDR2_PHY_FIFO_WE
577 data0_wr_lvl_slave_ratio1_val:
578         .word   DDR2_PHY_FIFO_WE
579 data0_wr_data_slave_ratio0_val:
580         .word   DDR2_PHY_WR_DATA
581 data0_wr_data_slave_ratio1_val:
582         .word   DDR2_PHY_WR_DATA
583 data0_dll_lock_diff_val:
584         .word   PHY_DLL_LOCK_DIFF
586 data0_rank0_delay0_val:
587         .word   PHY_RANK0_DELAY
588 data1_rank0_delay1_val:
589         .word   PHY_RANK0_DELAY
591 control_base:
592         .word   AM33XX_CTRL_BASE
593 Rddr_ioctrl_val:
594         .word   DDR_IOCTRL_VALUE
595 ddr_io_ctrl_addr:
596         .word   DDR_IO_CTRL
597 ddr_ioctrl_val:
598         .word   0x18B
599 ddr_cmd_offset:
600         .word   0x1404
601 ddr_data_offset:
602         .word   0x1440
604 ddr_cke_addr:
605         .word   DDR_CKE_CTRL
606 emif_rd_lat_val:
607         .word   EMIF_READ_LATENCY
608 emif_timing1_val:
609         .word   EMIF_TIM1
610 emif_timing2_val:
611         .word   EMIF_TIM2
612 emif_timing3_val:
613         .word   EMIF_TIM3
614 emif_sdcfg_val:
615         .word   EMIF_SDCFG
616 emif_ref_ctrl_const_val:
617         .word   0x4650
618 emif_ref_ctrl_val:
619         .word   EMIF_SDREF
621 ENTRY(am33xx_do_wfi_sz)
622         .word   . - am33xx_do_wfi