2 * Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved.
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.
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
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/>.
17 #include <linux/const.h>
18 #include <linux/init.h>
19 #include <linux/linkage.h>
21 #include <asm/assembler.h>
22 #include <asm/cache.h>
23 #include <asm/domain.h>
24 #include <asm/memory.h>
26 #include <asm/ptrace.h>
27 #include <asm/asm-offsets.h>
28 #include <asm/glue-cache.h>
29 #include <asm/glue-proc.h>
37 #define EMC_ADR_CFG 0x10
38 #define EMC_TIMING_CONTROL 0x28
39 #define EMC_REFRESH 0x70
41 #define EMC_SELF_REF 0xe0
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
56 #define PMC_CTRL_SIDE_EFFECT_LP0 (1 << 14) /* enter LP0 when CPU pwr gated */
58 #define PMC_PWRGATE_TOGGLE 0x30
59 #define PMC_REMOVE_CLAMPING_CMD 0x34
60 #define PMC_PWRGATE_STATUS 0x38
62 #define PMC_PWRGATE_PARTID_L2C (0x5)
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
72 #define FLOW_IPC_STS 0x500
73 #define FLOW_IPC_STS_AP2BB_MSC_STS_0 (1 << 4)
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
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
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
99 #define CLK_RESET_PLLP_OUTA 0xa4
100 #define CLK_RESET_PLLP_OUTB 0xa8
102 #define PMC_PLLP_WB0_OVERRIDE 0xf8
103 #define PMC_PLLM_WB0_OVERRIDE 0x1dc
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
117 #define I2C_ADDR0 0x4
118 #define I2C_DATA1 0xc
119 #define I2C_DATA2 0x10
120 #define I2C_STATUS 0x1c
122 #define MSELECT_CLKM (0x3 << 30)
124 #define TEGRA_RTC_MSEC 0x10
126 #if USE_PLL_LOCK_BITS
127 #define LOCK_DELAY PLL_POST_LOCK_DELAY
129 #define LOCK_DELAY 0xff /* 255uS delay for PLL stabilization */
132 #define USE_PLLP_ON_SLEEP_ENTRY 0
134 #define TEGRA30_POWER_HOTPLUG_SHUTDOWN (1 << 27) /* Hotplug shutdown */
136 .macro emc_device_mask, rd, base
137 ldr \rd, [\base, #EMC_ADR_CFG]
139 moveq \rd, #(0x1<<8) @ just 1 device
140 movne \rd, #(0x3<<8) @ 2 devices
143 .macro emc_timing_update, rd, base
145 str \rd, [\base, #EMC_TIMING_CONTROL]
147 ldr \rd, [\base, #EMC_EMC_STATUS]
148 tst \rd, #(0x1<<23) @ wait until EMC_STATUS_TIMING_UPDATE_STALLED is clear
152 #if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_PM_SLEEP)
154 * tegra30_hotplug_shutdown(void)
156 * Powergates the current CPU.
157 * Should never return.
159 ENTRY(tegra30_hotplug_shutdown)
161 bl tegra_cpu_exit_coherency
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)
170 * tegra30_cpu_shutdown(unsigned long flags)
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.
176 * corrupts r0-r4, r12
178 ENTRY(tegra30_cpu_shutdown)
180 #ifndef CONFIG_ARCH_TEGRA_HAS_SYMMETRIC_CPU_PWR_GATE
182 moveq pc, lr @ Must never be called for CPU 0
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
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.
196 FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG | \
198 #if defined(CONFIG_ARCH_TEGRA_11x_SOC) || defined(CONFIG_ARCH_TEGRA_12x_SOC)
199 mov r4, #(1 << 8) @ wfi bitmap
201 mov r4, #(1 << 4) @ wfe bitmap
203 orr r12, r12, r4, lsl r3
209 subs r3, r3, #1 @ delay as a part of wfe war.
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
220 moveq r3, #FLOW_CTRL_WAIT_FOR_INTERRUPT @ For LP2
221 movne r3, #FLOW_CTRL_WAITEVENT @ For hotplug
230 #if defined(CONFIG_ARCH_TEGRA_11x_SOC) || defined(CONFIG_ARCH_TEGRA_12x_SOC)
231 wfi @ CPU should be power gated here
233 wfe @ CPU should be power gated here
239 * 38 nop's, which fills reset of wfe cache line and
240 * 4 more cachelines with nop
245 b . @ should never get here
247 ENDPROC(tegra30_cpu_shutdown)
250 #ifdef CONFIG_PM_SLEEP
252 * tegra3_sleep_core_finish(unsigned long int)
254 * enters suspend in LP0 or LP1 by turning off the mmu and jumping to
255 * tegra3_tear_down_core in IRAM
257 ENTRY(tegra3_sleep_core_finish)
261 bl tegra_cpu_exit_coherency
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
274 mov32 r1, tegra3_tear_down_core
275 mov32 r2, tegra3_iram_start
277 mov32 r2, TEGRA_IRAM_CODE_AREA
281 ENDPROC(tegra3_sleep_core_finish)
283 ENTRY(tegra3_stop_mc_clk_finish)
287 bl tegra_cpu_exit_coherency
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
300 mov32 r1, tegra3_stop_mc_clk
301 mov32 r2, tegra3_iram_start
303 mov32 r2, TEGRA_IRAM_CODE_AREA
307 ENDPROC(tegra3_stop_mc_clk_finish)
310 * tegra3_sleep_cpu_secondary_finish(unsigned long v2p)
312 * Enters LP2 on secondary CPU by exiting coherency and powergating the CPU.
314 ENTRY(tegra3_sleep_cpu_secondary_finish)
317 bl tegra_flush_l1_cache
318 bl tegra_cpu_exit_coherency
320 /* Powergate this CPU. */
321 mov r0, #0 @ power mode flags (!hotplug)
322 bl tegra30_cpu_shutdown
323 mov r0, #1 @ never return here
325 ENDPROC(tegra3_sleep_cpu_secondary_finish)
328 * tegra3_tear_down_cpu
330 * Switches the CPU cluster to PLL-P and enters sleep.
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
341 ENDPROC(tegra3_tear_down_cpu)
343 /* START OF ROUTINES COPIED TO IRAM */
344 .align L1_CACHE_SHIFT
345 .globl tegra3_iram_start
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
359 * NOTE: THIS *MUST* BE RELOCATED TO TEGRA_IRAM_CODE_AREA AND MUST BE FIRST.
361 .macro pll_enable, rd, car, base, misc
362 ldr \rd, [\car, #\base]
364 orreq \rd, \rd, #(1<<30)
365 streq \rd, [\car, #\base]
366 #if USE_PLL_LOCK_BITS
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]
379 .macro pll_locked, rd, car, base
380 #if USE_PLL_LOCK_BITS
382 ldr \rd, [\car, #\base]
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]
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]
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. */
405 ldr r8, [r12, #RESET_DATA(MASK_MC_CLK)]
406 tst r8, r11 @ if memory clock stopped
407 mov32 r2, TEGRA_PMC_BASE
410 mov32 r0, TEGRA_CLK_RESET_BASE
412 str r1, [r0, #CLK_RESET_CLK_ENB_H_SET]
413 b emc_exit_selfrefresh
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 */
420 str r1, [r0, #CLK_RESET_SCLK_BURST]
421 str r1, [r0, #CLK_RESET_CCLK_BURST]
423 str r1, [r0, #CLK_RESET_SCLK_DIVIDER]
424 str r1, [r0, #CLK_RESET_CCLK_DIVIDER]
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]
432 str r1, [r2, #PMC_PLLP_WB0_OVERRIDE]
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
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
442 mov32 r7, TEGRA_TMRUS_BASE
445 wait_until r1, r7, r3
447 /* enable PLLM via PMC */
448 mov32 r2, TEGRA_PMC_BASE
449 ldr r1, [r2, #PMC_PLLP_WB0_OVERRIDE]
451 str r1, [r2, #PMC_PLLP_WB0_OVERRIDE]
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
457 pll_enable r1, r0, CLK_RESET_PLLP_BASE, CLK_RESET_PLLP_MISC
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
464 mov32 r7, TEGRA_TMRUS_BASE
466 add r1, r1, #LOCK_DELAY
467 wait_until r1, r7, r3
469 #if !defined(CONFIG_ARCH_TEGRA_3x_SOC)
470 /* re-enable cl_dvfs logic clock (if dfll running, it's in open loop) */
472 str r4, [r0, #CLK_RESET_CLK_ENB_W_SET]
475 #if !defined(CONFIG_ARCH_TEGRA_3x_SOC)
476 /* re-enable cl_dvfs logic clock (if dfll running, it's in open loop) */
478 str r4, [r0, #CLK_RESET_CLK_ENB_W_SET]
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
485 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
486 add r5, pc, #tegra11_sdram_pad_save-(.+8) @ r5 --> saved data
490 str r4, [r0, #CLK_RESET_CLK_SOURCE_MSELECT]
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]
498 /* first restore PLLX div2 state, 2us delay, then CPU clock source */
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]
507 wait_until r1, r7, r3
508 str r4, [r0, #CLK_RESET_CCLK_BURST]
511 #ifdef CONFIG_TEGRA_LP1_LOW_COREVOLTAGE
513 /* Restore the Core voltage to high on LP1 resume */
514 /* Reset(Enable/Disable) the DVC-I2C Controller*/
516 str r1, [r0, #CLK_RESET_CLK_RST_DEV_H_SET]
519 mov32 r7, TEGRA_TMRUS_BASE
520 wait_for_us r1, r7, r9
522 wait_until r1, r7, r9
525 str r1, [r0, #CLK_RESET_CLK_RST_DEV_H_CLR]
527 /* Enable the DVC-I2C Controller */
529 str r1, [r0, #CLK_RESET_CLK_ENB_H_SET]
532 /* Same I2C transaction protocol as suspend */
533 ldr r1, lp1_register_pmuslave_addr
535 beq lp1_voltskip_resume
537 ldr r4, lp1_register_i2c_base_addr
538 str r1, [r4, #I2C_ADDR0]
541 str r1, [r4, #I2C_CNFG]
543 ldr r1, lp1_register_core_highvolt
544 str r1, [r4, #I2C_DATA1]
547 str r1, [r4, #I2C_DATA2]
550 str r1, [r4, #I2C_CNFG]
552 wait_for_us r1, r7, r9
553 mov32 r3, 0x7D0 /* Wait for 2ms and try transaction again */
555 loop_i2c_status_resume:
556 add r1, r1, #0xFA /* Check status every 250us */
557 wait_until r1, r7, r9
561 ldr r3, [r4, #I2C_STATUS]
563 bne loop_i2c_status_resume
566 /* Disable the DVC-I2C Controller */
568 str r1, [r0, #CLK_RESET_CLK_ENB_H_CLR]
571 #if defined (CONFIG_CACHE_L2X0)
573 ldr r0, [r2, #PMC_PWRGATE_STATUS]
574 tst r0, #(1<<PMC_PWRGATE_PARTID_L2C)
576 movw r0, #(1<<8) | PMC_PWRGATE_PARTID_L2C
577 str r0, [r2, #PMC_PWRGATE_TOGGLE]
579 ldr r0, [r2, #PMC_PWRGATE_STATUS]
580 tst r0, #(1<<PMC_PWRGATE_PARTID_L2C)
583 mov r0, #PMC_PWRGATE_PARTID_L2C
584 str r0, [r2, #PMC_REMOVE_CLAMPING_CMD]
587 #if defined(CONFIG_ARCH_TEGRA_14x_SOC)
589 /* If we are waking up from LP1, unconditionally continue
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
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
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
611 ldr r1, [r5, #0x14] @ PMC_IO_DPD_STATUS
613 bic r1, r1, #(0x1<<31)
614 orr r1, r1, #(0x1<<30)
615 str r1, [r2, #PMC_IO_DPD_REQ]
619 str r1, [r0, #EMC_XM2VTTGENPADCTRL]
621 str r1, [r0, #EMC_XM2VTTGENPADCTRL2]
623 str r1, [r0, #EMC_AUTO_CAL_INTERVAL]
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]
629 emc_timing_update r1, r0
631 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
632 mov32 r1, TEGRA_EMC1_BASE
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
640 str r1, [r0, #EMC_AUTO_CAL_CONFIG]
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
647 ldr r1, [r0, #EMC_CFG]
648 bic r1, r1, #(1<<31) @ disable DRAM_CLK_STOP
649 str r1, [r0, #EMC_CFG]
652 str r1, [r0, #EMC_SELF_REF] @ take DRAM out of self refresh
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]
658 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)
659 str r1, [r0, #EMC_REFRESH]
662 emc_device_mask r1, r0
664 exit_selfrefresh_loop:
665 ldr r2, [r0, #EMC_EMC_STATUS]
667 bne exit_selfrefresh_loop
669 lsr r1, r1, #8 @ devSel, bit0:dev0 bit1:dev1
671 mov32 r7, TEGRA_TMRUS_BASE
672 ldr r2, [r0, #EMC_FBIO_CFG5]
679 str r2, [r0, #EMC_ZQ_CAL]
682 wait_until r2, r7, r3
688 str r2, [r0, #EMC_ZQ_CAL]
691 wait_until r2, r7, r3
697 str r2, [r0, #EMC_MRW]
700 wait_until r2, r7, r3
706 str r2, [r0, #EMC_MRW]
709 wait_until r2, r7, r3
714 str r1, [r0, #EMC_REQ_CTRL]
716 str r1, [r0, #EMC_ZCAL_INTERVAL]
718 str r1, [r0, #EMC_CFG]
720 emc_timing_update r1, r0
724 wait_until r2, r7, r3
726 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
727 mov32 r1, TEGRA_EMC1_BASE
731 bne exit_self_refresh
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
738 mov32 r4, TEGRA_PMC_BASE
739 mov r1, #PMC_IPC_SET_MEM_STS
740 str r1, [r4, #PMC_IPC_SET]
743 mov32 r0, TEGRA_PMC_BASE
744 ldr r0, [r0, #PMC_SCRATCH41]
746 ENDPROC(tegra3_lp1_reset)
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:
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
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:
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
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:
817 lp1_register_i2c_base_addr:
819 lp1_register_core_lowvolt:
821 lp1_register_core_highvolt:
825 #if defined(CONFIG_ARCH_TEGRA_14x_SOC)
830 /* tegra3_tear_down_core
832 * LP0 entry check conditions w.r.t BB take place here
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
841 /* Write PMC_IPC_CLR[mem_sts] = 1 */
842 mov r1, #PMC_IPC_CLR_MEM_STS
843 str r1, [r4, #PMC_IPC_CLR]
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]
850 b tegra3_lp0_tear_down_core
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.
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
869 /* Based on LP state being entered, sets mem_req=0
870 * or mem_req=1 as a wake interrupt
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]
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]
886 /* Wait for 1ms for write to take effect */
887 mov32 r7, TEGRA_TMRUS_BASE
888 wait_for_us r1, r7, r9
890 wait_until r1, r7, r9
892 /* Program the auto_wake_lvl regsiters */
893 ldr r0, [r4, #PMC_AUTO_WAKE_LVL]
895 str r0, [r4, #PMC_AUTO_WAKE_LVL]
897 /* Wait for 1ms for write to take effect */
898 mov32 r7, TEGRA_TMRUS_BASE
899 wait_for_us r1, r7, r9
901 wait_until r1, r7, r9
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]
908 ldr r0, [r4, #PMC_CTRL2]
909 orr r0, r0, #PMC_CTRL2_WAKE_DET_EN
910 str r0, [r4, #PMC_CTRL2]
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]
919 * tegra148_lp1bb_clear_warmboot_flag
920 * Clears side effect bit in case it was set during
921 * suspend entry. Also clears Warmboot0 flag.
923 tegra148_lp1bb_clear_warmboot_flag:
924 ldr r0, [r4, #PMC_SCRATCH0]
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]
932 /* Based on value of lp_enter_state, update LP state
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
942 str r1, [r4, #PMC_LP_STATE_SCRATCH_REG]
945 /* tegra3_lp0_tear_down_core
947 * copied into and executed from IRAM
948 * puts memory in self-refresh for LP0 and LP1
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
959 bl tegra3_save_config
960 bl tegra3_sdram_self_refresh
965 bl tegra3_save_config
966 bl tegra3_sdram_self_refresh
968 str r1, [r5, #CLK_RESET_CLK_ENB_H_CLR]
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
982 ldr r0, [r4, #PMC_CTRL]
983 tst r0, #PMC_CTRL_SIDE_EFFECT_LP0
984 beq lp1_clocks_prepare
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]
993 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
994 ldr r1, [r4, #PMC_SCRATCH1_ECO]
996 str r1, [r4, #PMC_SCRATCH1_ECO]
999 #if defined(CONFIG_ARCH_TEGRA_14x_SOC)
1000 ldr r1, [r4, #PMC_POR_DPD_CTRL]
1002 str r1, [r4, #PMC_POR_DPD_CTRL]
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*/
1013 /* Reset(Set/Clr) the DVC-I2C Controller*/
1015 str r0, [r5, #CLK_RESET_CLK_RST_DEV_H_SET]
1018 wait_for_us r1, r7, r9
1021 wait_until r1, r7, r9
1024 str r0, [r5, #CLK_RESET_CLK_RST_DEV_H_CLR]
1026 /* Enable the DVC-I2C Controller */
1028 str r0, [r5, #CLK_RESET_CLK_ENB_H_SET]
1030 /* I2C transfer protocol:
1031 * 4 packets: Slaveaddr + WriteConfigure + Data1 + Data2 */
1032 ldr r0, lp1_register_pmuslave_addr
1035 ldr r1, lp1_register_i2c_base_addr
1036 str r0, [r1, #I2C_ADDR0]
1039 str r0, [r1, #I2C_CNFG]
1041 ldr r0, lp1_register_core_lowvolt
1042 str r0, [r1, #I2C_DATA1]
1045 str r0, [r1, #I2C_DATA2]
1047 /* Send I2C transaction */
1049 str r0, [r1, #I2C_CNFG]
1051 /* Check the transaction status before proceeding */
1052 wait_for_us r2, r7, r9
1053 mov32 r3, 0x7D0 /* Wait for 2ms for I2C transaction */
1055 loop_i2c_status_suspend:
1056 add r2, r2, #0xFA /* Check status every 250us */
1058 beq lp1_volt_skip /* Waited for 2ms, I2C transaction didn't take place */
1059 wait_until r2, r7, r9
1061 ldr r0, [r1, #I2C_STATUS]
1063 bne loop_i2c_status_suspend
1066 /* Disable the DVC-I2C Controller */
1068 str r0, [r5, #CLK_RESET_CLK_ENB_H_CLR]
1071 /* start by jumping to clkm to safely disable PLLs, then jump
1074 str r0, [r5, #CLK_RESET_SCLK_BURST]
1075 /* 2 us delay between changing sclk and cclk */
1076 wait_for_us r1, r7, r9
1078 wait_until r1, r7, r9
1080 str r0, [r5, #CLK_RESET_CCLK_BURST]
1082 str r0, [r5, #CLK_RESET_CCLK_DIVIDER]
1083 str r0, [r5, #CLK_RESET_SCLK_DIVIDER]
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]
1090 #if !defined(CONFIG_ARCH_TEGRA_3x_SOC)
1091 /* disable cl_dvfs logic clock (if dfll running, it's in open loop) */
1093 str r0, [r5, #CLK_RESET_CLK_ENB_W_CLR]
1095 /* 2 us delay between changing sclk and disabling PLLs */
1096 wait_for_us r1, r7, r9
1098 wait_until r1, r7, r9
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]
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
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
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
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]
1140 ldr r0, [r5, #CLK_RESET_PLLC_BASE]
1141 bic r0, r0, #(1<<30)
1142 str r0, [r5, #CLK_RESET_PLLC_BASE]
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)
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
1153 pll_iddq_entry r1, r5, CLK_RESET_PLLX_MISC3, CLK_RESET_PLLX_MISC3_IDDQ
1156 /* switch to CLKS */
1157 mov r0, #0 /* burst policy = 32KHz */
1158 str r0, [r5, #CLK_RESET_SCLK_BURST]
1162 * tegra3_enter_sleep
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
1174 str r1, [r4, #PMC_SCRATCH38]
1178 cpu_to_csr_reg r2, r1
1180 orr r0, r0, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG
1181 orr r0, r0, #FLOW_CTRL_CSR_ENABLE
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
1191 mov r0, #FLOW_CTRL_WAIT_FOR_INTERRUPT
1192 orr r0, r0, #FLOW_CTRL_HALT_CPU_IRQ | FLOW_CTRL_HALT_CPU_FIQ
1194 cpu_to_halt_reg r2, r1
1197 ldr r0, [r6, r2] /* memory barrier */
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.
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?
1208 mov32 r1, 0xC5ACCE55
1209 mcrge p14, 0, r1, c1, c3, 4 @ DBGOSDLR
1214 wfi /* CPU should be power gated here */
1216 /* !!!FIXME!!! Implement halt failure handler */
1220 * tegra3_sdram_self_refresh
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
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
1238 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
1239 adr r2, tegra11_sdram_pad_address
1240 adr r8, tegra11_sdram_pad_save
1245 ldr r0, [r2], #4 @ r0 is emc register address
1248 str r1, [r8], #4 @ save emc register
1257 tegra3_sdram_self_refresh:
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
1263 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
1264 mov32 r0, TEGRA_EMC0_BASE @ r0 reserved for emc base
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)
1276 str r1, [r0, #EMC_CFG] @ disable DYN_SELF_REF
1278 emc_timing_update r1, r0
1282 wait_until r1, r7, r2
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
1290 str r1, [r0, #EMC_REQ_CTRL] @ stall incoming DRAM requests
1293 ldr r1, [r0, #EMC_EMC_STATUS]
1298 str r1, [r0, #EMC_SELF_REF]
1300 emc_device_mask r1, r0
1303 ldr r2, [r0, #EMC_EMC_STATUS]
1306 bne emcself @ loop until DDR in self-refresh
1308 ldr r1, [r0, #EMC_XM2VTTGENPADCTRL]
1309 mov32 r2, 0xF8F8FFFF @ clear XM2VTTGEN_DRVUP and XM2VTTGEN_DRVDN
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
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
1320 str r1, [r0, #EMC_XM2VTTGENPADCTRL2]
1322 emc_timing_update r1, r0
1324 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
1325 mov32 r1, TEGRA_EMC1_BASE
1328 bne enter_self_refresh
1331 ldr r1, [r4, #PMC_CTRL]
1332 tst r1, #PMC_CTRL_SIDE_EFFECT_LP0
1334 mov32 r1, 0x8EC00000
1335 str r1, [r4, #PMC_IO_DPD_REQ]
1340 #if defined(CONFIG_ARCH_TEGRA_14x_SOC)
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.
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]
1353 /* dummy symbol for end of IRAM */
1354 .align L1_CACHE_SHIFT
1355 .globl tegra3_iram_end