]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
power: pmic: pca9450: Add support for reset status
authorPrimoz Fiser <primoz.fiser@norik.com>
Thu, 28 Aug 2025 11:24:05 +0000 (13:24 +0200)
committerPeng Fan <peng.fan@nxp.com>
Mon, 1 Sep 2025 02:33:09 +0000 (10:33 +0800)
PCA9450 PMIC supports reading the reset status from the PWRON_STAT
register. Bits 7-4 give indication of the PMIC reset cause:

 - PWRON (BIT7) - Power ON triggered by PMIC_ON_REQ input line,
 - WDOGB (BIT6) - Boot after cold reset by WDOGB pin (watchdog reset),
 - SW_RST (BIT5) - Boot after cold reset initiated by the software,
 - PMIC_RST (BIT4) - Boot after PMIC_RST_B input line trigger.

Add support for reading reset status via the sysreset framework in a
convenient printable format.

Signed-off-by: Primoz Fiser <primoz.fiser@norik.com>
Reviewed-by: Paul Geurts <paul.geurts@prodrive-technologies.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
drivers/power/pmic/pca9450.c
include/power/pca9450.h

index 8b98c2239e135e495ec39dfb54ef07b7f88216dc..e5c1f037b613400e2b0f465983bbaa70471d97b1 100644 (file)
@@ -146,8 +146,46 @@ static int pca9450_sysreset_request(struct udevice *dev, enum sysreset_t type)
        return -EINPROGRESS;
 }
 
+int pca9450_sysreset_get_status(struct udevice *dev, char *buf, int size)
+{
+       const char *reason;
+       int ret;
+       u8 reg;
+
+       ret = pmic_read(dev->parent, PCA9450_PWRON_STAT, &reg, 1);
+       if (ret)
+               return ret;
+
+       switch (reg) {
+       case PCA9450_PWRON_STAT_PWRON_MASK:
+               reason = "PWRON";
+               break;
+       case PCA9450_PWRON_STAT_WDOG_MASK:
+               reason = "WDOGB";
+               break;
+       case PCA9450_PWRON_STAT_SW_RST_MASK:
+               reason = "SW_RST";
+               break;
+       case PCA9450_PWRON_STAT_PMIC_RST_MASK:
+               reason = "PMIC_RST";
+               break;
+       default:
+               reason = "UNKNOWN";
+               break;
+       }
+
+       ret = snprintf(buf, size, "Reset Status: %s\n", reason);
+       if (ret < 0) {
+               dev_err(dev, "Write reset status error (err = %d)\n", ret);
+               return -EIO;
+       }
+
+       return 0;
+}
+
 static struct sysreset_ops pca9450_sysreset_ops = {
        .request        = pca9450_sysreset_request,
+       .get_status     = pca9450_sysreset_get_status,
 };
 
 U_BOOT_DRIVER(pca9450_sysreset) = {
index 9119ef793b1fa72d7af6c80b6ee6a1227f2ffa65..41b7f95c0340ed8d739046093dff1d0dfa07b627 100644 (file)
@@ -75,6 +75,11 @@ enum {
 #define PCA9450_PMIC_RESET_WDOG_B_CFG_WARM             0x40
 #define PCA9450_PMIC_RESET_WDOG_B_CFG_COLD_LDO12       0x80
 
+#define PCA9450_PWRON_STAT_PWRON_MASK          0x80
+#define PCA9450_PWRON_STAT_WDOG_MASK           0x40
+#define PCA9450_PWRON_STAT_SW_RST_MASK         0x20
+#define PCA9450_PWRON_STAT_PMIC_RST_MASK               0x10
+
 #define PCA9450_SW_RST_COLD_RST                0x14
 
 #endif