[PATCHv2] watchdog: imx2_wdt: add restart handler support

Guenter Roeck linux at roeck-us.net
Wed Sep 17 08:46:42 PDT 2014


On Wed, Sep 17, 2014 at 07:40:01AM +0000, Jingchang Lu wrote:
> Hi, Guenter,
> 
>   Could you please help review this v2 patch, Thanks.
> 
Sure, but please give me some time. I _do_ have a daytime job.

Thanks,
Guenter

> Best Regards,
> Jingchang
> 
> >-----Original Message-----
> >From: Jingchang Lu [mailto:jingchang.lu at freescale.com]
> >Sent: Friday, September 12, 2014 3:25 PM
> >To: wim at iguana.be
> >Cc: Guo Shawn-R65073; arnd at arndb.de; linux at roeck-us.net; linux-
> >watchdog at vger.kernel.org; linux-arm-kernel at lists.infradead.org; Lu
> >Jingchang-B35083
> >Subject: [PATCHv2] watchdog: imx2_wdt: add restart handler support
> >
> >  Register the watchdog as the system restart function
> >to the new introducing kernel restart call chain in the
> >driver instead of providing the restart in machine desc.
> >  This restart handler function is from the mxc_restart()
> >in arch/arm/mach-imx/system.c
> >
> >Signed-off-by: Jingchang Lu <jingchang.lu at freescale.com>
> >---
> > drivers/watchdog/imx2_wdt.c | 37 +++++++++++++++++++++++++++++++++++++
> > 1 file changed, 37 insertions(+)
> >
> >diff --git a/drivers/watchdog/imx2_wdt.c b/drivers/watchdog/imx2_wdt.c
> >index 68c3d37..d32470e 100644
> >--- a/drivers/watchdog/imx2_wdt.c
> >+++ b/drivers/watchdog/imx2_wdt.c
> >@@ -22,14 +22,17 @@
> >  */
> >
> > #include <linux/clk.h>
> >+#include <linux/delay.h>
> > #include <linux/init.h>
> > #include <linux/io.h>
> > #include <linux/jiffies.h>
> > #include <linux/kernel.h>
> > #include <linux/module.h>
> > #include <linux/moduleparam.h>
> >+#include <linux/notifier.h>
> > #include <linux/of_address.h>
> > #include <linux/platform_device.h>
> >+#include <linux/reboot.h>
> > #include <linux/regmap.h>
> > #include <linux/timer.h>
> > #include <linux/watchdog.h>
> >@@ -59,6 +62,7 @@ struct imx2_wdt_device {
> > 	struct regmap *regmap;
> > 	struct timer_list timer;	/* Pings the watchdog when closed */
> > 	struct watchdog_device wdog;
> >+	struct notifier_block restart_handler;
> > };
> >
> > static bool nowayout = WATCHDOG_NOWAYOUT;
> >@@ -77,6 +81,31 @@ static const struct watchdog_info imx2_wdt_info = {
> > 	.options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE,
> > };
> >
> >+static int imx2_restart_handler(struct notifier_block *this, unsigned
> >long mode,
> >+				void *cmd)
> >+{
> >+	unsigned int wcr_enable = IMX2_WDT_WCR_WDE;
> >+	struct imx2_wdt_device *wdev = container_of(this,
> >+						    struct imx2_wdt_device,
> >+						    restart_handler);
> >+	/* Assert SRS signal */
> >+	regmap_write(wdev->regmap, 0, wcr_enable);
> >+	/*
> >+	 * Due to imx6q errata ERR004346 (WDOG: WDOG SRS bit requires to be
> >+	 * written twice), we add another two writes to ensure there must be
> >at
> >+	 * least two writes happen in the same one 32kHz clock period.  We
> >save
> >+	 * the target check here, since the writes shouldn't be a huge
> >burden
> >+	 * for other platforms.
> >+	 */
> >+	regmap_write(wdev->regmap, 0, wcr_enable);
> >+	regmap_write(wdev->regmap, 0, wcr_enable);
> >+
> >+	/* wait for reset to assert... */
> >+	mdelay(500);
> >+
> >+	return NOTIFY_DONE;
> >+}
> >+
> > static inline void imx2_wdt_setup(struct watchdog_device *wdog)
> > {
> > 	struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog);
> >@@ -257,6 +286,12 @@ static int __init imx2_wdt_probe(struct
> >platform_device *pdev)
> > 		return ret;
> > 	}
> >
> >+	wdev->restart_handler.notifier_call = imx2_restart_handler;
> >+	wdev->restart_handler.priority = 128;
> >+	ret = register_restart_handler(&wdev->restart_handler);
> >+	if (ret)
> >+		dev_err(&pdev->dev, "cannot register restart handler\n");
> >+
> > 	dev_info(&pdev->dev, "timeout %d sec (nowayout=%d)\n",
> > 		 wdog->timeout, nowayout);
> >
> >@@ -268,6 +303,8 @@ static int __exit imx2_wdt_remove(struct
> >platform_device *pdev)
> > 	struct watchdog_device *wdog = platform_get_drvdata(pdev);
> > 	struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog);
> >
> >+	unregister_restart_handler(&wdev->restart_handler);
> >+
> > 	watchdog_unregister_device(wdog);
> >
> > 	if (imx2_wdt_is_running(wdev)) {
> >--
> >1.8.0
> 



More information about the linux-arm-kernel mailing list