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