summaryrefslogtreecommitdiffstats
path: root/target/linux/ar7/patches-2.6.27/140-watchdog_bootcr.patch
blob: 95535def0c63df676c1e12f6a196e9ad422bd8d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
--- a/drivers/watchdog/ar7_wdt.c	2009-01-25 01:17:01.000000000 +1300
+++ b/drivers/watchdog/ar7_wdt.c	2009-01-25 01:19:15.000000000 +1300
@@ -293,12 +293,26 @@
 	.fops		= &ar7_wdt_fops,
 };
 
+#define AR7_WDT_HARDWARE_ENABLE 0x10
+
 static int __init ar7_wdt_init(void)
 {
 	int rc;
+	u32 *bootcr;
+	u32 bootcr_value;
 
 	ar7_wdt_get_regs();
 
+	/* arch/mips/ar7/clocks.c is the only other thing that reads this */
+	bootcr = (u32 *)ioremap_nocache(AR7_REGS_DCL, 4);
+	bootcr_value = *bootcr;
+	iounmap(bootcr);
+
+	if (!(bootcr_value & AR7_WDT_HARDWARE_ENABLE)) {
+		printk(KERN_INFO DRVNAME ": watchdog disabled in hardware (bootcr=%#x)\n", bootcr_value);
+		return -ENODEV;
+	}
+
 	if (!request_mem_region(ar7_regs_wdt, sizeof(struct ar7_wdt),
 							LONGNAME)) {
 		printk(KERN_WARNING DRVNAME ": watchdog I/O region busy\n");