69 lines
1.3 KiB
ArmAsm
69 lines
1.3 KiB
ArmAsm
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||
|
/*
|
||
|
* Copyright © 2014-2017 Broadcom
|
||
|
*/
|
||
|
|
||
|
#include <linux/linkage.h>
|
||
|
#include <asm/assembler.h>
|
||
|
|
||
|
#include "pm.h"
|
||
|
|
||
|
.text
|
||
|
.align 3
|
||
|
|
||
|
#define AON_CTRL_REG r10
|
||
|
#define DDR_PHY_STATUS_REG r11
|
||
|
|
||
|
/*
|
||
|
* r0: AON_CTRL base address
|
||
|
* r1: DDRY PHY PLL status register address
|
||
|
*/
|
||
|
ENTRY(brcmstb_pm_do_s2)
|
||
|
stmfd sp!, {r4-r11, lr}
|
||
|
mov AON_CTRL_REG, r0
|
||
|
mov DDR_PHY_STATUS_REG, r1
|
||
|
|
||
|
/* Flush memory transactions */
|
||
|
dsb
|
||
|
|
||
|
/* Cache DDR_PHY_STATUS_REG translation */
|
||
|
ldr r0, [DDR_PHY_STATUS_REG]
|
||
|
|
||
|
/* power down request */
|
||
|
ldr r0, =PM_S2_COMMAND
|
||
|
ldr r1, =0
|
||
|
str r1, [AON_CTRL_REG, #AON_CTRL_PM_CTRL]
|
||
|
ldr r1, [AON_CTRL_REG, #AON_CTRL_PM_CTRL]
|
||
|
str r0, [AON_CTRL_REG, #AON_CTRL_PM_CTRL]
|
||
|
ldr r0, [AON_CTRL_REG, #AON_CTRL_PM_CTRL]
|
||
|
|
||
|
/* Wait for interrupt */
|
||
|
wfi
|
||
|
nop
|
||
|
|
||
|
/* Bring MEMC back up */
|
||
|
1: ldr r0, [DDR_PHY_STATUS_REG]
|
||
|
ands r0, #1
|
||
|
beq 1b
|
||
|
|
||
|
/* Power-up handshake */
|
||
|
ldr r0, =1
|
||
|
str r0, [AON_CTRL_REG, #AON_CTRL_HOST_MISC_CMDS]
|
||
|
ldr r0, [AON_CTRL_REG, #AON_CTRL_HOST_MISC_CMDS]
|
||
|
|
||
|
ldr r0, =0
|
||
|
str r0, [AON_CTRL_REG, #AON_CTRL_PM_CTRL]
|
||
|
ldr r0, [AON_CTRL_REG, #AON_CTRL_PM_CTRL]
|
||
|
|
||
|
/* Return to caller */
|
||
|
ldr r0, =0
|
||
|
ldmfd sp!, {r4-r11, pc}
|
||
|
|
||
|
ENDPROC(brcmstb_pm_do_s2)
|
||
|
|
||
|
/* Place literal pool here */
|
||
|
.ltorg
|
||
|
|
||
|
ENTRY(brcmstb_pm_do_s2_sz)
|
||
|
.word . - brcmstb_pm_do_s2
|