From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from bh-25.webhostbox.net ([208.91.199.152]:54099 "EHLO bh-25.webhostbox.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756139AbaITOIv (ORCPT ); Sat, 20 Sep 2014 10:08:51 -0400 Received: from mailnull by bh-25.webhostbox.net with sa-checked (Exim 4.82) (envelope-from ) id 1XVLLH-0031Em-Em for linux-watchdog@vger.kernel.org; Sat, 20 Sep 2014 14:08:51 +0000 Message-ID: <541D8A56.8070609@roeck-us.net> Date: Sat, 20 Sep 2014 07:08:22 -0700 From: Guenter Roeck MIME-Version: 1.0 To: Jisheng Zhang , wim@iguana.be CC: linux-watchdog@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH 2/2] watchdog: dw_wdt: add restart handler support References: <1411108199-1280-1-git-send-email-jszhang@marvell.com> <1411108199-1280-3-git-send-email-jszhang@marvell.com> <541CEF86.9070606@roeck-us.net> In-Reply-To: <541CEF86.9070606@roeck-us.net> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-watchdog-owner@vger.kernel.org List-Id: linux-watchdog@vger.kernel.org On 09/19/2014 08:07 PM, Guenter Roeck wrote: > On 09/18/2014 11:29 PM, Jisheng Zhang wrote: >> The kernel core now provides an API to trigger a system restart. >> Register with it to support restarting the system via. watchdog. >> >> Signed-off-by: Jisheng Zhang >> --- >> drivers/watchdog/dw_wdt.c | 27 +++++++++++++++++++++++++++ >> 1 file changed, 27 insertions(+) >> >> diff --git a/drivers/watchdog/dw_wdt.c b/drivers/watchdog/dw_wdt.c >> index ad0619d..4ca41e9 100644 >> --- a/drivers/watchdog/dw_wdt.c >> +++ b/drivers/watchdog/dw_wdt.c >> @@ -29,9 +29,11 @@ >> #include >> #include >> #include >> +#include >> #include >> #include >> #include >> +#include >> #include >> #include >> #include >> @@ -62,6 +64,7 @@ static struct { >> unsigned long next_heartbeat; >> struct timer_list timer; >> int expect_close; >> + struct notifier_block restart_handler; >> } dw_wdt; >> >> static inline int dw_wdt_is_enabled(void) >> @@ -119,6 +122,22 @@ static void dw_wdt_keepalive(void) >> WDOG_COUNTER_RESTART_REG_OFFSET); >> } >> >> +static int dw_wdt_restart_handle(struct notifier_block *this, >> + unsigned long mode, void *cmd) >> +{ >> + u32 val; >> + >> + writel(0, dw_wdt.regs + WDOG_TIMEOUT_RANGE_REG_OFFSET); >> + val = readl(dw_wdt.regs + WDOG_CONTROL_REG_OFFSET); >> + if (val & WDOG_CONTROL_REG_WDT_EN_MASK) >> + writel(WDOG_COUNTER_RESTART_KICK_VALUE, dw_wdt.regs + >> + WDOG_COUNTER_RESTART_REG_OFFSET); >> + else >> + writel(WDOG_CONTROL_REG_WDT_EN_MASK, >> + dw_wdt.regs + WDOG_CONTROL_REG_OFFSET); > > Don't you have to write WDOG_COUNTER_RESTART_KICK_VALUE into > WDOG_COUNTER_RESTART_REG_OFFSET in the else case as well ? > According to the datasheet, it should be sufficient to - Write 0 into WDOG_TIMEOUT_RANGE_REG_OFFSET to select the minimum timeout period - Write 0x1 into WDOG_CONTROL_REG_OFFSET to enable the watchdog and select reset as desired action. This can be unconditional. Writing into the restart register should not be necessary. Thanks, Guenter