]>
Commit | Line | Data |
---|---|---|
abbab703 TK |
1 | /* |
2 | * watchdog.c - driver for i.mx on-chip watchdog | |
3 | * | |
4 | * Licensed under the GPL-2 or later. | |
5 | */ | |
6 | ||
7 | #include <common.h> | |
8 | #include <asm/io.h> | |
9 | #include <watchdog.h> | |
10 | #include <asm/arch/imx-regs.h> | |
f532727d | 11 | #include <fsl_wdog.h> |
abbab703 TK |
12 | |
13 | #ifdef CONFIG_IMX_WATCHDOG | |
14 | void hw_watchdog_reset(void) | |
15 | { | |
16 | struct watchdog_regs *wdog = (struct watchdog_regs *)WDOG1_BASE_ADDR; | |
17 | ||
18 | writew(0x5555, &wdog->wsr); | |
19 | writew(0xaaaa, &wdog->wsr); | |
20 | } | |
21 | ||
22 | void hw_watchdog_init(void) | |
23 | { | |
24 | struct watchdog_regs *wdog = (struct watchdog_regs *)WDOG1_BASE_ADDR; | |
25 | u16 timeout; | |
26 | ||
27 | /* | |
28 | * The timer watchdog can be set between | |
29 | * 0.5 and 128 Seconds. If not defined | |
30 | * in configuration file, sets 128 Seconds | |
31 | */ | |
32 | #ifndef CONFIG_WATCHDOG_TIMEOUT_MSECS | |
33 | #define CONFIG_WATCHDOG_TIMEOUT_MSECS 128000 | |
34 | #endif | |
35 | timeout = (CONFIG_WATCHDOG_TIMEOUT_MSECS / 500) - 1; | |
723ec69a | 36 | writew(WCR_WDZST | WCR_WDBG | WCR_WDE | WCR_WDT | WCR_SRS | |
9eeab572 | 37 | WCR_WDA | SET_WCR_WT(timeout), &wdog->wcr); |
abbab703 TK |
38 | hw_watchdog_reset(); |
39 | } | |
40 | #endif | |
41 | ||
8b248c8c | 42 | void __attribute__((weak)) reset_cpu(ulong addr) |
abbab703 TK |
43 | { |
44 | struct watchdog_regs *wdog = (struct watchdog_regs *)WDOG1_BASE_ADDR; | |
45 | ||
587c3f8e | 46 | clrsetbits_le16(&wdog->wcr, WCR_WT_MSK, WCR_WDE); |
623d96e8 | 47 | |
abbab703 TK |
48 | writew(0x5555, &wdog->wsr); |
49 | writew(0xaaaa, &wdog->wsr); /* load minimum 1/2 second timeout */ | |
50 | while (1) { | |
51 | /* | |
52 | * spin for .5 seconds before reset | |
53 | */ | |
54 | } | |
55 | } |