From: "Thomas Richard (TI)" <[email protected]> Add the board specific part of the exit retention sequence for k3-ddrss: - exit DDR from retention - de-assert the DDR_RET pin - restore DDR max frequency - exit DDR from low power Then generic resume path is run.
Signed-off-by: Thomas Richard (TI) <[email protected]> --- arch/arm/mach-k3/j721s2/j721s2_init.c | 73 +++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/arch/arm/mach-k3/j721s2/j721s2_init.c b/arch/arm/mach-k3/j721s2/j721s2_init.c index b5453d8895d4..0dcdc817e5a5 100644 --- a/arch/arm/mach-k3/j721s2/j721s2_init.c +++ b/arch/arm/mach-k3/j721s2/j721s2_init.c @@ -16,12 +16,17 @@ #include <dm/uclass-internal.h> #include <dm/pinctrl.h> #include <dm/root.h> +#include <mach/k3-ddr.h> #include <mmc.h> +#include <power/pmic.h> #include <remoteproc.h> #include "../sysfw-loader.h" +#include "../lpm-common.h" #include "../common.h" +#define MAX_DDR_CONTROLLERS 2 + /* NAVSS North Bridge (NB) */ #define NAVSS0_NBSS_NB0_CFG_MMRS 0x03702000 #define NAVSS0_NBSS_NB1_CFG_MMRS 0x03703000 @@ -250,12 +255,42 @@ bool check_rom_loaded_sysfw(void) return is_rom_loaded_sysfw(&bootdata); } +#define GPIO_OUT_1 0x3D +#define DDR_RET_VAL BIT(3) +#define PMIC_NSLEEP_REG 0x86 + +static void k3_deassert_ddr_ret(void) +{ + struct udevice *pmic; + int regval; + int err; + + err = uclass_get_device_by_name(UCLASS_PMIC, + "pmic@4c", &pmic); + if (err) { + printf("Getting PMIC@4c init failed: %d\n", err); + return; + } + /* Set DDR_RET Signal Low on PMIC B */ + regval = pmic_reg_read(pmic, GPIO_OUT_1) & ~DDR_RET_VAL; + regval &= ~(1 << (4 - 1)); + pmic_reg_write(pmic, GPIO_OUT_1, regval); +} + +__weak bool j7xx_board_is_resuming(void) +{ + return false; +} + void k3_mem_init(void) { struct udevice *dev; - int ret; + int ret, ctrl = 0; if (IS_ENABLED(CONFIG_K3_J721E_DDRSS)) { + struct udevice *devs[MAX_DDR_CONTROLLERS]; + struct k3_ddrss_regs regs[MAX_DDR_CONTROLLERS]; + ret = uclass_get_device_by_name(UCLASS_MISC, "msmc", &dev); if (ret) panic("Probe of msmc failed: %d\n", ret); @@ -263,10 +298,40 @@ void k3_mem_init(void) ret = uclass_get_device(UCLASS_RAM, 0, &dev); if (ret) panic("DRAM 0 init failed: %d\n", ret); + devs[0] = dev; + ctrl++; - ret = uclass_next_device_err(&dev); - if (ret && ret != -ENODEV) - panic("DRAM 1 init failed: %d\n", ret); + while (ctrl < MAX_DDR_CONTROLLERS) { + ret = uclass_next_device_err(&dev); + if (ret == -ENODEV) + break; + + if (ret) + panic("DRAM %d init failed: %d\n", ctrl, ret); + devs[ctrl] = dev; + ctrl++; + } + + if (j7xx_board_is_resuming()) { + /* exit DDRs from retention */ + for (ctrl = 0; ctrl < MAX_DDR_CONTROLLERS; ctrl++) + k3_ddrss_lpddr4_exit_retention(devs[ctrl], + ®s[ctrl]); + + /* de-assert DDR_RET pin */ + k3_deassert_ddr_ret(); + + /* restore DDR max frequency */ + for (ctrl = 0; ctrl < MAX_DDR_CONTROLLERS; ctrl++) + k3_ddrss_lpddr4_change_freq(devs[ctrl]); + + /* exit DDR from low power */ + for (ctrl = 0; ctrl < MAX_DDR_CONTROLLERS; ctrl++) + k3_ddrss_lpddr4_exit_low_power(devs[ctrl], + ®s[ctrl]); + + do_resume(); + } } spl_enable_cache(); } -- 2.47.3

