summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJone Chou <jonechou@google.com>2022-02-14 23:15:34 +0800
committerJone Chou <jonechou@google.com>2022-02-22 07:30:15 +0000
commit3a3fccafb5469eaf8ab18c758aa2853b82bbd1cd (patch)
treef5d9ec2b192645194b431b3fd47b1c062954db96
parentf111f3d32ad5cd2d003c7ee23e036f7173543fdf (diff)
downloadreset-3a3fccafb5469eaf8ab18c758aa2853b82bbd1cd.tar.gz
power: reset: support psci sys reset and poweroff
Both will be handled by TF-A. Bug: 201317385 Signed-off-by: Jone Chou <jonechou@google.com> Change-Id: I9336ab6cf8e76b6cde1b2506de606f0480035464
-rw-r--r--exynos-gs201-reboot.c66
1 files changed, 20 insertions, 46 deletions
diff --git a/exynos-gs201-reboot.c b/exynos-gs201-reboot.c
index ee49dde..915d4aa 100644
--- a/exynos-gs201-reboot.c
+++ b/exynos-gs201-reboot.c
@@ -55,36 +55,6 @@ enum pon_reboot_mode {
REBOOT_MODE_RECOVERY = 0xFF,
};
-static void exynos_power_off(void)
-{
- u32 poweroff_try = 0;
- int ret;
-
- while (1) {
- /* wait for power button release */
- if ((poweroff_try) || (!pmic_read_pwrkey_status())) {
-#if IS_ENABLED(CONFIG_GS_ACPM)
- exynos_acpm_reboot();
-#endif
- pr_emerg("Set PS_HOLD Low.\n");
- ret = rmw_priv_reg(pmu_alive_base + shutdown_offset, shutdown_trigger, 0);
- /* TODO: remove following fallback. see b/169128860 */
- if (ret)
- regmap_update_bits(pmureg, shutdown_offset, shutdown_trigger, 0);
-
- ++poweroff_try;
- pr_emerg("Should not reach here! (poweroff_try:%d)\n", poweroff_try);
- } else {
- /*
- * if power button is not released,
- * wait and check TA again
- */
- pr_info("PWR Key is not released.\n");
- }
- mdelay(1000);
- }
-}
-
static void exynos_reboot_mode_set(u32 val)
{
int ret;
@@ -146,6 +116,24 @@ static int exynos_reboot_handler(struct notifier_block *nb, unsigned long mode,
{
exynos_reboot_parse(cmd);
+ if (mode != SYS_POWER_OFF)
+ return NOTIFY_DONE;
+
+ while (1) {
+ /* wait for power button release */
+ if (!pmic_read_pwrkey_status()) {
+ pr_info("ready to do power off.\n");
+ break;
+ } else {
+ /*
+ * if power button is not released,
+ * wait and check TA again
+ */
+ pr_info("PWR Key is not released.\n");
+ }
+ mdelay(1000);
+ }
+
return NOTIFY_DONE;
}
@@ -157,23 +145,10 @@ static struct notifier_block exynos_reboot_nb = {
static int exynos_restart_handler(struct notifier_block *this, unsigned long mode, void *cmd)
{
#if IS_ENABLED(CONFIG_GS_ACPM)
- exynos_acpm_reboot();
+ acpm_prepare_reboot();
#endif
- /* Do S/W Reset */
- pr_emerg("%s: Exynos SoC reset right now\n", __func__);
-
- if (!dbg_snapshot_get_reboot_status() || dbg_snapshot_get_panic_status() ||
- dbg_snapshot_get_warm_status()) {
- set_priv_reg(pmu_alive_base + warm_reboot_offset, warm_reboot_trigger);
- } else {
- pr_emerg("Set PS_HOLD Low.\n");
- mdelay(2);
- rmw_priv_reg(pmu_alive_base + cold_reboot_offset, cold_reboot_trigger, 0);
- }
-
- while (1)
- wfi();
+ pr_info("ready to do restart.\n");
return NOTIFY_DONE;
}
@@ -251,7 +226,6 @@ static int exynos_reboot_probe(struct platform_device *pdev)
return err;
}
- pm_power_off = exynos_power_off;
dev_info(dev, "register restart handler successfully\n");
return 0;