summaryrefslogtreecommitdiff
path: root/openwrt/target/linux/aruba-2.6/patches/004-wdt.patch
blob: 15fbffa043c7fbfadfeaf27f2da48f5c8f0bc013 (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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
diff -Nur linux-2.6.15.1/drivers/char/watchdog/wdt_merlot.c linux-2.6.15.1-openwrt/drivers/char/watchdog/wdt_merlot.c
--- linux-2.6.15.1/drivers/char/watchdog/wdt_merlot.c	2006-01-26 21:14:02.204626250 -0800
+++ linux-2.6.15.1-openwrt/drivers/char/watchdog/wdt_merlot.c	2006-02-02 20:31:43.000000000 -0800
@@ -0,0 +1,110 @@
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/miscdevice.h>
+#include <linux/watchdog.h>
+#include <linux/fs.h>
+
+#include <asm/io.h>
+#include <asm/uaccess.h>
+#include <asm/system.h>
+#include <asm/bootinfo.h>
+
+extern unsigned long mips_machtype;
+
+static unsigned long wdt_is_open;
+static struct timer_list wdt_timer;
+
+static void wdt_merlot_refresh(void)
+{
+    volatile __u32 *wdt;
+    switch (mips_machtype) {
+    case MACH_ARUBA_AP70:
+	wdt = (__u32 *) 0xb8030034;
+	*wdt = 0x10000000;
+	break;
+    default:
+	wdt = (__u32 *) 0xbc00300c;
+	*wdt = 0x40000000;
+	break;
+    }
+}
+
+static void wdt_merlot_timer_fn(unsigned long data)
+{
+    wdt_merlot_refresh();
+    if (!test_bit(1, &wdt_is_open))
+	mod_timer(&wdt_timer, jiffies + HZ);
+}
+
+static int wdt_merlot_setup_timer(void)
+{
+
+    init_timer(&wdt_timer);
+    wdt_timer.function = wdt_merlot_timer_fn;
+    wdt_timer.data = 0;
+    wdt_timer.expires = jiffies + HZ;
+    add_timer(&wdt_timer);
+    return 0;
+}
+
+static int wdt_open(struct inode *inode, struct file *file)
+{
+    if (test_and_set_bit(0, &wdt_is_open))
+	return -EBUSY;
+    set_bit(1, &wdt_is_open);
+    return nonseekable_open(inode, file);
+}
+
+static ssize_t wdt_write(struct file *file, const char __user * buf, size_t count, loff_t * ppos)
+{
+    if (count) 	/* something was written */
+	wdt_merlot_refresh();
+    return count;
+}
+
+static int wdt_release(struct inode *inode, struct file *file)
+{
+    clear_bit(0, &wdt_is_open);
+    return 0;
+}
+
+static struct file_operations wdt_fops = {
+    .owner = THIS_MODULE,
+    .llseek = no_llseek,
+    .write = wdt_write,
+    .open = wdt_open,
+    .release = wdt_release,
+};
+
+static struct miscdevice wdt_miscdev = {
+    .minor = WATCHDOG_MINOR,
+    .name = "watchdog",
+    .fops = &wdt_fops,
+};
+
+static void __exit wdt_exit(void)
+{
+    misc_deregister(&wdt_miscdev);
+}
+
+static int __init wdt_init(void)
+{
+    int ret;
+    ret = misc_register(&wdt_miscdev);
+    if (ret) {
+	printk(KERN_ERR
+	       "wdt: cannot register miscdev on minor=%d (err=%d)\n",
+	       WATCHDOG_MINOR, ret);
+	misc_deregister(&wdt_miscdev);
+	goto out;
+    }
+    printk("wdt: registered with refresh\n");
+    wdt_merlot_refresh();
+    wdt_merlot_setup_timer();
+  out:
+    return ret;
+}
+
+module_init(wdt_init);
+module_exit(wdt_exit);
diff -Nur linux-2.6.15.3/drivers/char/watchdog/Makefile linux-2.6.15.3-openwrt/drivers/char/watchdog/Makefile
--- linux-2.6.15.3/drivers/char/watchdog/Makefile	2006-02-22 10:04:18.596278000 -0800
+++ linux-2.6.15.3-openwrt/drivers/char/watchdog/Makefile	2006-02-22 10:06:21.400960000 -0800
@@ -71,5 +71,8 @@
 
 # SPARC64 Architecture
 
+# Aruba Architecture
+obj-$(CONFIG_MACH_ARUBA) += wdt_merlot.o
+
 # Architecture Independant
 obj-$(CONFIG_SOFT_WATCHDOG) += softdog.o