Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 87ffc69e authored by Guenter Roeck's avatar Guenter Roeck
Browse files

watchdog: alim7101: register restart handler with kernel restart handler



The kernel core now provides an API to trigger a system restart.  Register
with it to restart the system instead of misusing the reboot notifier.

Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Acked-by: default avatarHeiko Stuebner <heiko@sntech.de>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jonas Jensen <jonas.jensen@gmail.com>
Cc: Maxime Ripard <maxime.ripard@free-electrons.com>
Cc: Randy Dunlap <rdunlap@infradead.org>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Tomasz Figa <t.figa@samsung.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Wim Van Sebroeck <wim@iguana.be>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent ad0e0e68
Loading
Loading
Loading
Loading
+32 −10
Original line number Original line Diff line number Diff line
@@ -301,6 +301,28 @@ static struct miscdevice wdt_miscdev = {
	.fops	=	&wdt_fops,
	.fops	=	&wdt_fops,
};
};


static int wdt_restart_handle(struct notifier_block *this, unsigned long mode,
			      void *cmd)
{
	/*
	 * Cobalt devices have no way of rebooting themselves other
	 * than getting the watchdog to pull reset, so we restart the
	 * watchdog on reboot with no heartbeat.
	 */
	wdt_change(WDT_ENABLE);

	/* loop until the watchdog fires */
	while (true)
		;

	return NOTIFY_DONE;
}

static struct notifier_block wdt_restart_handler = {
	.notifier_call = wdt_restart_handle,
	.priority = 128,
};

/*
/*
 *	Notifier for system down
 *	Notifier for system down
 */
 */
@@ -311,15 +333,6 @@ static int wdt_notify_sys(struct notifier_block *this,
	if (code == SYS_DOWN || code == SYS_HALT)
	if (code == SYS_DOWN || code == SYS_HALT)
		wdt_turnoff();
		wdt_turnoff();


	if (code == SYS_RESTART) {
		/*
		 * Cobalt devices have no way of rebooting themselves other
		 * than getting the watchdog to pull reset, so we restart the
		 * watchdog on reboot with no heartbeat
		 */
		wdt_change(WDT_ENABLE);
		pr_info("Watchdog timer is now enabled with no heartbeat - should reboot in ~1 second\n");
	}
	return NOTIFY_DONE;
	return NOTIFY_DONE;
}
}


@@ -338,6 +351,7 @@ static void __exit alim7101_wdt_unload(void)
	/* Deregister */
	/* Deregister */
	misc_deregister(&wdt_miscdev);
	misc_deregister(&wdt_miscdev);
	unregister_reboot_notifier(&wdt_notifier);
	unregister_reboot_notifier(&wdt_notifier);
	unregister_restart_handler(&wdt_restart_handler);
	pci_dev_put(alim7101_pmu);
	pci_dev_put(alim7101_pmu);
}
}


@@ -390,11 +404,17 @@ static int __init alim7101_wdt_init(void)
		goto err_out;
		goto err_out;
	}
	}


	rc = register_restart_handler(&wdt_restart_handler);
	if (rc) {
		pr_err("cannot register restart handler (err=%d)\n", rc);
		goto err_out_reboot;
	}

	rc = misc_register(&wdt_miscdev);
	rc = misc_register(&wdt_miscdev);
	if (rc) {
	if (rc) {
		pr_err("cannot register miscdev on minor=%d (err=%d)\n",
		pr_err("cannot register miscdev on minor=%d (err=%d)\n",
		       wdt_miscdev.minor, rc);
		       wdt_miscdev.minor, rc);
		goto err_out_reboot;
		goto err_out_restart;
	}
	}


	if (nowayout)
	if (nowayout)
@@ -404,6 +424,8 @@ static int __init alim7101_wdt_init(void)
		timeout, nowayout);
		timeout, nowayout);
	return 0;
	return 0;


err_out_restart:
	unregister_restart_handler(&wdt_restart_handler);
err_out_reboot:
err_out_reboot:
	unregister_reboot_notifier(&wdt_notifier);
	unregister_reboot_notifier(&wdt_notifier);
err_out:
err_out: