diff options
Diffstat (limited to 'drivers/power/reset/msm-poweroff.c')
| -rw-r--r-- | drivers/power/reset/msm-poweroff.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/power/reset/msm-poweroff.c b/drivers/power/reset/msm-poweroff.c index 209263ccced7..d052e9518060 100644 --- a/drivers/power/reset/msm-poweroff.c +++ b/drivers/power/reset/msm-poweroff.c @@ -328,11 +328,28 @@ static void msm_restart_prepare(const char *cmd) __raw_writel(0x7766550a, restart_reason); } else if (!strncmp(cmd, "oem-", 4)) { unsigned long code; + unsigned long reset_reason; int ret; ret = kstrtoul(cmd + 4, 16, &code); - if (!ret) + if (!ret) { + /* Bit-2 to bit-7 of SOFT_RB_SPARE for hard + * reset reason: + * Value 0 to 31 for common defined features + * Value 32 to 63 for oem specific features + */ + reset_reason = code + + PON_RESTART_REASON_OEM_MIN; + if (reset_reason > PON_RESTART_REASON_OEM_MAX || + reset_reason < PON_RESTART_REASON_OEM_MIN) { + pr_err("Invalid oem reset reason: %lx\n", + reset_reason); + } else { + qpnp_pon_set_restart_reason( + reset_reason); + } __raw_writel(0x6f656d00 | (code & 0xff), restart_reason); + } } else if (!strncmp(cmd, "edl", 3)) { enable_emergency_dload_mode(); } else { |
