diff options
| author | Lijuan Gao <lijuang@codeaurora.org> | 2017-12-06 16:20:35 +0800 |
|---|---|---|
| committer | Lijuan Gao <lijuang@codeaurora.org> | 2017-12-11 19:11:18 +0800 |
| commit | 25c63fa374f6f23f948ad9c1ec9ed2a0962502e6 (patch) | |
| tree | 1f3cf56d1703d627b4b167e26863880c0f64481f | |
| parent | 4f8f0737764aefd860f16eca0af844a639f8a11b (diff) | |
drivers: power: reset: Do cold reset when doing oem reboot
As the IMEM approach to store reset reason is deprecated, so use
the spare register in PMIC power-on peripheral to store the oem
restart reason.
Bit-2 to bit-7 of SOFT_RB_SPARE for hard reset reason, so divide
existing range into regions, value 0 to 31 for common defined features
and 32 to 63 values are for OEMs/ODMs specific features.
Change-Id: Ib8e64d6dd5a335325d0469280e41e9d10ec9b893
Signed-off-by: Lijuan Gao <lijuang@codeaurora.org>
| -rw-r--r-- | drivers/power/reset/msm-poweroff.c | 19 | ||||
| -rw-r--r-- | include/linux/input/qpnp-power-on.h | 5 |
2 files changed, 23 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 { diff --git a/include/linux/input/qpnp-power-on.h b/include/linux/input/qpnp-power-on.h index a2624ab57826..5944f0fd3414 100644 --- a/include/linux/input/qpnp-power-on.h +++ b/include/linux/input/qpnp-power-on.h @@ -51,6 +51,7 @@ enum pon_power_off_type { }; enum pon_restart_reason { + /* 0 ~ 31 for common defined features */ PON_RESTART_REASON_UNKNOWN = 0x00, PON_RESTART_REASON_RECOVERY = 0x01, PON_RESTART_REASON_BOOTLOADER = 0x02, @@ -58,6 +59,10 @@ enum pon_restart_reason { PON_RESTART_REASON_DMVERITY_CORRUPTED = 0x04, PON_RESTART_REASON_DMVERITY_ENFORCE = 0x05, PON_RESTART_REASON_KEYS_CLEAR = 0x06, + + /* 32 ~ 63 for OEMs/ODMs secific features */ + PON_RESTART_REASON_OEM_MIN = 0x20, + PON_RESTART_REASON_OEM_MAX = 0x3f, }; #ifdef CONFIG_INPUT_QPNP_POWER_ON |
