diff --git a/drivers/power/reset/msm-poweroff.c b/drivers/power/reset/msm-poweroff.c index d4cd4fa4c451..5ce3ba641c32 100644 --- a/drivers/power/reset/msm-poweroff.c +++ b/drivers/power/reset/msm-poweroff.c @@ -505,6 +505,17 @@ static void msm_restart_prepare(const char *cmd) RESET_EXTRA_POST_PANIC_REASON); /* force cold reboot */ qpnp_pon_system_pwr_off(PON_POWER_OFF_HARD_RESET); + } else if (!strncmp(cmd, "hw_warmreset", 13)) { + qpnp_pon_set_restart_reason( + PON_RESTART_REASON_HW_WARMRESET); + qpnp_pon_system_pwr_off(PON_POWER_OFF_WARM_RESET); + pr_info("set system hw warmreset mode\n"); + } else if (!strncmp(cmd, "post-hw_warmreset", 17)) { + /* set flag in PMIC to nofity BL post hw_warmreset reboot */ + qpnp_pon_store_extra_reset_info(RESET_EXTRA_POST_REBOOT_MASK, + RESET_EXTRA_POST_HWWARM_RESET_REASON); + /* force cold reboot */ + qpnp_pon_system_pwr_off(PON_POWER_OFF_HARD_RESET); } else { __raw_writel(0x77665501, restart_reason); } diff --git a/include/linux/input/qpnp-power-on.h b/include/linux/input/qpnp-power-on.h index 01c65317d4ca..92d81b30849f 100644 --- a/include/linux/input/qpnp-power-on.h +++ b/include/linux/input/qpnp-power-on.h @@ -55,8 +55,10 @@ enum pon_restart_reason { PON_RESTART_REASON_DMVERITY_CORRUPTED = 0x04, PON_RESTART_REASON_DMVERITY_ENFORCE = 0x05, PON_RESTART_REASON_KEYS_CLEAR = 0x06, + PON_RESTART_REASON_HW_WARMRESET = 0x18, }; +#define RESET_EXTRA_POST_HWWARM_RESET_REASON BIT(6) #define RESET_EXTRA_POST_PANIC_REASON (BIT(4) | BIT(5)) #define RESET_EXTRA_POST_PMICWDT_REASON BIT(5) #define RESET_EXTRA_POST_WDT_REASON BIT(4)