81019945cbfcdf2e56cafacae808a499d41f23ed
[linux-3.10.git] / arch / arm / mach-tegra / sleep-t30.S
1 /*
2  * Copyright (c) 2012, 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
35 #define EMC_CFG                         0xc
36 #define EMC_ADR_CFG                     0x10
37 #define EMC_TIMING_CONTROL              0x28
38 #define EMC_REFRESH                     0x70
39 #define EMC_NOP                         0xdc
40 #define EMC_SELF_REF                    0xe0
41 #define EMC_MRW                         0xe8
42 #define EMC_REQ_CTRL                    0x2b0
43 #define EMC_EMC_STATUS                  0x2b4
44 #define EMC_FBIO_CFG5                   0x104
45 #define EMC_AUTO_CAL_CONFIG             0x2a4
46 #define EMC_AUTO_CAL_INTERVAL           0x2a8
47 #define EMC_AUTO_CAL_STATUS             0x2ac
48 #define EMC_CFG_DIG_DLL                 0x2bc
49 #define EMC_ZCAL_INTERVAL               0x2e0
50 #define EMC_ZQ_CAL                      0x2ec
51 #define EMC_XM2VTTGENPADCTRL            0x310
52 #define EMC_XM2VTTGENPADCTRL2           0x314
53
54 #define PMC_CTRL                        0x0
55 #define PMC_CTRL_SIDE_EFFECT_LP0        (1 << 14)  /* enter LP0 when CPU pwr gated */
56
57 #define PMC_PWRGATE_TOGGLE              0x30
58 #define PMC_REMOVE_CLAMPING_CMD         0x34
59 #define PMC_PWRGATE_STATUS              0x38
60
61 #define PMC_PWRGATE_PARTID_L2C          (0x5)
62
63 #define PMC_IO_DPD_REQ                  0x1b8
64 #define PMC_IO_DPD_STATUS               0x1bc
65
66 #define CLK_RESET_CCLK_BURST            0x20
67 #define CLK_RESET_CCLK_DIVIDER          0x24
68 #define CLK_RESET_SCLK_BURST            0x28
69 #define CLK_RESET_SCLK_DIVIDER          0x2c
70
71 #define CLK_RESET_PLLC_BASE             0x80
72 #define CLK_RESET_PLLM_BASE             0x90
73 #define CLK_RESET_PLLP_BASE             0xa0
74 #define CLK_RESET_PLLA_BASE             0xb0
75 #define CLK_RESET_PLLX_BASE             0xe0
76
77 #define CLK_RESET_PLLC_MISC             0x8c
78 #define CLK_RESET_PLLM_MISC             0x9c
79 #define CLK_RESET_PLLP_MISC             0xac
80 #define CLK_RESET_PLLA_MISC             0xbc
81 #define CLK_RESET_PLLX_MISC             0xe4
82
83 #define CLK_RESET_PLLP_OUTA             0xa4
84 #define CLK_RESET_PLLP_OUTB             0xa8
85
86 #define PMC_PLLP_WB0_OVERRIDE           0xf8
87 #define PMC_PLLM_WB0_OVERRIDE           0x1dc
88
89 #define CLK_RESET_CLK_SOURCE_MSELECT    0x3b4
90 #define CLK_RESET_CLK_ENB_H_SET         0x328
91 #define CLK_RESET_CLK_ENB_H_CLR         0x32c
92 #define CLK_RESET_CLK_RST_DEV_H_SET             0x308
93 #define CLK_RESET_CLK_RST_DEV_H_CLR             0x30c
94
95 #define I2C_CNFG        0x0
96 #define I2C_ADDR0       0x4
97 #define I2C_DATA1       0xc
98 #define I2C_DATA2       0x10
99 #define I2C_STATUS      0x1c
100
101 #define MSELECT_CLKM                    (0x3 << 30)
102
103 #if USE_PLL_LOCK_BITS
104 #define LOCK_DELAY              PLL_POST_LOCK_DELAY
105 #else
106 #define LOCK_DELAY              0xff /* 255uS delay for PLL stabilization */
107 #endif
108
109 #define USE_PLLP_ON_SLEEP_ENTRY 0
110
111 #define TEGRA30_POWER_HOTPLUG_SHUTDOWN  (1 << 27) /* Hotplug shutdown */
112
113 .macro emc_device_mask, rd, base
114         ldr     \rd, [\base, #EMC_ADR_CFG]
115         tst     \rd, #0x1
116         moveq   \rd, #(0x1<<8)          @ just 1 device
117         movne   \rd, #(0x3<<8)          @ 2 devices
118 .endm
119
120 .macro emc_timing_update, rd, base
121         mov     \rd, #1
122         str     \rd, [\base, #EMC_TIMING_CONTROL]
123 1001:
124         ldr     \rd, [\base, #EMC_EMC_STATUS]
125         tst     \rd, #(0x1<<23)         @ wait until EMC_STATUS_TIMING_UPDATE_STALLED is clear
126         bne     1001b
127 .endm
128
129 #if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_PM_SLEEP)
130 /*
131  * tegra30_hotplug_shutdown(void)
132  *
133  * Powergates the current CPU.
134  * Should never return.
135  */
136 ENTRY(tegra30_hotplug_shutdown)
137         mov     r6, lr
138         bl      tegra_cpu_exit_coherency
139
140         /* Powergate this CPU */
141         mov     r0, #TEGRA30_POWER_HOTPLUG_SHUTDOWN
142         bl      tegra30_cpu_shutdown
143         mov     pc, r6                  @ should never get here
144 ENDPROC(tegra30_hotplug_shutdown)
145
146 /*
147  * tegra30_cpu_shutdown(unsigned long flags)
148  *
149  * Puts the current CPU in wait-for-event mode on the flow controller
150  * and powergates it -- flags (in R0) indicate the request type.
151  * Must never be called for CPU 0.
152  *
153  * corrupts r0-r4, r12
154  */
155 ENTRY(tegra30_cpu_shutdown)
156         cpu_id  r3
157 #ifndef CONFIG_ARCH_TEGRA_HAS_SYMMETRIC_CPU_PWR_GATE
158         cmp     r3, #0
159         moveq   pc, lr          @ Must never be called for CPU 0
160 #endif
161
162         ldr     r12, =TEGRA_FLOW_CTRL_VIRT
163         cpu_to_csr_reg r1, r3
164         add     r1, r1, r12     @ virtual CSR address for this CPU
165         cpu_to_halt_reg r2, r3
166         add     r2, r2, r12     @ virtual HALT_EVENTS address for this CPU
167
168         /*
169          * Clear this CPU's "event" and "interrupt" flags and power gate
170          * it when halting but not before it is in the "WFE" state.
171          */
172         movw    r12, \
173                 FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG | \
174                 FLOW_CTRL_CSR_ENABLE
175 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
176         mov     r4, #(1 << 8)                   @ wfi bitmap
177 #else
178         mov     r4, #(1 << 4)                   @ wfe bitmap
179 #endif
180         orr     r12, r12, r4, lsl r3
181         str     r12, [r1]
182
183         /* Halt this CPU. */
184         mov     r3, #0x400
185 delay_1:
186         subs    r3, r3, #1                      @ delay as a part of wfe war.
187         bge     delay_1;
188         cpsid   a                               @ disable imprecise aborts.
189         ldr     r3, [r1]                        @ read CSR
190         str     r3, [r1]                        @ clear CSR
191         tst     r0, #TEGRA30_POWER_HOTPLUG_SHUTDOWN
192 #ifdef CONFIG_ARCH_TEGRA_HAS_SYMMETRIC_CPU_PWR_GATE
193         mov     r3, #FLOW_CTRL_WAITEVENT
194         orreq   r3, r3, #FLOW_CTRL_HALT_GIC_IRQ
195         orreq   r3, r3, #FLOW_CTRL_HALT_GIC_FIQ
196 #else
197         moveq   r3, #FLOW_CTRL_WAIT_FOR_INTERRUPT       @ For LP2
198         movne   r3, #FLOW_CTRL_WAITEVENT                @ For hotplug
199 #endif
200         str     r3, [r2]
201         ldr     r0, [r2]
202         b       wfe_war
203
204 __cpu_reset_again:
205         dsb
206         .align 5
207 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
208         wfi                                     @ CPU should be power gated here
209 #else
210         wfe                                     @ CPU should be power gated here
211 #endif
212 wfe_war:
213         b       __cpu_reset_again
214
215         /*
216          * 38 nop's, which fills reset of wfe cache line and
217          * 4 more cachelines with nop
218          */
219         .rept 38
220         nop
221         .endr
222         b       .                               @ should never get here
223
224 ENDPROC(tegra30_cpu_shutdown)
225 #endif
226
227 #ifdef CONFIG_PM_SLEEP
228 /*
229  * tegra3_sleep_core_finish(unsigned long int)
230  *
231  * enters suspend in LP0 or LP1 by turning off the mmu and jumping to
232  * tegra3_tear_down_core in IRAM
233  */
234 ENTRY(tegra3_sleep_core_finish)
235         bl      tegra_cpu_exit_coherency
236
237         /* preload all the address literals that are needed for the
238          * CPU power-gating process, to avoid loads from SDRAM (which are
239          * not supported once SDRAM is put into self-refresh.
240          * LP0 / LP1 use physical address, since the MMU needs to be
241          * disabled before putting SDRAM into self-refresh to avoid
242          * memory access due to page table walks */
243         mov32   r4, TEGRA_PMC_BASE
244         mov32   r5, TEGRA_CLK_RESET_BASE
245         mov32   r6, TEGRA_FLOW_CTRL_BASE
246         mov32   r7, TEGRA_TMRUS_BASE
247
248         mov32   r1, tegra3_tear_down_core
249         mov32   r2, tegra3_iram_start
250         sub     r1, r1, r2
251         mov32   r2, TEGRA_IRAM_CODE_AREA
252         add     r1, r1, r2
253         b       tegra_turn_off_mmu
254 ENDPROC(tegra3_sleep_core_finish)
255
256 /*
257  * tegra3_sleep_cpu_secondary_finish(unsigned long v2p)
258  *
259  * Enters LP2 on secondary CPU by exiting coherency and powergating the CPU.
260  */
261 ENTRY(tegra3_sleep_cpu_secondary_finish)
262         mov     r6, lr
263
264         dsb
265
266         /* Disable the data cache */
267         mrc     p15, 0, r2, c1, c0, 0
268         bic     r2, r2, #CR_C
269         dsb
270         mcr     p15, 0, r2, c1, c0, 0
271         isb
272
273 #ifdef MULTI_CACHE
274 #ifdef CONFIG_HAVE_ARM_SCU
275         mov32   r10, cpu_cache
276         mov     lr, pc
277         ldr     pc, [r10, #CACHE_FLUSH_KERN_ALL]
278 #else
279
280         cpu_id  r2
281         cpu_to_csr_reg  r1,     r2
282         mov32   r10, TEGRA_FLOW_CTRL_VIRT
283         ldr     r10, [r10, r1]
284         tst     r10, #FLOW_CTRL_CSR_ENABLE_EXT_MASK
285         beq     flush_l1
286         mov32   r10, cpu_cache
287         mov     lr, pc
288         ldr     pc, [r10, #CACHE_FLUSH_KERN_ALL]
289         b       no_l2_sync
290 flush_l1:
291         bl      tegra_flush_l1_cache
292 #endif
293 #else
294         bl      __cpuc_flush_kern_all
295 #endif
296
297 no_l2_sync:
298         bl      tegra_cpu_exit_coherency
299
300         /* Powergate this CPU. */
301         mov     r0, #0                          @ power mode flags (!hotplug)
302         bl      tegra30_cpu_shutdown
303         mov     r0, #1                          @ never return here
304         mov     pc, r6
305 ENDPROC(tegra3_sleep_cpu_secondary_finish)
306
307 /*
308  * tegra3_tear_down_cpu
309  *
310  * Switches the CPU cluster to PLL-P and enters sleep.
311  */
312 ENTRY(tegra3_tear_down_cpu)
313         mov32   r4, TEGRA_PMC_BASE
314         mov32   r5, TEGRA_CLK_RESET_BASE
315         mov32   r6, TEGRA_FLOW_CTRL_BASE
316         mov32   r7, TEGRA_TMRUS_BASE
317 #if USE_PLLP_ON_SLEEP_ENTRY
318         bl      tegra_cpu_pllp
319 #endif
320         b       tegra3_enter_sleep
321 ENDPROC(tegra3_tear_down_cpu)
322
323 /* START OF ROUTINES COPIED TO IRAM */
324         .align L1_CACHE_SHIFT
325         .globl tegra3_iram_start
326 tegra3_iram_start:
327
328 /*
329  * tegra3_lp1_reset
330  *
331  * reset vector for LP1 restore; copied into IRAM during suspend.
332  * brings the system back up to a safe starting point (SDRAM out of
333  * self-refresh, PLLC, PLLM and PLLP reenabled, CPU running on PLLP,
334  * system clock running on the same PLL that it suspended at), and
335  * jumps to tegra_lp2_startup to restore PLLX and virtual addressing.
336  * physical address of tegra_lp2_startup expected to be stored in
337  * PMC_SCRATCH41
338  *
339  * NOTE: THIS *MUST* BE RELOCATED TO TEGRA_IRAM_CODE_AREA AND MUST BE FIRST.
340  */
341 .macro pll_enable, rd, car, base, misc
342         ldr     \rd, [\car, #\base]
343         tst     \rd, #(1<<30)
344         orreq   \rd, \rd, #(1<<30)
345         streq   \rd, [\car, #\base]
346 #if USE_PLL_LOCK_BITS
347         ldr     \rd, [\car, #\misc]
348         orr     \rd, \rd, #(1<<18)
349         str     \rd, [\car, #\misc]
350 #endif
351 .endm
352
353 .macro pll_locked, rd, car, base
354 #if USE_PLL_LOCK_BITS
355 1:
356         ldr     \rd, [\car, #\base]
357         tst     \rd, #(1<<27)
358         beq     1b
359 #endif
360 .endm
361
362 ENTRY(tegra3_lp1_reset)
363         /* the CPU and system bus are running at 32KHz and executing from
364          * IRAM when this code is executed; immediately switch to CLKM and
365          * enable PLLP, PLLM, PLLC, PLLA and PLLX. */
366         mov32   r0, TEGRA_CLK_RESET_BASE
367 #ifndef CONFIG_TRUSTED_FOUNDATIONS
368         /* secure code handles 32KHz to CLKM/OSC clock switch */
369         mov     r1, #(1<<28)
370         str     r1, [r0, #CLK_RESET_SCLK_BURST]
371         str     r1, [r0, #CLK_RESET_CCLK_BURST]
372         mov     r1, #0
373         str     r1, [r0, #CLK_RESET_SCLK_DIVIDER]
374         str     r1, [r0, #CLK_RESET_CCLK_DIVIDER]
375 #endif
376         /* enable PLLM via PMC */
377         mov32   r2, TEGRA_PMC_BASE
378         ldr     r1, [r2, #PMC_PLLP_WB0_OVERRIDE]
379         orr     r1, r1, #(1<<12)
380         str     r1, [r2, #PMC_PLLP_WB0_OVERRIDE]
381
382         pll_enable r1, r0, CLK_RESET_PLLM_BASE, CLK_RESET_PLLM_MISC
383         pll_enable r1, r0, CLK_RESET_PLLP_BASE, CLK_RESET_PLLP_MISC
384         pll_enable r1, r0, CLK_RESET_PLLA_BASE, CLK_RESET_PLLA_MISC
385         pll_enable r1, r0, CLK_RESET_PLLC_BASE, CLK_RESET_PLLC_MISC
386         pll_enable r1, r0, CLK_RESET_PLLX_BASE, CLK_RESET_PLLX_MISC
387
388         pll_locked r1, r0, CLK_RESET_PLLM_BASE
389         pll_locked r1, r0, CLK_RESET_PLLP_BASE
390         pll_locked r1, r0, CLK_RESET_PLLA_BASE
391         pll_locked r1, r0, CLK_RESET_PLLC_BASE
392         pll_locked r1, r0, CLK_RESET_PLLX_BASE
393
394         mov32   r7, TEGRA_TMRUS_BASE
395         ldr     r1, [r7]
396         add     r1, r1, #LOCK_DELAY
397         wait_until r1, r7, r3
398
399         add     r5, pc, #tegra3_sdram_pad_save-(.+8)    @ r5 reserved for pad base
400
401         ldr     r4, [r5, #0x18]
402         str     r4, [r0, #CLK_RESET_CLK_SOURCE_MSELECT]
403
404         ldr     r4, [r5, #0x1C]
405         str     r4, [r0, #CLK_RESET_SCLK_BURST]
406
407         mov32   r4, ((1<<28) | (8))     @ burst policy is PLLX
408         str     r4, [r0, #CLK_RESET_CCLK_BURST]
409
410 #ifdef CONFIG_TEGRA_LP1_950
411 lp1_voltset:
412         /* Restore the Core voltage to high on LP1 resume */
413         /* Reset(Enable/Disable) the DVC-I2C Controller*/
414         mov r1, #(1 << 15)
415         str r1, [r0, #CLK_RESET_CLK_RST_DEV_H_SET]
416
417         /* Wait for 2us */
418         mov32   r7, TEGRA_TMRUS_BASE
419         wait_for_us r1, r7, r9
420         add r1, r1, #2
421         wait_until r1, r7, r9
422
423         mov r1, #(1 << 15)
424         str r1, [r0, #CLK_RESET_CLK_RST_DEV_H_CLR]
425
426         /* Enable the DVC-I2C Controller */
427         mov r1, #(1 << 15)
428         str r1, [r0, #CLK_RESET_CLK_ENB_H_SET]
429
430
431         /* Same I2C transaction protocol as suspend */
432         ldr r1, lp1_register_pmuslave_addr
433         cmp r1, #0
434         beq lp1_voltskip_resume
435
436         ldr r4, lp1_register_i2c_base_addr
437         str r1, [r4, #I2C_ADDR0]
438
439         mov32 r1, 0x2
440         str r1, [r4, #I2C_CNFG]
441
442         ldr r1, lp1_register_core_highvolt
443         str r1, [r4, #I2C_DATA1]
444
445         mov32 r1, 0
446         str r1, [r4, #I2C_DATA2]
447
448         mov32 r1, 0xA02
449         str r1, [r4, #I2C_CNFG]
450
451         wait_for_us r1, r7, r9
452         mov32 r3, 0x7D0   /* Wait for 2ms and try transaction again */
453         add r0, r1, r3
454 loop_i2c_status_resume:
455         add r1, r1, #0xFA /* Check status every 250us */
456         wait_until r1, r7, r9
457         cmp r0, r1
458         beq lp1_voltset
459
460         ldr r3, [r4, #I2C_STATUS]
461         cmp r3, #0
462         bne loop_i2c_status_resume
463
464 lp1_voltskip_resume:
465         /* Disable the DVC-I2C Controller */
466         mov r0, #(1 << 15)
467         str r0, [r5, #CLK_RESET_CLK_ENB_H_CLR]
468 #endif
469
470 #if defined (CONFIG_CACHE_L2X0)
471         /* power up L2 */
472         ldr     r0, [r2, #PMC_PWRGATE_STATUS]
473         tst     r0, #(1<<PMC_PWRGATE_PARTID_L2C)
474         bne     powerup_l2_done
475         movw    r0, #(1<<8) | PMC_PWRGATE_PARTID_L2C
476         str     r0, [r2, #PMC_PWRGATE_TOGGLE]
477 powerup_l2_wait:
478         ldr     r0, [r2, #PMC_PWRGATE_STATUS]
479         tst     r0, #(1<<PMC_PWRGATE_PARTID_L2C)
480         beq     powerup_l2_wait
481 powerup_l2_done:
482         mov     r0, #PMC_PWRGATE_PARTID_L2C
483         str     r0, [r2, #PMC_REMOVE_CLAMPING_CMD]
484 #endif
485
486         mov32   r0, TEGRA_EMC_BASE                      @ r0 reserved for emc base
487
488         ldr     r1, [r5, #0x14] @ PMC_IO_DPD_STATUS
489         mvn     r1, r1
490         bic     r1, r1, #(0x1<<31)
491         orr     r1, r1, #(0x1<<30)
492         str     r1, [r2, #PMC_IO_DPD_REQ]
493         ldr     r1, [r5, #0xC]
494         str     r1, [r0, #EMC_XM2VTTGENPADCTRL]
495         ldr     r1, [r5, #0x10]
496         str     r1, [r0, #EMC_XM2VTTGENPADCTRL2]
497         ldr     r1, [r5, #0x8]
498         str     r1, [r0, #EMC_AUTO_CAL_INTERVAL]
499
500         ldr     r1, [r0, #EMC_CFG_DIG_DLL]
501         orr     r1, r1, #(0x1<<30)              @ set DLL_RESET
502         str     r1, [r0, #EMC_CFG_DIG_DLL]
503
504         emc_timing_update r1, r0
505
506         ldr     r1, [r0, #EMC_AUTO_CAL_CONFIG]
507         orr     r1, r1, #(0x1<<31)              @ set AUTO_CAL_ACTIVE
508         str     r1, [r0, #EMC_AUTO_CAL_CONFIG]
509
510 emc_wait_audo_cal_onetime:
511         ldr     r1, [r0, #EMC_AUTO_CAL_STATUS]
512         tst     r1, #(0x1<<31)          @ wait until AUTO_CAL_ACTIVE is clear
513         bne     emc_wait_audo_cal_onetime
514
515         ldr     r1, [r0, #EMC_CFG]
516         bic     r1, r1, #(1<<31)        @ disable DRAM_CLK_STOP
517         str     r1, [r0, #EMC_CFG]
518
519         mov     r1, #0
520         str     r1, [r0, #EMC_SELF_REF] @ take DRAM out of self refresh
521         mov     r1, #1
522         str     r1, [r0, #EMC_NOP]
523         str     r1, [r0, #EMC_NOP]
524         str     r1, [r0, #EMC_REFRESH]
525
526         emc_device_mask r1, r0
527
528 exit_selfrefresh_loop:
529         ldr     r2, [r0, #EMC_EMC_STATUS]
530         ands    r2, r2, r1
531         bne     exit_selfrefresh_loop
532
533         lsr     r1, r1, #8              @ devSel, bit0:dev0 bit1:dev1
534
535         mov32   r7, TEGRA_TMRUS_BASE
536         ldr     r2, [r0, #EMC_FBIO_CFG5]
537
538         and     r2, r2, #3
539         cmp     r2, #2
540         beq     emc_lpddr2
541
542         mov32   r2, 0x80000011
543         str     r2, [r0, #EMC_ZQ_CAL]
544         ldr     r2, [r7]
545         add     r2, r2, #10
546         wait_until r2, r7, r3
547
548         tst     r1, #2
549         beq zcal_done
550
551         mov32   r2, 0x40000011
552         str     r2, [r0, #EMC_ZQ_CAL]
553         ldr     r2, [r7]
554         add     r2, r2, #10
555         wait_until r2, r7, r3
556         b zcal_done
557
558 emc_lpddr2:
559
560         mov32   r2, 0x800A00AB
561         str     r2, [r0, #EMC_MRW]
562         ldr     r2, [r7]
563         add     r2, r2, #1
564         wait_until r2, r7, r3
565
566         tst     r1, #2
567         beq zcal_done
568
569         mov32   r2, 0x400A00AB
570         str     r2, [r0, #EMC_MRW]
571         ldr     r2, [r7]
572         add     r2, r2, #1
573         wait_until r2, r7, r3
574
575 zcal_done:
576
577         mov     r1, #0
578         str     r1, [r0, #EMC_REQ_CTRL]
579         ldr     r1, [r5, #0x4]
580         str     r1, [r0, #EMC_ZCAL_INTERVAL]
581         ldr     r1, [r5, #0x0]
582         str     r1, [r0, #EMC_CFG]
583
584         mov32   r0, TEGRA_PMC_BASE
585         ldr     r0, [r0, #PMC_SCRATCH41]
586         mov     pc, r0
587 ENDPROC(tegra3_lp1_reset)
588
589         .align  L1_CACHE_SHIFT
590         .type   tegra3_sdram_pad_save, %object
591 tegra3_sdram_pad_save:
592         .word   0
593         .word   0
594         .word   0
595         .word   0
596         .word   0
597         .word   0
598         .word   0
599         .word   0
600
601 tegra3_sdram_pad_address:
602         .word   TEGRA_EMC_BASE + EMC_CFG                                @0x0
603         .word   TEGRA_EMC_BASE + EMC_ZCAL_INTERVAL                      @0x4
604         .word   TEGRA_EMC_BASE + EMC_AUTO_CAL_INTERVAL                  @0x8
605         .word   TEGRA_EMC_BASE + EMC_XM2VTTGENPADCTRL                   @0xc
606         .word   TEGRA_EMC_BASE + EMC_XM2VTTGENPADCTRL2                  @0x10
607         .word   TEGRA_PMC_BASE + PMC_IO_DPD_STATUS                      @0x14
608         .word   TEGRA_CLK_RESET_BASE + CLK_RESET_CLK_SOURCE_MSELECT     @0x18
609         .word   TEGRA_CLK_RESET_BASE + CLK_RESET_SCLK_BURST             @0x1c
610
611 tegra3_sdram_pad_size:
612         .word   tegra3_sdram_pad_address - tegra3_sdram_pad_save
613
614 #ifdef CONFIG_TEGRA_LP1_950
615         .globl lp1_register_pmuslave_addr
616         .globl lp1_register_i2c_base_addr
617         .globl lp1_register_core_lowvolt
618         .globl lp1_register_core_highvolt
619 lp1_register_pmuslave_addr:
620         .word   0
621 lp1_register_i2c_base_addr:
622         .word   0
623 lp1_register_core_lowvolt:
624         .word   0
625 lp1_register_core_highvolt:
626         .word   0
627 #endif
628
629 /*
630  * tegra3_tear_down_core
631  *
632  * copied into and executed from IRAM
633  * puts memory in self-refresh for LP0 and LP1
634  */
635 tegra3_tear_down_core:
636         bl      tegra3_sdram_self_refresh
637         bl      tegra3_cpu_clk32k
638         b       tegra3_enter_sleep
639
640 /*
641  * tegra3_cpu_clk32k
642  *
643  * In LP0 and LP1 all plls will be turned off.  Switch the CPU and system clock
644  * to the 32khz clock (clks)
645  * r4 = TEGRA_PMC_BASE
646  * r5 = TEGRA_CLK_RESET_BASE
647  * r6 = TEGRA_FLOW_CTRL_BASE
648  * r7 = TEGRA_TMRUS_BASE
649  */
650 tegra3_cpu_clk32k:
651         ldr     r0, [r4, #PMC_CTRL]
652         tst     r0, #PMC_CTRL_SIDE_EFFECT_LP0
653         beq     lp1_clocks_prepare
654
655         /* enable PLLM auto-restart via PMC in LP0; restore override settings */
656         ldr     r0, [r4, #PMC_PLLP_WB0_OVERRIDE]
657         orr     r0, r0, #((1 << 12) | (1 << 11))
658         str     r0, [r4, #PMC_PLLP_WB0_OVERRIDE]
659         ldr     r0, [r4, #PMC_SCRATCH2]
660         str     r0, [r4, #PMC_PLLM_WB0_OVERRIDE]
661         mov     pc, lr
662
663 lp1_clocks_prepare:
664         /* Prepare to set the Core to the lowest voltage if supported.
665          * Start by setting the I2C clocks to make the I2C transfer */
666 #ifdef CONFIG_TEGRA_LP1_950
667         /* Set up the PWR I2C GPIOs with the right masks*/
668
669         /* Reset(Set/Clr) the DVC-I2C Controller*/
670         mov r0, #(1 << 15)
671         str r0, [r5, #CLK_RESET_CLK_RST_DEV_H_SET]
672
673         /* Wait for 2us */
674         wait_for_us r1, r7, r9
675         mov32 r0, 0x7D0
676         add r1, r1, r0
677         wait_until r1, r7, r9
678
679         mov r0, #(1 << 15)
680         str r0, [r5, #CLK_RESET_CLK_RST_DEV_H_CLR]
681
682         /* Enable the DVC-I2C Controller */
683         mov r0, #(1 << 15)
684         str r0, [r5, #CLK_RESET_CLK_ENB_H_SET]
685
686         /* I2C transfer protocol:
687          * 4 packets: Slaveaddr + WriteConfigure + Data1 + Data2 */
688         ldr r0, lp1_register_pmuslave_addr
689         cmp r0, #0
690         beq lp1_volt_skip
691         ldr r1, lp1_register_i2c_base_addr
692         str r0, [r1, #I2C_ADDR0]
693
694         mov32 r0, 0x2
695         str r0, [r1, #I2C_CNFG]
696
697         ldr r0, lp1_register_core_lowvolt
698         str r0, [r1, #I2C_DATA1]
699
700         mov32 r0, 0
701         str r0, [r1, #I2C_DATA2]
702
703         /* Send I2C transaction */
704         mov32 r0, 0xA02
705         str r0, [r1, #I2C_CNFG]
706
707         /* Check the transaction status before proceeding */
708         wait_for_us r2, r7, r9
709         mov32 r3, 0x7D0 /* Wait for 2ms for I2C transaction */
710         add r3, r2, r3
711 loop_i2c_status_suspend:
712         add r2, r2, #0xFA /* Check status every 250us */
713         cmp r3, r2
714         beq lp1_volt_skip  /* Waited for 2ms, I2C transaction didn't take place */
715         wait_until r2, r7, r9
716
717         ldr r0, [r1, #I2C_STATUS]
718         cmp r0, #0
719         bne loop_i2c_status_suspend
720 lp1_volt_skip:
721
722         /* Disable the DVC-I2C Controller */
723         mov r0, #(1 << 15)
724         str r0, [r5, #CLK_RESET_CLK_ENB_H_CLR]
725
726 #endif
727         /* start by jumping to clkm to safely disable PLLs, then jump
728          * to clks */
729         mov     r0, #(1 << 28)
730         str     r0, [r5, #CLK_RESET_SCLK_BURST]
731         str     r0, [r5, #CLK_RESET_CCLK_BURST]
732         mov     r0, #0
733         str     r0, [r5, #CLK_RESET_CCLK_DIVIDER]
734         str     r0, [r5, #CLK_RESET_SCLK_DIVIDER]
735
736         /* switch the clock source for mselect to be CLK_M */
737         ldr     r0, [r5, #CLK_RESET_CLK_SOURCE_MSELECT]
738         orr     r0, r0, #MSELECT_CLKM
739         str     r0, [r5, #CLK_RESET_CLK_SOURCE_MSELECT]
740
741         /* 2 us delay between changing sclk and disabling PLLs */
742         wait_for_us r1, r7, r9
743         add     r1, r1, #2
744         wait_until r1, r7, r9
745
746         /* switch to CLKS */
747         mov     r0, #0  /* burst policy = 32KHz */
748         str     r0, [r5, #CLK_RESET_SCLK_BURST]
749
750         /* disable PLLM via PMC in LP1 */
751         ldr     r0, [r4, #PMC_PLLP_WB0_OVERRIDE]
752         bic     r0, r0, #(1 << 12)
753         str     r0, [r4, #PMC_PLLP_WB0_OVERRIDE]
754         b       powerdown_pll_pcx
755
756 powerdown_pll_pcx:
757         ldr     r11, [r4, #PMC_SCRATCH37]       @ load the LP1 flags
758         tst     r11, #TEGRA_POWER_LP1_AUDIO     @ check if voice call is going on
759         bne     powerdown_pll_cx                @ if yes, do not turn off pll-p/pll-a
760
761         ldr     r0, [r5, #CLK_RESET_PLLP_BASE]
762         bic     r0, r0, #(1<<30)
763         str     r0, [r5, #CLK_RESET_PLLP_BASE]
764         ldr     r0, [r5, #CLK_RESET_PLLA_BASE]
765         bic     r0, r0, #(1<<30)
766         str     r0, [r5, #CLK_RESET_PLLA_BASE]
767
768 powerdown_pll_cx:
769         ldr     r0, [r5, #CLK_RESET_PLLC_BASE]
770         bic     r0, r0, #(1<<30)
771         str     r0, [r5, #CLK_RESET_PLLC_BASE]
772         ldr     r0, [r5, #CLK_RESET_PLLX_BASE]
773         bic     r0, r0, #(1<<30)
774         str     r0, [r5, #CLK_RESET_PLLX_BASE]
775
776         mov     pc, lr
777
778 /*
779  * tegra3_enter_sleep
780  *
781  * uses flow controller to enter sleep state
782  * executes from IRAM with SDRAM in selfrefresh when target state is LP0 or LP1
783  * executes from SDRAM with target state is LP2
784  * r4 = TEGRA_PMC_BASE
785  * r5 = TEGRA_CLK_RESET_BASE
786  * r6 = TEGRA_FLOW_CTRL_BASE
787  * r7 = TEGRA_TMRUS_BASE
788  */
789 tegra3_enter_sleep:
790         ldr     r1, [r7]
791         str     r1, [r4, #PMC_SCRATCH38]
792         dsb
793         cpu_id  r1
794
795         cpu_to_csr_reg  r2, r1
796         ldr     r0, [r6, r2]
797         orr     r0, r0, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG
798         orr     r0, r0, #FLOW_CTRL_CSR_ENABLE
799         str     r0, [r6, r2]
800
801 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
802         tst     r0, #FLOW_CTRL_IMMEDIATE_WAKE
803         movne   r0, #FLOW_CTRL_WAITEVENT
804         moveq   r0, #FLOW_CTRL_WAIT_FOR_INTERRUPT
805         orr     r0, r0, #FLOW_CTRL_HALT_LIC_IRQ | FLOW_CTRL_HALT_LIC_FIQ
806 #else
807         mov     r0, #FLOW_CTRL_WAIT_FOR_INTERRUPT
808         orr     r0, r0, #FLOW_CTRL_HALT_CPU_IRQ | FLOW_CTRL_HALT_CPU_FIQ
809 #endif
810         cpu_to_halt_reg r2, r1
811         str     r0, [r6, r2]
812         dsb
813         ldr     r0, [r6, r2] /* memory barrier */
814
815 #ifndef CONFIG_ARM_SAVE_DEBUG_CONTEXT_NO_LOCK
816         /* Set the Debug OS Double Lock for Debug Arch v7.1 or greater.
817            With this lock set, the debugger is completely locked out.
818            Disable this to debug WFI/powergating failures.
819         */
820         mrc     p15, 0, r3, c0, c1, 2   @ ID_DFR0
821         and     r3, r3, #0xF            @ coprocessor debug model
822         cmp     r3, #5                  @ debug arch >= v7.1?
823
824         mov32   r1, 0xC5ACCE55
825         mcrge   p14, 0, r1, c1, c3, 4   @ DBGOSDLR
826 #endif
827 halted:
828         isb
829         dsb
830         wfi     /* CPU should be power gated here */
831
832         /* !!!FIXME!!! Implement halt failure handler */
833         b       halted
834
835 /*
836  * tegra3_sdram_self_refresh
837  *
838  * called with MMU off and caches disabled
839  * puts sdram in self refresh
840  * must execute from IRAM
841  * r4 = TEGRA_PMC_BASE
842  * r5 = TEGRA_CLK_RESET_BASE
843  * r6 = TEGRA_FLOW_CTRL_BASE
844  * r7 = TEGRA_TMRUS_BASE
845  */
846
847 tegra3_sdram_self_refresh:
848
849         adr     r2, tegra3_sdram_pad_address
850         adr     r8, tegra3_sdram_pad_save
851         mov     r9, #0
852
853 padsave:
854         ldr     r0, [r2, r9]                    @ r0 is emc register address
855
856         ldr     r1, [r0]
857         str     r1, [r8, r9]                    @ save emc register
858
859         add     r9, r9, #4
860         ldr     r0, tegra3_sdram_pad_size
861         cmp     r0, r9
862         bne     padsave
863 padsave_done:
864
865         dsb
866
867         mov32   r0, TEGRA_EMC_BASE                      @ r0 reserved for emc base
868
869         mov     r1, #0
870         str     r1, [r0, #EMC_ZCAL_INTERVAL]
871         str     r1, [r0, #EMC_AUTO_CAL_INTERVAL]
872         ldr     r1, [r0, #EMC_CFG]
873         bic     r1, r1, #(1<<28)
874         str     r1, [r0, #EMC_CFG]              @ disable DYN_SELF_REF
875
876         emc_timing_update r1, r0
877
878         ldr     r1, [r7]
879         add     r1, r1, #5
880         wait_until r1, r7, r2
881
882 emc_wait_audo_cal:
883         ldr     r1, [r0, #EMC_AUTO_CAL_STATUS]
884         tst     r1, #(0x1<<31)          @ wait until AUTO_CAL_ACTIVE is clear
885         bne     emc_wait_audo_cal
886
887         mov     r1, #3
888         str     r1, [r0, #EMC_REQ_CTRL]         @ stall incoming DRAM requests
889
890 emcidle:
891         ldr     r1, [r0, #EMC_EMC_STATUS]
892         tst     r1, #4
893         beq     emcidle
894
895         mov     r1, #1
896         str     r1, [r0, #EMC_SELF_REF]
897
898         emc_device_mask r1, r0
899
900 emcself:
901         ldr     r2, [r0, #EMC_EMC_STATUS]
902         and     r2, r2, r1
903         cmp     r2, r1
904         bne     emcself                         @ loop until DDR in self-refresh
905
906         ldr     r1, [r0, #EMC_XM2VTTGENPADCTRL]
907         mov32   r2, 0xF8F8FFFF          @ clear XM2VTTGEN_DRVUP and XM2VTTGEN_DRVDN
908         and     r1, r1, r2
909         str     r1, [r0, #EMC_XM2VTTGENPADCTRL]
910         ldr     r1, [r0, #EMC_XM2VTTGENPADCTRL2]
911         orr     r1, r1, #7                      @ set E_NO_VTTGEN
912         str     r1, [r0, #EMC_XM2VTTGENPADCTRL2]
913
914         emc_timing_update r1, r0
915
916         ldr     r1, [r4, #PMC_CTRL]
917         tst     r1, #PMC_CTRL_SIDE_EFFECT_LP0
918         bne     pmc_io_dpd_skip
919         mov32   r1, 0x8EC00000
920         str     r1, [r4, #PMC_IO_DPD_REQ]
921 pmc_io_dpd_skip:
922
923         dsb
924
925         mov     pc, lr
926
927         .ltorg
928 /* dummy symbol for end of IRAM */
929         .align L1_CACHE_SHIFT
930         .globl tegra3_iram_end
931 tegra3_iram_end:
932         b       .
933 #endif