diff options
author | Guenter Roeck <linux@roeck-us.net> | 2014-09-30 17:48:35 (GMT) |
---|---|---|
committer | Sebastian Reichel <sre@kernel.org> | 2014-11-17 02:07:10 (GMT) |
commit | 6724534c79ead70e310616d0e4380bb9fbb67c15 (patch) | |
tree | 34f375b2d645dad9b704249ea2350bdc77e700f8 /drivers/power/reset/hisi-reboot.c | |
parent | f59a42d4e177564b9892112af7a4e73d0c91f9b4 (diff) | |
download | linux-6724534c79ead70e310616d0e4380bb9fbb67c15.tar.xz |
power/reset: hisi: Register with kernel restart handler
Register with kernel restart handler instead of setting arm_pm_restart directly.
Cc: Haojian Zhuang <haojian.zhuang@linaro.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers/power/reset/hisi-reboot.c')
-rw-r--r-- | drivers/power/reset/hisi-reboot.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/power/reset/hisi-reboot.c b/drivers/power/reset/hisi-reboot.c index 0c91d02..5385460 100644 --- a/drivers/power/reset/hisi-reboot.c +++ b/drivers/power/reset/hisi-reboot.c @@ -14,27 +14,36 @@ #include <linux/delay.h> #include <linux/io.h> #include <linux/module.h> +#include <linux/notifier.h> #include <linux/of_address.h> #include <linux/platform_device.h> #include <linux/reboot.h> #include <asm/proc-fns.h> -#include <asm/system_misc.h> static void __iomem *base; static u32 reboot_offset; -static void hisi_restart(enum reboot_mode mode, const char *cmd) +static int hisi_restart_handler(struct notifier_block *this, + unsigned long mode, void *cmd) { writel_relaxed(0xdeadbeef, base + reboot_offset); while (1) cpu_do_idle(); + + return NOTIFY_DONE; } +static struct notifier_block hisi_restart_nb = { + .notifier_call = hisi_restart_handler, + .priority = 128, +}; + static int hisi_reboot_probe(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node; + int err; base = of_iomap(np, 0); if (!base) { @@ -47,9 +56,12 @@ static int hisi_reboot_probe(struct platform_device *pdev) return -EINVAL; } - arm_pm_restart = hisi_restart; + err = register_restart_handler(&hisi_restart_nb); + if (err) + dev_err(&pdev->dev, "cannot register restart handler (err=%d)\n", + err); - return 0; + return err; } static struct of_device_id hisi_reboot_of_match[] = { |