|
|
|
@ -42,11 +42,10 @@ |
|
|
|
|
static int at91_wdt_settimeout(unsigned int timeout) |
|
|
|
|
{ |
|
|
|
|
unsigned int reg; |
|
|
|
|
unsigned int mr; |
|
|
|
|
at91_wdt_t *wd = (at91_wdt_t *) AT91_WDT_BASE; |
|
|
|
|
|
|
|
|
|
/* Check if disabled */ |
|
|
|
|
mr = at91_sys_read(AT91_WDT_MR); |
|
|
|
|
if (mr & AT91_WDT_WDDIS) { |
|
|
|
|
if (readl(&wd->mr) & AT91_WDT_MR_WDDIS) { |
|
|
|
|
printf("sorry, watchdog is disabled\n"); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
@ -57,19 +56,21 @@ static int at91_wdt_settimeout(unsigned int timeout) |
|
|
|
|
* Since WDV is a 12-bit counter, the maximum period is |
|
|
|
|
* 4096 / 256 = 16 seconds. |
|
|
|
|
*/ |
|
|
|
|
reg = AT91_WDT_WDRSTEN /* causes watchdog reset */ |
|
|
|
|
/* | AT91_WDT_WDRPROC causes processor reset only */ |
|
|
|
|
| AT91_WDT_WDDBGHLT /* disabled in debug mode */ |
|
|
|
|
| AT91_WDT_WDD /* restart at any time */ |
|
|
|
|
| (timeout & AT91_WDT_WDV); /* timer value */ |
|
|
|
|
at91_sys_write(AT91_WDT_MR, reg); |
|
|
|
|
|
|
|
|
|
reg = AT91_WDT_MR_WDRSTEN /* causes watchdog reset */ |
|
|
|
|
| AT91_WDT_MR_WDDBGHLT /* disabled in debug mode */ |
|
|
|
|
| AT91_WDT_MR_WDD(0xfff) /* restart at any time */ |
|
|
|
|
| AT91_WDT_MR_WDV(timeout); /* timer value */ |
|
|
|
|
|
|
|
|
|
writel(reg, &wd->mr); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void hw_watchdog_reset(void) |
|
|
|
|
{ |
|
|
|
|
at91_sys_write(AT91_WDT_CR, AT91_WDT_KEY | AT91_WDT_WDRSTT); |
|
|
|
|
at91_wdt_t *wd = (at91_wdt_t *) AT91_WDT_BASE; |
|
|
|
|
writel(AT91_WDT_CR_WDRSTT | AT91_WDT_CR_KEY, &wd->cr); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void hw_watchdog_init(void) |
|
|
|
|