From: "Richard Genoud (TI)" <richard.genoud@bootlin.com>
To: Tom Rini <trini@konsulko.com>,
Manorit Chawdhry <m-chawdhry@ti.com>,
Apurva Nandan <a-nandan@ti.com>, "Andrew F . Davis" <afd@ti.com>,
Vignesh Raghavendra <vigneshr@ti.com>, Bryan Brattlof <bb@ti.com>,
Vaishnav Achath <vaishnav.a@ti.com>,
Jayesh Choudhary <j-choudhary@ti.com>,
Simon Glass <sjg@chromium.org>,
Alper Nebi Yasak <alpernebiyasak@gmail.com>
Cc: Markus Schneider-Pargmann <msp@baylibre.com>,
Kendall Willis <k-willis@ti.com>, Udit Kumar <u-kumar1@ti.com>,
Abhash Kumar <a-kumar2@ti.com>,
Thomas Richard <thomas.richard@bootlin.com>,
Gregory CLEMENT <gregory.clement@bootlin.com>,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
Richard Genoud <richard.genoud@bootlin.com>,
u-boot@lists.u-boot-project.org
Subject: [PATCH v5 06/21] mach-k3: r5: common: introduce j7xx_board_is_resuming()
Date: Fri, 28 Aug 2026 15:57:15 +0200 [thread overview]
Message-ID: <20260828135730.1565643-7-richard.genoud@bootlin.com> (raw)
In-Reply-To: <20260828135730.1565643-1-richard.genoud@bootlin.com>
Add the capability to detect a resume on J7200, J784s4, J721e, j722s,
j721s2 SoCs.
To detect the resume, SPL searches a magic value (0xBA) in a register
of PMIC.
This value is set by DM-Firmware during the suspend sequence.
NB: As this is called in board_init_f(), there's no BSS, so we can't
use global/static variables.
NB2: For j722s HS-* devices, we need an extra call to ctrl_mmr_unlock(),
and we have to use I2C API instead of PMIC API for this to work.
This is because bind is called before anything comes up, in between either
bootrom or TIFS messing up, clearing pad config and pd config.
Signed-off-by: Richard Genoud (TI) <richard.genoud@bootlin.com>
---
arch/arm/mach-k3/common.c | 6 ++
arch/arm/mach-k3/include/mach/hardware.h | 1 +
arch/arm/mach-k3/r5/lpm-common.c | 78 +++++++++++++++++++++++-
3 files changed, 83 insertions(+), 2 deletions(-)
diff --git a/arch/arm/mach-k3/common.c b/arch/arm/mach-k3/common.c
index 6e382efdb3be..d934f732b330 100644
--- a/arch/arm/mach-k3/common.c
+++ b/arch/arm/mach-k3/common.c
@@ -713,3 +713,9 @@ int spl_start_uboot(void)
return 0;
}
#endif
+
+/* if r5/lpm-common.c is compiled, this will be overridden */
+__weak bool j7xx_board_is_resuming(void)
+{
+ return false;
+}
diff --git a/arch/arm/mach-k3/include/mach/hardware.h b/arch/arm/mach-k3/include/mach/hardware.h
index 2c771a1195f5..c45bd3747163 100644
--- a/arch/arm/mach-k3/include/mach/hardware.h
+++ b/arch/arm/mach-k3/include/mach/hardware.h
@@ -137,6 +137,7 @@ u32 get_boot_device(void);
const char *get_reset_reason(void);
enum k3_device_type get_device_type(void);
int k3_fit_config_match_security_state(const char *name);
+bool j7xx_board_is_resuming(void);
#define writel_verify(val, addr) \
do { \
diff --git a/arch/arm/mach-k3/r5/lpm-common.c b/arch/arm/mach-k3/r5/lpm-common.c
index 9b91081e4f0f..c1a8c8e940de 100644
--- a/arch/arm/mach-k3/r5/lpm-common.c
+++ b/arch/arm/mach-k3/r5/lpm-common.c
@@ -6,18 +6,28 @@
* Copyright (C) 2026 Bootlin
*/
+#include <asm/global_data.h>
#include <clk.h>
+#include <dm/device.h>
#include <dm/read.h>
#include <elf.h>
+#include <i2c.h>
#include <linux/printk.h>
#include <linux/soc/ti/ti_sci_protocol.h>
#include <power-domain.h>
+#include <power/pmic.h>
#include <remoteproc.h>
#include <mach/security.h>
#include "../common.h"
#include "../lpm-common.h"
+/* Magic value in PMIC register to indicate the suspend state (SOC_OFF) */
+#define K3_LPM_MAGIC_SUSPEND 0xba
+
+/* PMIC register where the magic value resides */
+#define K3_LPM_SCRATCH_PAD_REG_3 0xcb
+
#define FW_IMAGE_SIZE 0x80000
struct lpm_addr_info {
@@ -28,9 +38,73 @@ struct lpm_addr_info {
u32 size;
};
-__weak bool j7xx_board_is_resuming(void)
+/* This is used by J722s */
+__weak void ctrl_mmr_unlock(void) { }
+
+/* in board_init_f(), there's no BSS, so we can't use global/static variables */
+bool j7xx_board_is_resuming(void)
{
- return false;
+ struct udevice *pmic, *i2c;
+ int ret, magic;
+
+ if (gd_k3_resuming() != K3_RESUME_STATE_UNKNOWN)
+ goto end;
+
+ if (IS_ENABLED(CONFIG_SOC_K3_J722S)) {
+ /*
+ * On J722S devices, i2c access fails unless MMR
+ * registers are unlocked.
+ * Moreover, it fails also if we use PMIC API instead of I2C API.
+ */
+ ctrl_mmr_unlock();
+ ret = uclass_get_device_by_name(UCLASS_I2C,
+ "i2c@2b200000", &i2c);
+ if (ret) {
+ printf("Getting I2C failed: %d\n", ret);
+ goto end;
+ }
+ ret = dm_i2c_probe(i2c, 0x48, 0, &pmic);
+ if (ret) {
+ printf("Getting PMIC failed: %d\n", ret);
+ goto end;
+ }
+ } else {
+ ret = uclass_get_device_by_name(UCLASS_PMIC,
+ "pmic@48", &pmic);
+ if (ret) {
+ printf("Getting PMIC init failed: %d\n", ret);
+ goto end;
+ }
+ }
+ debug("%s: PMIC is detected (%s)\n", __func__, pmic->name);
+
+ if (IS_ENABLED(CONFIG_SOC_K3_J722S))
+ magic = dm_i2c_reg_read(pmic, K3_LPM_SCRATCH_PAD_REG_3);
+ else
+ magic = pmic_reg_read(pmic, K3_LPM_SCRATCH_PAD_REG_3);
+
+ if (magic == K3_LPM_MAGIC_SUSPEND) {
+ debug("%s: board is resuming\n", __func__);
+ gd_set_k3_resuming(K3_RESUME_STATE_RESUMING);
+
+ /* clean magic suspend */
+ if (IS_ENABLED(CONFIG_SOC_K3_J722S))
+ ret = dm_i2c_reg_write(pmic, K3_LPM_SCRATCH_PAD_REG_3, 0);
+ else
+ ret = pmic_reg_write(pmic, K3_LPM_SCRATCH_PAD_REG_3, 0);
+
+ if (ret)
+ printf("Failed to clean magic value for suspend detection in PMIC\n");
+ /*
+ * For robustness, the DM should also clean the magic value at
+ * startup.
+ */
+ } else {
+ debug("%s: board is booting (no resume detected)\n", __func__);
+ gd_set_k3_resuming(K3_RESUME_STATE_BOOTING);
+ }
+end:
+ return gd_k3_resuming() == K3_RESUME_STATE_RESUMING;
}
static const char *lpm_core_compatible;
next prev parent reply other threads:[~2026-08-28 13:58 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-28 13:57 [PATCH v5 00/21] Introduce resume for J7xx SoCs Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 01/21] ram: k3-ddrss: Add support for DDR in self-refresh Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 02/21] firmware: ti_sci: Add TI_SCI_MSG_MIN_CONTEXT_RESTORE Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 03/21] firmware: ti_sci: add low power mode operations Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 04/21] mach-k3: r5: common: add helper functions needed in LPM resume sequence Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 05/21] global: k3: use gd to store the resume state Richard Genoud (TI)
2026-08-28 13:57 ` Richard Genoud (TI) [this message]
2026-08-28 13:57 ` [PATCH v5 07/21] mach-k3: r5: common: introduce k3_deassert_ddr_ret() Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 08/21] board: mach-k3: r5: common: enable GTC after core_resume Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 09/21] board: evm: Enable de-isolation of IOs at resume for j7200 and j784s4 Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 10/21] board: mach-k3: r5: common: Store wakeup reason on scratchpad memory Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 11/21] board: mach-k3: r5: common: Set PMIC NSLEEP triggers bits at resume Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 12/21] ram: k3-ddrss: Add exit retention support Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 13/21] ram: k3-ddrss: Add j722s DDR resume sequence Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 14/21] ram: k3-ddrss: support j784s4/j721e/j721s2 DDR resume Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 15/21] arm: mach-k3: j721e: Enable LPM resume flow for J7200/J721e SOC Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 16/21] arm: mach-k3: j784s4: Enable LPM resume flow for J784s4/J742s2 SOCs Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 17/21] arm: mach-k3: j722s: Enable LPM resume flow Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 18/21] arm: mach-k3: j721s2: " Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 19/21] arm: mach-k3: Update pm-boardcfg for all k3 platforms Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 20/21] arm: dts: k3-j7200: Remove background firewall on DDR Richard Genoud (TI)
2026-08-28 13:57 ` [PATCH v5 21/21] arm: dts: k3-j7200: Extend firewall for ATF region to TIFS Richard Genoud (TI)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260828135730.1565643-7-richard.genoud@bootlin.com \
--to=richard.genoud@bootlin.com \
--cc=a-kumar2@ti.com \
--cc=a-nandan@ti.com \
--cc=afd@ti.com \
--cc=alpernebiyasak@gmail.com \
--cc=bb@ti.com \
--cc=gregory.clement@bootlin.com \
--cc=j-choudhary@ti.com \
--cc=k-willis@ti.com \
--cc=m-chawdhry@ti.com \
--cc=msp@baylibre.com \
--cc=sjg@chromium.org \
--cc=thomas.petazzoni@bootlin.com \
--cc=thomas.richard@bootlin.com \
--cc=trini@konsulko.com \
--cc=u-boot@lists.u-boot-project.org \
--cc=u-kumar1@ti.com \
--cc=vaishnav.a@ti.com \
--cc=vigneshr@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.