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],
+                                                              &regs[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],
+                                                              &regs[ctrl]);
+
+                       do_resume();
+               }
        }
        spl_enable_cache();
 }
-- 
2.47.3

Reply via email to