ARM: Tegra: Add CONFIG_TEGRA_USE_SECURE_KERNEL
[linux-3.10.git] / arch / arm / mach-tegra / sleep-t30.S
1 /*
2  * Copyright (c) 2010-2013, NVIDIA CORPORATION.  All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms and conditions of the GNU General Public License,
6  * version 2, as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope it will be useful, but WITHOUT
9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
11  * more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
15  */
16
17 #include <linux/const.h>
18 #include <linux/init.h>
19 #include <linux/linkage.h>
20
21 #include <asm/assembler.h>
22 #include <asm/cache.h>
23 #include <asm/domain.h>
24 #include <asm/memory.h>
25 #include <asm/page.h>
26 #include <asm/ptrace.h>
27 #include <asm/asm-offsets.h>
28 #include <asm/glue-cache.h>
29 #include <asm/glue-proc.h>
30 #include <asm/cp15.h>
31
32 #include "sleep.h"
33 #include "clock.h"
34 #include "reset.h"
35
36 #define EMC_CFG                         0xc
37 #define EMC_ADR_CFG                     0x10
38 #define EMC_TIMING_CONTROL              0x28
39 #define EMC_REFRESH                     0x70
40 #define EMC_NOP                         0xdc
41 #define EMC_SELF_REF                    0xe0
42 #define EMC_MRW                         0xe8
43 #define EMC_REQ_CTRL                    0x2b0
44 #define EMC_EMC_STATUS                  0x2b4
45 #define EMC_FBIO_CFG5                   0x104
46 #define EMC_AUTO_CAL_CONFIG             0x2a4
47 #define EMC_AUTO_CAL_INTERVAL           0x2a8
48 #define EMC_AUTO_CAL_STATUS             0x2ac
49 #define EMC_CFG_DIG_DLL                 0x2bc
50 #define EMC_ZCAL_INTERVAL               0x2e0
51 #define EMC_ZQ_CAL                      0x2ec
52 #define EMC_XM2VTTGENPADCTRL            0x310
53 #define EMC_XM2VTTGENPADCTRL2           0x314
54
55 #define PMC_CTRL                        0x0
56 #define PMC_CTRL_SIDE_EFFECT_LP0        (1 << 14)  /* enter LP0 when CPU pwr gated */
57
58 #define PMC_PWRGATE_TOGGLE              0x30
59 #define PMC_REMOVE_CLAMPING_CMD         0x34
60 #define PMC_PWRGATE_STATUS              0x38
61
62 #define PMC_PWRGATE_PARTID_L2C          (0x5)
63
64 #define PMC_IO_DPD_REQ                  0x1b8
65 #define PMC_IO_DPD_STATUS               0x1bc
66 #define PMC_SCRATCH1_ECO       0x264
67 #define PMC_POR_DPD_CTRL               0x264
68
69 #define FLOW_IPC_STS                    0x500
70 #define FLOW_IPC_STS_AP2BB_MSC_STS_0    (1 << 4)
71
72 #define CLK_RESET_CCLK_BURST            0x20
73 #define CLK_RESET_CCLK_DIVIDER          0x24
74 #define CLK_RESET_SCLK_BURST            0x28
75 #define CLK_RESET_SCLK_DIVIDER          0x2c
76
77 #define CLK_RESET_PLLC_BASE             0x80
78 #define CLK_RESET_PLLM_BASE             0x90
79 #define CLK_RESET_PLLP_BASE             0xa0
80 #define CLK_RESET_PLLA_BASE             0xb0
81 #define CLK_RESET_PLLX_BASE             0xe0
82
83 #define CLK_RESET_PLLC_MISC             0x8c
84 #define CLK_RESET_PLLM_MISC             0x9c
85 #define CLK_RESET_PLLP_MISC             0xac
86 #define CLK_RESET_PLLA_MISC             0xbc
87 #define CLK_RESET_PLLX_MISC             0xe4
88 #if !defined(CONFIG_ARCH_TEGRA_3x_SOC)
89 #define CLK_RESET_PLLX_MISC3            0x518
90 #define CLK_RESET_PLLM_MISC_IDDQ        5
91 #define CLK_RESET_PLLC_MISC_IDDQ        26
92 #define CLK_RESET_PLLX_MISC3_IDDQ       3
93 #endif
94
95 #define CLK_RESET_PLLP_OUTA             0xa4
96 #define CLK_RESET_PLLP_OUTB             0xa8
97
98 #define PMC_PLLP_WB0_OVERRIDE           0xf8
99 #define PMC_PLLM_WB0_OVERRIDE           0x1dc
100
101 #define CLK_RESET_CLK_SOURCE_MSELECT    0x3b4
102 #define CLK_RESET_CLK_ENB_H_SET         0x328
103 #define CLK_RESET_CLK_ENB_H_CLR         0x32c
104 #define CLK_RESET_CLK_RST_DEV_H_SET             0x308
105 #define CLK_RESET_CLK_RST_DEV_H_CLR             0x30c
106
107 #define I2C_CNFG        0x0
108 #define I2C_ADDR0       0x4
109 #define I2C_DATA1       0xc
110 #define I2C_DATA2       0x10
111 #define I2C_STATUS      0x1c
112
113 #define MSELECT_CLKM                    (0x3 << 30)
114
115 #define TEGRA_RTC_MSEC  0x10
116
117 #if USE_PLL_LOCK_BITS
118 #define LOCK_DELAY              PLL_POST_LOCK_DELAY
119 #else
120 #define LOCK_DELAY              0xff /* 255uS delay for PLL stabilization */
121 #endif
122
123 #define USE_PLLP_ON_SLEEP_ENTRY 0
124
125 #define TEGRA30_POWER_HOTPLUG_SHUTDOWN  (1 << 27) /* Hotplug shutdown */
126
127 .macro emc_device_mask, rd, base
128         ldr     \rd, [\base, #EMC_ADR_CFG]
129         tst     \rd, #0x1
130         moveq   \rd, #(0x1<<8)          @ just 1 device
131         movne   \rd, #(0x3<<8)          @ 2 devices
132 .endm
133
134 .macro emc_timing_update, rd, base
135         mov     \rd, #1
136         str     \rd, [\base, #EMC_TIMING_CONTROL]
137 1001:
138         ldr     \rd, [\base, #EMC_EMC_STATUS]
139         tst     \rd, #(0x1<<23)         @ wait until EMC_STATUS_TIMING_UPDATE_STALLED is clear
140         bne     1001b
141 .endm
142
143 #if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_PM_SLEEP)
144 /*
145  * tegra30_hotplug_shutdown(void)
146  *
147  * Powergates the current CPU.
148  * Should never return.
149  */
150 ENTRY(tegra30_hotplug_shutdown)
151         mov     r6, lr
152         bl      tegra_cpu_exit_coherency
153
154         /* Powergate this CPU */
155         mov     r0, #TEGRA30_POWER_HOTPLUG_SHUTDOWN
156         bl      tegra30_cpu_shutdown
157         mov     pc, r6                  @ should never get here
158 ENDPROC(tegra30_hotplug_shutdown)
159
160 /*
161  * tegra30_cpu_shutdown(unsigned long flags)
162  *
163  * Puts the current CPU in wait-for-event mode on the flow controller
164  * and powergates it -- flags (in R0) indicate the request type.
165  * Must never be called for CPU 0.
166  *
167  * corrupts r0-r4, r12
168  */
169 ENTRY(tegra30_cpu_shutdown)
170         cpu_id  r3
171 #ifndef CONFIG_ARCH_TEGRA_HAS_SYMMETRIC_CPU_PWR_GATE
172         cmp     r3, #0
173         moveq   pc, lr          @ Must never be called for CPU 0
174 #endif
175
176         ldr     r12, =TEGRA_FLOW_CTRL_VIRT
177         cpu_to_csr_reg r1, r3
178         add     r1, r1, r12     @ virtual CSR address for this CPU
179         cpu_to_halt_reg r2, r3
180         add     r2, r2, r12     @ virtual HALT_EVENTS address for this CPU
181
182         /*
183          * Clear this CPU's "event" and "interrupt" flags and power gate
184          * it when halting but not before it is in the "WFE" state.
185          */
186         movw    r12, \
187                 FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG | \
188                 FLOW_CTRL_CSR_ENABLE
189 #if defined(CONFIG_ARCH_TEGRA_11x_SOC) || defined(CONFIG_ARCH_TEGRA_14x_SOC)
190         mov     r4, #(1 << 8)                   @ wfi bitmap
191 #else
192         mov     r4, #(1 << 4)                   @ wfe bitmap
193 #endif
194         orr     r12, r12, r4, lsl r3
195         str     r12, [r1]
196
197         /* Halt this CPU. */
198         mov     r3, #0x400
199 delay_1:
200         subs    r3, r3, #1                      @ delay as a part of wfe war.
201         bge     delay_1;
202         cpsid   a                               @ disable imprecise aborts.
203         ldr     r3, [r1]                        @ read CSR
204         str     r3, [r1]                        @ clear CSR
205         tst     r0, #TEGRA30_POWER_HOTPLUG_SHUTDOWN
206 #ifdef CONFIG_ARCH_TEGRA_HAS_SYMMETRIC_CPU_PWR_GATE
207         mov     r3, #FLOW_CTRL_WAITEVENT
208         orreq   r3, r3, #FLOW_CTRL_HALT_GIC_IRQ
209         orreq   r3, r3, #FLOW_CTRL_HALT_GIC_FIQ
210 #else
211         moveq   r3, #FLOW_CTRL_WAIT_FOR_INTERRUPT       @ For LP2
212         movne   r3, #FLOW_CTRL_WAITEVENT                @ For hotplug
213 #endif
214         str     r3, [r2]
215         ldr     r0, [r2]
216         b       wfe_war
217
218 __cpu_reset_again:
219         dsb
220         .align 5
221 #if defined(CONFIG_ARCH_TEGRA_11x_SOC) || defined(CONFIG_ARCH_TEGRA_14x_SOC)
222         wfi                                     @ CPU should be power gated here
223 #else
224         wfe                                     @ CPU should be power gated here
225 #endif
226 wfe_war:
227         b       __cpu_reset_again
228
229         /*
230          * 38 nop's, which fills reset of wfe cache line and
231          * 4 more cachelines with nop
232          */
233         .rept 38
234         nop
235         .endr
236         b       .                               @ should never get here
237
238 ENDPROC(tegra30_cpu_shutdown)
239 #endif
240
241 #ifdef CONFIG_PM_SLEEP
242 /*
243  * tegra3_sleep_core_finish(unsigned long int)
244  *
245  * enters suspend in LP0 or LP1 by turning off the mmu and jumping to
246  * tegra3_tear_down_core in IRAM
247  */
248 ENTRY(tegra3_sleep_core_finish)
249         mov     r4, r0
250         bl      tegra_flush_cache
251         mov     r0, r4
252         bl      tegra_cpu_exit_coherency
253
254         /* preload all the address literals that are needed for the
255          * CPU power-gating process, to avoid loads from SDRAM (which are
256          * not supported once SDRAM is put into self-refresh.
257          * LP0 / LP1 use physical address, since the MMU needs to be
258          * disabled before putting SDRAM into self-refresh to avoid
259          * memory access due to page table walks */
260         mov32   r4, TEGRA_PMC_BASE
261         mov32   r5, TEGRA_CLK_RESET_BASE
262         mov32   r6, TEGRA_FLOW_CTRL_BASE
263         mov32   r7, TEGRA_TMRUS_BASE
264
265         mov32   r1, tegra3_tear_down_core
266         mov32   r2, tegra3_iram_start
267         sub     r1, r1, r2
268         mov32   r2, TEGRA_IRAM_CODE_AREA
269         add     r1, r1, r2
270         mov     r11, #0
271         b       tegra_turn_off_mmu
272 ENDPROC(tegra3_sleep_core_finish)
273
274 ENTRY(tegra3_stop_mc_clk_finish)
275         mov     r4, r0
276         bl      tegra_flush_cache
277         mov     r0, r4
278         bl      tegra_cpu_exit_coherency
279
280         /* preload all the address literals that are needed for the
281          * CPU power-gating process, to avoid loads from SDRAM (which are
282          * not supported once SDRAM is put into self-refresh.
283          * LP0 / LP1 use physical address, since the MMU needs to be
284          * disabled before putting SDRAM into self-refresh to avoid
285          * memory access due to page table walks */
286         mov32   r4, TEGRA_PMC_BASE
287         mov32   r5, TEGRA_CLK_RESET_BASE
288         mov32   r6, TEGRA_FLOW_CTRL_BASE
289         mov32   r7, TEGRA_TMRUS_BASE
290
291         mov32   r1, tegra3_stop_mc_clk
292         mov32   r2, tegra3_iram_start
293         sub     r1, r1, r2
294         mov32   r2, TEGRA_IRAM_CODE_AREA
295         add     r1, r1, r2
296         b       tegra_turn_off_mmu
297 ENDPROC(tegra3_stop_mc_clk_finish)
298
299 /*
300  * tegra3_sleep_cpu_secondary_finish(unsigned long v2p)
301  *
302  * Enters LP2 on secondary CPU by exiting coherency and powergating the CPU.
303  */
304 ENTRY(tegra3_sleep_cpu_secondary_finish)
305         mov     r6, lr
306
307         bl      tegra_flush_l1_cache
308         bl      tegra_cpu_exit_coherency
309
310         /* Powergate this CPU. */
311         mov     r0, #0                          @ power mode flags (!hotplug)
312         bl      tegra30_cpu_shutdown
313         mov     r0, #1                          @ never return here
314         mov     pc, r6
315 ENDPROC(tegra3_sleep_cpu_secondary_finish)
316
317 /*
318  * tegra3_tear_down_cpu
319  *
320  * Switches the CPU cluster to PLL-P and enters sleep.
321  */
322 ENTRY(tegra3_tear_down_cpu)
323         mov32   r4, TEGRA_PMC_BASE
324         mov32   r5, TEGRA_CLK_RESET_BASE
325         mov32   r6, TEGRA_FLOW_CTRL_BASE
326         mov32   r7, TEGRA_TMRUS_BASE
327 #if USE_PLLP_ON_SLEEP_ENTRY
328         bl      tegra_cpu_pllp
329 #endif
330         b       tegra3_enter_sleep
331 ENDPROC(tegra3_tear_down_cpu)
332
333 /* START OF ROUTINES COPIED TO IRAM */
334         .align L1_CACHE_SHIFT
335         .globl tegra3_iram_start
336 tegra3_iram_start:
337
338 /*
339  * tegra3_lp1_reset
340  *
341  * reset vector for LP1 restore; copied into IRAM during suspend.
342  * brings the system back up to a safe starting point (SDRAM out of
343  * self-refresh, PLLC, PLLM and PLLP reenabled, CPU running on PLLP,
344  * system clock running on the same PLL that it suspended at), and
345  * jumps to tegra_lp2_startup to restore PLLX and virtual addressing.
346  * physical address of tegra_lp2_startup expected to be stored in
347  * PMC_SCRATCH41
348  *
349  * NOTE: THIS *MUST* BE RELOCATED TO TEGRA_IRAM_CODE_AREA AND MUST BE FIRST.
350  */
351 .macro pll_enable, rd, car, base, misc
352         ldr     \rd, [\car, #\base]
353         tst     \rd, #(1<<30)
354         orreq   \rd, \rd, #(1<<30)
355         streq   \rd, [\car, #\base]
356 #if USE_PLL_LOCK_BITS
357         .if     \misc
358         ldr     \rd, [\car, #\misc]
359         bic     \rd, \rd, #(1<<18)
360         str     \rd, [\car, #\misc]
361         ldr     \rd, [\car, #\misc]
362         ldr     \rd, [\car, #\misc]
363         orr     \rd, \rd, #(1<<18)
364         str     \rd, [\car, #\misc]
365         .endif
366 #endif
367 .endm
368
369 .macro pll_locked, rd, car, base
370 #if USE_PLL_LOCK_BITS
371 1:
372         ldr     \rd, [\car, #\base]
373         tst     \rd, #(1<<27)
374         beq     1b
375 #endif
376 .endm
377
378 .macro pll_iddq_exit, rd, car, iddq, iddq_bit
379         ldr     \rd, [\car, #\iddq]
380         bic     \rd, \rd, #(1<<\iddq_bit)
381         str     \rd, [\car, #\iddq]
382 .endm
383
384 .macro pll_iddq_entry, rd, car, iddq, iddq_bit
385         ldr     \rd, [\car, #\iddq]
386         orr     \rd, \rd, #(1<<\iddq_bit)
387         str     \rd, [\car, #\iddq]
388 .endm
389
390 ENTRY(tegra3_lp1_reset)
391         /* the CPU and system bus are running at 32KHz and executing from
392          * IRAM when this code is executed; immediately switch to CLKM and
393          * enable PLLP, PLLM, PLLC, and PLLX. */
394
395         ldr     r8, [r12, #RESET_DATA(MASK_MC_CLK)]
396         tst     r8, r11         @ if memory clock stopped
397         mov32   r2, TEGRA_PMC_BASE
398         bne     emc_exit_selfrefresh
399
400         mov32   r0, TEGRA_CLK_RESET_BASE
401 #if !defined(CONFIG_TEGRA_USE_SECURE_KERNEL)
402         /* secure code handles 32KHz to CLKM/OSC clock switch */
403         mov     r1, #(1<<28)
404         str     r1, [r0, #CLK_RESET_SCLK_BURST]
405         str     r1, [r0, #CLK_RESET_CCLK_BURST]
406         mov     r1, #0
407         str     r1, [r0, #CLK_RESET_SCLK_DIVIDER]
408         str     r1, [r0, #CLK_RESET_CCLK_DIVIDER]
409 #endif
410
411 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)
412         /* enable PLLM via PMC */
413         mov32   r2, TEGRA_PMC_BASE
414         ldr     r1, [r2, #PMC_PLLP_WB0_OVERRIDE]
415         orr     r1, r1, #(1<<12)
416         str     r1, [r2, #PMC_PLLP_WB0_OVERRIDE]
417
418         pll_enable r1, r0, CLK_RESET_PLLM_BASE, CLK_RESET_PLLM_MISC
419         pll_enable r1, r0, CLK_RESET_PLLC_BASE, CLK_RESET_PLLC_MISC
420         pll_enable r1, r0, CLK_RESET_PLLX_BASE, CLK_RESET_PLLX_MISC
421 #else
422         pll_iddq_exit r1, r0, CLK_RESET_PLLM_MISC, CLK_RESET_PLLM_MISC_IDDQ
423         pll_iddq_exit r1, r0, CLK_RESET_PLLC_MISC, CLK_RESET_PLLC_MISC_IDDQ
424         pll_iddq_exit r1, r0, CLK_RESET_PLLX_MISC3, CLK_RESET_PLLX_MISC3_IDDQ
425
426         mov32   r7, TEGRA_TMRUS_BASE
427         ldr     r1, [r7]
428         add     r1, r1, #2
429         wait_until r1, r7, r3
430
431         /* enable PLLM via PMC */
432         mov32   r2, TEGRA_PMC_BASE
433         ldr     r1, [r2, #PMC_PLLP_WB0_OVERRIDE]
434         orr     r1, r1, #(1<<12)
435         str     r1, [r2, #PMC_PLLP_WB0_OVERRIDE]
436
437         pll_enable r1, r0, CLK_RESET_PLLM_BASE, 0
438         pll_enable r1, r0, CLK_RESET_PLLC_BASE, 0
439         pll_enable r1, r0, CLK_RESET_PLLX_BASE, 0
440 #endif
441         pll_enable r1, r0, CLK_RESET_PLLP_BASE, CLK_RESET_PLLP_MISC
442
443         pll_locked r1, r0, CLK_RESET_PLLM_BASE
444         pll_locked r1, r0, CLK_RESET_PLLP_BASE
445         pll_locked r1, r0, CLK_RESET_PLLC_BASE
446         pll_locked r1, r0, CLK_RESET_PLLX_BASE
447
448         mov32   r7, TEGRA_TMRUS_BASE
449         ldr     r1, [r7]
450         add     r1, r1, #LOCK_DELAY
451         wait_until r1, r7, r3
452
453 #if defined(CONFIG_ARCH_TEGRA_3x_SOC) || defined(CONFIG_ARCH_TEGRA_14x_SOC)
454         add     r5, pc, #tegra3_sdram_pad_save-(.+8)    @ r5 --> saved data
455 #endif
456 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
457         add     r5, pc, #tegra11_sdram_pad_save-(.+8)   @ r5 --> saved data
458 #endif
459
460         ldr     r4, [r5, #0x18]
461         str     r4, [r0, #CLK_RESET_CLK_SOURCE_MSELECT]
462
463         ldr     r4, [r5, #0x1C]
464         str     r4, [r0, #CLK_RESET_SCLK_BURST]
465 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)
466         mov32   r4, ((1<<28) | (8))     @ burst policy is PLLX
467         str     r4, [r0, #CLK_RESET_CCLK_BURST]
468 #endif
469
470 #ifdef CONFIG_TEGRA_LP1_950
471 lp1_voltset:
472         /* Restore the Core voltage to high on LP1 resume */
473         /* Reset(Enable/Disable) the DVC-I2C Controller*/
474         mov r1, #(1 << 15)
475         str r1, [r0, #CLK_RESET_CLK_RST_DEV_H_SET]
476
477         /* Wait for 2us */
478         mov32   r7, TEGRA_TMRUS_BASE
479         wait_for_us r1, r7, r9
480         add r1, r1, #2
481         wait_until r1, r7, r9
482
483         mov r1, #(1 << 15)
484         str r1, [r0, #CLK_RESET_CLK_RST_DEV_H_CLR]
485
486         /* Enable the DVC-I2C Controller */
487         mov r1, #(1 << 15)
488         str r1, [r0, #CLK_RESET_CLK_ENB_H_SET]
489
490
491         /* Same I2C transaction protocol as suspend */
492         ldr r1, lp1_register_pmuslave_addr
493         cmp r1, #0
494         beq lp1_voltskip_resume
495
496         ldr r4, lp1_register_i2c_base_addr
497         str r1, [r4, #I2C_ADDR0]
498
499         mov32 r1, 0x2
500         str r1, [r4, #I2C_CNFG]
501
502         ldr r1, lp1_register_core_highvolt
503         str r1, [r4, #I2C_DATA1]
504
505         mov32 r1, 0
506         str r1, [r4, #I2C_DATA2]
507
508         mov32 r1, 0xA02
509         str r1, [r4, #I2C_CNFG]
510
511         wait_for_us r1, r7, r9
512         mov32 r3, 0x7D0   /* Wait for 2ms and try transaction again */
513         add r0, r1, r3
514 loop_i2c_status_resume:
515         add r1, r1, #0xFA /* Check status every 250us */
516         wait_until r1, r7, r9
517         cmp r0, r1
518         beq lp1_voltset
519
520         ldr r3, [r4, #I2C_STATUS]
521         cmp r3, #0
522         bne loop_i2c_status_resume
523
524 lp1_voltskip_resume:
525         /* Disable the DVC-I2C Controller */
526         mov r0, #(1 << 15)
527         str r0, [r5, #CLK_RESET_CLK_ENB_H_CLR]
528 #endif
529
530 #if defined (CONFIG_CACHE_L2X0)
531         /* power up L2 */
532         ldr     r0, [r2, #PMC_PWRGATE_STATUS]
533         tst     r0, #(1<<PMC_PWRGATE_PARTID_L2C)
534         bne     powerup_l2_done
535         movw    r0, #(1<<8) | PMC_PWRGATE_PARTID_L2C
536         str     r0, [r2, #PMC_PWRGATE_TOGGLE]
537 powerup_l2_wait:
538         ldr     r0, [r2, #PMC_PWRGATE_STATUS]
539         tst     r0, #(1<<PMC_PWRGATE_PARTID_L2C)
540         beq     powerup_l2_wait
541 powerup_l2_done:
542         mov     r0, #PMC_PWRGATE_PARTID_L2C
543         str     r0, [r2, #PMC_REMOVE_CLAMPING_CMD]
544 #endif
545
546 #if defined(CONFIG_ARCH_TEGRA_14x_SOC)
547
548         /* If we are waking up from LP1, unconditionally continue
549          * resume.
550          */
551         mov32   r4, TEGRA_PMC_BASE
552         ldr     r0, [r4, #PMC_LP_STATE_SCRATCH_REG]
553         mov     r0, r0, lsr #PMC_LP_STATE_BIT_OFFSET
554         and     r0, r0, #PMC_LP_STATE_BIT_MASK
555         cmp     r0, #PMC_LP_STATE_LP1
556         beq     lp1_exit_resume
557
558         /* If we are waking up from LP1BB, see the wake source.
559          * If it was mem_req=0, then go into LP1.
560          * Otherwise wake to active.
561          */
562         ldr     r0, [r4, #PMC_WAKE2_STATUS]
563         tst     r0, #PMC_WAKE2_BB_MEM_REQ
564
565         /* If it isn't mem_req=0, continue with resume, just
566          * skip self refresh routine
567          */
568         beq     self_refresh_skip
569
570         /* If it is mem_req=0, check to see if there was another
571          * wake event, if yes, continue with wake to active
572          */
573         ldr     r1, [r4, #PMC_WAKE_STATUS]
574
575         /* Mask out other wake events from WAKE2_STATUS */
576         bic     r0, r0, #PMC_WAKE2_BB_MEM_REQ
577         orrs    r1, r1, r0
578
579         /* If there were any other wake events, wake to active */
580         bne     self_refresh_skip
581
582         /* Since the wake was mem_req, we need to enter LP1 */
583         mov32   r5, TEGRA_CLK_RESET_BASE
584         mov32   r6, TEGRA_FLOW_CTRL_BASE
585         mov32   r7, TEGRA_TMRUS_BASE
586
587         /* Write PMC_IPC_CLR[mem_sts] = 1 */
588         ldr     r1, [r4, #PMC_IPC_CLR]
589         orr     r1, r1, #PMC_IPC_CLR_MEM_STS
590         str     r1, [r4, #PMC_IPC_CLR]
591
592         /* Set lp state variable */
593         mov     r0, #PMC_LP_STATE_LP1
594         str     r0, lp_enter_state
595         bl      tegra148_set_lp_state
596
597         /* Set mem_req=1 interrupt */
598         bl      tegra148_set_mem_req_interrupt
599
600         /* Legacy LP1 entry routine */
601         bl      tegra3_sdram_self_refresh
602         bl      tegra3_cpu_clk32k
603         b       tegra3_enter_sleep
604
605 lp1_exit_resume:
606 #endif
607
608 emc_exit_selfrefresh:
609 #if defined(CONFIG_ARCH_TEGRA_3x_SOC) || defined(CONFIG_ARCH_TEGRA_14x_SOC)
610         mov32   r0, TEGRA_EMC_BASE              @ r0 reserved for emc base
611         add     r5, pc, #tegra3_sdram_pad_save-(.+8)    @ r5 --> saved data
612 #endif
613 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
614         mov32   r0, TEGRA_EMC0_BASE             @ r0 reserved for emc base
615         add     r5, pc, #tegra11_sdram_pad_save-(.+8)   @ r5 --> saved data
616 #endif
617
618         ldr     r1, [r5, #0x14] @ PMC_IO_DPD_STATUS
619         mvn     r1, r1
620         bic     r1, r1, #(0x1<<31)
621         orr     r1, r1, #(0x1<<30)
622         str     r1, [r2, #PMC_IO_DPD_REQ]
623
624 exit_self_refresh:
625         ldr     r1, [r5, #0xC]
626         str     r1, [r0, #EMC_XM2VTTGENPADCTRL]
627         ldr     r1, [r5, #0x10]
628         str     r1, [r0, #EMC_XM2VTTGENPADCTRL2]
629         ldr     r1, [r5, #0x8]
630         str     r1, [r0, #EMC_AUTO_CAL_INTERVAL]
631
632         ldr     r1, [r0, #EMC_CFG_DIG_DLL]
633         orr     r1, r1, #(0x1<<30)              @ set DLL_RESET
634         str     r1, [r0, #EMC_CFG_DIG_DLL]
635
636         emc_timing_update r1, r0
637
638 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
639         mov32   r1, TEGRA_EMC1_BASE
640         cmp     r0, r1
641 #endif
642         ldr     r1, [r0, #EMC_AUTO_CAL_CONFIG]
643         orr     r1, r1, #(0x1<<31)              @ set AUTO_CAL_ACTIVE
644 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
645         orreq   r1, r1, #(0x1<<27)              @ set slave mode for channel 1
646 #endif
647         str     r1, [r0, #EMC_AUTO_CAL_CONFIG]
648
649 emc_wait_audo_cal_onetime:
650         ldr     r1, [r0, #EMC_AUTO_CAL_STATUS]
651         tst     r1, #(0x1<<31)          @ wait until AUTO_CAL_ACTIVE is clear
652         bne     emc_wait_audo_cal_onetime
653
654         ldr     r1, [r0, #EMC_CFG]
655         bic     r1, r1, #(1<<31)        @ disable DRAM_CLK_STOP
656         str     r1, [r0, #EMC_CFG]
657
658         mov     r1, #0
659         str     r1, [r0, #EMC_SELF_REF] @ take DRAM out of self refresh
660         mov     r1, #1
661 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)
662         str     r1, [r0, #EMC_NOP]
663         str     r1, [r0, #EMC_NOP]
664 #endif
665         str     r1, [r0, #EMC_REFRESH]
666
667         emc_device_mask r1, r0
668
669 exit_selfrefresh_loop:
670         ldr     r2, [r0, #EMC_EMC_STATUS]
671         ands    r2, r2, r1
672         bne     exit_selfrefresh_loop
673
674         lsr     r1, r1, #8              @ devSel, bit0:dev0 bit1:dev1
675
676         mov32   r7, TEGRA_TMRUS_BASE
677         ldr     r2, [r0, #EMC_FBIO_CFG5]
678
679         and     r2, r2, #3
680         cmp     r2, #2
681         beq     emc_lpddr2
682
683         mov32   r2, 0x80000011
684         str     r2, [r0, #EMC_ZQ_CAL]
685         ldr     r2, [r7]
686         add     r2, r2, #10
687         wait_until r2, r7, r3
688
689         tst     r1, #2
690         beq zcal_done
691
692         mov32   r2, 0x40000011
693         str     r2, [r0, #EMC_ZQ_CAL]
694         ldr     r2, [r7]
695         add     r2, r2, #10
696         wait_until r2, r7, r3
697         b zcal_done
698
699 emc_lpddr2:
700
701         mov32   r2, 0x800A00AB
702         str     r2, [r0, #EMC_MRW]
703         ldr     r2, [r7]
704         add     r2, r2, #1
705         wait_until r2, r7, r3
706
707         tst     r1, #2
708         beq zcal_done
709
710         mov32   r2, 0x400A00AB
711         str     r2, [r0, #EMC_MRW]
712         ldr     r2, [r7]
713         add     r2, r2, #1
714         wait_until r2, r7, r3
715
716 zcal_done:
717
718         mov     r1, #0
719         str     r1, [r0, #EMC_REQ_CTRL]
720         ldr     r1, [r5, #0x4]
721         str     r1, [r0, #EMC_ZCAL_INTERVAL]
722         ldr     r1, [r5, #0x0]
723         str     r1, [r0, #EMC_CFG]
724
725 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
726         mov32   r1, TEGRA_EMC1_BASE
727         cmp     r0, r1
728         movne   r0, r1
729         addne   r5, r5, #0x20
730         bne     exit_self_refresh
731 #endif
732
733 #if defined(CONFIG_ARCH_TEGRA_14x_SOC)
734         /* In the LP1 case, we need to set the Memory status from
735          * AP to BB, so that memory transactions can take place
736          */
737         mov32   r4, TEGRA_PMC_BASE
738         ldr     r1, [r4, #PMC_IPC_SET]
739         orr     r1, r1, #PMC_IPC_SET_MEM_STS
740         str     r1, [r4, #PMC_IPC_SET]
741 self_refresh_skip:
742 #endif
743         mov32   r0, TEGRA_PMC_BASE
744         ldr     r0, [r0, #PMC_SCRATCH41]
745         mov     pc, r0
746 ENDPROC(tegra3_lp1_reset)
747
748 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)|| defined(CONFIG_ARCH_TEGRA_14x_SOC)
749         .align  L1_CACHE_SHIFT
750         .type   tegra3_sdram_pad_save, %object
751 tegra3_sdram_pad_save:
752         .word   0
753         .word   0
754         .word   0
755         .word   0
756         .word   0
757         .word   0
758         .word   0
759         .word   0
760
761 tegra3_sdram_pad_address:
762         .word   TEGRA_EMC_BASE + EMC_CFG                                @0x0
763         .word   TEGRA_EMC_BASE + EMC_ZCAL_INTERVAL                      @0x4
764         .word   TEGRA_EMC_BASE + EMC_AUTO_CAL_INTERVAL                  @0x8
765         .word   TEGRA_EMC_BASE + EMC_XM2VTTGENPADCTRL                   @0xc
766         .word   TEGRA_EMC_BASE + EMC_XM2VTTGENPADCTRL2                  @0x10
767         .word   TEGRA_PMC_BASE + PMC_IO_DPD_STATUS                      @0x14
768         .word   TEGRA_CLK_RESET_BASE + CLK_RESET_CLK_SOURCE_MSELECT     @0x18
769         .word   TEGRA_CLK_RESET_BASE + CLK_RESET_SCLK_BURST             @0x1c
770 #endif
771 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
772         .align  L1_CACHE_SHIFT
773         .type   tegra11_sdram_pad_save, %object
774 tegra11_sdram_pad_save:
775         .word   0
776         .word   0
777         .word   0
778         .word   0
779         .word   0
780         .word   0
781         .word   0
782         .word   0
783         .word   0
784         .word   0
785         .word   0
786         .word   0
787         .word   0
788
789 tegra11_sdram_pad_address:
790         .word   TEGRA_EMC0_BASE + EMC_CFG                               @0x0
791         .word   TEGRA_EMC0_BASE + EMC_ZCAL_INTERVAL                     @0x4
792         .word   TEGRA_EMC0_BASE + EMC_AUTO_CAL_INTERVAL                 @0x8
793         .word   TEGRA_EMC0_BASE + EMC_XM2VTTGENPADCTRL                  @0xc
794         .word   TEGRA_EMC0_BASE + EMC_XM2VTTGENPADCTRL2                 @0x10
795         .word   TEGRA_PMC_BASE + PMC_IO_DPD_STATUS                      @0x14
796         .word   TEGRA_CLK_RESET_BASE + CLK_RESET_CLK_SOURCE_MSELECT     @0x18
797         .word   TEGRA_CLK_RESET_BASE + CLK_RESET_SCLK_BURST             @0x1c
798         .word   TEGRA_EMC1_BASE + EMC_CFG                               @0x20
799         .word   TEGRA_EMC1_BASE + EMC_ZCAL_INTERVAL                     @0x24
800         .word   TEGRA_EMC1_BASE + EMC_AUTO_CAL_INTERVAL                 @0x28
801         .word   TEGRA_EMC1_BASE + EMC_XM2VTTGENPADCTRL                  @0x2c
802         .word   TEGRA_EMC1_BASE + EMC_XM2VTTGENPADCTRL2                 @0x30
803 #endif
804
805 #ifdef CONFIG_TEGRA_LP1_950
806         .globl lp1_register_pmuslave_addr
807         .globl lp1_register_i2c_base_addr
808         .globl lp1_register_core_lowvolt
809         .globl lp1_register_core_highvolt
810 lp1_register_pmuslave_addr:
811         .word   0
812 lp1_register_i2c_base_addr:
813         .word   0
814 lp1_register_core_lowvolt:
815         .word   0
816 lp1_register_core_highvolt:
817         .word   0
818 #endif
819
820 #if defined(CONFIG_ARCH_TEGRA_14x_SOC)
821 lp_enter_state:
822         .word   0
823 #endif
824
825 /* tegra3_tear_down_core
826  *
827  * LP0 entry check conditions w.r.t BB take place here
828  */
829 tegra3_tear_down_core:
830 #if defined(CONFIG_ARCH_TEGRA_14x_SOC)
831         /* Checking for BB-idle or Paging case */
832         ldr     r0, [r4, #PMC_IPC_STS]
833         tst     r0, #PMC_IPC_STS_MEM_REQ | PMC_IPC_STS_MEM_REQ_SOON
834         movne   r0, #PMC_LP_STATE_LP1BB
835
836         /* Write PMC_IPC_CLR[mem_sts] = 1 */
837         ldr     r1, [r4, #PMC_IPC_CLR]
838         orr     r1, r1, #PMC_IPC_CLR_MEM_STS
839         str     r1, [r4, #PMC_IPC_CLR]
840
841         /* Clear FLOW_IPC_STS[AP2BB_MSC_STS[0]] */
842         ldr     r1, [r6, #FLOW_IPC_STS]
843         bic     r1, #FLOW_IPC_STS_AP2BB_MSC_STS_0
844         str     r1, [r6, #FLOW_IPC_STS]
845
846         cmp     r0, #PMC_LP_STATE_LP1BB
847         bne     tegra3_lp0_tear_down_core
848         ldr     r1, [r4, #PMC_IPC_SET]
849         orr     r1, r1, #PMC_IPC_SET_MEM_STS
850         str     r1, [r4, #PMC_IPC_SET]
851
852 /* lp1bb_entry
853  * Set up mem_req active low to be a wake event.
854  * Configure the EVP reset vector.
855  * Set up LIC to accept pmc wake events as interrupts.
856  * Clear previously set warmboot and side_effect bits
857  * Invoke remaining LP routines.
858  */
859 lp1bb_entry:
860         bl      tegra148_lp1bb_clear_warmboot_flag
861         mov     r0, #PMC_LP_STATE_LP1BB
862         str     r0, lp_enter_state
863         bl      tegra148_set_lp_state
864         bl      tegra148_set_mem_req_interrupt
865         bl      tegra3_cpu_clk32k
866         b       tegra3_enter_sleep
867
868 /* Based on LP state being entered, sets mem_req=0
869  * or mem_req=1 as a wake interrupt
870  */
871 tegra148_set_mem_req_interrupt:
872         /* Clear the PMC_CTRL2_WAKE_DET_EN bit */
873         ldr     r0, [r4, #PMC_CTRL2]
874         bic     r0, r0, #PMC_CTRL2_WAKE_DET_EN
875         str     r0, [r4, #PMC_CTRL2]
876
877         /* Program the wake_level2 registers */
878         ldr     r0, [r4, #PMC_WAKE2_LEVEL]
879         ldr     r1, lp_enter_state
880         cmp     r1, #PMC_LP_STATE_LP1BB
881         biceq   r0, r0, #PMC_WAKE2_BB_MEM_REQ
882         orrne   r0, r0, #PMC_WAKE2_BB_MEM_REQ
883         str     r0, [r4, #PMC_WAKE2_LEVEL]
884
885         /* Wait for 1ms for write to take effect */
886         mov32   r7, TEGRA_TMRUS_BASE
887         wait_for_us r1, r7, r9
888         add r1, r1, #100
889         wait_until r1, r7, r9
890
891         /* Program the auto_wake_lvl regsiters */
892         ldr     r0, [r4, #PMC_AUTO_WAKE_LVL]
893         orr     r0, r0, #1
894         str     r0, [r4, #PMC_AUTO_WAKE_LVL]
895
896         /* Wait for 1ms for write to take effect */
897         mov32   r7, TEGRA_TMRUS_BASE
898         wait_for_us r1, r7, r9
899         add r1, r1, #100
900         wait_until r1, r7, r9
901
902         /* Configure mem_req active low to be wake event */
903         ldr     r0, [r4, #PMC_WAKE2_MASK]
904         orr     r0, r0, #PMC_WAKE2_BB_MEM_REQ
905         str     r0, [r4, #PMC_WAKE2_MASK]
906
907         ldr     r0, [r4, #PMC_CTRL2]
908         orr     r0, r0, #PMC_CTRL2_WAKE_DET_EN
909         str     r0, [r4, #PMC_CTRL2]
910
911         /* Set up the LIC to accept pmc_wake events as interrupts */
912         ldr     r8, =TEGRA_TERTIARY_ICTLR_BASE
913         ldr     r0, =TRI_ICTLR_PMC_WAKE_INT
914         str     r0, [r8, #TRI_ICTLR_CPU_IER_SET]
915         mov     pc, lr
916
917 /*
918  * tegra148_lp1bb_clear_warmboot_flag
919  * Clears side effect bit in case it was set during
920  * suspend entry. Also clears Warmboot0 flag.
921  */
922 tegra148_lp1bb_clear_warmboot_flag:
923         ldr     r0, [r4, #PMC_SCRATCH0]
924         bic     r0, r0, #1
925         str     r0, [r4, #PMC_SCRATCH0]
926         ldr     r0, [r4, #PMC_CTRL]
927         bic     r0, r0, #PMC_CTRL_SIDE_EFFECT_LP0
928         str     r0, [r4, #PMC_CTRL]
929         mov     pc, lr
930
931 /* Based on value of lp_enter_state, update LP state
932  * scratch register
933  */
934 tegra148_set_lp_state:
935         ldr     r0, lp_enter_state
936         mov     r0, r0, lsl #PMC_LP_STATE_BIT_OFFSET
937         ldr     r1, [r4, #PMC_LP_STATE_SCRATCH_REG]
938         mov     r2, #PMC_LP_STATE_BIT_MASK
939         bic     r1, r2, lsl #PMC_LP_STATE_BIT_OFFSET
940         orr     r1, r0
941         str     r1, [r4, #PMC_LP_STATE_SCRATCH_REG]
942         mov     pc, lr
943
944 /* tegra3_lp0_tear_down_core
945  *
946  * copied into and executed from IRAM
947  * puts memory in self-refresh for LP0 and LP1
948  */
949 tegra3_lp0_tear_down_core:
950         ldr     r0, [r4, #PMC_CTRL]
951         tst     r0, #PMC_CTRL_SIDE_EFFECT_LP0
952         moveq   r0, #PMC_LP_STATE_LP1
953         movne   r0, #PMC_LP_STATE_LP0
954         str     r0, lp_enter_state
955         bleq    tegra148_set_mem_req_interrupt
956         bl      tegra148_set_lp_state
957 #endif
958         bl      tegra3_sdram_self_refresh
959         bl      tegra3_cpu_clk32k
960         b       tegra3_enter_sleep
961
962 tegra3_stop_mc_clk:
963         bl      tegra3_sdram_self_refresh
964         b       tegra3_enter_sleep
965
966 /*
967  * tegra3_cpu_clk32k
968  *
969  * In LP0 and LP1 all plls will be turned off.  Switch the CPU and system clock
970  * to the 32khz clock (clks)
971  * r4 = TEGRA_PMC_BASE
972  * r5 = TEGRA_CLK_RESET_BASE
973  * r6 = TEGRA_FLOW_CTRL_BASE
974  * r7 = TEGRA_TMRUS_BASE
975  */
976 tegra3_cpu_clk32k:
977         ldr     r0, [r4, #PMC_CTRL]
978         tst     r0, #PMC_CTRL_SIDE_EFFECT_LP0
979         beq     lp1_clocks_prepare
980
981         /* enable PLLM auto-restart via PMC in LP0; restore override settings */
982         ldr     r0, [r4, #PMC_PLLP_WB0_OVERRIDE]
983         orr     r0, r0, #((1 << 12) | (1 << 11))
984         str     r0, [r4, #PMC_PLLP_WB0_OVERRIDE]
985         ldr     r0, [r4, #PMC_SCRATCH2]
986         str     r0, [r4, #PMC_PLLM_WB0_OVERRIDE]
987
988 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
989         ldr r1, [r4, #PMC_SCRATCH1_ECO]
990         orr r1, r1, #0x3F
991         str r1, [r4, #PMC_SCRATCH1_ECO]
992 #endif
993
994 #if defined(CONFIG_ARCH_TEGRA_14x_SOC)
995         ldr r1, [r4, #PMC_POR_DPD_CTRL]
996         orr r1, r1, #0x47
997         str r1, [r4, #PMC_POR_DPD_CTRL]
998 #endif
999
1000         mov     pc, lr
1001
1002 lp1_clocks_prepare:
1003         /* Prepare to set the Core to the lowest voltage if supported.
1004          * Start by setting the I2C clocks to make the I2C transfer */
1005 #ifdef CONFIG_TEGRA_LP1_950
1006         /* Set up the PWR I2C GPIOs with the right masks*/
1007
1008         /* Reset(Set/Clr) the DVC-I2C Controller*/
1009         mov r0, #(1 << 15)
1010         str r0, [r5, #CLK_RESET_CLK_RST_DEV_H_SET]
1011
1012         /* Wait for 2us */
1013         wait_for_us r1, r7, r9
1014         mov32 r0, 0x7D0
1015         add r1, r1, r0
1016         wait_until r1, r7, r9
1017
1018         mov r0, #(1 << 15)
1019         str r0, [r5, #CLK_RESET_CLK_RST_DEV_H_CLR]
1020
1021         /* Enable the DVC-I2C Controller */
1022         mov r0, #(1 << 15)
1023         str r0, [r5, #CLK_RESET_CLK_ENB_H_SET]
1024
1025         /* I2C transfer protocol:
1026          * 4 packets: Slaveaddr + WriteConfigure + Data1 + Data2 */
1027         ldr r0, lp1_register_pmuslave_addr
1028         cmp r0, #0
1029         beq lp1_volt_skip
1030         ldr r1, lp1_register_i2c_base_addr
1031         str r0, [r1, #I2C_ADDR0]
1032
1033         mov32 r0, 0x2
1034         str r0, [r1, #I2C_CNFG]
1035
1036         ldr r0, lp1_register_core_lowvolt
1037         str r0, [r1, #I2C_DATA1]
1038
1039         mov32 r0, 0
1040         str r0, [r1, #I2C_DATA2]
1041
1042         /* Send I2C transaction */
1043         mov32 r0, 0xA02
1044         str r0, [r1, #I2C_CNFG]
1045
1046         /* Check the transaction status before proceeding */
1047         wait_for_us r2, r7, r9
1048         mov32 r3, 0x7D0 /* Wait for 2ms for I2C transaction */
1049         add r3, r2, r3
1050 loop_i2c_status_suspend:
1051         add r2, r2, #0xFA /* Check status every 250us */
1052         cmp r3, r2
1053         beq lp1_volt_skip  /* Waited for 2ms, I2C transaction didn't take place */
1054         wait_until r2, r7, r9
1055
1056         ldr r0, [r1, #I2C_STATUS]
1057         cmp r0, #0
1058         bne loop_i2c_status_suspend
1059 lp1_volt_skip:
1060
1061         /* Disable the DVC-I2C Controller */
1062         mov r0, #(1 << 15)
1063         str r0, [r5, #CLK_RESET_CLK_ENB_H_CLR]
1064
1065 #endif
1066         /* start by jumping to clkm to safely disable PLLs, then jump
1067          * to clks */
1068         mov     r0, #(1 << 28)
1069         str     r0, [r5, #CLK_RESET_SCLK_BURST]
1070         /* 2 us delay between changing sclk and cclk */
1071         wait_for_us r1, r7, r9
1072         add     r1, r1, #2
1073         wait_until r1, r7, r9
1074         mov     r0, #(1 << 28)
1075         str     r0, [r5, #CLK_RESET_CCLK_BURST]
1076         mov     r0, #0
1077         str     r0, [r5, #CLK_RESET_CCLK_DIVIDER]
1078         str     r0, [r5, #CLK_RESET_SCLK_DIVIDER]
1079
1080         /* switch the clock source for mselect to be CLK_M */
1081         ldr     r0, [r5, #CLK_RESET_CLK_SOURCE_MSELECT]
1082         orr     r0, r0, #MSELECT_CLKM
1083         str     r0, [r5, #CLK_RESET_CLK_SOURCE_MSELECT]
1084
1085         /* 2 us delay between changing sclk and disabling PLLs */
1086         wait_for_us r1, r7, r9
1087         add     r1, r1, #2
1088         wait_until r1, r7, r9
1089
1090 #if !defined(CONFIG_ARCH_TEGRA_14x_SOC)
1091         /* disable PLLM via PMC in LP1 */
1092         ldr     r0, [r4, #PMC_PLLP_WB0_OVERRIDE]
1093         bic     r0, r0, #(1 << 12)
1094         str     r0, [r4, #PMC_PLLP_WB0_OVERRIDE]
1095 #endif
1096         b       powerdown_pll_pcx
1097
1098 powerdown_pll_pcx:
1099         ldr     r11, [r4, #PMC_SCRATCH37]       @ load the LP1 flags
1100         tst     r11, #TEGRA_POWER_LP1_AUDIO     @ check if voice call is going on
1101         bne     powerdown_pll_cx                @ if yes, do not turn off pll-p/pll-a
1102
1103         ldr     r0, [r5, #CLK_RESET_PLLP_BASE]
1104         bic     r0, r0, #(1<<30)
1105         str     r0, [r5, #CLK_RESET_PLLP_BASE]
1106         ldr     r0, [r5, #CLK_RESET_PLLA_BASE]
1107         bic     r0, r0, #(1<<30)
1108         str     r0, [r5, #CLK_RESET_PLLA_BASE]
1109
1110 powerdown_pll_cx:
1111         ldr     r0, [r5, #CLK_RESET_PLLC_BASE]
1112         bic     r0, r0, #(1<<30)
1113         str     r0, [r5, #CLK_RESET_PLLC_BASE]
1114         ldr     r0, [r5, #CLK_RESET_PLLX_BASE]
1115         bic     r0, r0, #(1<<30)
1116         str     r0, [r5, #CLK_RESET_PLLX_BASE]
1117 #if !defined(CONFIG_ARCH_TEGRA_3x_SOC)
1118         /*
1119          * FIXME: put PLLM/C into IDDQ (need additional testing)
1120          * pll_iddq_entry r1, r5, CLK_RESET_PLLM_MISC, CLK_RESET_PLLM_MISC_IDDQ
1121          * pll_iddq_entry r1, r5, CLK_RESET_PLLC_MISC, CLK_RESET_PLLC_MISC_IDDQ
1122          */
1123         pll_iddq_entry r1, r5, CLK_RESET_PLLX_MISC3, CLK_RESET_PLLX_MISC3_IDDQ
1124 #endif
1125
1126         /* switch to CLKS */
1127         mov     r0, #0  /* burst policy = 32KHz */
1128         str     r0, [r5, #CLK_RESET_SCLK_BURST]
1129         mov     pc, lr
1130
1131 /*
1132  * tegra3_enter_sleep
1133  *
1134  * uses flow controller to enter sleep state
1135  * executes from IRAM with SDRAM in selfrefresh when target state is LP0 or LP1
1136  * executes from SDRAM with target state is LP2
1137  * r4 = TEGRA_PMC_BASE
1138  * r5 = TEGRA_CLK_RESET_BASE
1139  * r6 = TEGRA_FLOW_CTRL_BASE
1140  * r7 = TEGRA_TMRUS_BASE
1141  */
1142 tegra3_enter_sleep:
1143         ldr     r1, [r7]
1144         str     r1, [r4, #PMC_SCRATCH38]
1145         dsb
1146         cpu_id  r1
1147
1148         cpu_to_csr_reg  r2, r1
1149         ldr     r0, [r6, r2]
1150         orr     r0, r0, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG
1151         orr     r0, r0, #FLOW_CTRL_CSR_ENABLE
1152         str     r0, [r6, r2]
1153
1154 #if defined(CONFIG_ARCH_TEGRA_11x_SOC) || defined(CONFIG_ARCH_TEGRA_14x_SOC)
1155         tst     r0, #FLOW_CTRL_IMMEDIATE_WAKE
1156         movne   r0, #FLOW_CTRL_WAITEVENT
1157         moveq   r0, #FLOW_CTRL_WAIT_FOR_INTERRUPT
1158         orr     r0, r0, #FLOW_CTRL_HALT_LIC_IRQ | FLOW_CTRL_HALT_LIC_FIQ
1159 #else
1160         mov     r0, #FLOW_CTRL_WAIT_FOR_INTERRUPT
1161         orr     r0, r0, #FLOW_CTRL_HALT_CPU_IRQ | FLOW_CTRL_HALT_CPU_FIQ
1162 #endif
1163         cpu_to_halt_reg r2, r1
1164         str     r0, [r6, r2]
1165         dsb
1166         ldr     r0, [r6, r2] /* memory barrier */
1167
1168 #ifndef CONFIG_ARM_SAVE_DEBUG_CONTEXT_NO_LOCK
1169         /* Set the Debug OS Double Lock for Debug Arch v7.1 or greater.
1170            With this lock set, the debugger is completely locked out.
1171            Disable this to debug WFI/powergating failures.
1172         */
1173         mrc     p15, 0, r3, c0, c1, 2   @ ID_DFR0
1174         and     r3, r3, #0xF            @ coprocessor debug model
1175         cmp     r3, #5                  @ debug arch >= v7.1?
1176
1177         mov32   r1, 0xC5ACCE55
1178         mcrge   p14, 0, r1, c1, c3, 4   @ DBGOSDLR
1179 #endif
1180 halted:
1181         isb
1182         dsb
1183         wfi     /* CPU should be power gated here */
1184
1185         /* !!!FIXME!!! Implement halt failure handler */
1186         b       halted
1187
1188 /*
1189  * tegra3_sdram_self_refresh
1190  *
1191  * called with MMU off and caches disabled
1192  * puts sdram in self refresh
1193  * must execute from IRAM
1194  * r4 = TEGRA_PMC_BASE
1195  * r5 = TEGRA_CLK_RESET_BASE
1196  * r6 = TEGRA_FLOW_CTRL_BASE
1197  * r7 = TEGRA_TMRUS_BASE
1198  */
1199
1200 tegra3_sdram_self_refresh:
1201
1202 #if defined(CONFIG_ARCH_TEGRA_3x_SOC) || defined(CONFIG_ARCH_TEGRA_14x_SOC)
1203         adr     r2, tegra3_sdram_pad_address
1204         adr     r8, tegra3_sdram_pad_save
1205 #endif
1206 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
1207         adr     r2, tegra11_sdram_pad_address
1208         adr     r8, tegra11_sdram_pad_save
1209 #endif
1210         mov     r9, r2
1211
1212 padsave:
1213         ldr     r0, [r2], #4                    @ r0 is emc register address
1214
1215         ldr     r1, [r0]
1216         str     r1, [r8], #4                    @ save emc register
1217
1218         cmp     r8, r9
1219         bne     padsave
1220 padsave_done:
1221
1222         dsb
1223
1224 #if defined(CONFIG_ARCH_TEGRA_3x_SOC) || defined(CONFIG_ARCH_TEGRA_14x_SOC)
1225         mov32   r0, TEGRA_EMC_BASE              @ r0 reserved for emc base
1226 #endif
1227 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
1228         mov32   r0, TEGRA_EMC0_BASE             @ r0 reserved for emc base
1229 #endif
1230 enter_self_refresh:
1231         mov     r1, #0
1232         str     r1, [r0, #EMC_ZCAL_INTERVAL]
1233         str     r1, [r0, #EMC_AUTO_CAL_INTERVAL]
1234         ldr     r1, [r0, #EMC_CFG]
1235         bic     r1, r1, #(1<<28)
1236 #if defined(CONFIG_ARCH_TEGRA_11x_SOC) || defined(CONFIG_ARCH_TEGRA_14x_SOC)
1237         bic     r1, r1, #(1<<29)
1238 #endif
1239         str     r1, [r0, #EMC_CFG]              @ disable DYN_SELF_REF
1240
1241         emc_timing_update r1, r0
1242
1243         ldr     r1, [r7]
1244         add     r1, r1, #5
1245         wait_until r1, r7, r2
1246
1247 emc_wait_audo_cal:
1248         ldr     r1, [r0, #EMC_AUTO_CAL_STATUS]
1249         tst     r1, #(0x1<<31)          @ wait until AUTO_CAL_ACTIVE is clear
1250         bne     emc_wait_audo_cal
1251
1252         mov     r1, #3
1253         str     r1, [r0, #EMC_REQ_CTRL]         @ stall incoming DRAM requests
1254
1255 emcidle:
1256         ldr     r1, [r0, #EMC_EMC_STATUS]
1257         tst     r1, #4
1258         beq     emcidle
1259
1260         mov     r1, #1
1261         str     r1, [r0, #EMC_SELF_REF]
1262
1263         emc_device_mask r1, r0
1264
1265 emcself:
1266         ldr     r2, [r0, #EMC_EMC_STATUS]
1267         and     r2, r2, r1
1268         cmp     r2, r1
1269         bne     emcself                         @ loop until DDR in self-refresh
1270
1271         ldr     r1, [r0, #EMC_XM2VTTGENPADCTRL]
1272         mov32   r2, 0xF8F8FFFF          @ clear XM2VTTGEN_DRVUP and XM2VTTGEN_DRVDN
1273         and     r1, r1, r2
1274         str     r1, [r0, #EMC_XM2VTTGENPADCTRL]
1275         ldr     r1, [r0, #EMC_XM2VTTGENPADCTRL2]
1276 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)
1277         orr     r1, r1, #7                      @ set E_NO_VTTGEN
1278 #endif
1279 #if defined(CONFIG_ARCH_TEGRA_11x_SOC) || defined(CONFIG_ARCH_TEGRA_14x_SOC)
1280         orr     r1, r1, #0x3f                   @ set E_NO_VTTGEN
1281 #endif
1282         str     r1, [r0, #EMC_XM2VTTGENPADCTRL2]
1283
1284         emc_timing_update r1, r0
1285
1286 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
1287         mov32   r1, TEGRA_EMC1_BASE
1288         cmp     r0, r1
1289         movne   r0, r1
1290         bne     enter_self_refresh
1291 #endif
1292
1293         ldr     r1, [r4, #PMC_CTRL]
1294         tst     r1, #PMC_CTRL_SIDE_EFFECT_LP0
1295         bne     pmc_io_dpd_skip
1296         mov32   r1, 0x8EC00000
1297         str     r1, [r4, #PMC_IO_DPD_REQ]
1298 pmc_io_dpd_skip:
1299
1300         dsb
1301
1302         mov     pc, lr
1303
1304         .ltorg
1305 /* dummy symbol for end of IRAM */
1306         .align L1_CACHE_SHIFT
1307         .globl tegra3_iram_end
1308 tegra3_iram_end:
1309         b       .
1310 #endif