You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.8 KiB
57 lines
1.8 KiB
Allow watchdog to set its iterrupt as pending when it is configured
|
|
for timer mode (in other words, allow emitting interrupt).
|
|
Also add macros for all Watchdog Control Register flags.
|
|
|
|
Signed-off-by: Vitaly Kuzmichev <vkuzmichev@mvista.com>
|
|
---
|
|
arch/arm/include/asm/smp_twd.h | 6 ++++++
|
|
drivers/watchdog/mpcore_wdt.c | 15 +++++++++++----
|
|
2 files changed, 17 insertions(+), 4 deletions(-)
|
|
|
|
--- a/arch/arm/include/asm/smp_twd.h
|
|
+++ b/arch/arm/include/asm/smp_twd.h
|
|
@@ -18,6 +18,12 @@
|
|
#define TWD_TIMER_CONTROL_PERIODIC (1 << 1)
|
|
#define TWD_TIMER_CONTROL_IT_ENABLE (1 << 2)
|
|
|
|
+#define TWD_WDOG_CONTROL_ENABLE (1 << 0)
|
|
+#define TWD_WDOG_CONTROL_PERIODIC (1 << 1)
|
|
+#define TWD_WDOG_CONTROL_IT_ENABLE (1 << 2)
|
|
+#define TWD_WDOG_CONTROL_TIMER_MODE (0 << 3)
|
|
+#define TWD_WDOG_CONTROL_WATCHDOG_MODE (1 << 3)
|
|
+
|
|
#include <linux/ioport.h>
|
|
|
|
struct twd_local_timer {
|
|
--- a/drivers/watchdog/mpcore_wdt.c
|
|
+++ b/drivers/watchdog/mpcore_wdt.c
|
|
@@ -120,18 +120,25 @@ static void mpcore_wdt_stop(struct mpcor
|
|
|
|
static void mpcore_wdt_start(struct mpcore_wdt *wdt)
|
|
{
|
|
+ u32 mode;
|
|
+
|
|
dev_info(wdt->dev, "enabling watchdog\n");
|
|
|
|
/* This loads the count register but does NOT start the count yet */
|
|
mpcore_wdt_keepalive(wdt);
|
|
|
|
+ /* Setup watchdog - prescale=256, enable=1 */
|
|
+ mode = (255 << 8) | TWD_WDOG_CONTROL_ENABLE;
|
|
+
|
|
if (mpcore_noboot) {
|
|
- /* Enable watchdog - prescale=256, watchdog mode=0, enable=1 */
|
|
- writel(0x0000FF01, wdt->base + TWD_WDOG_CONTROL);
|
|
+ /* timer mode, send interrupt */
|
|
+ mode |= TWD_WDOG_CONTROL_TIMER_MODE |
|
|
+ TWD_WDOG_CONTROL_IT_ENABLE;
|
|
} else {
|
|
- /* Enable watchdog - prescale=256, watchdog mode=1, enable=1 */
|
|
- writel(0x0000FF09, wdt->base + TWD_WDOG_CONTROL);
|
|
+ /* watchdog mode */
|
|
+ mode |= TWD_WDOG_CONTROL_WATCHDOG_MODE;
|
|
}
|
|
+ writel(mode, wdt->base + TWD_WDOG_CONTROL);
|
|
}
|
|
|
|
static int mpcore_wdt_set_heartbeat(int t)
|
|
|