1 #include <linux/autoconf.h>
2 #include <linux/module.h>
3 #include <linux/types.h>
4 #include <linux/miscdevice.h>
5 #include <linux/watchdog.h>
9 #include <asm/uaccess.h>
10 #include <asm/system.h>
11 #include <asm/bootinfo.h>
13 extern unsigned long mips_machtype;
15 static unsigned long wdt_is_open;
16 static struct timer_list wdt_timer;
18 static void wdt_merlot_refresh(void)
21 switch (mips_machtype) {
23 wdt = (__u32 *) 0xb8030034;
27 wdt = (__u32 *) 0xbc00300c;
33 static void wdt_merlot_timer_fn(unsigned long data)
36 if (!test_bit(1, &wdt_is_open))
37 mod_timer(&wdt_timer, jiffies + HZ);
40 static int wdt_merlot_setup_timer(void)
43 init_timer(&wdt_timer);
44 wdt_timer.function = wdt_merlot_timer_fn;
46 wdt_timer.expires = jiffies + HZ;
47 add_timer(&wdt_timer);
51 static int wdt_open(struct inode *inode, struct file *file)
53 if (test_and_set_bit(0, &wdt_is_open))
55 set_bit(1, &wdt_is_open);
56 return nonseekable_open(inode, file);
59 static ssize_t wdt_write(struct file *file, const char __user * buf, size_t count, loff_t * ppos)
61 if (count) /* something was written */
66 static int wdt_release(struct inode *inode, struct file *file)
68 clear_bit(0, &wdt_is_open);
72 static struct file_operations wdt_fops = {
77 .release = wdt_release,
80 static struct miscdevice wdt_miscdev = {
81 .minor = WATCHDOG_MINOR,
86 static void __exit wdt_exit(void)
88 misc_deregister(&wdt_miscdev);
91 static int __init wdt_init(void)
94 ret = misc_register(&wdt_miscdev);
97 "wdt: cannot register miscdev on minor=%d (err=%d)\n",
99 misc_deregister(&wdt_miscdev);
102 printk("wdt: registered with refresh\n");
103 wdt_merlot_refresh();
104 wdt_merlot_setup_timer();
109 module_init(wdt_init);
110 module_exit(wdt_exit);