summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrimoz Fiser <[email protected]>2025-08-28 13:24:05 +0200
committerPeng Fan <[email protected]>2025-09-01 10:33:09 +0800
commitad197b31b3f88d53c349995d8bbaeba4b18b8f2b (patch)
tree02c7c6d56f5b2768ff7f7e88f816d296b38115a2
parent9065b87f35018a4e993e7dfb8a8ec29474785f76 (diff)
power: pmic: pca9450: Add support for reset status
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 <[email protected]> Reviewed-by: Paul Geurts <[email protected]> Signed-off-by: Peng Fan <[email protected]>
-rw-r--r--drivers/power/pmic/pca9450.c38
-rw-r--r--include/power/pca9450.h5
2 files changed, 43 insertions, 0 deletions
diff --git a/drivers/power/pmic/pca9450.c b/drivers/power/pmic/pca9450.c
index 8b98c2239e1..e5c1f037b61 100644
--- a/drivers/power/pmic/pca9450.c
+++ b/drivers/power/pmic/pca9450.c
@@ -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) = {
diff --git a/include/power/pca9450.h b/include/power/pca9450.h
index 9119ef793b1..41b7f95c034 100644
--- a/include/power/pca9450.h
+++ b/include/power/pca9450.h
@@ -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