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