mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-08-21 00:40:14 +03:00
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@33911 3c298f89-4303-0410-b956-a3cf2f4a3e73
58 lines
1.8 KiB
Diff
58 lines
1.8 KiB
Diff
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
|
|
@@ -121,18 +121,25 @@ static void mpcore_wdt_stop(struct mpcor
|
|
|
|
static void mpcore_wdt_start(struct mpcore_wdt *wdt)
|
|
{
|
|
+ u32 mode;
|
|
+
|
|
dev_printk(KERN_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)
|