[PATCH v4 05/19] mach-k3: r5: common: introduce k3_deassert_ddr_ret()
Richard Genoud (TI)
richard.genoud at bootlin.com
Thu Jun 25 09:15:01 CEST 2026
Deasserting DDR retention pin is quite similar from J7200, J784s4,
J721e, and j721s2 SoCs.
Instead of duplicating almost the same code, add it in lpm-common.c.
NB: On J7200, there's a latch, so the clock needs to be toggled.
Signed-off-by: Richard Genoud (TI) <richard.genoud at bootlin.com>
---
arch/arm/mach-k3/lpm-common.h | 2 ++
arch/arm/mach-k3/r5/lpm-common.c | 27 +++++++++++++++++++++++++++
2 files changed, 29 insertions(+)
diff --git a/arch/arm/mach-k3/lpm-common.h b/arch/arm/mach-k3/lpm-common.h
index 2b360e6f03f3..2e3ea4428124 100644
--- a/arch/arm/mach-k3/lpm-common.h
+++ b/arch/arm/mach-k3/lpm-common.h
@@ -11,5 +11,7 @@
void __noreturn do_resume(void);
void lpm_process(void);
+void k3_deassert_ddr_ret(const char *pmic_name, unsigned int ddr_ret_val,
+ unsigned int ddr_ret_clk, bool toggle);
#endif
diff --git a/arch/arm/mach-k3/r5/lpm-common.c b/arch/arm/mach-k3/r5/lpm-common.c
index 95f777c5029f..afc6b5cf5376 100644
--- a/arch/arm/mach-k3/r5/lpm-common.c
+++ b/arch/arm/mach-k3/r5/lpm-common.c
@@ -41,6 +41,33 @@ struct lpm_addr_info {
/* This is used by J722s */
__weak void ctrl_mmr_unlock(void) { }
+#define GPIO_OUT_1 0x3D
+void k3_deassert_ddr_ret(const char *pmic_name, unsigned int ddr_ret_val,
+ unsigned int ddr_ret_clk, bool toggle)
+{
+ struct udevice *pmic;
+ int regval;
+ int err;
+
+ err = uclass_get_device_by_name(UCLASS_PMIC, pmic_name, &pmic);
+ if (err) {
+ printf("Getting %s init failed: %d\n", pmic_name, err);
+ return;
+ }
+
+ /* Set DDR_RET Signal Low on PMIC */
+ regval = pmic_reg_read(pmic, GPIO_OUT_1) & ~ddr_ret_val;
+ pmic_reg_write(pmic, GPIO_OUT_1, regval);
+
+ if (toggle) {
+ /* Now toggle the CLK of the latch for DDR retention */
+ pmic_reg_write(pmic, GPIO_OUT_1, regval | ddr_ret_clk);
+ pmic_reg_write(pmic, GPIO_OUT_1, regval & ~ddr_ret_clk);
+ pmic_reg_write(pmic, GPIO_OUT_1, regval | ddr_ret_clk);
+ pmic_reg_write(pmic, GPIO_OUT_1, regval & ~ddr_ret_clk);
+ }
+}
+
/* in board_init_f(), there's no BSS, so we can't use global/static variables */
bool j7xx_board_is_resuming(void)
{
More information about the U-Boot
mailing list