Commit 0397c5db authored by Guenter Roeck's avatar Guenter Roeck
Browse files

watchdog: tangox: Use watchdog core to install restart handler



Use the infrastructure provided by the watchdog core to install
the restart handler.

Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent a70dcc01
Loading
Loading
Loading
Loading
+13 −21
Original line number Diff line number Diff line
@@ -15,9 +15,7 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/notifier.h>
#include <linux/platform_device.h>
#include <linux/reboot.h>
#include <linux/watchdog.h>

#define DEFAULT_TIMEOUT 30
@@ -47,7 +45,6 @@ struct tangox_wdt_device {
	void __iomem *base;
	unsigned long clk_rate;
	struct clk *clk;
	struct notifier_block restart;
};

static int tangox_wdt_set_timeout(struct watchdog_device *wdt,
@@ -96,24 +93,24 @@ static const struct watchdog_info tangox_wdt_info = {
	.identity = "tangox watchdog",
};

static int tangox_wdt_restart(struct watchdog_device *wdt,
			      unsigned long action, void *data)
{
	struct tangox_wdt_device *dev = watchdog_get_drvdata(wdt);

	writel(1, dev->base + WD_COUNTER);

	return 0;
}

static const struct watchdog_ops tangox_wdt_ops = {
	.start		= tangox_wdt_start,
	.stop		= tangox_wdt_stop,
	.set_timeout	= tangox_wdt_set_timeout,
	.get_timeleft	= tangox_wdt_get_timeleft,
	.restart	= tangox_wdt_restart,
};

static int tangox_wdt_restart(struct notifier_block *nb, unsigned long action,
			      void *data)
{
	struct tangox_wdt_device *dev =
		container_of(nb, struct tangox_wdt_device, restart);

	writel(1, dev->base + WD_COUNTER);

	return NOTIFY_DONE;
}

static int tangox_wdt_probe(struct platform_device *pdev)
{
	struct tangox_wdt_device *dev;
@@ -174,18 +171,14 @@ static int tangox_wdt_probe(struct platform_device *pdev)
		tangox_wdt_start(&dev->wdt);
	}

	watchdog_set_restart_priority(&dev->wdt, 128);

	err = watchdog_register_device(&dev->wdt);
	if (err)
		goto err;

	platform_set_drvdata(pdev, dev);

	dev->restart.notifier_call = tangox_wdt_restart;
	dev->restart.priority = 128;
	err = register_restart_handler(&dev->restart);
	if (err)
		dev_warn(&pdev->dev, "failed to register restart handler\n");

	dev_info(&pdev->dev, "SMP86xx/SMP87xx watchdog registered\n");

	return 0;
@@ -202,7 +195,6 @@ static int tangox_wdt_remove(struct platform_device *pdev)
	tangox_wdt_stop(&dev->wdt);
	clk_disable_unprepare(dev->clk);

	unregister_restart_handler(&dev->restart);
	watchdog_unregister_device(&dev->wdt);

	return 0;