diff options
-rw-r--r-- | exynos-gs101-reboot.c | 13 |
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"); |