summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--exynos-gs101-reboot.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/exynos-gs101-reboot.c b/exynos-gs101-reboot.c
index c9bd602..834b4e8 100644
--- a/exynos-gs101-reboot.c
+++ b/exynos-gs101-reboot.c
@@ -31,11 +31,14 @@
#define BMS_RSBM_VALID BIT(31)
+#define DUMP_GPR_MODE (0xDAB)
+
static struct regmap *pmureg;
static u32 warm_reboot_offset, warm_reboot_trigger;
static u32 cold_reboot_offset, cold_reboot_trigger;
static u32 reboot_cmd_offset;
static u32 shutdown_offset, shutdown_trigger;
+static u32 dump_gpr_offset;
static phys_addr_t pmu_alive_base;
static bool rsbm_supported;
static bool force_warm_reboot_on_thermal_shutdown;
@@ -199,6 +202,11 @@ static int exynos_restart_handler(struct notifier_block *this, unsigned long mod
/* Do S/W Reset */
pr_emerg("%s: Exynos SoC reset right now\n", __func__);
+ if (reboot_mode == REBOOT_WARM || reboot_mode == REBOOT_SOFT)
+ set_priv_reg(pmu_alive_base + dump_gpr_offset, DUMP_GPR_MODE);
+ else
+ set_priv_reg(pmu_alive_base + dump_gpr_offset, 0x0);
+
if (s2mpg10_get_rev_id() == S2MPG10_EVT0 || !rsbm_supported ||
reboot_mode == REBOOT_WARM || reboot_mode == REBOOT_SOFT) {
set_priv_reg(pmu_alive_base + warm_reboot_offset, warm_reboot_trigger);
@@ -274,6 +282,11 @@ static int exynos_reboot_probe(struct platform_device *pdev)
reboot_cmd_offset = EXYNOS_PMU_SYSIP_DAT0;
}
+ if (of_property_read_u32(np, "dump-gpr-offset", &dump_gpr_offset) < 0) {
+ dev_err(dev, "failed to find dump-gpr-offset property\n");
+ return -EINVAL;
+ }
+
force_warm_reboot_on_thermal_shutdown = of_property_read_bool(np,
"force-warm-reboot-on-thermal-shutdown");