| /* 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 |