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