]>
Commit | Line | Data |
---|---|---|
9096963c ML |
1 | /* |
2 | * Watchdog driver for the FTWDT010 Watch Dog Driver | |
3 | * | |
4 | * (c) Copyright 2004 Faraday Technology Corp. (www.faraday-tech.com) | |
5 | * Based on sa1100_wdt.c by Oleg Drokin <green@crimea.edu> | |
6 | * Based on SoftDog driver by Alan Cox <alan@redhat.com> | |
7 | * | |
8 | * Copyright (C) 2011 Andes Technology Corporation | |
9 | * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com> | |
10 | * | |
1a459660 | 11 | * SPDX-License-Identifier: GPL-2.0+ |
9096963c ML |
12 | * |
13 | * 27/11/2004 Initial release, Faraday. | |
14 | * 12/01/2011 Port to u-boot, Macpaul Lin. | |
15 | */ | |
16 | ||
17 | #include <common.h> | |
18 | #include <watchdog.h> | |
19 | #include <asm/io.h> | |
04c2dd82 | 20 | #include <faraday/ftwdt010_wdt.h> |
9096963c ML |
21 | |
22 | /* | |
23 | * Set the watchdog time interval. | |
24 | * Counter is 32 bit. | |
25 | */ | |
04c2dd82 | 26 | int ftwdt010_wdt_settimeout(unsigned int timeout) |
9096963c ML |
27 | { |
28 | unsigned int reg; | |
29 | ||
30 | struct ftwdt010_wdt *wd = (struct ftwdt010_wdt *)CONFIG_FTWDT010_BASE; | |
31 | ||
32 | debug("Activating WDT..\n"); | |
33 | ||
34 | /* Check if disabled */ | |
35 | if (readl(&wd->wdcr) & ~FTWDT010_WDCR_ENABLE) { | |
36 | printf("sorry, watchdog is disabled\n"); | |
37 | return -1; | |
38 | } | |
39 | ||
40 | /* | |
41 | * In a 66MHz system, | |
42 | * if you set WDLOAD as 0x03EF1480 (66000000) | |
43 | * the reset timer is 1 second. | |
44 | */ | |
45 | reg = FTWDT010_WDLOAD(timeout * FTWDT010_TIMEOUT_FACTOR); | |
46 | ||
47 | writel(reg, &wd->wdload); | |
48 | ||
49 | return 0; | |
50 | } | |
51 | ||
04c2dd82 | 52 | void ftwdt010_wdt_reset(void) |
9096963c ML |
53 | { |
54 | struct ftwdt010_wdt *wd = (struct ftwdt010_wdt *)CONFIG_FTWDT010_BASE; | |
55 | ||
56 | /* clear control register */ | |
57 | writel(0, &wd->wdcr); | |
58 | ||
59 | /* Write Magic number */ | |
60 | writel(FTWDT010_WDRESTART_MAGIC, &wd->wdrestart); | |
61 | ||
62 | /* Enable WDT */ | |
63 | writel((FTWDT010_WDCR_RST | FTWDT010_WDCR_ENABLE), &wd->wdcr); | |
64 | } | |
65 | ||
04c2dd82 | 66 | void ftwdt010_wdt_disable(void) |
9096963c ML |
67 | { |
68 | struct ftwdt010_wdt *wd = (struct ftwdt010_wdt *)CONFIG_FTWDT010_BASE; | |
69 | ||
70 | debug("Deactivating WDT..\n"); | |
71 | ||
72 | /* | |
73 | * It was defined with CONFIG_WATCHDOG_NOWAYOUT in Linux | |
74 | * | |
75 | * Shut off the timer. | |
76 | * Lock it in if it's a module and we defined ...NOWAYOUT | |
77 | */ | |
78 | writel(0, &wd->wdcr); | |
79 | } | |
80 | ||
04c2dd82 ML |
81 | #if defined(CONFIG_HW_WATCHDOG) |
82 | void hw_watchdog_reset(void) | |
9096963c ML |
83 | { |
84 | ftwdt010_wdt_reset(); | |
85 | } | |
86 | ||
87 | void hw_watchdog_init(void) | |
88 | { | |
89 | /* set timer in ms */ | |
90 | ftwdt010_wdt_settimeout(CONFIG_FTWDT010_HW_TIMEOUT * 1000); | |
91 | } | |
04c2dd82 | 92 | #endif |