arm: tegra: Set Core to 0.95V in LP1
[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 #ifdef MULTI_CACHE
266 #ifdef CONFIG_HAVE_ARM_SCU
267         mov32   r10, cpu_cache
268         mov     lr, pc
269         ldr     pc, [r10, #CACHE_FLUSH_KERN_ALL]
270 #else
271         /* Disable the data cache */
272         mrc     p15, 0, r2, c1, c0, 0
273         bic     r2, r2, #CR_C
274         dsb
275         mcr     p15, 0, r2, c1, c0, 0
276         isb
277
278         cpu_id  r2
279         cpu_to_csr_reg  r1,     r2
280         mov32   r10, TEGRA_FLOW_CTRL_VIRT
281         ldr     r10, [r10, r1]
282         tst     r10, #FLOW_CTRL_CSR_ENABLE_EXT_MASK
283         beq     flush_l1
284         mov32   r10, cpu_cache
285         mov     lr, pc
286         ldr     pc, [r10, #CACHE_FLUSH_KERN_ALL]
287         b       no_l2_sync
288 flush_l1:
289         bl      tegra_flush_l1_cache
290 #endif
291 #else
292         bl      __cpuc_flush_kern_all
293 #endif
294
295 no_l2_sync:
296         bl      tegra_cpu_exit_coherency
297
298         /* Powergate this CPU. */
299         mov     r0, #0                          @ power mode flags (!hotplug)
300         bl      tegra30_cpu_shutdown
301         mov     r0, #1                          @ never return here
302         mov     pc, r6
303 ENDPROC(tegra3_sleep_cpu_secondary_finish)
304
305 /*
306  * tegra3_tear_down_cpu
307  *
308  * Switches the CPU cluster to PLL-P and enters sleep.
309  */
310 ENTRY(tegra3_tear_down_cpu)
311         mov32   r4, TEGRA_PMC_BASE
312         mov32   r5, TEGRA_CLK_RESET_BASE
313         mov32   r6, TEGRA_FLOW_CTRL_BASE
314         mov32   r7, TEGRA_TMRUS_BASE
315 #if USE_PLLP_ON_SLEEP_ENTRY
316         bl      tegra_cpu_pllp
317 #endif
318         b       tegra3_enter_sleep
319 ENDPROC(tegra3_tear_down_cpu)
320
321 /* START OF ROUTINES COPIED TO IRAM */
322         .align L1_CACHE_SHIFT
323         .globl tegra3_iram_start
324 tegra3_iram_start:
325
326 /*
327  * tegra3_lp1_reset
328  *
329  * reset vector for LP1 restore; copied into IRAM during suspend.
330  * brings the system back up to a safe starting point (SDRAM out of
331  * self-refresh, PLLC, PLLM and PLLP reenabled, CPU running on PLLP,
332  * system clock running on the same PLL that it suspended at), and
333  * jumps to tegra_lp2_startup to restore PLLX and virtual addressing.
334  * physical address of tegra_lp2_startup expected to be stored in
335  * PMC_SCRATCH41
336  *
337  * NOTE: THIS *MUST* BE RELOCATED TO TEGRA_IRAM_CODE_AREA AND MUST BE FIRST.
338  */
339 .macro pll_enable, rd, car, base, misc
340         ldr     \rd, [\car, #\base]
341         tst     \rd, #(1<<30)
342         orreq   \rd, \rd, #(1<<30)
343         streq   \rd, [\car, #\base]
344 #if USE_PLL_LOCK_BITS
345         ldr     \rd, [\car, #\misc]
346         orr     \rd, \rd, #(1<<18)
347         str     \rd, [\car, #\misc]
348 #endif
349 .endm
350
351 .macro pll_locked, rd, car, base
352 #if USE_PLL_LOCK_BITS
353 1:
354         ldr     \rd, [\car, #\base]
355         tst     \rd, #(1<<27)
356         beq     1b
357 #endif
358 .endm
359
360 ENTRY(tegra3_lp1_reset)
361         /* the CPU and system bus are running at 32KHz and executing from
362          * IRAM when this code is executed; immediately switch to CLKM and
363          * enable PLLP, PLLM, PLLC, PLLA and PLLX. */
364         mov32   r0, TEGRA_CLK_RESET_BASE
365 #ifndef CONFIG_TRUSTED_FOUNDATIONS
366         /* secure code handles 32KHz to CLKM/OSC clock switch */
367         mov     r1, #(1<<28)
368         str     r1, [r0, #CLK_RESET_SCLK_BURST]
369         str     r1, [r0, #CLK_RESET_CCLK_BURST]
370         mov     r1, #0
371         str     r1, [r0, #CLK_RESET_SCLK_DIVIDER]
372         str     r1, [r0, #CLK_RESET_CCLK_DIVIDER]
373 #endif
374         /* enable PLLM via PMC */
375         mov32   r2, TEGRA_PMC_BASE
376         ldr     r1, [r2, #PMC_PLLP_WB0_OVERRIDE]
377         orr     r1, r1, #(1<<12)
378         str     r1, [r2, #PMC_PLLP_WB0_OVERRIDE]
379
380         pll_enable r1, r0, CLK_RESET_PLLM_BASE, CLK_RESET_PLLM_MISC
381         pll_enable r1, r0, CLK_RESET_PLLP_BASE, CLK_RESET_PLLP_MISC
382         pll_enable r1, r0, CLK_RESET_PLLA_BASE, CLK_RESET_PLLA_MISC
383         pll_enable r1, r0, CLK_RESET_PLLC_BASE, CLK_RESET_PLLC_MISC
384         pll_enable r1, r0, CLK_RESET_PLLX_BASE, CLK_RESET_PLLX_MISC
385
386         pll_locked r1, r0, CLK_RESET_PLLM_BASE
387         pll_locked r1, r0, CLK_RESET_PLLP_BASE
388         pll_locked r1, r0, CLK_RESET_PLLA_BASE
389         pll_locked r1, r0, CLK_RESET_PLLC_BASE
390         pll_locked r1, r0, CLK_RESET_PLLX_BASE
391
392         mov32   r7, TEGRA_TMRUS_BASE
393         ldr     r1, [r7]
394         add     r1, r1, #LOCK_DELAY
395         wait_until r1, r7, r3
396
397         add     r5, pc, #tegra3_sdram_pad_save-(.+8)    @ r5 reserved for pad base
398
399         ldr     r4, [r5, #0x18]
400         str     r4, [r0, #CLK_RESET_CLK_SOURCE_MSELECT]
401
402         ldr     r4, [r5, #0x1C]
403         str     r4, [r0, #CLK_RESET_SCLK_BURST]
404
405         mov32   r4, ((1<<28) | (8))     @ burst policy is PLLX
406         str     r4, [r0, #CLK_RESET_CCLK_BURST]
407
408 #ifdef CONFIG_TEGRA_LP1_950
409 lp1_voltset:
410         /* Restore the Core voltage to high on LP1 resume */
411         /* Reset(Enable/Disable) the DVC-I2C Controller*/
412         mov r1, #(1 << 15)
413         str r1, [r0, #CLK_RESET_CLK_RST_DEV_H_SET]
414
415         /* Wait for 2us */
416         mov32   r7, TEGRA_TMRUS_BASE
417         wait_for_us r1, r7, r9
418         add r1, r1, #2
419         wait_until r1, r7, r9
420
421         mov r1, #(1 << 15)
422         str r1, [r0, #CLK_RESET_CLK_RST_DEV_H_CLR]
423
424         /* Enable the DVC-I2C Controller */
425         mov r1, #(1 << 15)
426         str r1, [r0, #CLK_RESET_CLK_ENB_H_SET]
427
428
429         /* Same I2C transaction protocol as suspend */
430         ldr r1, lp1_register_pmuslave_addr
431         cmp r1, #0
432         beq lp1_voltskip_resume
433
434         ldr r4, lp1_register_i2c_base_addr
435         str r1, [r4, #I2C_ADDR0]
436
437         mov32 r1, 0x2
438         str r1, [r4, #I2C_CNFG]
439
440         ldr r1, lp1_register_core_highvolt
441         str r1, [r4, #I2C_DATA1]
442
443         mov32 r1, 0
444         str r1, [r4, #I2C_DATA2]
445
446         mov32 r1, 0xA02
447         str r1, [r4, #I2C_CNFG]
448
449         wait_for_us r1, r7, r9
450         mov32 r3, 0x7D0   /* Wait for 2ms and try transaction again */
451         add r0, r1, r3
452 loop_i2c_status_resume:
453         add r1, r1, #0xFA /* Check status every 250us */
454         wait_until r1, r7, r9
455         cmp r0, r1
456         beq lp1_voltset
457
458         ldr r3, [r4, #I2C_STATUS]
459         cmp r3, #0
460         bne loop_i2c_status_resume
461
462 lp1_voltskip_resume:
463         /* Disable the DVC-I2C Controller */
464         mov r0, #(1 << 15)
465         str r0, [r5, #CLK_RESET_CLK_ENB_H_CLR]
466 #endif
467
468 #if defined (CONFIG_CACHE_L2X0)
469         /* power up L2 */
470         ldr     r0, [r2, #PMC_PWRGATE_STATUS]
471         tst     r0, #(1<<PMC_PWRGATE_PARTID_L2C)
472         bne     powerup_l2_done
473         movw    r0, #(1<<8) | PMC_PWRGATE_PARTID_L2C
474         str     r0, [r2, #PMC_PWRGATE_TOGGLE]
475 powerup_l2_wait:
476         ldr     r0, [r2, #PMC_PWRGATE_STATUS]
477         tst     r0, #(1<<PMC_PWRGATE_PARTID_L2C)
478         beq     powerup_l2_wait
479 powerup_l2_done:
480         mov     r0, #PMC_PWRGATE_PARTID_L2C
481         str     r0, [r2, #PMC_REMOVE_CLAMPING_CMD]
482 #endif
483
484         mov32   r0, TEGRA_EMC_BASE                      @ r0 reserved for emc base
485
486         ldr     r1, [r5, #0x14] @ PMC_IO_DPD_STATUS
487         mvn     r1, r1
488         bic     r1, r1, #(0x1<<31)
489         orr     r1, r1, #(0x1<<30)
490         str     r1, [r2, #PMC_IO_DPD_REQ]
491         ldr     r1, [r5, #0xC]
492         str     r1, [r0, #EMC_XM2VTTGENPADCTRL]
493         ldr     r1, [r5, #0x10]
494         str     r1, [r0, #EMC_XM2VTTGENPADCTRL2]
495         ldr     r1, [r5, #0x8]
496         str     r1, [r0, #EMC_AUTO_CAL_INTERVAL]
497
498         ldr     r1, [r0, #EMC_CFG_DIG_DLL]
499         orr     r1, r1, #(0x1<<30)              @ set DLL_RESET
500         str     r1, [r0, #EMC_CFG_DIG_DLL]
501
502         emc_timing_update r1, r0
503
504         ldr     r1, [r0, #EMC_AUTO_CAL_CONFIG]
505         orr     r1, r1, #(0x1<<31)              @ set AUTO_CAL_ACTIVE
506         str     r1, [r0, #EMC_AUTO_CAL_CONFIG]
507
508 emc_wait_audo_cal_onetime:
509         ldr     r1, [r0, #EMC_AUTO_CAL_STATUS]
510         tst     r1, #(0x1<<31)          @ wait until AUTO_CAL_ACTIVE is clear
511         bne     emc_wait_audo_cal_onetime
512
513         ldr     r1, [r0, #EMC_CFG]
514         bic     r1, r1, #(1<<31)        @ disable DRAM_CLK_STOP
515         str     r1, [r0, #EMC_CFG]
516
517         mov     r1, #0
518         str     r1, [r0, #EMC_SELF_REF] @ take DRAM out of self refresh
519         mov     r1, #1
520         str     r1, [r0, #EMC_NOP]
521         str     r1, [r0, #EMC_NOP]
522         str     r1, [r0, #EMC_REFRESH]
523
524         emc_device_mask r1, r0
525
526 exit_selfrefresh_loop:
527         ldr     r2, [r0, #EMC_EMC_STATUS]
528         ands    r2, r2, r1
529         bne     exit_selfrefresh_loop
530
531         lsr     r1, r1, #8              @ devSel, bit0:dev0 bit1:dev1
532
533         mov32   r7, TEGRA_TMRUS_BASE
534         ldr     r2, [r0, #EMC_FBIO_CFG5]
535
536         and     r2, r2, #3
537         cmp     r2, #2
538         beq     emc_lpddr2
539
540         mov32   r2, 0x80000011
541         str     r2, [r0, #EMC_ZQ_CAL]
542         ldr     r2, [r7]
543         add     r2, r2, #10
544         wait_until r2, r7, r3
545
546         tst     r1, #2
547         beq zcal_done
548
549         mov32   r2, 0x40000011
550         str     r2, [r0, #EMC_ZQ_CAL]
551         ldr     r2, [r7]
552         add     r2, r2, #10
553         wait_until r2, r7, r3
554         b zcal_done
555
556 emc_lpddr2:
557
558         mov32   r2, 0x800A00AB
559         str     r2, [r0, #EMC_MRW]
560         ldr     r2, [r7]
561         add     r2, r2, #1
562         wait_until r2, r7, r3
563
564         tst     r1, #2
565         beq zcal_done
566
567         mov32   r2, 0x400A00AB
568         str     r2, [r0, #EMC_MRW]
569         ldr     r2, [r7]
570         add     r2, r2, #1
571         wait_until r2, r7, r3
572
573 zcal_done:
574
575         mov     r1, #0
576         str     r1, [r0, #EMC_REQ_CTRL]
577         ldr     r1, [r5, #0x4]
578         str     r1, [r0, #EMC_ZCAL_INTERVAL]
579         ldr     r1, [r5, #0x0]
580         str     r1, [r0, #EMC_CFG]
581
582         mov32   r0, TEGRA_PMC_BASE
583         ldr     r0, [r0, #PMC_SCRATCH41]
584         mov     pc, r0
585 ENDPROC(tegra3_lp1_reset)
586
587         .align  L1_CACHE_SHIFT
588         .type   tegra3_sdram_pad_save, %object
589 tegra3_sdram_pad_save:
590         .word   0
591         .word   0
592         .word   0
593         .word   0
594         .word   0
595         .word   0
596         .word   0
597         .word   0
598
599 tegra3_sdram_pad_address:
600         .word   TEGRA_EMC_BASE + EMC_CFG                                @0x0
601         .word   TEGRA_EMC_BASE + EMC_ZCAL_INTERVAL                      @0x4
602         .word   TEGRA_EMC_BASE + EMC_AUTO_CAL_INTERVAL                  @0x8
603         .word   TEGRA_EMC_BASE + EMC_XM2VTTGENPADCTRL                   @0xc
604         .word   TEGRA_EMC_BASE + EMC_XM2VTTGENPADCTRL2                  @0x10
605         .word   TEGRA_PMC_BASE + PMC_IO_DPD_STATUS                      @0x14
606         .word   TEGRA_CLK_RESET_BASE + CLK_RESET_CLK_SOURCE_MSELECT     @0x18
607         .word   TEGRA_CLK_RESET_BASE + CLK_RESET_SCLK_BURST             @0x1c
608
609 tegra3_sdram_pad_size:
610         .word   tegra3_sdram_pad_address - tegra3_sdram_pad_save
611
612 #ifdef CONFIG_TEGRA_LP1_950
613         .globl lp1_register_pmuslave_addr
614         .globl lp1_register_i2c_base_addr
615         .globl lp1_register_core_lowvolt
616         .globl lp1_register_core_highvolt
617 lp1_register_pmuslave_addr:
618         .word   0
619 lp1_register_i2c_base_addr:
620         .word   0
621 lp1_register_core_lowvolt:
622         .word   0
623 lp1_register_core_highvolt:
624         .word   0
625 #endif
626
627 /*
628  * tegra3_tear_down_core
629  *
630  * copied into and executed from IRAM
631  * puts memory in self-refresh for LP0 and LP1
632  */
633 tegra3_tear_down_core:
634         bl      tegra3_sdram_self_refresh
635         bl      tegra3_cpu_clk32k
636         b       tegra3_enter_sleep
637
638 /*
639  * tegra3_cpu_clk32k
640  *
641  * In LP0 and LP1 all plls will be turned off.  Switch the CPU and system clock
642  * to the 32khz clock (clks)
643  * r4 = TEGRA_PMC_BASE
644  * r5 = TEGRA_CLK_RESET_BASE
645  * r6 = TEGRA_FLOW_CTRL_BASE
646  * r7 = TEGRA_TMRUS_BASE
647  */
648 tegra3_cpu_clk32k:
649         ldr     r0, [r4, #PMC_CTRL]
650         tst     r0, #PMC_CTRL_SIDE_EFFECT_LP0
651         beq     lp1_clocks_prepare
652
653         /* enable PLLM auto-restart via PMC in LP0; restore override settings */
654         ldr     r0, [r4, #PMC_PLLP_WB0_OVERRIDE]
655         orr     r0, r0, #((1 << 12) | (1 << 11))
656         str     r0, [r4, #PMC_PLLP_WB0_OVERRIDE]
657         ldr     r0, [r4, #PMC_SCRATCH2]
658         str     r0, [r4, #PMC_PLLM_WB0_OVERRIDE]
659         mov     pc, lr
660
661 lp1_clocks_prepare:
662         /* Prepare to set the Core to the lowest voltage if supported.
663          * Start by setting the I2C clocks to make the I2C transfer */
664 #ifdef CONFIG_TEGRA_LP1_950
665         /* Set up the PWR I2C GPIOs with the right masks*/
666
667         /* Reset(Set/Clr) the DVC-I2C Controller*/
668         mov r0, #(1 << 15)
669         str r0, [r5, #CLK_RESET_CLK_RST_DEV_H_SET]
670
671         /* Wait for 2us */
672         wait_for_us r1, r7, r9
673         mov32 r0, 0x7D0
674         add r1, r1, r0
675         wait_until r1, r7, r9
676
677         mov r0, #(1 << 15)
678         str r0, [r5, #CLK_RESET_CLK_RST_DEV_H_CLR]
679
680         /* Enable the DVC-I2C Controller */
681         mov r0, #(1 << 15)
682         str r0, [r5, #CLK_RESET_CLK_ENB_H_SET]
683
684         /* I2C transfer protocol:
685          * 4 packets: Slaveaddr + WriteConfigure + Data1 + Data2 */
686         ldr r0, lp1_register_pmuslave_addr
687         cmp r0, #0
688         beq lp1_volt_skip
689         ldr r1, lp1_register_i2c_base_addr
690         str r0, [r1, #I2C_ADDR0]
691
692         mov32 r0, 0x2
693         str r0, [r1, #I2C_CNFG]
694
695         ldr r0, lp1_register_core_lowvolt
696         str r0, [r1, #I2C_DATA1]
697
698         mov32 r0, 0
699         str r0, [r1, #I2C_DATA2]
700
701         /* Send I2C transaction */
702         mov32 r0, 0xA02
703         str r0, [r1, #I2C_CNFG]
704
705         /* Check the transaction status before proceeding */
706         wait_for_us r2, r7, r9
707         mov32 r3, 0x7D0 /* Wait for 2ms for I2C transaction */
708         add r3, r2, r3
709 loop_i2c_status_suspend:
710         add r2, r2, #0xFA /* Check status every 250us */
711         cmp r3, r2
712         beq lp1_volt_skip  /* Waited for 2ms, I2C transaction didn't take place */
713         wait_until r2, r7, r9
714
715         ldr r0, [r1, #I2C_STATUS]
716         cmp r0, #0
717         bne loop_i2c_status_suspend
718 lp1_volt_skip:
719
720         /* Disable the DVC-I2C Controller */
721         mov r0, #(1 << 15)
722         str r0, [r5, #CLK_RESET_CLK_ENB_H_CLR]
723
724 #endif
725         /* start by jumping to clkm to safely disable PLLs, then jump
726          * to clks */
727         mov     r0, #(1 << 28)
728         str     r0, [r5, #CLK_RESET_SCLK_BURST]
729         str     r0, [r5, #CLK_RESET_CCLK_BURST]
730         mov     r0, #0
731         str     r0, [r5, #CLK_RESET_CCLK_DIVIDER]
732         str     r0, [r5, #CLK_RESET_SCLK_DIVIDER]
733
734         /* switch the clock source for mselect to be CLK_M */
735         ldr     r0, [r5, #CLK_RESET_CLK_SOURCE_MSELECT]
736         orr     r0, r0, #MSELECT_CLKM
737         str     r0, [r5, #CLK_RESET_CLK_SOURCE_MSELECT]
738
739         /* 2 us delay between changing sclk and disabling PLLs */
740         wait_for_us r1, r7, r9
741         add     r1, r1, #2
742         wait_until r1, r7, r9
743
744         /* switch to CLKS */
745         mov     r0, #0  /* burst policy = 32KHz */
746         str     r0, [r5, #CLK_RESET_SCLK_BURST]
747
748         /* disable PLLM via PMC in LP1 */
749         ldr     r0, [r4, #PMC_PLLP_WB0_OVERRIDE]
750         bic     r0, r0, #(1 << 12)
751         str     r0, [r4, #PMC_PLLP_WB0_OVERRIDE]
752         b       powerdown_pll_pcx
753
754 powerdown_pll_pcx:
755         ldr     r11, [r4, #PMC_SCRATCH37]       @ load the LP1 flags
756         tst     r11, #TEGRA_POWER_LP1_AUDIO     @ check if voice call is going on
757         bne     powerdown_pll_cx                @ if yes, do not turn off pll-p/pll-a
758
759         ldr     r0, [r5, #CLK_RESET_PLLP_BASE]
760         bic     r0, r0, #(1<<30)
761         str     r0, [r5, #CLK_RESET_PLLP_BASE]
762         ldr     r0, [r5, #CLK_RESET_PLLA_BASE]
763         bic     r0, r0, #(1<<30)
764         str     r0, [r5, #CLK_RESET_PLLA_BASE]
765
766 powerdown_pll_cx:
767         ldr     r0, [r5, #CLK_RESET_PLLC_BASE]
768         bic     r0, r0, #(1<<30)
769         str     r0, [r5, #CLK_RESET_PLLC_BASE]
770         ldr     r0, [r5, #CLK_RESET_PLLX_BASE]
771         bic     r0, r0, #(1<<30)
772         str     r0, [r5, #CLK_RESET_PLLX_BASE]
773
774         mov     pc, lr
775
776 /*
777  * tegra3_enter_sleep
778  *
779  * uses flow controller to enter sleep state
780  * executes from IRAM with SDRAM in selfrefresh when target state is LP0 or LP1
781  * executes from SDRAM with target state is LP2
782  * r4 = TEGRA_PMC_BASE
783  * r5 = TEGRA_CLK_RESET_BASE
784  * r6 = TEGRA_FLOW_CTRL_BASE
785  * r7 = TEGRA_TMRUS_BASE
786  */
787 tegra3_enter_sleep:
788         ldr     r1, [r7]
789         str     r1, [r4, #PMC_SCRATCH38]
790         dsb
791         cpu_id  r1
792
793         cpu_to_csr_reg  r2, r1
794         ldr     r0, [r6, r2]
795         orr     r0, r0, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG
796         orr     r0, r0, #FLOW_CTRL_CSR_ENABLE
797         str     r0, [r6, r2]
798
799 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
800         tst     r0, #FLOW_CTRL_IMMEDIATE_WAKE
801         movne   r0, #FLOW_CTRL_WAITEVENT
802         moveq   r0, #FLOW_CTRL_WAIT_FOR_INTERRUPT
803         orr     r0, r0, #FLOW_CTRL_HALT_LIC_IRQ | FLOW_CTRL_HALT_LIC_FIQ
804 #else
805         mov     r0, #FLOW_CTRL_WAIT_FOR_INTERRUPT
806         orr     r0, r0, #FLOW_CTRL_HALT_CPU_IRQ | FLOW_CTRL_HALT_CPU_FIQ
807 #endif
808         cpu_to_halt_reg r2, r1
809         str     r0, [r6, r2]
810         dsb
811         ldr     r0, [r6, r2] /* memory barrier */
812
813 #ifndef CONFIG_ARM_SAVE_DEBUG_CONTEXT_NO_LOCK
814         /* Set the Debug OS Double Lock for Debug Arch v7.1 or greater.
815            With this lock set, the debugger is completely locked out.
816            Disable this to debug WFI/powergating failures.
817         */
818         mrc     p15, 0, r3, c0, c1, 2   @ ID_DFR0
819         and     r3, r3, #0xF            @ coprocessor debug model
820         cmp     r3, #5                  @ debug arch >= v7.1?
821
822         mov32   r1, 0xC5ACCE55
823         mcrge   p14, 0, r1, c1, c3, 4   @ DBGOSDLR
824 #endif
825 halted:
826         isb
827         dsb
828         wfi     /* CPU should be power gated here */
829
830         /* !!!FIXME!!! Implement halt failure handler */
831         b       halted
832
833 /*
834  * tegra3_sdram_self_refresh
835  *
836  * called with MMU off and caches disabled
837  * puts sdram in self refresh
838  * must execute from IRAM
839  * r4 = TEGRA_PMC_BASE
840  * r5 = TEGRA_CLK_RESET_BASE
841  * r6 = TEGRA_FLOW_CTRL_BASE
842  * r7 = TEGRA_TMRUS_BASE
843  */
844
845 tegra3_sdram_self_refresh:
846
847         adr     r2, tegra3_sdram_pad_address
848         adr     r8, tegra3_sdram_pad_save
849         mov     r9, #0
850
851 padsave:
852         ldr     r0, [r2, r9]                    @ r0 is emc register address
853
854         ldr     r1, [r0]
855         str     r1, [r8, r9]                    @ save emc register
856
857         add     r9, r9, #4
858         ldr     r0, tegra3_sdram_pad_size
859         cmp     r0, r9
860         bne     padsave
861 padsave_done:
862
863         dsb
864
865         mov32   r0, TEGRA_EMC_BASE                      @ r0 reserved for emc base
866
867         mov     r1, #0
868         str     r1, [r0, #EMC_ZCAL_INTERVAL]
869         str     r1, [r0, #EMC_AUTO_CAL_INTERVAL]
870         ldr     r1, [r0, #EMC_CFG]
871         bic     r1, r1, #(1<<28)
872         str     r1, [r0, #EMC_CFG]              @ disable DYN_SELF_REF
873
874         emc_timing_update r1, r0
875
876         ldr     r1, [r7]
877         add     r1, r1, #5
878         wait_until r1, r7, r2
879
880 emc_wait_audo_cal:
881         ldr     r1, [r0, #EMC_AUTO_CAL_STATUS]
882         tst     r1, #(0x1<<31)          @ wait until AUTO_CAL_ACTIVE is clear
883         bne     emc_wait_audo_cal
884
885         mov     r1, #3
886         str     r1, [r0, #EMC_REQ_CTRL]         @ stall incoming DRAM requests
887
888 emcidle:
889         ldr     r1, [r0, #EMC_EMC_STATUS]
890         tst     r1, #4
891         beq     emcidle
892
893         mov     r1, #1
894         str     r1, [r0, #EMC_SELF_REF]
895
896         emc_device_mask r1, r0
897
898 emcself:
899         ldr     r2, [r0, #EMC_EMC_STATUS]
900         and     r2, r2, r1
901         cmp     r2, r1
902         bne     emcself                         @ loop until DDR in self-refresh
903
904         ldr     r1, [r0, #EMC_XM2VTTGENPADCTRL]
905         mov32   r2, 0xF8F8FFFF          @ clear XM2VTTGEN_DRVUP and XM2VTTGEN_DRVDN
906         and     r1, r1, r2
907         str     r1, [r0, #EMC_XM2VTTGENPADCTRL]
908         ldr     r1, [r0, #EMC_XM2VTTGENPADCTRL2]
909         orr     r1, r1, #7                      @ set E_NO_VTTGEN
910         str     r1, [r0, #EMC_XM2VTTGENPADCTRL2]
911
912         emc_timing_update r1, r0
913
914         ldr     r1, [r4, #PMC_CTRL]
915         tst     r1, #PMC_CTRL_SIDE_EFFECT_LP0
916         bne     pmc_io_dpd_skip
917         mov32   r1, 0x8EC00000
918         str     r1, [r4, #PMC_IO_DPD_REQ]
919 pmc_io_dpd_skip:
920
921         dsb
922
923         mov     pc, lr
924
925         .ltorg
926 /* dummy symbol for end of IRAM */
927         .align L1_CACHE_SHIFT
928         .globl tegra3_iram_end
929 tegra3_iram_end:
930         b       .
931 #endif