xref: /openbmc/linux/arch/arm/mach-omap2/sleep43xx.S (revision 74655749a58405e259eaaba66bfc391fdbe1e34e)
141d37e61SDave Gerlach/* SPDX-License-Identifier: GPL-2.0 */
241d37e61SDave Gerlach/*
341d37e61SDave Gerlach * Low level suspend code for AM43XX SoCs
441d37e61SDave Gerlach *
541d37e61SDave Gerlach * Copyright (C) 2013-2018 Texas Instruments Incorporated - http://www.ti.com/
641d37e61SDave Gerlach *	Dave Gerlach, Vaibhav Bedia
741d37e61SDave Gerlach */
841d37e61SDave Gerlach
941d9d44dSDave Gerlach#include <generated/ti-pm-asm-offsets.h>
1041d37e61SDave Gerlach#include <linux/linkage.h>
1141d37e61SDave Gerlach#include <linux/ti-emif-sram.h>
12*74655749SDave Gerlach#include <linux/platform_data/pm33xx.h>
1341d37e61SDave Gerlach#include <asm/assembler.h>
1441d37e61SDave Gerlach#include <asm/hardware/cache-l2x0.h>
1541d37e61SDave Gerlach#include <asm/memory.h>
1641d37e61SDave Gerlach
1741d37e61SDave Gerlach#include "cm33xx.h"
1841d37e61SDave Gerlach#include "common.h"
1941d37e61SDave Gerlach#include "iomap.h"
2041d37e61SDave Gerlach#include "omap-secure.h"
2141d37e61SDave Gerlach#include "omap44xx.h"
2241d37e61SDave Gerlach#include "prm33xx.h"
2341d37e61SDave Gerlach#include "prcm43xx.h"
2441d37e61SDave Gerlach
25*74655749SDave Gerlach/* replicated define because linux/bitops.h cannot be included in assembly */
26*74655749SDave Gerlach#define BIT(nr)			(1 << (nr))
27*74655749SDave Gerlach
2841d37e61SDave Gerlach#define AM33XX_CM_CLKCTRL_MODULESTATE_DISABLED		0x00030000
2941d37e61SDave Gerlach#define AM33XX_CM_CLKCTRL_MODULEMODE_DISABLE		0x0003
3041d37e61SDave Gerlach#define AM33XX_CM_CLKCTRL_MODULEMODE_ENABLE		0x0002
3141d37e61SDave Gerlach
3241d37e61SDave Gerlach#define AM43XX_EMIF_POWEROFF_ENABLE			0x1
3341d37e61SDave Gerlach#define AM43XX_EMIF_POWEROFF_DISABLE			0x0
3441d37e61SDave Gerlach
3541d37e61SDave Gerlach#define AM43XX_CM_CLKSTCTRL_CLKTRCTRL_SW_SLEEP		0x1
3641d37e61SDave Gerlach#define AM43XX_CM_CLKSTCTRL_CLKTRCTRL_HW_AUTO		0x3
3741d37e61SDave Gerlach
3841d37e61SDave Gerlach#define AM43XX_CM_BASE					0x44DF0000
3941d37e61SDave Gerlach
4041d37e61SDave Gerlach#define AM43XX_CM_REGADDR(inst, reg)                           \
4141d37e61SDave Gerlach       AM33XX_L4_WK_IO_ADDRESS(AM43XX_CM_BASE + (inst) + (reg))
4241d37e61SDave Gerlach
4341d37e61SDave Gerlach#define AM43XX_CM_MPU_CLKSTCTRL AM43XX_CM_REGADDR(AM43XX_CM_MPU_INST, \
4441d37e61SDave Gerlach					AM43XX_CM_MPU_MPU_CDOFFS)
4541d37e61SDave Gerlach#define AM43XX_CM_MPU_MPU_CLKCTRL AM43XX_CM_REGADDR(AM43XX_CM_MPU_INST, \
4641d37e61SDave Gerlach					AM43XX_CM_MPU_MPU_CLKCTRL_OFFSET)
4741d37e61SDave Gerlach#define AM43XX_CM_PER_EMIF_CLKCTRL  AM43XX_CM_REGADDR(AM43XX_CM_PER_INST, \
4841d37e61SDave Gerlach					AM43XX_CM_PER_EMIF_CLKCTRL_OFFSET)
4941d37e61SDave Gerlach#define AM43XX_PRM_EMIF_CTRL_OFFSET			0x0030
5041d37e61SDave Gerlach
5141d37e61SDave Gerlach	.arm
5241d37e61SDave Gerlach	.align 3
5341d37e61SDave Gerlach
5441d37e61SDave GerlachENTRY(am43xx_do_wfi)
5541d37e61SDave Gerlach	stmfd	sp!, {r4 - r11, lr}	@ save registers on stack
5641d37e61SDave Gerlach
57*74655749SDave Gerlach	/* Save wfi_flags arg to data space */
58*74655749SDave Gerlach	mov	r4, r0
59*74655749SDave Gerlach	adr	r3, am43xx_pm_ro_sram_data
60*74655749SDave Gerlach	ldr	r2, [r3, #AMX3_PM_RO_SRAM_DATA_VIRT_OFFSET]
61*74655749SDave Gerlach	str	r4, [r2, #AMX3_PM_WFI_FLAGS_OFFSET]
62*74655749SDave Gerlach
6303de3727SArnd Bergmann#ifdef CONFIG_CACHE_L2X0
6441d37e61SDave Gerlach	/* Retrieve l2 cache virt address BEFORE we shut off EMIF */
6541d37e61SDave Gerlach	ldr	r1, get_l2cache_base
6641d37e61SDave Gerlach	blx	r1
6741d37e61SDave Gerlach	mov	r8, r0
6803de3727SArnd Bergmann#endif
6941d37e61SDave Gerlach
70*74655749SDave Gerlach	/* Only flush cache is we know we are losing MPU context */
71*74655749SDave Gerlach	tst	r4, #WFI_FLAG_FLUSH_CACHE
72*74655749SDave Gerlach	beq	cache_skip_flush
73*74655749SDave Gerlach
7441d37e61SDave Gerlach	/*
7541d37e61SDave Gerlach	 * Flush all data from the L1 and L2 data cache before disabling
7641d37e61SDave Gerlach	 * SCTLR.C bit.
7741d37e61SDave Gerlach	 */
7841d37e61SDave Gerlach	ldr	r1, kernel_flush
7941d37e61SDave Gerlach	blx	r1
8041d37e61SDave Gerlach
8141d37e61SDave Gerlach	/*
8241d37e61SDave Gerlach	 * Clear the SCTLR.C bit to prevent further data cache
8341d37e61SDave Gerlach	 * allocation. Clearing SCTLR.C would make all the data accesses
8441d37e61SDave Gerlach	 * strongly ordered and would not hit the cache.
8541d37e61SDave Gerlach	 */
8641d37e61SDave Gerlach	mrc	p15, 0, r0, c1, c0, 0
8741d37e61SDave Gerlach	bic	r0, r0, #(1 << 2)	@ Disable the C bit
8841d37e61SDave Gerlach	mcr	p15, 0, r0, c1, c0, 0
8941d37e61SDave Gerlach	isb
9041d37e61SDave Gerlach	dsb
9141d37e61SDave Gerlach
9241d37e61SDave Gerlach	/*
9341d37e61SDave Gerlach	 * Invalidate L1 and L2 data cache.
9441d37e61SDave Gerlach	 */
9541d37e61SDave Gerlach	ldr	r1, kernel_flush
9641d37e61SDave Gerlach	blx	r1
9741d37e61SDave Gerlach
9841d37e61SDave Gerlach#ifdef CONFIG_CACHE_L2X0
9941d37e61SDave Gerlach	/*
10041d37e61SDave Gerlach	 * Clean and invalidate the L2 cache.
10141d37e61SDave Gerlach	 */
10241d37e61SDave Gerlach#ifdef CONFIG_PL310_ERRATA_727915
10341d37e61SDave Gerlach	mov	r0, #0x03
10441d37e61SDave Gerlach	mov	r12, #OMAP4_MON_L2X0_DBG_CTRL_INDEX
10541d37e61SDave Gerlach	dsb
10641d37e61SDave Gerlach	smc	#0
10741d37e61SDave Gerlach	dsb
10841d37e61SDave Gerlach#endif
10941d37e61SDave Gerlach	mov	r0, r8
11041d37e61SDave Gerlach	adr	r4, am43xx_pm_ro_sram_data
11141d37e61SDave Gerlach	ldr	r3, [r4, #AMX3_PM_RO_SRAM_DATA_VIRT_OFFSET]
11241d37e61SDave Gerlach
11341d37e61SDave Gerlach	mov	r2, r0
11441d37e61SDave Gerlach	ldr	r0, [r2, #L2X0_AUX_CTRL]
11541d37e61SDave Gerlach	str	r0, [r3, #AMX3_PM_L2_AUX_CTRL_VAL_OFFSET]
11641d37e61SDave Gerlach	ldr	r0, [r2, #L310_PREFETCH_CTRL]
11741d37e61SDave Gerlach	str	r0, [r3, #AMX3_PM_L2_PREFETCH_CTRL_VAL_OFFSET]
11841d37e61SDave Gerlach
11941d37e61SDave Gerlach	ldr	r0, l2_val
12041d37e61SDave Gerlach	str	r0, [r2, #L2X0_CLEAN_INV_WAY]
12141d37e61SDave Gerlachwait:
12241d37e61SDave Gerlach	ldr	r0, [r2, #L2X0_CLEAN_INV_WAY]
12341d37e61SDave Gerlach	ldr	r1, l2_val
12441d37e61SDave Gerlach	ands	r0, r0, r1
12541d37e61SDave Gerlach	bne	wait
12641d37e61SDave Gerlach#ifdef CONFIG_PL310_ERRATA_727915
12741d37e61SDave Gerlach	mov	r0, #0x00
12841d37e61SDave Gerlach	mov	r12, #OMAP4_MON_L2X0_DBG_CTRL_INDEX
12941d37e61SDave Gerlach	dsb
13041d37e61SDave Gerlach	smc	#0
13141d37e61SDave Gerlach	dsb
13241d37e61SDave Gerlach#endif
13341d37e61SDave Gerlachl2x_sync:
13441d37e61SDave Gerlach	mov	r0, r8
13541d37e61SDave Gerlach	mov	r2, r0
13641d37e61SDave Gerlach	mov	r0, #0x0
13741d37e61SDave Gerlach	str	r0, [r2, #L2X0_CACHE_SYNC]
13841d37e61SDave Gerlachsync:
13941d37e61SDave Gerlach	ldr	r0, [r2, #L2X0_CACHE_SYNC]
14041d37e61SDave Gerlach	ands	r0, r0, #0x1
14141d37e61SDave Gerlach	bne	sync
14241d37e61SDave Gerlach#endif
14341d37e61SDave Gerlach
144*74655749SDave Gerlach	/* Restore wfi_flags */
145*74655749SDave Gerlach	adr	r3, am43xx_pm_ro_sram_data
146*74655749SDave Gerlach	ldr	r2, [r3, #AMX3_PM_RO_SRAM_DATA_VIRT_OFFSET]
147*74655749SDave Gerlach	ldr	r4, [r2, #AMX3_PM_WFI_FLAGS_OFFSET]
148*74655749SDave Gerlach
149*74655749SDave Gerlachcache_skip_flush:
150*74655749SDave Gerlach	/* Check if we want self refresh */
151*74655749SDave Gerlach	tst	r4, #WFI_FLAG_SELF_REFRESH
152*74655749SDave Gerlach	beq	emif_skip_enter_sr
153*74655749SDave Gerlach
15441d37e61SDave Gerlach	adr     r9, am43xx_emif_sram_table
15541d37e61SDave Gerlach
15641d37e61SDave Gerlach	ldr     r3, [r9, #EMIF_PM_ENTER_SR_OFFSET]
15741d37e61SDave Gerlach	blx     r3
15841d37e61SDave Gerlach
159*74655749SDave Gerlachemif_skip_enter_sr:
160*74655749SDave Gerlach	/* Only necessary if PER is losing context */
161*74655749SDave Gerlach	tst	r4, #WFI_FLAG_SAVE_EMIF
162*74655749SDave Gerlach	beq	emif_skip_save
163*74655749SDave Gerlach
16441d37e61SDave Gerlach	ldr     r3, [r9, #EMIF_PM_SAVE_CONTEXT_OFFSET]
16541d37e61SDave Gerlach	blx	r3
16641d37e61SDave Gerlach
167*74655749SDave Gerlachemif_skip_save:
168*74655749SDave Gerlach	/* Only can disable EMIF if we have entered self refresh */
169*74655749SDave Gerlach	tst	r4, #WFI_FLAG_SELF_REFRESH
170*74655749SDave Gerlach	beq	emif_skip_disable
171*74655749SDave Gerlach
17241d37e61SDave Gerlach	/* Disable EMIF */
17341d37e61SDave Gerlach	ldr	r1, am43xx_virt_emif_clkctrl
17441d37e61SDave Gerlach	ldr	r2, [r1]
17541d37e61SDave Gerlach	bic	r2, r2, #AM33XX_CM_CLKCTRL_MODULEMODE_DISABLE
17641d37e61SDave Gerlach	str	r2, [r1]
17741d37e61SDave Gerlach
17841d37e61SDave Gerlachwait_emif_disable:
17941d37e61SDave Gerlach	ldr	r2, [r1]
18041d37e61SDave Gerlach	mov	r3, #AM33XX_CM_CLKCTRL_MODULESTATE_DISABLED
18141d37e61SDave Gerlach	cmp	r2, r3
18241d37e61SDave Gerlach	bne	wait_emif_disable
18341d37e61SDave Gerlach
184*74655749SDave Gerlachemif_skip_disable:
185*74655749SDave Gerlach	tst	r4, #WFI_FLAG_WAKE_M3
186*74655749SDave Gerlach	beq	wkup_m3_skip
187*74655749SDave Gerlach
18841d37e61SDave Gerlach	/*
18941d37e61SDave Gerlach	 * For the MPU WFI to be registered as an interrupt
19041d37e61SDave Gerlach	 * to WKUP_M3, MPU_CLKCTRL.MODULEMODE needs to be set
19141d37e61SDave Gerlach	 * to DISABLED
19241d37e61SDave Gerlach	 */
19341d37e61SDave Gerlach	ldr	r1, am43xx_virt_mpu_clkctrl
19441d37e61SDave Gerlach	ldr	r2, [r1]
19541d37e61SDave Gerlach	bic	r2, r2, #AM33XX_CM_CLKCTRL_MODULEMODE_DISABLE
19641d37e61SDave Gerlach	str	r2, [r1]
19741d37e61SDave Gerlach
19841d37e61SDave Gerlach	/*
19941d37e61SDave Gerlach	 * Put MPU CLKDM to SW_SLEEP
20041d37e61SDave Gerlach	 */
20141d37e61SDave Gerlach	ldr	r1, am43xx_virt_mpu_clkstctrl
20241d37e61SDave Gerlach	mov	r2, #AM43XX_CM_CLKSTCTRL_CLKTRCTRL_SW_SLEEP
20341d37e61SDave Gerlach	str	r2, [r1]
20441d37e61SDave Gerlach
205*74655749SDave Gerlachwkup_m3_skip:
20641d37e61SDave Gerlach	/*
20741d37e61SDave Gerlach	 * Execute a barrier instruction to ensure that all cache,
20841d37e61SDave Gerlach	 * TLB and branch predictor maintenance operations issued
20941d37e61SDave Gerlach	 * have completed.
21041d37e61SDave Gerlach	 */
21141d37e61SDave Gerlach	dsb
21241d37e61SDave Gerlach	dmb
21341d37e61SDave Gerlach
21441d37e61SDave Gerlach	/*
21541d37e61SDave Gerlach	 * Execute a WFI instruction and wait until the
21641d37e61SDave Gerlach	 * STANDBYWFI output is asserted to indicate that the
21741d37e61SDave Gerlach	 * CPU is in idle and low power state. CPU can specualatively
21841d37e61SDave Gerlach	 * prefetch the instructions so add NOPs after WFI. Sixteen
21941d37e61SDave Gerlach	 * NOPs as per Cortex-A9 pipeline.
22041d37e61SDave Gerlach	 */
22141d37e61SDave Gerlach	wfi
22241d37e61SDave Gerlach
22341d37e61SDave Gerlach	nop
22441d37e61SDave Gerlach	nop
22541d37e61SDave Gerlach	nop
22641d37e61SDave Gerlach	nop
22741d37e61SDave Gerlach	nop
22841d37e61SDave Gerlach	nop
22941d37e61SDave Gerlach	nop
23041d37e61SDave Gerlach	nop
23141d37e61SDave Gerlach	nop
23241d37e61SDave Gerlach	nop
23341d37e61SDave Gerlach	nop
23441d37e61SDave Gerlach	nop
23541d37e61SDave Gerlach	nop
23641d37e61SDave Gerlach	nop
23741d37e61SDave Gerlach	nop
23841d37e61SDave Gerlach	nop
23941d37e61SDave Gerlach
24041d37e61SDave Gerlach	/* We come here in case of an abort due to a late interrupt */
24141d37e61SDave Gerlach	ldr	r1, am43xx_virt_mpu_clkstctrl
24241d37e61SDave Gerlach	mov	r2, #AM43XX_CM_CLKSTCTRL_CLKTRCTRL_HW_AUTO
24341d37e61SDave Gerlach	str	r2, [r1]
24441d37e61SDave Gerlach
24541d37e61SDave Gerlach	/* Set MPU_CLKCTRL.MODULEMODE back to ENABLE */
24641d37e61SDave Gerlach	ldr	r1, am43xx_virt_mpu_clkctrl
24741d37e61SDave Gerlach	mov	r2, #AM33XX_CM_CLKCTRL_MODULEMODE_ENABLE
24841d37e61SDave Gerlach	str	r2, [r1]
24941d37e61SDave Gerlach
25041d37e61SDave Gerlach	/* Re-enable EMIF */
25141d37e61SDave Gerlach	ldr	r1, am43xx_virt_emif_clkctrl
25241d37e61SDave Gerlach	mov	r2, #AM33XX_CM_CLKCTRL_MODULEMODE_ENABLE
25341d37e61SDave Gerlach	str	r2, [r1]
25441d37e61SDave Gerlachwait_emif_enable:
25541d37e61SDave Gerlach	ldr	r3, [r1]
25641d37e61SDave Gerlach	cmp	r2, r3
25741d37e61SDave Gerlach	bne	wait_emif_enable
25841d37e61SDave Gerlach
259*74655749SDave Gerlach	tst	r4, #WFI_FLAG_FLUSH_CACHE
260*74655749SDave Gerlach	beq	cache_skip_restore
261*74655749SDave Gerlach
26241d37e61SDave Gerlach	/*
26341d37e61SDave Gerlach	 * Set SCTLR.C bit to allow data cache allocation
26441d37e61SDave Gerlach	 */
26541d37e61SDave Gerlach	mrc	p15, 0, r0, c1, c0, 0
26641d37e61SDave Gerlach	orr	r0, r0, #(1 << 2)	@ Enable the C bit
26741d37e61SDave Gerlach	mcr	p15, 0, r0, c1, c0, 0
26841d37e61SDave Gerlach	isb
26941d37e61SDave Gerlach
270*74655749SDave Gerlachcache_skip_restore:
271*74655749SDave Gerlach	/* Only necessary if PER is losing context */
272*74655749SDave Gerlach	tst	r4, #WFI_FLAG_SELF_REFRESH
273*74655749SDave Gerlach	beq	emif_skip_exit_sr_abt
274*74655749SDave Gerlach
275*74655749SDave Gerlach	adr	r9, am43xx_emif_sram_table
27641d37e61SDave Gerlach	ldr	r1, [r9, #EMIF_PM_ABORT_SR_OFFSET]
27741d37e61SDave Gerlach	blx	r1
27841d37e61SDave Gerlach
279*74655749SDave Gerlachemif_skip_exit_sr_abt:
28041d37e61SDave Gerlach	/* Let the suspend code know about the abort */
28141d37e61SDave Gerlach	mov	r0, #1
28241d37e61SDave Gerlach	ldmfd	sp!, {r4 - r11, pc}	@ restore regs and return
28341d37e61SDave GerlachENDPROC(am43xx_do_wfi)
28441d37e61SDave Gerlach
28541d37e61SDave Gerlach	.align
28641d37e61SDave GerlachENTRY(am43xx_resume_offset)
28741d37e61SDave Gerlach	.word . - am43xx_do_wfi
28841d37e61SDave Gerlach
28941d37e61SDave GerlachENTRY(am43xx_resume_from_deep_sleep)
29041d37e61SDave Gerlach	/* Set MPU CLKSTCTRL to HW AUTO so that CPUidle works properly */
29141d37e61SDave Gerlach	ldr	r1, am43xx_virt_mpu_clkstctrl
29241d37e61SDave Gerlach	mov	r2, #AM43XX_CM_CLKSTCTRL_CLKTRCTRL_HW_AUTO
29341d37e61SDave Gerlach	str	r2, [r1]
29441d37e61SDave Gerlach
29541d37e61SDave Gerlach	/* For AM43xx, use EMIF power down until context is restored */
29641d37e61SDave Gerlach	ldr	r2, am43xx_phys_emif_poweroff
29741d37e61SDave Gerlach	mov	r1, #AM43XX_EMIF_POWEROFF_ENABLE
29841d37e61SDave Gerlach	str	r1, [r2, #0x0]
29941d37e61SDave Gerlach
30041d37e61SDave Gerlach	/* Re-enable EMIF */
30141d37e61SDave Gerlach	ldr	r1, am43xx_phys_emif_clkctrl
30241d37e61SDave Gerlach	mov	r2, #AM33XX_CM_CLKCTRL_MODULEMODE_ENABLE
30341d37e61SDave Gerlach	str	r2, [r1]
30441d37e61SDave Gerlachwait_emif_enable1:
30541d37e61SDave Gerlach	ldr	r3, [r1]
30641d37e61SDave Gerlach	cmp	r2, r3
30741d37e61SDave Gerlach	bne	wait_emif_enable1
30841d37e61SDave Gerlach
30941d37e61SDave Gerlach	adr     r9, am43xx_emif_sram_table
31041d37e61SDave Gerlach
31141d37e61SDave Gerlach	ldr     r1, [r9, #EMIF_PM_RESTORE_CONTEXT_OFFSET]
31241d37e61SDave Gerlach	blx     r1
31341d37e61SDave Gerlach
31441d37e61SDave Gerlach	ldr     r1, [r9, #EMIF_PM_EXIT_SR_OFFSET]
31541d37e61SDave Gerlach	blx     r1
31641d37e61SDave Gerlach
31741d37e61SDave Gerlach	ldr     r2, am43xx_phys_emif_poweroff
31841d37e61SDave Gerlach	mov     r1, #AM43XX_EMIF_POWEROFF_DISABLE
31941d37e61SDave Gerlach	str     r1, [r2, #0x0]
32041d37e61SDave Gerlach
32141d37e61SDave Gerlach#ifdef CONFIG_CACHE_L2X0
32241d37e61SDave Gerlach	ldr	r2, l2_cache_base
32341d37e61SDave Gerlach	ldr	r0, [r2, #L2X0_CTRL]
32441d37e61SDave Gerlach	and	r0, #0x0f
32541d37e61SDave Gerlach	cmp	r0, #1
32641d37e61SDave Gerlach	beq	skip_l2en			@ Skip if already enabled
32741d37e61SDave Gerlach
32841d37e61SDave Gerlach	adr	r4, am43xx_pm_ro_sram_data
32941d37e61SDave Gerlach	ldr	r3, [r4, #AMX3_PM_RO_SRAM_DATA_PHYS_OFFSET]
33041d37e61SDave Gerlach	ldr     r0, [r3, #AMX3_PM_L2_PREFETCH_CTRL_VAL_OFFSET]
33141d37e61SDave Gerlach
33241d37e61SDave Gerlach	ldr	r12, l2_smc1
33341d37e61SDave Gerlach	dsb
33441d37e61SDave Gerlach	smc	#0
33541d37e61SDave Gerlach	dsb
33641d37e61SDave Gerlachset_aux_ctrl:
33741d37e61SDave Gerlach	ldr     r0, [r3, #AMX3_PM_L2_AUX_CTRL_VAL_OFFSET]
33841d37e61SDave Gerlach	ldr	r12, l2_smc2
33941d37e61SDave Gerlach	dsb
34041d37e61SDave Gerlach	smc	#0
34141d37e61SDave Gerlach	dsb
34241d37e61SDave Gerlach
34341d37e61SDave Gerlach	/* L2 invalidate on resume */
34441d37e61SDave Gerlach	ldr	r0, l2_val
34541d37e61SDave Gerlach	ldr	r2, l2_cache_base
34641d37e61SDave Gerlach	str	r0, [r2, #L2X0_INV_WAY]
34741d37e61SDave Gerlachwait2:
34841d37e61SDave Gerlach	ldr	r0, [r2, #L2X0_INV_WAY]
34941d37e61SDave Gerlach	ldr	r1, l2_val
35041d37e61SDave Gerlach	ands	r0, r0, r1
35141d37e61SDave Gerlach	bne	wait2
35241d37e61SDave Gerlach#ifdef CONFIG_PL310_ERRATA_727915
35341d37e61SDave Gerlach	mov	r0, #0x00
35441d37e61SDave Gerlach	mov	r12, #OMAP4_MON_L2X0_DBG_CTRL_INDEX
35541d37e61SDave Gerlach	dsb
35641d37e61SDave Gerlach	smc	#0
35741d37e61SDave Gerlach	dsb
35841d37e61SDave Gerlach#endif
35941d37e61SDave Gerlachl2x_sync2:
36041d37e61SDave Gerlach	ldr	r2, l2_cache_base
36141d37e61SDave Gerlach	mov	r0, #0x0
36241d37e61SDave Gerlach	str	r0, [r2, #L2X0_CACHE_SYNC]
36341d37e61SDave Gerlachsync2:
36441d37e61SDave Gerlach	ldr	r0, [r2, #L2X0_CACHE_SYNC]
36541d37e61SDave Gerlach	ands	r0, r0, #0x1
36641d37e61SDave Gerlach	bne	sync2
36741d37e61SDave Gerlach
36841d37e61SDave Gerlach	mov	r0, #0x1
36941d37e61SDave Gerlach	ldr	r12, l2_smc3
37041d37e61SDave Gerlach	dsb
37141d37e61SDave Gerlach	smc	#0
37241d37e61SDave Gerlach	dsb
37341d37e61SDave Gerlach#endif
37441d37e61SDave Gerlachskip_l2en:
37541d37e61SDave Gerlach	/* We are back. Branch to the common CPU resume routine */
37641d37e61SDave Gerlach	mov	r0, #0
37741d37e61SDave Gerlach	ldr	pc, resume_addr
37841d37e61SDave GerlachENDPROC(am43xx_resume_from_deep_sleep)
37941d37e61SDave Gerlach
38041d37e61SDave Gerlach/*
38141d37e61SDave Gerlach * Local variables
38241d37e61SDave Gerlach */
38341d37e61SDave Gerlach	.align
38441d37e61SDave Gerlachresume_addr:
38541d37e61SDave Gerlach	.word	cpu_resume - PAGE_OFFSET + 0x80000000
38641d37e61SDave Gerlachkernel_flush:
38741d37e61SDave Gerlach	.word   v7_flush_dcache_all
38841d37e61SDave Gerlachddr_start:
38941d37e61SDave Gerlach	.word	PAGE_OFFSET
39041d37e61SDave Gerlach
39141d37e61SDave Gerlacham43xx_phys_emif_poweroff:
39241d37e61SDave Gerlach	.word   (AM43XX_CM_BASE + AM43XX_PRM_DEVICE_INST + \
39341d37e61SDave Gerlach		 AM43XX_PRM_EMIF_CTRL_OFFSET)
39441d37e61SDave Gerlacham43xx_virt_mpu_clkstctrl:
39541d37e61SDave Gerlach	.word	(AM43XX_CM_MPU_CLKSTCTRL)
39641d37e61SDave Gerlacham43xx_virt_mpu_clkctrl:
39741d37e61SDave Gerlach	.word	(AM43XX_CM_MPU_MPU_CLKCTRL)
39841d37e61SDave Gerlacham43xx_virt_emif_clkctrl:
39941d37e61SDave Gerlach	.word	(AM43XX_CM_PER_EMIF_CLKCTRL)
40041d37e61SDave Gerlacham43xx_phys_emif_clkctrl:
40141d37e61SDave Gerlach	.word	(AM43XX_CM_BASE + AM43XX_CM_PER_INST + \
40241d37e61SDave Gerlach		 AM43XX_CM_PER_EMIF_CLKCTRL_OFFSET)
40341d37e61SDave Gerlach
40403de3727SArnd Bergmann#ifdef CONFIG_CACHE_L2X0
40541d37e61SDave Gerlach/* L2 cache related defines for AM437x */
40603de3727SArnd Bergmannget_l2cache_base:
40703de3727SArnd Bergmann	.word	omap4_get_l2cache_base
40841d37e61SDave Gerlachl2_cache_base:
40941d37e61SDave Gerlach	.word	OMAP44XX_L2CACHE_BASE
41041d37e61SDave Gerlachl2_smc1:
41141d37e61SDave Gerlach	.word	OMAP4_MON_L2X0_PREFETCH_INDEX
41241d37e61SDave Gerlachl2_smc2:
41341d37e61SDave Gerlach	.word	OMAP4_MON_L2X0_AUXCTRL_INDEX
41441d37e61SDave Gerlachl2_smc3:
41541d37e61SDave Gerlach	.word	OMAP4_MON_L2X0_CTRL_INDEX
41641d37e61SDave Gerlachl2_val:
41741d37e61SDave Gerlach	.word	0xffff
41803de3727SArnd Bergmann#endif
41941d37e61SDave Gerlach
42041d37e61SDave Gerlach.align 3
42141d37e61SDave Gerlach/* DDR related defines */
42241d37e61SDave GerlachENTRY(am43xx_emif_sram_table)
42341d37e61SDave Gerlach	.space EMIF_PM_FUNCTIONS_SIZE
42441d37e61SDave Gerlach
42541d37e61SDave GerlachENTRY(am43xx_pm_sram)
42641d37e61SDave Gerlach	.word am43xx_do_wfi
42741d37e61SDave Gerlach	.word am43xx_do_wfi_sz
42841d37e61SDave Gerlach	.word am43xx_resume_offset
42941d37e61SDave Gerlach	.word am43xx_emif_sram_table
43041d37e61SDave Gerlach	.word am43xx_pm_ro_sram_data
43141d37e61SDave Gerlach
43241d37e61SDave Gerlach.align 3
43341d37e61SDave Gerlach
43441d37e61SDave GerlachENTRY(am43xx_pm_ro_sram_data)
43541d37e61SDave Gerlach	.space AMX3_PM_RO_SRAM_DATA_SIZE
43641d37e61SDave Gerlach
43741d37e61SDave GerlachENTRY(am43xx_do_wfi_sz)
43841d37e61SDave Gerlach	.word	. - am43xx_do_wfi
439