Loading drivers/watchdog/sc520_wdt.c +86 −75 Original line number Diff line number Diff line Loading @@ -64,9 +64,9 @@ #include <linux/reboot.h> #include <linux/init.h> #include <linux/jiffies.h> #include <linux/io.h> #include <linux/uaccess.h> #include <asm/io.h> #include <asm/uaccess.h> #include <asm/system.h> #define OUR_NAME "sc520_wdt" Loading @@ -91,13 +91,18 @@ */ #define WATCHDOG_TIMEOUT 30 /* 30 sec default timeout */ static int timeout = WATCHDOG_TIMEOUT; /* in seconds, will be multiplied by HZ to get seconds to wait for a ping */ /* in seconds, will be multiplied by HZ to get seconds to wait for a ping */ static int timeout = WATCHDOG_TIMEOUT; module_param(timeout, int, 0); MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (1<=timeout<=3600, default=" __MODULE_STRING(WATCHDOG_TIMEOUT) ")"); MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (1 <= timeout <= 3600, default=" __MODULE_STRING(WATCHDOG_TIMEOUT) ")"); static int nowayout = WATCHDOG_NOWAYOUT; module_param(nowayout, int, 0); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); /* * AMD Elan SC520 - Watchdog Timer Registers Loading Loading @@ -136,8 +141,7 @@ static void wdt_timer_ping(unsigned long data) /* If we got a heartbeat pulse within the WDT_US_INTERVAL * we agree to ping the WDT */ if(time_before(jiffies, next_heartbeat)) { if (time_before(jiffies, next_heartbeat)) { /* Ping the WDT */ spin_lock(&wdt_spinlock); writew(0xAAAA, wdtmrctl); Loading @@ -146,9 +150,9 @@ static void wdt_timer_ping(unsigned long data) /* Re-set the timer interval */ mod_timer(&timer, jiffies + WDT_INTERVAL); } else { printk(KERN_WARNING PFX "Heartbeat lost! Will not ping the watchdog\n"); } } else printk(KERN_WARNING PFX "Heartbeat lost! Will not ping the watchdog\n"); } /* Loading Loading @@ -219,7 +223,8 @@ static int wdt_set_heartbeat(int t) * /dev/watchdog handling */ static ssize_t fop_write(struct file * file, const char __user * buf, size_t count, loff_t * ppos) static ssize_t fop_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { /* See if we got the magic character 'V' and reload the timer */ if (count) { Loading @@ -240,7 +245,8 @@ static ssize_t fop_write(struct file * file, const char __user * buf, size_t cou } } /* Well, anyhow someone wrote to us, we should return that favour */ /* Well, anyhow someone wrote to us, we should return that favour */ wdt_keepalive(); } return count; Loading @@ -261,10 +267,11 @@ static int fop_open(struct inode * inode, struct file * file) static int fop_close(struct inode *inode, struct file *file) { if(wdt_expect_close == 42) { if (wdt_expect_close == 42) wdt_turnoff(); } else { printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); else { printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); wdt_keepalive(); } clear_bit(0, &wdt_is_open); Loading @@ -272,13 +279,13 @@ static int fop_close(struct inode * inode, struct file * file) return 0; } static int fop_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) static int fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { void __user *argp = (void __user *)arg; int __user *p = argp; static struct watchdog_info ident = { .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE, static const struct watchdog_info ident = { .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE, .firmware_version = 1, .identity = "SC520", }; Loading Loading @@ -383,10 +390,12 @@ static int __init sc520_wdt_init(void) { int rc = -EBUSY; /* Check that the timeout value is within it's range ; if not reset to the default */ /* Check that the timeout value is within it's range ; if not reset to the default */ if (wdt_set_heartbeat(timeout)) { wdt_set_heartbeat(WATCHDOG_TIMEOUT); printk(KERN_INFO PFX "timeout value must be 1<=timeout<=3600, using %d\n", printk(KERN_INFO PFX "timeout value must be 1 <= timeout <= 3600, using %d\n", WATCHDOG_TIMEOUT); } Loading @@ -399,19 +408,21 @@ static int __init sc520_wdt_init(void) rc = register_reboot_notifier(&wdt_notifier); if (rc) { printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", rc); printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", rc); goto err_out_ioremap; } rc = misc_register(&wdt_miscdev); if (rc) { printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", WATCHDOG_MINOR, rc); goto err_out_notifier; } printk(KERN_INFO PFX "WDT driver for SC520 initialised. timeout=%d sec (nowayout=%d)\n", printk(KERN_INFO PFX "WDT driver for SC520 initialised. timeout=%d sec (nowayout=%d)\n", timeout, nowayout); return 0; Loading Loading
drivers/watchdog/sc520_wdt.c +86 −75 Original line number Diff line number Diff line Loading @@ -64,9 +64,9 @@ #include <linux/reboot.h> #include <linux/init.h> #include <linux/jiffies.h> #include <linux/io.h> #include <linux/uaccess.h> #include <asm/io.h> #include <asm/uaccess.h> #include <asm/system.h> #define OUR_NAME "sc520_wdt" Loading @@ -91,13 +91,18 @@ */ #define WATCHDOG_TIMEOUT 30 /* 30 sec default timeout */ static int timeout = WATCHDOG_TIMEOUT; /* in seconds, will be multiplied by HZ to get seconds to wait for a ping */ /* in seconds, will be multiplied by HZ to get seconds to wait for a ping */ static int timeout = WATCHDOG_TIMEOUT; module_param(timeout, int, 0); MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (1<=timeout<=3600, default=" __MODULE_STRING(WATCHDOG_TIMEOUT) ")"); MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (1 <= timeout <= 3600, default=" __MODULE_STRING(WATCHDOG_TIMEOUT) ")"); static int nowayout = WATCHDOG_NOWAYOUT; module_param(nowayout, int, 0); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); /* * AMD Elan SC520 - Watchdog Timer Registers Loading Loading @@ -136,8 +141,7 @@ static void wdt_timer_ping(unsigned long data) /* If we got a heartbeat pulse within the WDT_US_INTERVAL * we agree to ping the WDT */ if(time_before(jiffies, next_heartbeat)) { if (time_before(jiffies, next_heartbeat)) { /* Ping the WDT */ spin_lock(&wdt_spinlock); writew(0xAAAA, wdtmrctl); Loading @@ -146,9 +150,9 @@ static void wdt_timer_ping(unsigned long data) /* Re-set the timer interval */ mod_timer(&timer, jiffies + WDT_INTERVAL); } else { printk(KERN_WARNING PFX "Heartbeat lost! Will not ping the watchdog\n"); } } else printk(KERN_WARNING PFX "Heartbeat lost! Will not ping the watchdog\n"); } /* Loading Loading @@ -219,7 +223,8 @@ static int wdt_set_heartbeat(int t) * /dev/watchdog handling */ static ssize_t fop_write(struct file * file, const char __user * buf, size_t count, loff_t * ppos) static ssize_t fop_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { /* See if we got the magic character 'V' and reload the timer */ if (count) { Loading @@ -240,7 +245,8 @@ static ssize_t fop_write(struct file * file, const char __user * buf, size_t cou } } /* Well, anyhow someone wrote to us, we should return that favour */ /* Well, anyhow someone wrote to us, we should return that favour */ wdt_keepalive(); } return count; Loading @@ -261,10 +267,11 @@ static int fop_open(struct inode * inode, struct file * file) static int fop_close(struct inode *inode, struct file *file) { if(wdt_expect_close == 42) { if (wdt_expect_close == 42) wdt_turnoff(); } else { printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); else { printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); wdt_keepalive(); } clear_bit(0, &wdt_is_open); Loading @@ -272,13 +279,13 @@ static int fop_close(struct inode * inode, struct file * file) return 0; } static int fop_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) static int fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { void __user *argp = (void __user *)arg; int __user *p = argp; static struct watchdog_info ident = { .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE, static const struct watchdog_info ident = { .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE, .firmware_version = 1, .identity = "SC520", }; Loading Loading @@ -383,10 +390,12 @@ static int __init sc520_wdt_init(void) { int rc = -EBUSY; /* Check that the timeout value is within it's range ; if not reset to the default */ /* Check that the timeout value is within it's range ; if not reset to the default */ if (wdt_set_heartbeat(timeout)) { wdt_set_heartbeat(WATCHDOG_TIMEOUT); printk(KERN_INFO PFX "timeout value must be 1<=timeout<=3600, using %d\n", printk(KERN_INFO PFX "timeout value must be 1 <= timeout <= 3600, using %d\n", WATCHDOG_TIMEOUT); } Loading @@ -399,19 +408,21 @@ static int __init sc520_wdt_init(void) rc = register_reboot_notifier(&wdt_notifier); if (rc) { printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", rc); printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", rc); goto err_out_ioremap; } rc = misc_register(&wdt_miscdev); if (rc) { printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", WATCHDOG_MINOR, rc); goto err_out_notifier; } printk(KERN_INFO PFX "WDT driver for SC520 initialised. timeout=%d sec (nowayout=%d)\n", printk(KERN_INFO PFX "WDT driver for SC520 initialised. timeout=%d sec (nowayout=%d)\n", timeout, nowayout); return 0; Loading