watchdog: Giant scrub
Subsystems (8)
cover watchdog: Giant scrub
Out damn'd lock, out I say...
The gnomes have been having a spring clean. This tidy up brings all of the watchdog drivers into coding style (except where it doesn't make sense). I've also systematically
- Checked and if need be fixed the locking
- Removed the use of semaphores for open/close handling
- Switched them to unlocked_ioctl
- Checked there are no misc_register races for BKL dropping later
I've also eliminated an escaped use of inb/outb_p on a PCI device
These cover so many architectures I've not been able to build test the lot so there may be the old follow up needed on the build front.
Alan
---
Alan Cox (57):
wdt501/pci: Clean up, coding style and switch to unlocked_ioctl
wdt977: clean up, coding style and switch to unlocked_ioctl
wdt285: switch to unlocked_ioctl and tidy up oddments of coding style
wdrtas: clean up, coding style, switch to unlocked_ioctl
wafer5823wdt: Clean up, coding style, switch to unlocked_ioctl
w83977f_wdt: clean up, coding style and switch to unlocked_ioctl
w83877f_wdt: clean up code, coding style, switch to unlocked_ioctl
w83697hf_wdt: cleanup, coding style and switch to unlocked_ioctl
w83627hf: coding style, clean up and switch to unlocked_ioctl
txx9: Fix locking, switch to unlocked_ioctl
softdog: clean up, coding style and switch to unlocked_ioctl
smsc37b787_wdt: coding style, switch to unlocked_ioctl
shwdt: coding style, cleanup, switch to unlocked_ioctl
scx200_wdt: clean up and switch to unlocked_ioctl
sc520_wdt: Clean up and switch to unlocked_ioctl
sc1200_wdt: clean up, fix locking and use unlocked_ioctl
sb_wdog: Clean up and switch to unlocked_ioctl
sbc_epx_c3_wdt: switch to unlocked_ioctl
sbc8360: clean up
stg7240_wdt: unlocked_ioctl
sbc60xxwdt: clean up and switch to unlocked_ioctl
sa1100_wdt: Switch to unlocked_ioctl
s3c2410: watchdog cleanup and switch to unlocked_ioctl
rm9k_wdt: clean up
pnx4008_wdt: unlocked_ioctl setup
pcwd: clean up, unlocked_ioctl usage
pc87413_wdt: clean up, coding style, unlocked_ioctl
omap_wdt: locking, unlocked_ioctl, tidy
mv64x60_wdt: clean up and locking checks
mtx-1_wdt: clean up, coding style, unlocked ioctl
mpcore watchdog: unlocked_ioctl and BKl work
mpc watchdog: clean up and locking
mixcomwd: coding style locking, unlocked_ioctl
machzwd: clean up, coding style, unlocked_ioctl
ks8695_wdt: clean up, coding style, unlocked_ioctl
ixp4xx_wdt: unlocked_ioctl
ixp2000_wdt: clean up and unlocked_ioctl
booke watchdog: clean up and unlocked_ioctl
bfin: watchdog cleanup and unlocked_ioctl
iTCO: unlocked_ioctl, coding style and cleanup
it8712f: unlocked_ioctl
iop: watchdog switch to unlocked_ioctl
indydog: Clean up and tidy
ibmasr: coding style, locking verify
i6300esb: Style, unlocked_ioctl, cleanup
ib700wdt: clean up and switch to unlocked_ioctl
hpwdt: couple of include cleanups
eurotechwdt: unlocked_ioctl, code lock check and tidy
ep93xx_wdt: unlocked_ioctl
davinci_wdt: unlocked_ioctl and check locking
cpu5_wdt: switch to unlocked_ioctl
at91: watchdog to unlocked_ioctl
atp watchdog
AR7 watchdog
ali: watchdog locking and style
clean up and check advantech watchdog
Clean acquirewdt and check for BKL dependancies
drivers/char/ip2/Makefile | 4 drivers/char/ip2/ip2main.c | 23 -- drivers/watchdog/acquirewdt.c | 119 ++++----- drivers/watchdog/advantechwdt.c | 133 ++++------ drivers/watchdog/alim1535_wdt.c | 186 +++++++------ drivers/watchdog/alim7101_wdt.c | 224 +++++++++------- drivers/watchdog/ar7_wdt.c | 29 +- drivers/watchdog/at32ap700x_wdt.c | 7 - drivers/watchdog/at91rm9200_wdt.c | 108 ++++---- drivers/watchdog/bfin_wdt.c | 147 +++++------ drivers/watchdog/booke_wdt.c | 57 ++-- drivers/watchdog/cpu5wdt.c | 144 +++++----- drivers/watchdog/davinci_wdt.c | 11 - drivers/watchdog/ep93xx_wdt.c | 17 + drivers/watchdog/eurotechwdt.c | 57 +++- drivers/watchdog/hpwdt.c | 4 drivers/watchdog/i6300esb.c | 342 ++++++++++++------------- drivers/watchdog/iTCO_vendor.h | 15 + drivers/watchdog/iTCO_vendor_support.c | 53 ++-- drivers/watchdog/iTCO_wdt.c | 294 ++++++++++----------- drivers/watchdog/ib700wdt.c | 103 ++++--- drivers/watchdog/ibmasr.c | 149 ++++++----- drivers/watchdog/indydog.c | 114 ++++---- drivers/watchdog/iop_wdt.c | 46 ++- drivers/watchdog/it8712f_wdt.c | 77 ++---- drivers/watchdog/ixp2000_wdt.c | 50 ++-- drivers/watchdog/ixp4xx_wdt.c | 41 +-- drivers/watchdog/ks8695_wdt.c | 119 ++++----- drivers/watchdog/machzwd.c | 108 +++----- drivers/watchdog/mixcomwd.c | 133 +++++----- drivers/watchdog/mpc5200_wdt.c | 20 + drivers/watchdog/mpc83xx_wdt.c | 19 + drivers/watchdog/mpc8xx_wdt.c | 37 +-- drivers/watchdog/mpcore_wdt.c | 53 ++-- drivers/watchdog/mtx-1_wdt.c | 107 ++++---- drivers/watchdog/mv64x60_wdt.c | 20 + drivers/watchdog/omap_wdt.c | 35 ++- drivers/watchdog/pc87413_wdt.c | 211 ++++++--------- drivers/watchdog/pcwd.c | 179 +++++++------ drivers/watchdog/pnx4008_wdt.c | 18 + drivers/watchdog/rm9k_wdt.c | 21 +- drivers/watchdog/s3c2410_wdt.c | 148 ++++++----- drivers/watchdog/sa1100_wdt.c | 32 +- drivers/watchdog/sb_wdog.c | 78 +++--- drivers/watchdog/sbc60xxwdt.c | 223 ++++++++-------- drivers/watchdog/sbc7240_wdt.c | 16 + drivers/watchdog/sbc8360.c | 30 +- drivers/watchdog/sbc_epx_c3.c | 12 - drivers/watchdog/sc1200wdt.c | 203 ++++++++------- drivers/watchdog/sc520_wdt.c | 163 ++++++------ drivers/watchdog/scx200_wdt.c | 59 ++-- drivers/watchdog/shwdt.c | 139 ++++++---- drivers/watchdog/smsc37b787_wdt.c | 442 ++++++++++++++++---------------- drivers/watchdog/softdog.c | 87 +++--- drivers/watchdog/txx9wdt.c | 31 +- drivers/watchdog/w83627hf_wdt.c | 175 ++++++------- drivers/watchdog/w83697hf_wdt.c | 141 +++++----- drivers/watchdog/w83877f_wdt.c | 199 +++++++------- drivers/watchdog/w83977f_wdt.c | 225 ++++++++-------- drivers/watchdog/wafer5823wdt.c | 80 +++--- drivers/watchdog/wdrtas.c | 103 +++---- drivers/watchdog/wdt.c | 176 +++++++------ drivers/watchdog/wdt285.c | 31 +- drivers/watchdog/wdt977.c | 148 +++++------ drivers/watchdog/wdt_pci.c | 300 ++++++++++++---------- 65 files changed, 3479 insertions(+), 3396 deletions(-) create mode 100644 drivers/watchdog/iTCO_vendor.h
Signature · 4 lines
"Also I poked a hole in the projector screen when pointing my
replica Roman sword at the site of the Battle of Lake Regillus
and am in Big Trouble."
-- Matthew PeacockPATCH 1/57 Clean acquirewdt and check for BKL dependancies
From: Alan Cox <[email protected]>
This brings the file into line with coding style.
---
drivers/watchdog/acquirewdt.c | 119 ++++++++++++++++++++--------------------- 1 files changed, 58 insertions(+), 61 deletions(-)
drivers/watchdog/acquirewdt.c +58 -61
@@ -58,39 +58,46 @@#include <linux/types.h> /* For standard types (like size_t) */ #include <linux/errno.h> /* For the -ENODEV/... values */ #include <linux/kernel.h> /* For printk/panic/... */ -#include <linux/miscdevice.h> /* For MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR) */ +#include <linux/miscdevice.h> /* For MODULE_ALIAS_MISCDEV +(WATCHDOG_MINOR) */ #include <linux/watchdog.h> /* For the watchdog specific items */ #include <linux/fs.h> /* For file operations */ #include <linux/ioport.h> /* For io-port access */ #include <linux/platform_device.h> /* For platform_driver framework */ #include <linux/init.h> /* For __init/__exit/... */ -#include <asm/uaccess.h> /* For copy_to_user/put_user/... */ -#include <asm/io.h> /* For inb/outb/... */ +#include <linux/uaccess.h> /* For copy_to_user/put_user/... */ +#include <linux/io.h> /* For inb/outb/... */ /* Module information */ #define DRV_NAME "acquirewdt"#define PFX DRV_NAME ": "#define WATCHDOG_NAME "Acquire WDT" -#define WATCHDOG_HEARTBEAT 0/* There is no way to see what the correct time-out period is */ +/* There is no way to see what the correct time-out period is */ +#define WATCHDOG_HEARTBEAT 0/* internal variables */ -static struct platform_device *acq_platform_device;/* the watchdog platform device */ +/* the watchdog platform device */ +static struct platform_device *acq_platform_device;static unsigned long acq_is_open;static char expect_close;/* module parameters */ -static int wdt_stop =0x43 ;/* You must set this - there is no sane way to probe for this board. */ +/* You must set this - there is no sane way to probe for this board. */ +static int wdt_stop =0x43 ;module_param (wdt_stop, int,0 );MODULE_PARM_DESC (wdt_stop,"Acquire WDT 'stop' io port (default 0x43)" ); -static int wdt_start =0x443 ;/* You must set this - there is no sane way to probe for this board. */ +/* You must set this - there is no sane way to probe for this board. */ +static int wdt_start =0x443 ;module_param (wdt_start, int,0 );MODULE_PARM_DESC (wdt_start,"Acquire WDT 'start' io port (default 0x443)" );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) ")");/* * Watchdog Operations
@@ -112,18 +119,18 @@ static void acq_stop(void)* /dev/watchdog handling */ -static ssize_t acq_write (struct file *file,const char __user *buf,size_t count,loff_t *ppos) +static ssize_t acq_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) { +if (count) {if (!nowayout) {size_t i; -/* note: just in case someone wrote the magic character * five months ago... */ expect_close =0 ; - -/* scan to see whether or not we got the magic character */ +/* scan to see whether or not we got the +magic character */ for (i =0 ; i != count; i++) {char c;if (get_user (c, buf + i))
@@ -132,64 +139,55 @@ static ssize_t acq_write(struct file *file, const char __user *buf, size_t count expect_close =42 ; } } - -/* Well, anyhow someone wrote to us, we should return that favour */ +/* Well, anyhow someone wrote to us, we should +return that favour */ acq_keepalive (); }return count; } -static int acq_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long acq_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {int options, retval = -EINVAL ;void __user *argp = (void __user *)arg;int __user *p = argp; -static struct watchdog_info ident = - { +static struct watchdog_info ident = { .options =WDIOF_KEEPALIVEPING |WDIOF_MAGICCLOSE , .firmware_version =1 , .identity =WATCHDOG_NAME , }; -switch (cmd) - { +switch (cmd) {case WDIOC_GETSUPPORT : -return copy_to_user (argp, &ident,sizeof (ident)) ? -EFAULT :0 ; +return copy_to_user (argp, &ident,sizeof (ident)) ? -EFAULT :0 ;case WDIOC_GETSTATUS :case WDIOC_GETBOOTSTATUS : -return put_user (0 , p); +return put_user (0 , p);case WDIOC_KEEPALIVE : -acq_keepalive (); -return 0 ; +acq_keepalive (); +return 0 ;case WDIOC_GETTIMEOUT :return put_user (WATCHDOG_HEARTBEAT , p);case WDIOC_SETOPTIONS : { -if (get_user (options, p)) -return -EFAULT ; - -if (options &WDIOS_DISABLECARD ) - { -acq_stop (); - retval =0 ; - } - -if (options &WDIOS_ENABLECARD ) - { -acq_keepalive (); - retval =0 ; - } - -return retval; +if (get_user (options, p)) +return -EFAULT ; +if (options &WDIOS_DISABLECARD ) { +acq_stop (); + retval =0 ; + } +if (options &WDIOS_ENABLECARD ) { +acq_keepalive (); + retval =0 ; + } +return retval; } -default : -return -ENOTTY ; +return -ENOTTY ; } }
@@ -211,7 +209,8 @@ static int acq_close(struct inode *inode, struct file *file)if (expect_close ==42 ) {acq_stop (); }else { - printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); + printk(KERN_CRIT PFX + "Unexpected close, not stopping watchdog!\n");acq_keepalive (); }clear_bit (0 , &acq_is_open);
@@ -227,7 +226,7 @@ static const struct file_operations acq_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = acq_write, - .ioctl = acq_ioctl, + .unlocked_ioctl = acq_ioctl, .open = acq_open, .release = acq_close, };
@@ -248,32 +247,29 @@ static int __devinit acq_probe(struct platform_device *dev)if (wdt_stop != wdt_start) {if (!request_region (wdt_stop,1 ,WATCHDOG_NAME )) { - printk (KERN_ERR PFX "I/O address 0x%04x already in use\n", - wdt_stop); + printk(KERN_ERR PFX + "I/O address 0x%04x already in use\n", wdt_stop); ret = -EIO ; goto out; } }if (!request_region (wdt_start,1 ,WATCHDOG_NAME )) { - printk (KERN_ERR PFX "I/O address 0x%04x already in use\n", + printk(KERN_ERR PFX "I/O address 0x%04x already in use\n", wdt_start); ret = -EIO ; goto unreg_stop; } - ret =misc_register (&acq_miscdev);if (ret !=0 ) { - printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - WATCHDOG_MINOR, ret); + printk(KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + WATCHDOG_MINOR, ret); goto unreg_regions; } - - printk (KERN_INFO PFX "initialized. (nowayout=%d)\n", - nowayout); + printk(KERN_INFO PFX "initialized. (nowayout=%d)\n", nowayout);return 0 ; - unreg_regions:release_region (wdt_start,1 ); unreg_stop:
@@ -286,9 +282,9 @@ out: static int __devexit acq_remove(struct platform_device *dev) {misc_deregister (&acq_miscdev); -release_region (wdt_start,1 ); -if (wdt_stop != wdt_start) -release_region (wdt_stop,1 ); +release_region (wdt_start,1 ); +if (wdt_stop != wdt_start) +release_region (wdt_stop,1 );return 0 ; }
@@ -313,18 +309,19 @@ static int __init acq_init(void) {int err; -printk (KERN_INFO "WDT driver for Acquire single board computer initialising.\n" ); +printk (KERN_INFO +"WDT driver for Acquire single board computer initialising.\n" ); err =platform_driver_register (&acquirewdt_driver);if (err)return err; - acq_platform_device =platform_device_register_simple (DRV_NAME ,-1 ,NULL ,0 ); + acq_platform_device =platform_device_register_simple (DRV_NAME , +-1 ,NULL ,0 );if (IS_ERR (acq_platform_device)) { err =PTR_ERR (acq_platform_device); goto unreg_platform_driver; } -return 0 ; unreg_platform_driver:
PATCH 2/57 clean up and check advantech watchdog
In reply to Alan CoxFrom: Alan Cox <[email protected]>
Clean up the advantech watchdog code and inspect for BKL problems
---
drivers/watchdog/advantechwdt.c | 133 ++++++++++++++++++--------------------- 1 files changed, 61 insertions(+), 72 deletions(-)
drivers/watchdog/advantechwdt.c +61 -72
@@ -72,35 +72,35 @@ MODULE_PARM_DESC(wdt_start, "Advantech WDT 'start' io port (default 0x443)");static int timeout =WATCHDOG_TIMEOUT ;/* in seconds */ module_param (timeout, int,0 ); -MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=63, default=" __MODULE_STRING(WATCHDOG_TIMEOUT) "."); +MODULE_PARM_DESC (timeout, + "Watchdog timeout in seconds. 1<= timeout <=63, 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) ")");/* * Watchdog Operations */ -static void -advwdt_ping (void ) +static void advwdt_ping (void ) {/* Write a watchdog value */ outb_p (timeout, wdt_start); } -static void -advwdt_disable (void ) +static void advwdt_disable (void ) {inb_p (wdt_stop); } -static int -advwdt_set_heartbeat (int t) +static int advwdt_set_heartbeat (int t) { -if ((t <1 ) || (t >63 )) +if (t <1 || t >63 )return -EINVAL ; - timeout = t;return 0 ; }
@@ -109,8 +109,8 @@ advwdt_set_heartbeat(int t)* /dev/watchdog handling */ -static ssize_t -advwdt_write (struct file *file,const char __user *buf,size_t count,loff_t *ppos) +static ssize_t advwdt_write (struct file *file,const char __user *buf, +size_t count,loff_t *ppos) {if (count) {if (!nowayout) {
@@ -131,9 +131,7 @@ advwdt_write(struct file *file, const char __user *buf, size_t count, loff_t *ppreturn count; } -static int -advwdt_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long advwdt_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {int new_timeout;void __user *argp = (void __user *)arg;
@@ -146,57 +144,50 @@ advwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,switch (cmd) {case WDIOC_GETSUPPORT : -if (copy_to_user (argp, &ident,sizeof (ident))) -return -EFAULT ; -break ; +if (copy_to_user (argp, &ident,sizeof (ident))) +return -EFAULT ; +break ;case WDIOC_GETSTATUS :case WDIOC_GETBOOTSTATUS : -return put_user (0 , p); +return put_user (0 , p);case WDIOC_KEEPALIVE : -advwdt_ping (); -break ; +advwdt_ping (); +break ;case WDIOC_SETTIMEOUT : -if (get_user (new_timeout, p)) -return -EFAULT ; -if (advwdt_set_heartbeat (new_timeout)) -return -EINVAL ; -advwdt_ping (); -/* Fall */ - +if (get_user (new_timeout, p)) +return -EFAULT ; +if (advwdt_set_heartbeat (new_timeout)) +return -EINVAL ; +advwdt_ping (); +/* Fall */ case WDIOC_GETTIMEOUT : -return put_user (timeout, p); - +return put_user (timeout, p);case WDIOC_SETOPTIONS : { -int options, retval = -EINVAL ; - -if (get_user (options, p)) -return -EFAULT ; +int options, retval = -EINVAL ; -if (options &WDIOS_DISABLECARD ) { -advwdt_disable (); - retval =0 ; - } - -if (options &WDIOS_ENABLECARD ) { -advwdt_ping (); - retval =0 ; - } - -return retval; +if (get_user (options, p)) +return -EFAULT ; +if (options &WDIOS_DISABLECARD ) { +advwdt_disable (); + retval =0 ; + } +if (options &WDIOS_ENABLECARD ) { +advwdt_ping (); + retval =0 ; + } +return retval; } -default : -return -ENOTTY ; +return -ENOTTY ; }return 0 ; } -static int -advwdt_open (struct inode *inode,struct file *file) +static int advwdt_open (struct inode *inode,struct file *file) {if (test_and_set_bit (0 , &advwdt_is_open))return -EBUSY ;
@@ -214,7 +205,8 @@ advwdt_close(struct inode *inode, struct file *file)if (adv_expect_close ==42 ) {advwdt_disable (); }else { - printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); + printk(KERN_CRIT PFX + "Unexpected close, not stopping watchdog!\n");advwdt_ping (); }clear_bit (0 , &advwdt_is_open);
@@ -230,7 +222,7 @@ static const struct file_operations advwdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = advwdt_write, - .ioctl = advwdt_ioctl, + .unlocked_ioctl = advwdt_ioctl, .open = advwdt_open, .release = advwdt_close, };
@@ -245,23 +237,24 @@ static struct miscdevice advwdt_miscdev = {* Init & exit routines */ -static int __devinit -advwdt_probe (struct platform_device *dev) +static int __devinit advwdt_probe (struct platform_device *dev) {int ret;if (wdt_stop != wdt_start) {if (!request_region (wdt_stop,1 ,WATCHDOG_NAME )) { - printk (KERN_ERR PFX "I/O address 0x%04x already in use\n", - wdt_stop); + printk (KERN_ERR PFX +"I/O address 0x%04x already in use\n" , + wdt_stop); ret = -EIO ; goto out; } }if (!request_region (wdt_start,1 ,WATCHDOG_NAME )) { - printk (KERN_ERR PFX "I/O address 0x%04x already in use\n", - wdt_start); + printk (KERN_ERR PFX +"I/O address 0x%04x already in use\n" , + wdt_start); ret = -EIO ; goto unreg_stop; }
@@ -269,20 +262,19 @@ advwdt_probe(struct platform_device *dev)/* Check that the heartbeat value is within it's range ; if not reset to the default */ if (advwdt_set_heartbeat (timeout)) {advwdt_set_heartbeat (WATCHDOG_TIMEOUT ); - printk (KERN_INFO PFX "timeout value must be 1<=x<=63, using %d\n", - timeout); + printk (KERN_INFO PFX + "timeout value must be 1<=x<=63, using %d\n", timeout); } ret =misc_register (&advwdt_miscdev);if (ret !=0 ) { - printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - WATCHDOG_MINOR, ret); + printk (KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + WATCHDOG_MINOR, ret); goto unreg_regions; } - printk (KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d)\n", timeout, nowayout); - out:return ret; unreg_regions:
@@ -293,8 +285,7 @@ unreg_stop: goto out; } -static int __devexit -advwdt_remove (struct platform_device *dev) +static int __devexit advwdt_remove(struct platform_device *dev) {misc_deregister (&advwdt_miscdev);release_region (wdt_start,1 );
@@ -304,8 +295,7 @@ advwdt_remove(struct platform_device *dev)return 0 ; } -static void -advwdt_shutdown (struct platform_device *dev) +static void advwdt_shutdown (struct platform_device *dev) {/* Turn the WDT off if we have a soft shutdown */ advwdt_disable ();
@@ -321,8 +311,7 @@ static struct platform_driver advwdt_driver = { }, }; -static int __init -advwdt_init (void ) +static int __init advwdt_init (void ) {int err;
@@ -332,7 +321,8 @@ advwdt_init(void)if (err)return err; - advwdt_platform_device =platform_device_register_simple (DRV_NAME ,-1 ,NULL ,0 ); + advwdt_platform_device =platform_device_register_simple (DRV_NAME , +-1 ,NULL ,0 );if (IS_ERR (advwdt_platform_device)) { err =PTR_ERR (advwdt_platform_device); goto unreg_platform_driver;
@@ -345,8 +335,7 @@ unreg_platform_driver:return err; } -static void __exit -advwdt_exit (void ) +static void __exit advwdt_exit(void) {platform_device_unregister (advwdt_platform_device);platform_driver_unregister (&advwdt_driver);
PATCH 3/57 ali: watchdog locking and style
In reply to Alan CoxFrom: Alan Cox <[email protected]>
Clean up and check locking
---
drivers/watchdog/alim1535_wdt.c | 186 ++++++++++++++++---------------- drivers/watchdog/alim7101_wdt.c | 224 +++++++++++++++++++++------------------ 2 files changed, 209 insertions(+), 201 deletions(-)
drivers/watchdog/alim1535_wdt.c +91 -95
@@ -19,8 +19,8 @@#include <linux/fs.h> #include <linux/pci.h> -#include <asm/uaccess.h> -#include <asm/io.h> +#include <linux/uaccess.h> +#include <linux/io.h> #define WATCHDOG_NAME "ALi_M1535"#define PFX WATCHDOG_NAME ": "
@@ -30,17 +30,21 @@static unsigned long ali_is_open;static char ali_expect_release;static struct pci_dev *ali_pci; -static u32 ali_timeout_bits;/* stores the computed timeout */ +static u32 ali_timeout_bits;/* stores the computed timeout */ static DEFINE_SPINLOCK (ali_lock);/* Guards the hardware */ /* module parameters */ static int timeout =WATCHDOG_TIMEOUT ;module_param (timeout, int,0 ); -MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (0<timeout<18000, default=" __MODULE_STRING(WATCHDOG_TIMEOUT) ")"); +MODULE_PARM_DESC (timeout, + "Watchdog timeout in seconds. (0 < timeout < 18000, 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) ")");/* * ali_start - start watchdog countdown
@@ -103,15 +107,16 @@ static void ali_keepalive(void)static int ali_settimer (int t) { -if (t <0 ) +if (t <0 )return -EINVAL ; -else if (t <60 ) +else if (t <60 ) ali_timeout_bits = t|(1 <<6 ); -else if (t <3600 ) +else if (t <3600 ) ali_timeout_bits = (t/60 )|(1 <<7 ); -else if (t <18000 ) +else if (t <18000 ) ali_timeout_bits = (t/300 )|(1 <<6 )|(1 <<7 ); -else return -EINVAL ; +else +return -EINVAL ; timeout = t;return 0 ;
@@ -134,21 +139,22 @@ static int ali_settimer(int t)*/ static ssize_t ali_write (struct file *file,const char __user *data, -size_t len,loff_t * ppos) +size_t len,loff_t *ppos) {/* See if we got the magic character 'V' and reload the timer */ if (len) {if (!nowayout) {size_t i; -/* note: just in case someone wrote the magic character -* five months ago... */ +/* note: just in case someone wrote the +magic character five months ago... */ ali_expect_release =0 ; -/* scan to see whether or not we got the magic character */ +/* scan to see whether or not we got +the magic character */ for (i =0 ; i != len; i++) {char c; -if (get_user (c, data+i)) +if (get_user (c, data+i))return -EFAULT ;if (c =='V' ) ali_expect_release =42 ;
@@ -163,7 +169,6 @@ static ssize_t ali_write(struct file *file, const char __user *data,/* * ali_ioctl - handle watchdog ioctls -* @inode: VFS inode * @file: VFS file pointer * @cmd: ioctl number * @arg: arguments to the ioctl
@@ -172,8 +177,7 @@ static ssize_t ali_write(struct file *file, const char __user *data,* we want an extension to enable irq ack monitoring and the like */ -static int ali_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long ali_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {void __user *argp = (void __user *)arg;int __user *p = argp;
@@ -186,57 +190,45 @@ static int ali_ioctl(struct inode *inode, struct file *file, };switch (cmd) { -case WDIOC_GETSUPPORT : -return copy_to_user (argp, &ident, -sizeof (ident)) ? -EFAULT :0 ; - -case WDIOC_GETSTATUS : -case WDIOC_GETBOOTSTATUS : -return put_user (0 , p); - -case WDIOC_KEEPALIVE : -ali_keepalive (); -return 0 ; - -case WDIOC_SETOPTIONS : - { -int new_options, retval = -EINVAL ; - -if (get_user (new_options, p)) -return -EFAULT ; - -if (new_options &WDIOS_DISABLECARD ) { -ali_stop (); - retval =0 ; - } - -if (new_options &WDIOS_ENABLECARD ) { -ali_start (); - retval =0 ; - } +case WDIOC_GETSUPPORT : +return copy_to_user (argp, &ident,sizeof (ident)) ? -EFAULT :0 ; -return retval; +case WDIOC_GETSTATUS : +case WDIOC_GETBOOTSTATUS : +return put_user (0 , p); +case WDIOC_KEEPALIVE : +ali_keepalive (); +return 0 ; +case WDIOC_SETOPTIONS : + { +int new_options, retval = -EINVAL ; + +if (get_user (new_options, p)) +return -EFAULT ; +if (new_options &WDIOS_DISABLECARD ) { +ali_stop (); + retval =0 ; } - -case WDIOC_SETTIMEOUT : - { -int new_timeout; - -if (get_user (new_timeout, p)) -return -EFAULT ; - -if (ali_settimer (new_timeout)) -return -EINVAL ; - -ali_keepalive (); -/* Fall */ +if (new_options &WDIOS_ENABLECARD ) { +ali_start (); + retval =0 ; } - -case WDIOC_GETTIMEOUT : -return put_user (timeout, p); - -default : -return -ENOTTY ; +return retval; + } +case WDIOC_SETTIMEOUT : + { +int new_timeout; +if (get_user (new_timeout, p)) +return -EFAULT ; +if (ali_settimer (new_timeout)) +return -EINVAL ; +ali_keepalive (); +/* Fall */ + } +case WDIOC_GETTIMEOUT : +return put_user (timeout, p); +default : +return -ENOTTY ; } }
@@ -274,10 +266,11 @@ static int ali_release(struct inode *inode, struct file *file)/* * Shut off the timer. */ -if (ali_expect_release ==42 ) { +if (ali_expect_release ==42 )ali_stop (); - }else { - printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); +else { + printk(KERN_CRIT PFX + "Unexpected close, not stopping watchdog!\n");ali_keepalive (); }clear_bit (0 , &ali_is_open);
@@ -292,13 +285,11 @@ static int ali_release(struct inode *inode, struct file *file)*/ -static int ali_notify_sys (struct notifier_block *this,unsigned long code,void *unused) +static int ali_notify_sys (struct notifier_block *this, +unsigned long code,void *unused) { -if (code==SYS_DOWN || code==SYS_HALT ) { -/* Turn the WDT off */ -ali_stop (); - } - +if (code ==SYS_DOWN || code ==SYS_HALT ) +ali_stop ();/* Turn the WDT off */ return NOTIFY_DONE ; }
@@ -340,10 +331,10 @@ static int __init ali_find_watchdog(void)/* Check for the a 7101 PMU */ pdev =pci_get_device (PCI_VENDOR_ID_AL ,0x7101 ,NULL ); -if (pdev ==NULL ) +if (pdev ==NULL )return -ENODEV ; -if (pci_enable_device (pdev)) { +if (pci_enable_device (pdev)) {pci_dev_put (pdev);return -EIO ; }
@@ -355,9 +346,12 @@ static int __init ali_find_watchdog(void)*/ pci_read_config_dword (pdev,0xCC , &wdog); - wdog &= ~0x3F ;/* Timer bits */ - wdog &= ~((1 <<27 )|(1 <<26 )|(1 <<25 )|(1 <<24 ));/* Issued events */ - wdog &= ~((1 <<16 )|(1 <<13 )|(1 <<12 )|(1 <<11 )|(1 <<10 )|(1 <<9 ));/* No monitor bits */ +/* Timer bits */ + wdog &= ~0x3F ; +/* Issued events */ + wdog &= ~((1 <<27 )|(1 <<26 )|(1 <<25 )|(1 <<24 )); +/* No monitor bits */ + wdog &= ~((1 <<16 )|(1 <<13 )|(1 <<12 )|(1 <<11 )|(1 <<10 )|(1 <<9 ));pci_write_config_dword (pdev,0xCC , wdog);
@@ -369,12 +363,12 @@ static int __init ali_find_watchdog(void)*/ static const struct file_operations ali_fops = { - .owner =THIS_MODULE , - .llseek = no_llseek, - .write = ali_write, - .ioctl = ali_ioctl, - .open = ali_open, - .release = ali_release, + .owner =THIS_MODULE , + .llseek = no_llseek, + .write = ali_write, + .unlocked_ioctl = ali_ioctl, + .open = ali_open, + .release = ali_release, };static struct miscdevice ali_miscdev = {
@@ -399,15 +393,16 @@ static int __init watchdog_init(void)int ret;/* Check whether or not the hardware watchdog is there */ -if (ali_find_watchdog () !=0 ) { +if (ali_find_watchdog () !=0 )return -ENODEV ; - } -/* 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 (timeout <1 || timeout >=18000 ) { timeout =WATCHDOG_TIMEOUT ; - printk(KERN_INFO PFX "timeout value must be 0<timeout<18000, using %d\n", - timeout); + printk(KERN_INFO PFX +"timeout value must be 0 < timeout < 18000, using %d\n" , + timeout); }/* Calculate the watchdog's timeout */
@@ -415,15 +410,16 @@ static int __init watchdog_init(void) ret =register_reboot_notifier (&ali_notifier);if (ret !=0 ) { - printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", - ret); + printk(KERN_ERR PFX + "cannot register reboot notifier (err=%d)\n", ret); goto out; } ret =misc_register (&ali_miscdev);if (ret !=0 ) { - printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - WATCHDOG_MINOR, ret); + printk(KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + WATCHDOG_MINOR, ret); goto unreg_reboot; }
drivers/watchdog/alim7101_wdt.c +118 -106
364 lines not on this page · raw message
PATCH 4/57 AR7 watchdog
In reply to Alan CoxFrom: Alan Cox <[email protected]>
Fix locking
Use unlocked_ioctl
Remove semaphores
---
drivers/watchdog/ar7_wdt.c | 29 +++++++++++++++++------------ 1 files changed, 17 insertions(+), 12 deletions(-)
drivers/watchdog/ar7_wdt.c +17 -12
@@ -69,7 +69,8 @@ struct ar7_wdt {u32 prescale; }; -static struct semaphore open_semaphore; +static unsigned long wdt_is_open; +static spinlock_t wdt_lock;static unsigned expect_close;/* XXX currently fixed, allows max margin ~68.72 secs */
@@ -154,8 +155,10 @@ static void ar7_wdt_update_margin(int new_margin)u32 change; change = new_margin * (ar7_vbus_freq () / prescale_value); -if (change <1 ) change =1 ; -if (change >0xffff ) change =0xffff ; +if (change <1 ) + change =1 ; +if (change >0xffff ) + change =0xffff ;ar7_wdt_change (change); margin = change * prescale_value /ar7_vbus_freq (); printk(KERN_INFO DRVNAME
@@ -179,7 +182,7 @@ static void ar7_wdt_disable_wdt(void)static int ar7_wdt_open (struct inode *inode,struct file *file) {/* only allow one at a time */ -if (down_trylock (&open_semaphore)) +if (test_and_set_bit (0 , &wdt_is_open))return -EBUSY ;ar7_wdt_enable_wdt (); expect_close =0 ;
@@ -195,9 +198,7 @@ static int ar7_wdt_release(struct inode *inode, struct file *file) "will not disable the watchdog timer\n"); else if (!nowayout) ar7_wdt_disable_wdt(); - -up (&open_semaphore); - +clear_bit (0 , &wdt_is_open);return 0 ; }
@@ -222,7 +223,9 @@ static ssize_t ar7_wdt_write(struct file *file, const char *data,if (len) {size_t i; +spin_lock (&wdt_lock);ar7_wdt_kick (1 ); +spin_unlock (&wdt_lock); expect_close =0 ;for (i =0 ; i < len; ++i) {
@@ -237,8 +240,8 @@ static ssize_t ar7_wdt_write(struct file *file, const char *data,return len; } -static int ar7_wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long ar7_wdt_ioctl (struct file *file, +unsigned int cmd,unsigned long arg) {static struct watchdog_info ident = { .identity =LONGNAME ,
@@ -269,8 +272,10 @@ static int ar7_wdt_ioctl(struct inode *inode, struct file *file,if (new_margin <1 )return -EINVAL ; +spin_lock (&wdt_lock);ar7_wdt_update_margin (new_margin);ar7_wdt_kick (1 ); +spin_unlock (&wdt_lock);case WDIOC_GETTIMEOUT :if (put_user (margin, (int *)arg))
@@ -282,7 +287,7 @@ static int ar7_wdt_ioctl(struct inode *inode, struct file *file,static const struct file_operations ar7_wdt_fops = { .owner =THIS_MODULE , .write = ar7_wdt_write, - .ioctl = ar7_wdt_ioctl, + .unlocked_ioctl = ar7_wdt_ioctl, .open = ar7_wdt_open, .release = ar7_wdt_release, };
@@ -297,6 +302,8 @@ static int __init ar7_wdt_init(void) { int rc; + spin_lock_init(&wdt_lock); + ar7_wdt_get_regs(); if (!request_mem_region(ar7_regs_wdt, sizeof(struct ar7_wdt),
@@ -312,8 +319,6 @@ static int __init ar7_wdt_init(void)ar7_wdt_prescale (prescale_value);ar7_wdt_update_margin (margin); -sema_init (&open_semaphore,1 ); - rc =register_reboot_notifier (&ar7_wdt_notifier);if (rc) { printk(KERN_ERR DRVNAME
PATCH 5/57 atp watchdog
In reply to Alan CoxFrom: Alan Cox <[email protected]>
Switch to unlocked_ioctl
---
drivers/watchdog/at32ap700x_wdt.c | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-)
drivers/watchdog/at32ap700x_wdt.c +3 -4
@@ -212,8 +212,8 @@ static struct watchdog_info at32_wdt_info = {/* * Handle commands from user-space. */ -static int at32_wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long at32_wdt_ioctl (struct file *file, +unsigned int cmd,unsigned long arg) {int ret = -ENOTTY ;int time;
@@ -298,7 +298,7 @@ static ssize_t at32_wdt_write(struct file *file, const char __user *data,static const struct file_operations at32_wdt_fops = { .owner =THIS_MODULE , .llseek = no_llseek, - .ioctl = at32_wdt_ioctl, + .unlocked_ioctl = at32_wdt_ioctl, .open = at32_wdt_open, .release = at32_wdt_close, .write = at32_wdt_write,
@@ -391,7 +391,6 @@ static int __exit at32_wdt_remove(struct platform_device *pdev) wdt =NULL ;platform_set_drvdata (pdev,NULL ); } -return 0 ; }
PATCH 6/57 at91: watchdog to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
Review and switch to unlocked_ioctl
---
drivers/watchdog/at91rm9200_wdt.c | 108 +++++++++++++++++++------------------ 1 files changed, 54 insertions(+), 54 deletions(-)
drivers/watchdog/at91rm9200_wdt.c +54 -54
@@ -20,7 +20,7 @@#include <linux/platform_device.h> #include <linux/types.h> #include <linux/watchdog.h> -#include <asm/uaccess.h> +#include <linux/uaccess.h> #include <asm/arch/at91_st.h>
@@ -31,11 +31,14 @@ static int wdt_time = WDT_DEFAULT_TIME;static int nowayout =WATCHDOG_NOWAYOUT ;module_param (wdt_time, int,0 ); -MODULE_PARM_DESC(wdt_time, "Watchdog time in seconds. (default="__MODULE_STRING(WDT_DEFAULT_TIME) ")"); +MODULE_PARM_DESC(wdt_time, "Watchdog time in seconds. (default=" + __MODULE_STRING(WDT_DEFAULT_TIME) ")");#ifdef CONFIG_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) ")");#endif
@@ -46,7 +49,7 @@ static unsigned long at91wdt_busy;/* * Disable the watchdog. */ -static void inline at91_wdt_stop (void ) +static inline void at91_wdt_stop (void ) {at91_sys_write (AT91_ST_WDMR ,AT91_ST_EXTEN ); }
@@ -54,16 +57,17 @@ static void inline at91_wdt_stop(void)/* * Enable and reset the watchdog. */ -static void inline at91_wdt_start (void ) +static inline void at91_wdt_start (void ) { -at91_sys_write (AT91_ST_WDMR ,AT91_ST_EXTEN |AT91_ST_RSTEN | (((65536 * wdt_time) >>8 ) &AT91_ST_WDV )); +at91_sys_write (AT91_ST_WDMR ,AT91_ST_EXTEN |AT91_ST_RSTEN | + (((65536 * wdt_time) >>8 ) &AT91_ST_WDV ));at91_sys_write (AT91_ST_CR ,AT91_ST_WDRST ); }/* * Reload the watchdog timer. (ie, pat the watchdog) */ -static void inline at91_wdt_reload (void ) +static inline void at91_wdt_reload (void ) {at91_sys_write (AT91_ST_CR ,AT91_ST_WDRST ); }
@@ -89,8 +93,9 @@ static int at91_wdt_open(struct inode *inode, struct file *file)*/ static int at91_wdt_close (struct inode *inode,struct file *file) { +/* Disable the watchdog when file is closed */ if (!nowayout) -at91_wdt_stop ();/* Disable the watchdog when file is closed */ +at91_wdt_stop ();clear_bit (0 , &at91wdt_busy);return 0 ;
@@ -110,7 +115,8 @@ static int at91_wdt_settimeout(int new_time)if ((new_time <=0 ) || (new_time >WDT_MAX_TIME ))return -EINVAL ; -/* Set new watchdog time. It will be used when at91_wdt_start() is called. */ +/* Set new watchdog time. It will be used when +at91_wdt_start() is called. */ wdt_time = new_time;return 0 ; }
@@ -123,60 +129,52 @@ static struct watchdog_info at91_wdt_info = {/* * Handle commands from user-space. */ -static int at91_wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long at91_wdt_ioct (struct file *file, +unsigned int cmd,unsigned long arg) {void __user *argp = (void __user *)arg;int __user *p = argp;int new_value; -switch (cmd) { -case WDIOC_KEEPALIVE : -at91_wdt_reload ();/* pat the watchdog */ -return 0 ; - -case WDIOC_GETSUPPORT : -return copy_to_user (argp, &at91_wdt_info,sizeof (at91_wdt_info)) ? -EFAULT :0 ; - -case WDIOC_SETTIMEOUT : -if (get_user (new_value, p)) -return -EFAULT ; - -if (at91_wdt_settimeout (new_value)) -return -EINVAL ; - -/* Enable new time value */ +switch (cmd) { +case WDIOC_KEEPALIVE : +at91_wdt_reload ();/* pat the watchdog */ +return 0 ; +case WDIOC_GETSUPPORT : +return copy_to_user (argp, &at91_wdt_info, +sizeof (at91_wdt_info)) ? -EFAULT :0 ; +case WDIOC_SETTIMEOUT : +if (get_user (new_value, p)) +return -EFAULT ; +if (at91_wdt_settimeout (new_value)) +return -EINVAL ; +/* Enable new time value */ +at91_wdt_start (); +/* Return current value */ +return put_user (wdt_time, p); +case WDIOC_GETTIMEOUT : +return put_user (wdt_time, p); +case WDIOC_GETSTATUS : +case WDIOC_GETBOOTSTATUS : +return put_user (0 , p); +case WDIOC_SETOPTIONS : +if (get_user (new_value, p)) +return -EFAULT ; +if (new_value &WDIOS_DISABLECARD ) +at91_wdt_stop (); +if (new_value &WDIOS_ENABLECARD )at91_wdt_start (); - -/* Return current value */ -return put_user (wdt_time, p); - -case WDIOC_GETTIMEOUT : -return put_user (wdt_time, p); - -case WDIOC_GETSTATUS : -case WDIOC_GETBOOTSTATUS : -return put_user (0 , p); - -case WDIOC_SETOPTIONS : -if (get_user (new_value, p)) -return -EFAULT ; - -if (new_value &WDIOS_DISABLECARD ) -at91_wdt_stop (); -if (new_value &WDIOS_ENABLECARD ) -at91_wdt_start (); -return 0 ; - -default : -return -ENOTTY ; +return 0 ; +default : +return -ENOTTY ; } }/* * Pat the watchdog whenever device is written to. */ -static ssize_t at91_wdt_write (struct file *file,const char *data,size_t len,loff_t *ppos) +static ssize_t at91_wdt_write (struct file *file,const char *data, +size_t len,loff_t *ppos) {at91_wdt_reload ();/* pat the watchdog */ return len;
@@ -187,7 +185,7 @@ static ssize_t at91_wdt_write(struct file *file, const char *data, size_t len, lstatic const struct file_operations at91wdt_fops = { .owner =THIS_MODULE , .llseek = no_llseek, - .ioctl = at91_wdt_ioctl, + .unlocked_ioctl = at91_wdt_ioctl, .open = at91_wdt_open, .release = at91_wdt_close, .write = at91_wdt_write,
@@ -211,7 +209,8 @@ static int __init at91wdt_probe(struct platform_device *pdev)if (res)return res; -printk ("AT91 Watchdog Timer enabled (%d seconds%s)\n" , wdt_time, nowayout ?", nowayout" :"" ); +printk (KERN_INFO "AT91 Watchdog Timer enabled (%d seconds%s)\n" , + wdt_time, nowayout ?", nowayout" :"" );return 0 ; }
@@ -265,7 +264,8 @@ static struct platform_driver at91wdt_driver = {static int __init at91_wdt_init (void ) { -/* Check that the heartbeat value is within range; if not reset to the default */ +/* Check that the heartbeat value is within range; +if not reset to the default */ if (at91_wdt_settimeout (wdt_time)) {at91_wdt_settimeout (WDT_DEFAULT_TIME );pr_info ("at91_wdt: wdt_time value must be 1 <= wdt_time <= 256, using %d\n" , wdt_time);
PATCH 7/57 cpu5_wdt: switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/cpu5wdt.c | 144 +++++++++++++++++++++----------------------- 1 files changed, 70 insertions(+), 74 deletions(-)
drivers/watchdog/cpu5wdt.c +70 -74
@@ -30,16 +30,16 @@#include <linux/timer.h> #include <linux/completion.h> #include <linux/jiffies.h> -#include <asm/io.h> -#include <asm/uaccess.h> - +#include <linux/io.h> +#include <linux/uaccess.h> #include <linux/watchdog.h> /* adjustable parameters */ -static int verbose =0 ; +static int verbose;static int port =0x91 ;static int ticks =10000 ; +static spinlock_t cpu5wdt_lock;#define PFX "cpu5wdt: "
@@ -70,12 +70,13 @@ static struct {static void cpu5wdt_trigger (unsigned long unused) { -if ( verbose >2 ) +if (verbose >2 ) printk(KERN_DEBUG PFX "trigger at %i ticks\n", ticks); -if ( cpu5wdt_device.running ) +if (cpu5wdt_device.running) ticks--; +spin_lock (&cpu5wdt_lock);/* keep watchdog alive */ outb (1 , port +CPU5WDT_TRIGGER_REG );
@@ -86,6 +87,7 @@ static void cpu5wdt_trigger(unsigned long unused)/* ticks doesn't matter anyway */ complete (&cpu5wdt_device.stop); } +spin_unlock (&cpu5wdt_lock); }
@@ -93,14 +95,17 @@ static void cpu5wdt_reset(void) { ticks = cpu5wdt_device.default_ticks; -if ( verbose ) +if (verbose) printk(KERN_DEBUG PFX "reset (%i ticks)\n", (int) ticks); }static void cpu5wdt_start (void ) { -if ( !cpu5wdt_device.queue ) { +unsigned long flags; + +spin_lock_irqsave (&cpu5wdt_lock, flags); +if (!cpu5wdt_device.queue) { cpu5wdt_device.queue =1 ;outb (0 , port +CPU5WDT_TIME_A_REG );outb (0 , port +CPU5WDT_TIME_B_REG );
@@ -111,18 +116,20 @@ static void cpu5wdt_start(void) }/* if process dies, counter is not decremented */ cpu5wdt_device.running++; +spin_unlock_irqrestore (&cpu5wdt_lock, flags); }static int cpu5wdt_stop (void ) { -if ( cpu5wdt_device.running ) - cpu5wdt_device.running =0 ; +unsigned long flags; +spin_lock_irqsave (&cpu5wdt_lock, flags); +if (cpu5wdt_device.running) + cpu5wdt_device.running =0 ; ticks = cpu5wdt_device.default_ticks; - -if ( verbose ) +spin_unlock_irqrestore (&cpu5wdt_lock, flags); +if (verbose) printk(KERN_CRIT PFX "stop not possible\n"); -return -EIO ; }
@@ -130,9 +137,8 @@ static int cpu5wdt_stop(void)static int cpu5wdt_open (struct inode *inode,struct file *file) { -if (test_and_set_bit (0 , &cpu5wdt_device.inuse) ) +if (test_and_set_bit (0 , &cpu5wdt_device.inuse))return -EBUSY ; -return nonseekable_open (inode, file); }
@@ -142,67 +148,58 @@ static int cpu5wdt_release(struct inode *inode, struct file *file)return 0 ; } -static int cpu5wdt_ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg) +static long cpu5wdt_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {void __user *argp = (void __user *)arg; +int __user *p = argp;unsigned int value; -static struct watchdog_info ident = - { +static struct watchdog_info ident = { .options =WDIOF_CARDRESET , .identity ="CPU5 WDT" , }; -switch (cmd) { -case WDIOC_KEEPALIVE : -cpu5wdt_reset (); -break ; -case WDIOC_GETSTATUS : - value =inb (port +CPU5WDT_STATUS_REG ); - value = (value >>2 ) &1 ; -if (copy_to_user (argp, &value,sizeof (int )) ) -return -EFAULT ; -break ; -case WDIOC_GETBOOTSTATUS : -if (copy_to_user (argp, &value,sizeof (int )) ) -return -EFAULT ; -break ; -case WDIOC_GETSUPPORT : -if (copy_to_user (argp, &ident,sizeof (ident)) ) -return -EFAULT ; -break ; -case WDIOC_SETOPTIONS : -if (copy_from_user (&value, argp,sizeof (int )) ) -return -EFAULT ; -switch (value) { -case WDIOS_ENABLECARD : -cpu5wdt_start (); -break ; -case WDIOS_DISABLECARD : -return cpu5wdt_stop (); -default : -return -EINVAL ; - } -break ; -default : -return -ENOTTY ; +switch (cmd) { +case WDIOC_KEEPALIVE : +cpu5wdt_reset (); +break ; +case WDIOC_GETSTATUS : + value =inb (port +CPU5WDT_STATUS_REG ); + value = (value >>2 ) &1 ; +return put_user (value, p); +case WDIOC_GETBOOTSTATUS : +return put_user (0 , p); +case WDIOC_GETSUPPORT : +if (copy_to_user (argp, &ident,sizeof (ident))) +return -EFAULT ; +break ; +case WDIOC_SETOPTIONS : +if (get_user (value, p)) +return -EFAULT ; +if (value &WDIOS_ENABLECARD ) +cpu5wdt_start (); +if (value &WDIOS_DISABLECARD ) +cpu5wdt_stop (); +break ; +default : +return -ENOTTY ; }return 0 ; } -static ssize_t cpu5wdt_write (struct file *file,const char __user *buf,size_t count,loff_t *ppos) +static ssize_t cpu5wdt_write (struct file *file,const char __user *buf, +size_t count,loff_t *ppos) { -if ( !count ) +if (!count)return -EIO ; -cpu5wdt_reset (); -return count; }static const struct file_operations cpu5wdt_fops = { .owner =THIS_MODULE , .llseek = no_llseek, - .ioctl = cpu5wdt_ioctl, + .unlocked_ioctl = cpu5wdt_ioctl, .open = cpu5wdt_open, .write = cpu5wdt_write, .release = cpu5wdt_release,
@@ -221,37 +218,36 @@ static int __devinit cpu5wdt_init(void)unsigned int val;int err; -if ( verbose ) - printk(KERN_DEBUG PFX "port=0x%x, verbose=%i\n", port, verbose); +if (verbose) + printk(KERN_DEBUG PFX +"port=0x%x, verbose=%i\n" , port, verbose); -if ( !request_region (port,CPU5WDT_EXTENT ,PFX ) ) { +init_completion (&cpu5wdt_device.stop); +spin_lock_init (&cpu5wdt_lock); + cpu5wdt_device.queue =0 ; +setup_timer (&cpu5wdt_device.timer, cpu5wdt_trigger,0 ); + cpu5wdt_device.default_ticks = ticks; + +if (!request_region (port,CPU5WDT_EXTENT ,PFX )) { printk(KERN_ERR PFX "request_region failed\n"); err = -EBUSY ; goto no_port; } -if ( (err =misc_register (&cpu5wdt_misc)) <0 ) { - printk(KERN_ERR PFX "misc_register failed\n"); - goto no_misc; - } -/* watchdog reboot? */ val =inb (port +CPU5WDT_STATUS_REG ); val = (val >>2 ) &1 ; -if ( !val ) +if (!val) printk(KERN_INFO PFX "sorry, was my fault\n"); -init_completion (&cpu5wdt_device.stop); - cpu5wdt_device.queue =0 ; - -clear_bit (0 , &cpu5wdt_device.inuse); - -setup_timer (&cpu5wdt_device.timer, cpu5wdt_trigger,0 ); + err =misc_register (&cpu5wdt_misc); +if (err <0 ) { + printk(KERN_ERR PFX "misc_register failed\n"); + goto no_misc; + } - cpu5wdt_device.default_ticks = ticks; printk(KERN_INFO PFX "init success\n"); -return 0 ; no_misc:
@@ -267,7 +263,7 @@ static int __devinit cpu5wdt_init_module(void) static void __devexit cpu5wdt_exit(void) { -if ( cpu5wdt_device.queue ) { +if (cpu5wdt_device.queue) { cpu5wdt_device.queue =0 ;wait_for_completion (&cpu5wdt_device.stop); }
PATCH 8/57 davinci_wdt: unlocked_ioctl and check locking
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/davinci_wdt.c | 11 +++++------ 1 files changed, 5 insertions(+), 6 deletions(-)
drivers/watchdog/davinci_wdt.c +5 -6
@@ -22,10 +22,10 @@#include <linux/bitops.h> #include <linux/platform_device.h> #include <linux/spinlock.h> +#include <linux/uaccess.h> +#include <linux/io.h> #include <asm/hardware.h> -#include <asm/uaccess.h> -#include <asm/io.h> #define MODULE_NAME "DAVINCI-WDT: "
@@ -143,9 +143,8 @@ static struct watchdog_info ident = { .identity = "DaVinci Watchdog", }; -static int -davinci_wdt_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long davinci_wdt_ioctl (struct file *file, +unsigned int cmd,unsigned long arg) {int ret = -ENOTTY ;
@@ -184,7 +183,7 @@ static const struct file_operations davinci_wdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = davinci_wdt_write, - .ioctl = davinci_wdt_ioctl, + .unlocked_ioctl = davinci_wdt_ioctl, .open = davinci_wdt_open, .release = davinci_wdt_release, };
PATCH 9/57 ep93xx_wdt: unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/ep93xx_wdt.c | 17 +++++++++-------- 1 files changed, 9 insertions(+), 8 deletions(-)
drivers/watchdog/ep93xx_wdt.c +9 -8
@@ -28,9 +28,9 @@#include <linux/miscdevice.h> #include <linux/watchdog.h> #include <linux/timer.h> +#include <linux/uaccess.h> #include <asm/hardware.h> -#include <asm/uaccess.h> #define WDT_VERSION "0.3"#define PFX "ep93xx_wdt: "
@@ -136,9 +136,8 @@ static struct watchdog_info ident = { .identity = "EP93xx Watchdog", }; -static int -ep93xx_wdt_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long ep93xx_wdt_ioctl (struct file *file, +unsigned int cmd,unsigned long arg) {int ret = -ENOTTY ;
@@ -174,8 +173,8 @@ static int ep93xx_wdt_release(struct inode *inode, struct file *file)if (test_bit (WDT_OK_TO_CLOSE , &wdt_status))wdt_shutdown ();else - printk(KERN_CRIT PFX "Device closed unexpectedly - " -"timer will not stop\n" ); + printk(KERN_CRIT PFX +"Device closed unexpectedly - timer will not stop\n" );clear_bit (WDT_IN_USE , &wdt_status);clear_bit (WDT_OK_TO_CLOSE , &wdt_status);
@@ -186,7 +185,7 @@ static int ep93xx_wdt_release(struct inode *inode, struct file *file)static const struct file_operations ep93xx_wdt_fops = { .owner =THIS_MODULE , .write = ep93xx_wdt_write, - .ioctl = ep93xx_wdt_ioctl, + .unlocked_ioctl = ep93xx_wdt_ioctl, .open = ep93xx_wdt_open, .release = ep93xx_wdt_release, };
@@ -243,7 +242,9 @@ module_param(nowayout, int, 0);MODULE_PARM_DESC (nowayout,"Watchdog cannot be stopped once started" );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) ")");MODULE_AUTHOR ("Ray Lehtiniemi <[email protected]>," "Alessandro Zummo <[email protected]>" );
PATCH 10/57 eurotechwdt: unlocked_ioctl, code lock check and tidy
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/eurotechwdt.c | 57 +++++++++++++++++++++++++--------------- 1 files changed, 36 insertions(+), 21 deletions(-)
drivers/watchdog/eurotechwdt.c +36 -21
@@ -56,14 +56,15 @@#include <linux/notifier.h> #include <linux/reboot.h> #include <linux/init.h> +#include <linux/io.h> +#include <linux/uaccess.h> -#include <asm/io.h> -#include <asm/uaccess.h> #include <asm/system.h> static unsigned long eurwdt_is_open;static int eurwdt_timeout;static char eur_expect_close; +static spinlock_t eurwdt_lock;/* * You must set these - there is no sane way to probe for this board.
@@ -78,7 +79,9 @@ static char *ev = "int";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) ")");/* * Some symbolic names
@@ -137,7 +140,8 @@ static void eurwdt_activate_timer(void) {eurwdt_disable_timer ();eurwdt_write_reg (WDT_CTRL_REG ,0x01 );/* activate the WDT */ -eurwdt_write_reg (WDT_OUTPIN_CFG , !strcmp ("int" , ev) ?WDT_EVENT_INT :WDT_EVENT_REBOOT ); +eurwdt_write_reg (WDT_OUTPIN_CFG , + !strcmp ("int" , ev) ?WDT_EVENT_INT :WDT_EVENT_REBOOT );/* Setting interrupt line */ if (irq ==2 || irq >15 || irq <0 ) {
@@ -206,21 +210,21 @@ size_t count, loff_t *ppos)for (i =0 ; i != count; i++) {char c; -if (get_user (c, buf+i)) +if (get_user (c, buf+i))return -EFAULT ;if (c =='V' ) eur_expect_close =42 ; } } +spin_lock (&eurwdt_lock);eurwdt_ping ();/* the default timeout */ +spin_unlock (&eurwdt_lock); } -return count; }/** * eurwdt_ioctl: -* @inode: inode of the device * @file: file handle to the device * @cmd: watchdog command * @arg: argument pointer
@@ -229,13 +233,14 @@ size_t count, loff_t *ppos)* according to their available features. */ -static int eurwdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long eurwdt_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 , + .options =WDIOF_KEEPALIVEPING |WDIOF_SETTIMEOUT + |WDIOF_MAGICCLOSE , .firmware_version =1 , .identity ="WDT Eurotech CPU-1220/1410" , };
@@ -243,7 +248,7 @@ static int eurwdt_ioctl(struct inode *inode, struct file *file,int time;int options, retval = -EINVAL ; -switch (cmd) { +switch (cmd) {default :return -ENOTTY ;
@@ -255,7 +260,9 @@ static int eurwdt_ioctl(struct inode *inode, struct file *file,return put_user (0 , p);case WDIOC_KEEPALIVE : +spin_lock (&eurwdt_lock);eurwdt_ping (); +spin_unlock (&eurwdt_lock);return 0 ;case WDIOC_SETTIMEOUT :
@@ -266,8 +273,10 @@ static int eurwdt_ioctl(struct inode *inode, struct file *file,if (time <0 || time >255 )return -EINVAL ; +spin_lock (&eurwdt_lock); eurwdt_timeout = time;eurwdt_set_timeout (time); +spin_unlock (&eurwdt_lock);/* Fall */ case WDIOC_GETTIMEOUT :
@@ -276,6 +285,7 @@ static int eurwdt_ioctl(struct inode *inode, struct file *file,case WDIOC_SETOPTIONS :if (get_user (options, p))return -EFAULT ; +spin_lock (&eurwdt_lock);if (options &WDIOS_DISABLECARD ) {eurwdt_disable_timer (); retval =0 ;
@@ -285,6 +295,7 @@ static int eurwdt_ioctl(struct inode *inode, struct file *file,eurwdt_ping (); retval =0 ; } +spin_unlock (&eurwdt_lock);return retval; } }
@@ -322,10 +333,11 @@ static int eurwdt_open(struct inode *inode, struct file *file)static int eurwdt_release (struct inode *inode,struct file *file) { -if (eur_expect_close ==42 ) { +if (eur_expect_close ==42 )eurwdt_disable_timer (); - }else { -printk (KERN_CRIT "eurwdt: Unexpected close, not stopping watchdog!\n" ); +else { +printk (KERN_CRIT +"eurwdt: Unexpected close, not stopping watchdog!\n" );eurwdt_ping (); }clear_bit (0 , &eurwdt_is_open);
@@ -362,11 +374,11 @@ static int eurwdt_notify_sys(struct notifier_block *this, unsigned long code,static const struct file_operations eurwdt_fops = { - .owner =THIS_MODULE , - .llseek = no_llseek, - .write = eurwdt_write, - .ioctl = eurwdt_ioctl, - .open = eurwdt_open, + .owner =THIS_MODULE , + .llseek = no_llseek, + .write = eurwdt_write, + .unlocked_ioctl = eurwdt_ioctl, + .open = eurwdt_open, .release = eurwdt_release, };
@@ -419,7 +431,7 @@ static int __init eurwdt_init(void)int ret; ret =request_irq (irq, eurwdt_interrupt,IRQF_DISABLED ,"eurwdt" ,NULL ); -if (ret) { +if (ret) {printk (KERN_ERR "eurwdt: IRQ %d is not free.\n" , irq); goto out; }
@@ -432,10 +444,13 @@ static int __init eurwdt_init(void) ret =register_reboot_notifier (&eurwdt_notifier);if (ret) { -printk (KERN_ERR "eurwdt: can't register reboot notifier (err=%d)\n" , ret); +printk (KERN_ERR +"eurwdt: can't register reboot notifier (err=%d)\n" , ret); goto outreg; } +spin_lock_init (&eurwdt_lock); + ret =misc_register (&eurwdt_miscdev);if (ret) { printk(KERN_ERR "eurwdt: can't misc_register on minor=%d\n",
PATCH 11/57 hpwdt: couple of include cleanups
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/hpwdt.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
drivers/watchdog/hpwdt.c +2 -2
@@ -39,9 +39,9 @@#include <linux/string.h> #include <linux/bootmem.h> #include <linux/slab.h> -#include <asm/dmi.h> +#include <linux/dmi.h> #include <asm/desc.h> -#include <asm/kdebug.h> +#include <linux/kdebug.h> #define PCI_BIOS32_SD_VALUE 0x5F32335F/* "_32_" */ #define CRU_BIOS_SIGNATURE_VALUE 0x55524324
PATCH 12/57 ib700wdt: clean up and switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/ib700wdt.c | 103 ++++++++++++++++++++++--------------------- 1 files changed, 52 insertions(+), 51 deletions(-)
drivers/watchdog/ib700wdt.c +52 -51
@@ -42,8 +42,8 @@#include <linux/moduleparam.h> #include <linux/platform_device.h> -#include <asm/io.h> -#include <asm/uaccess.h> +#include <linux/io.h> +#include <linux/uaccess.h> #include <asm/system.h> static struct platform_device *ibwdt_platform_device;
@@ -120,7 +120,9 @@ static int wd_margin = WD_TIMO;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) ")");/*
@@ -165,8 +167,8 @@ ibwdt_set_heartbeat(int t)* /dev/watchdog handling */ -static ssize_t -ibwdt_write (struct file *file,const char __user *buf,size_t count,loff_t *ppos) +static ssize_t ibwdt_write (struct file *file,const char __user *buf, +size_t count,loff_t *ppos) {if (count) {if (!nowayout) {
@@ -188,77 +190,71 @@ ibwdt_write(struct file *file, const char __user *buf, size_t count, loff_t *pporeturn count; } -static int -ibwdt_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long ibwdt_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {int new_margin;void __user *argp = (void __user *)arg;int __user *p = argp;static struct watchdog_info ident = { - .options =WDIOF_KEEPALIVEPING |WDIOF_SETTIMEOUT |WDIOF_MAGICCLOSE , + .options =WDIOF_KEEPALIVEPING |WDIOF_SETTIMEOUT + |WDIOF_MAGICCLOSE , .firmware_version =1 , .identity ="IB700 WDT" , };switch (cmd) {case WDIOC_GETSUPPORT : -if (copy_to_user (argp, &ident,sizeof (ident))) -return -EFAULT ; -break ; +if (copy_to_user (argp, &ident,sizeof (ident))) +return -EFAULT ; +break ;case WDIOC_GETSTATUS :case WDIOC_GETBOOTSTATUS : -return put_user (0 , p); +return put_user (0 , p);case WDIOC_KEEPALIVE : -ibwdt_ping (); -break ; +ibwdt_ping (); +break ;case WDIOC_SETTIMEOUT : -if (get_user (new_margin, p)) -return -EFAULT ; -if (ibwdt_set_heartbeat (new_margin)) -return -EINVAL ; -ibwdt_ping (); -/* Fall */ +if (get_user (new_margin, p)) +return -EFAULT ; +if (ibwdt_set_heartbeat (new_margin)) +return -EINVAL ; +ibwdt_ping (); +/* Fall */ case WDIOC_GETTIMEOUT : -return put_user (wd_times[wd_margin], p); +return put_user (wd_times[wd_margin], p);case WDIOC_SETOPTIONS : { -int options, retval = -EINVAL ; +int options, retval = -EINVAL ; -if (get_user (options, p)) -return -EFAULT ; +if (get_user (options, p)) +return -EFAULT ; -if (options &WDIOS_DISABLECARD ) { -ibwdt_disable (); - retval =0 ; - } - -if (options &WDIOS_ENABLECARD ) { -ibwdt_ping (); - retval =0 ; - } - -return retval; +if (options &WDIOS_DISABLECARD ) { +ibwdt_disable (); + retval =0 ; + } +if (options &WDIOS_ENABLECARD ) { +ibwdt_ping (); + retval =0 ; + } +return retval; } -default : -return -ENOTTY ; +return -ENOTTY ; }return 0 ; } -static int -ibwdt_open (struct inode *inode,struct file *file) +static int ibwdt_open (struct inode *inode,struct file *file) { -if (test_and_set_bit (0 , &ibwdt_is_open)) { +if (test_and_set_bit (0 , &ibwdt_is_open))return -EBUSY ; - }if (nowayout)__module_get (THIS_MODULE );
@@ -273,7 +269,8 @@ ibwdt_close(struct inode *inode, struct file *file)if (expect_close ==42 ) {ibwdt_disable (); }else { - printk(KERN_CRIT PFX "WDT device closed unexpectedly. WDT will not stop!\n"); + printk(KERN_CRIT PFX + "WDT device closed unexpectedly. WDT will not stop!\n");ibwdt_ping (); }clear_bit (0 , &ibwdt_is_open);
@@ -289,7 +286,7 @@ static const struct file_operations ibwdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = ibwdt_write, - .ioctl = ibwdt_ioctl, + .unlocked_ioctl = ibwdt_ioctl, .open = ibwdt_open, .release = ibwdt_close, };
@@ -310,21 +307,23 @@ static int __devinit ibwdt_probe(struct platform_device *dev)#if WDT_START !=WDT_STOP if (!request_region (WDT_STOP ,1 ,"IB700 WDT" )) { - printk (KERN_ERR PFX "STOP method I/O %X is not available.\n", WDT_STOP); + printk(KERN_ERR PFX "STOP method I/O %X is not available.\n", + WDT_STOP); res = -EIO ; goto out_nostopreg; }#endif if (!request_region (WDT_START ,1 ,"IB700 WDT" )) { - printk (KERN_ERR PFX "START method I/O %X is not available.\n", WDT_START); + printk(KERN_ERR PFX "START method I/O %X is not available.\n", + WDT_START); res = -EIO ; goto out_nostartreg; } res =misc_register (&ibwdt_miscdev);if (res) { - printk (KERN_ERR PFX "failed to register misc device\n"); + printk(KERN_ERR PFX "failed to register misc device\n"); goto out_nomisc; }return 0 ;
@@ -342,9 +341,9 @@ out_nostopreg: static int __devexit ibwdt_remove(struct platform_device *dev) {misc_deregister (&ibwdt_miscdev); -release_region (WDT_START ,1 ); +release_region (WDT_START ,1 );#if WDT_START !=WDT_STOP -release_region (WDT_STOP ,1 ); +release_region (WDT_STOP ,1 );#endif return 0 ; }
@@ -369,13 +368,15 @@ static int __init ibwdt_init(void) {int err; - printk(KERN_INFO PFX "WDT driver for IB700 single board computer initialising.\n"); + printk(KERN_INFO PFX + "WDT driver for IB700 single board computer initialising.\n"); err =platform_driver_register (&ibwdt_driver);if (err)return err; - ibwdt_platform_device =platform_device_register_simple (DRV_NAME ,-1 ,NULL ,0 ); + ibwdt_platform_device =platform_device_register_simple (DRV_NAME , +-1 ,NULL ,0 );if (IS_ERR (ibwdt_platform_device)) { err =PTR_ERR (ibwdt_platform_device); goto unreg_platform_driver;
PATCH 13/57 i6300esb: Style, unlocked_ioctl, cleanup
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/i6300esb.c | 342 +++++++++++++++++++++---------------------- 1 files changed, 167 insertions(+), 175 deletions(-)
drivers/watchdog/i6300esb.c +167 -175
@@ -38,9 +38,8 @@#include <linux/init.h> #include <linux/pci.h> #include <linux/ioport.h> - -#include <asm/uaccess.h> -#include <asm/io.h> +#include <linux/uaccess.h> +#include <linux/io.h> /* Module and version information */ #define ESB_VERSION "0.03"
@@ -59,17 +58,17 @@#define ESB_RELOAD_REG BASEADDR + 0x0c/* Reload register */ /* Lock register bits */ -#define ESB_WDT_FUNC ( 0x01 << 2 )/* Watchdog functionality */ -#define ESB_WDT_ENABLE ( 0x01 << 1 )/* Enable WDT */ -#define ESB_WDT_LOCK ( 0x01 << 0 )/* Lock (nowayout) */ +#define ESB_WDT_FUNC (0x01 << 2)/* Watchdog functionality */ +#define ESB_WDT_ENABLE (0x01 << 1)/* Enable WDT */ +#define ESB_WDT_LOCK (0x01 << 0)/* Lock (nowayout) */ /* Config register bits */ -#define ESB_WDT_REBOOT ( 0x01 << 5 )/* Enable reboot on timeout */ -#define ESB_WDT_FREQ ( 0x01 << 2 )/* Decrement frequency */ -#define ESB_WDT_INTTYPE ( 0x11 << 0 )/* Interrupt type on timer1 timeout */ +#define ESB_WDT_REBOOT (0x01 << 5)/* Enable reboot on timeout */ +#define ESB_WDT_FREQ (0x01 << 2)/* Decrement frequency */ +#define ESB_WDT_INTTYPE (0x11 << 0)/* Interrupt type on timer1 timeout */ /* Reload register bits */ -#define ESB_WDT_RELOAD ( 0x01 << 8 )/* prevent timeout */ +#define ESB_WDT_RELOAD (0x01 << 8)/* prevent timeout */ /* Magic constants */ #define ESB_UNLOCK1 0x80/* Step 1 to unlock reset registers */
@@ -84,14 +83,20 @@ static unsigned short triggered; /* The status of the watchdog upon boot */static char esb_expect_close;/* module parameters */ -#define WATCHDOG_HEARTBEAT 30/* 30 sec default heartbeat (1<heartbeat<2*1023) */ +/* 30 sec default heartbeat (1 < heartbeat < 2*1023) */ +#define WATCHDOG_HEARTBEAT 30static int heartbeat =WATCHDOG_HEARTBEAT ;/* in seconds */ +module_param (heartbeat, int,0 ); -MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (1<heartbeat<2046, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")"); +MODULE_PARM_DESC (heartbeat, + "Watchdog heartbeat in seconds. (1<heartbeat<2046, default=" + __MODULE_STRING(WATCHDOG_HEARTBEAT) ")");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) ")");/* * Some i6300ESB specific functions
@@ -104,8 +109,8 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" _* to once before they need to be unlocked again. */ static inline void esb_unlock_registers (void ) { -writeb (ESB_UNLOCK1 ,ESB_RELOAD_REG ); -writeb (ESB_UNLOCK2 ,ESB_RELOAD_REG ); +writeb (ESB_UNLOCK1 ,ESB_RELOAD_REG ); +writeb (ESB_UNLOCK2 ,ESB_RELOAD_REG ); }static void esb_timer_start (void )
@@ -114,8 +119,7 @@ static void esb_timer_start(void)/* Enable or Enable + Lock? */ val =0x02 | (nowayout ?0x01 :0x00 ); - -pci_write_config_byte (esb_pci,ESB_LOCK_REG , val); +pci_write_config_byte (esb_pci,ESB_LOCK_REG , val); }static int esb_timer_stop (void )
@@ -140,7 +144,7 @@ static void esb_timer_keepalive(void)spin_lock (&esb_lock);esb_unlock_registers ();writew (ESB_WDT_RELOAD ,ESB_RELOAD_REG ); -/* FIXME: Do we need to flush anything here? */ +/* FIXME: Do we need to flush anything here? */ spin_unlock (&esb_lock); }
@@ -167,7 +171,7 @@ static int esb_timer_set_heartbeat(int time)esb_unlock_registers ();writel (val,ESB_TIMER2_REG ); -/* Reload */ +/* Reload */ esb_unlock_registers ();writew (ESB_WDT_RELOAD ,ESB_RELOAD_REG );
@@ -179,54 +183,55 @@ static int esb_timer_set_heartbeat(int time)return 0 ; } -static int esb_timer_read (void ) +static int esb_timer_read (void ) { -u32 count; +u32 count;/* This isn't documented, and doesn't take into -* acount which stage is running, but it looks -* like a 20 bit count down, so we might as well report it. -*/ -pci_read_config_dword (esb_pci,0x64 , &count); -return (int )count; +* acount which stage is running, but it looks +* like a 20 bit count down, so we might as well report it. +*/ +pci_read_config_dword (esb_pci,0x64 , &count); +return (int )count; }/* * /dev/watchdog handling */ -static int esb_open (struct inode *inode,struct file *file) +static int esb_open (struct inode *inode,struct file *file) { -/* /dev/watchdog can only be opened once */ -if (test_and_set_bit (0 , &timer_alive)) -return -EBUSY ; +/* /dev/watchdog can only be opened once */ +if (test_and_set_bit (0 , &timer_alive)) +return -EBUSY ; -/* Reload and activate timer */ -esb_timer_keepalive (); -esb_timer_start (); +/* Reload and activate timer */ +esb_timer_keepalive (); +esb_timer_start ();return nonseekable_open (inode, file); } -static int esb_release (struct inode *inode,struct file *file) +static int esb_release (struct inode *inode,struct file *file) { -/* Shut off the timer. */ -if (esb_expect_close ==42 ) { -esb_timer_stop (); - }else { - printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); -esb_timer_keepalive (); - } -clear_bit (0 , &timer_alive); - esb_expect_close =0 ; -return 0 ; +/* Shut off the timer. */ +if (esb_expect_close ==42 ) +esb_timer_stop (); +else { + printk(KERN_CRIT PFX + "Unexpected close, not stopping watchdog!\n"); +esb_timer_keepalive (); + } +clear_bit (0 , &timer_alive); + esb_expect_close =0 ; +return 0 ; } -static ssize_t esb_write (struct file *file,const char __user *data, -size_t len,loff_t * ppos) +static ssize_t esb_write (struct file *file,const char __user *data, +size_t len,loff_t *ppos) {/* See if we got the magic character 'V' and reload the timer */ -if (len) { +if (len) {if (!nowayout) {size_t i;
@@ -237,7 +242,7 @@ static ssize_t esb_write (struct file *file, const char __user *data,/* scan to see whether or not we got the magic character */ for (i =0 ; i != len; i++) {char c; -if (get_user (c, data+i)) +if (get_user (c, data+i))return -EFAULT ;if (c =='V' ) esb_expect_close =42 ;
@@ -245,13 +250,12 @@ static ssize_t esb_write (struct file *file, const char __user *data, }/* someone wrote to us, we should reload the timer */ -esb_timer_keepalive (); +esb_timer_keepalive (); }return len; } -static int esb_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long esb_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {int new_options, retval = -EINVAL ;int new_heartbeat;
@@ -266,71 +270,65 @@ static int esb_ioctl (struct inode *inode, struct file *file, };switch (cmd) { -case WDIOC_GETSUPPORT : -return copy_to_user (argp, &ident, -sizeof (ident)) ? -EFAULT :0 ; - -case WDIOC_GETSTATUS : -return put_user (esb_timer_read (), p); - -case WDIOC_GETBOOTSTATUS : -return put_user (triggered, p); - -case WDIOC_KEEPALIVE : -esb_timer_keepalive (); -return 0 ; +case WDIOC_GETSUPPORT : +return copy_to_user (argp, &ident, +sizeof (ident)) ? -EFAULT :0 ; -case WDIOC_SETOPTIONS : - { -if (get_user (new_options, p)) -return -EFAULT ; +case WDIOC_GETSTATUS : +return put_user (esb_timer_read (), p); -if (new_options &WDIOS_DISABLECARD ) { -esb_timer_stop (); - retval =0 ; - } +case WDIOC_GETBOOTSTATUS : +return put_user (triggered, p); -if (new_options &WDIOS_ENABLECARD ) { -esb_timer_keepalive (); -esb_timer_start (); - retval =0 ; - } +case WDIOC_KEEPALIVE : +esb_timer_keepalive (); +return 0 ; -return retval; - } +case WDIOC_SETOPTIONS : + { +if (get_user (new_options, p)) +return -EFAULT ; -case WDIOC_SETTIMEOUT : - { -if (get_user (new_heartbeat, p)) -return -EFAULT ; - -if (esb_timer_set_heartbeat (new_heartbeat)) -return -EINVAL ; - -esb_timer_keepalive (); -/* Fall */ - } - -case WDIOC_GETTIMEOUT : -return put_user (heartbeat, p); +if (new_options &WDIOS_DISABLECARD ) { +esb_timer_stop (); + retval =0 ; + } -default : -return -ENOTTY ; - } +if (new_options &WDIOS_ENABLECARD ) { +esb_timer_keepalive (); +esb_timer_start (); + retval =0 ; + } +return retval; + } +case WDIOC_SETTIMEOUT : + { +if (get_user (new_heartbeat, p)) +return -EFAULT ; +if (esb_timer_set_heartbeat (new_heartbeat)) +return -EINVAL ; +esb_timer_keepalive (); +/* Fall */ + } +case WDIOC_GETTIMEOUT : +return put_user (heartbeat, p); +default : +return -ENOTTY ; + } }/* * Notify system */ -static int esb_notify_sys (struct notifier_block *this,unsigned long code,void *unused) +static int esb_notify_sys (struct notifier_block *this, +unsigned long code,void *unused) { -if (code==SYS_DOWN || code==SYS_HALT ) { -/* Turn the WDT off */ -esb_timer_stop (); - } - -return NOTIFY_DONE ; +if (code ==SYS_DOWN || code ==SYS_HALT ) { +/* Turn the WDT off */ +esb_timer_stop (); + } +return NOTIFY_DONE ; }/*
@@ -338,22 +336,22 @@ static int esb_notify_sys (struct notifier_block *this, unsigned long code, void*/ static const struct file_operations esb_fops = { - .owner =THIS_MODULE , - .llseek = no_llseek, - .write = esb_write, - .ioctl = esb_ioctl, - .open = esb_open, - .release = esb_release, + .owner =THIS_MODULE , + .llseek = no_llseek, + .write = esb_write, + .unlocked_ioctl = esb_ioctl, + .open = esb_open, + .release = esb_release, };static struct miscdevice esb_miscdev = { - .minor =WATCHDOG_MINOR , - .name ="watchdog" , - .fops = &esb_fops, + .minor =WATCHDOG_MINOR , + .name ="watchdog" , + .fops = &esb_fops, };static struct notifier_block esb_notifier = { - .notifier_call = esb_notify_sys, + .notifier_call = esb_notify_sys, };/*
@@ -365,50 +363,44 @@ static struct notifier_block esb_notifier = {* want to register another driver on the same PCI id. */ static struct pci_device_id esb_pci_tbl[] = { - {PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_ESB_9 ), }, - {0 , },/* End of list */ + {PCI_DEVICE (PCI_VENDOR_ID_INTEL ,PCI_DEVICE_ID_INTEL_ESB_9 ), }, + {0 , },/* End of list */ }; -MODULE_DEVICE_TABLE (pci, esb_pci_tbl); +MODULE_DEVICE_TABLE (pci, esb_pci_tbl);/* * Init & exit routines */ -static unsigned char __init esb_getdevice (void ) +static unsigned char __init esb_getdevice (void ) {u8 val1;unsigned short val2; +/* +* Find the PCI device +*/ -struct pci_dev *dev =NULL ; -/* -* Find the PCI device -*/ - -for_each_pci_dev (dev) { -if (pci_match_id (esb_pci_tbl, dev)) { - esb_pci = dev; -break ; - } - } + esb_pci =pci_get_device (PCI_VENDOR_ID_INTEL , +PCI_DEVICE_ID_INTEL_ESB_9 ,NULL ); -if (esb_pci) { -if (pci_enable_device (esb_pci)) { - printk (KERN_ERR PFX "failed to enable device\n"); +if (esb_pci) { +if (pci_enable_device (esb_pci)) { + printk(KERN_ERR PFX "failed to enable device\n"); goto err_devput; }if (pci_request_region (esb_pci,0 ,ESB_MODULE_NAME )) { - printk (KERN_ERR PFX "failed to request region\n"); + printk(KERN_ERR PFX "failed to request region\n"); goto err_disable; }BASEADDR =ioremap (pci_resource_start (esb_pci,0 ),pci_resource_len (esb_pci,0 ));if (BASEADDR ==NULL ) { -/* Something's wrong here, BASEADDR has to be set */ - printk (KERN_ERR PFX "failed to get BASEADDR\n"); - goto err_release; - } +/* Something's wrong here, BASEADDR has to be set */ + printk(KERN_ERR PFX "failed to get BASEADDR\n"); + goto err_release; + }/* * The watchdog has two timers, it can be setup so that the
@@ -425,7 +417,7 @@ static unsigned char __init esb_getdevice (void)/* Check that the WDT isn't already locked */ pci_read_config_byte (esb_pci,ESB_LOCK_REG , &val1);if (val1 &ESB_WDT_LOCK ) - printk (KERN_WARNING PFX "nowayout already set\n"); + printk(KERN_WARNING PFX "nowayout already set\n");/* Set the timer to watchdog mode and disable it for now */ pci_write_config_byte (esb_pci,ESB_LOCK_REG ,0x00 );
@@ -452,44 +444,44 @@ err_devput:return 0 ; } -static int __init watchdog_init (void ) +static int __init watchdog_init (void ) { -int ret; - -/* Check whether or not the hardware watchdog is there */ -if (!esb_getdevice () || esb_pci ==NULL ) -return -ENODEV ; - -/* Check that the heartbeat value is within it's range ; if not reset to the default */ -if (esb_timer_set_heartbeat (heartbeat)) { -esb_timer_set_heartbeat (WATCHDOG_HEARTBEAT ); - printk(KERN_INFO PFX "heartbeat value must be 1<heartbeat<2046, using %d\n", - heartbeat); - } - - ret =register_reboot_notifier (&esb_notifier); -if (ret !=0 ) { - printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", - ret); - goto err_unmap; - } - - ret =misc_register (&esb_miscdev); -if (ret !=0 ) { - printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - WATCHDOG_MINOR, ret); - goto err_notifier; - } - -esb_timer_stop (); - - printk (KERN_INFO PFX "initialized (0x%p). heartbeat=%d sec (nowayout=%d)\n", - BASEADDR, heartbeat, nowayout); +int ret; + +/* Check whether or not the hardware watchdog is there */ +if (!esb_getdevice () || esb_pci ==NULL ) +return -ENODEV ; + +/* Check that the heartbeat value is within it's range; +if not reset to the default */ +if (esb_timer_set_heartbeat (heartbeat)) { +esb_timer_set_heartbeat (WATCHDOG_HEARTBEAT ); + printk(KERN_INFO PFX +"heartbeat value must be 1<heartbeat<2046, using %d\n" , + heartbeat); + } + ret =register_reboot_notifier (&esb_notifier); +if (ret !=0 ) { + printk(KERN_ERR PFX + "cannot register reboot notifier (err=%d)\n", ret); + goto err_unmap; + } -return 0 ; + ret =misc_register (&esb_miscdev); +if (ret !=0 ) { + printk(KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + WATCHDOG_MINOR, ret); + goto err_notifier; + } +esb_timer_stop (); + printk(KERN_INFO PFX +"initialized (0x%p). heartbeat=%d sec (nowayout=%d)\n" , + BASEADDR, heartbeat, nowayout); +return 0 ; err_notifier: -unregister_reboot_notifier (&esb_notifier); +unregister_reboot_notifier (&esb_notifier); err_unmap:iounmap (BASEADDR );/* err_release: */
@@ -498,18 +490,18 @@ err_unmap:pci_disable_device (esb_pci);/* err_devput: */ pci_dev_put (esb_pci); -return ret; +return ret; } -static void __exit watchdog_cleanup (void) +static void __exit watchdog_cleanup(void) {/* Stop the timer before we leave */ if (!nowayout) -esb_timer_stop (); +esb_timer_stop ();/* Deregister */ misc_deregister (&esb_miscdev); -unregister_reboot_notifier (&esb_notifier); +unregister_reboot_notifier (&esb_notifier);iounmap (BASEADDR );pci_release_region (esb_pci,0 );pci_disable_device (esb_pci);
PATCH 14/57 ibmasr: coding style, locking verify
In reply to Alan CoxFrom: Alan Cox <[email protected]>
There is a new #if 0 section here which is a suggested fix for the horrible PCI hack in the existing code. Would be good if someone with a box that uses this device could test it.
---
drivers/watchdog/ibmasr.c | 149 ++++++++++++++++++++++++++------------------- 1 files changed, 87 insertions(+), 62 deletions(-)
drivers/watchdog/ibmasr.c +87 -62
@@ -19,9 +19,8 @@#include <linux/miscdevice.h> #include <linux/watchdog.h> #include <linux/dmi.h> - -#include <asm/io.h> -#include <asm/uaccess.h> +#include <linux/io.h> +#include <linux/uaccess.h> enum {
@@ -70,10 +69,13 @@ static char asr_expect_close;static unsigned int asr_type, asr_base, asr_length;static unsigned int asr_read_addr, asr_write_addr;static unsigned char asr_toggle_mask, asr_disable_mask; +static spinlock_t asr_lock; -static void asr_toggle (void ) +static void __asr_toggle (void ) { -unsigned char reg =inb (asr_read_addr); +unsigned char reg; + + reg =inb (asr_read_addr);outb (reg & ~asr_toggle_mask, asr_write_addr); reg =inb (asr_read_addr);
@@ -83,12 +85,21 @@ static void asr_toggle(void)outb (reg & ~asr_toggle_mask, asr_write_addr); reg =inb (asr_read_addr); +spin_unlock (&asr_lock); +} + +static void asr_toggle (void ) +{ +spin_lock (&asr_lock); +__asr_toggle (); +spin_unlock (&asr_lock); }static void asr_enable (void ) {unsigned char reg; +spin_lock (&asr_lock);if (asr_type ==ASMTYPE_TOPAZ ) {/* asr_write_addr == asr_read_addr */ reg =inb (asr_read_addr);
@@ -99,17 +110,21 @@ static void asr_enable(void)* First make sure the hardware timer is reset by toggling * ASR hardware timer line. */ -asr_toggle (); +__asr_toggle (); reg =inb (asr_read_addr);outb (reg & ~asr_disable_mask, asr_write_addr); } reg =inb (asr_read_addr); +spin_unlock (&asr_lock); }static void asr_disable (void ) { -unsigned char reg =inb (asr_read_addr); +unsigned char reg; + +spin_lock (&asr_lock); + reg =inb (asr_read_addr);if (asr_type ==ASMTYPE_TOPAZ )/* asr_write_addr == asr_read_addr */
@@ -122,6 +137,7 @@ static void asr_disable(void)outb (reg | asr_disable_mask, asr_write_addr); } reg =inb (asr_read_addr); +spin_unlock (&asr_lock); }static int __init asr_get_base_address (void )
@@ -133,7 +149,8 @@ static int __init asr_get_base_address(void)switch (asr_type) {case ASMTYPE_TOPAZ : -/* SELECT SuperIO CHIP FOR QUERYING (WRITE 0x07 TO BOTH 0x2E and 0x2F) */ +/* SELECT SuperIO CHIP FOR QUERYING +(WRITE 0x07 TO BOTH 0x2E and 0x2F) */ outb (0x07 ,0x2e );outb (0x07 ,0x2f );
@@ -154,14 +171,26 @@ static int __init asr_get_base_address(void)case ASMTYPE_JASPER : type ="Jaspers " ; - -/* FIXME: need to use pci_config_lock here, but it's not exported */ +#if 0 +u32 r; +/* Suggested fix */ + pdev =pci_get_bus_and_slot (0 ,DEVFN (0x1f ,0 )); +if (pdev ==NULL ) +return -ENODEV ; +pci_read_config_dword (pdev,0x58 , &r); + asr_base = r &0xFFFE ; +pci_dev_put (pdev); +#else +/* FIXME: need to use pci_config_lock here, +but it's not exported */ /* spin_lock_irqsave(&pci_config_lock, flags);*/ /* Select the SuperIO chip in the PCI I/O port register */ outl (0x8000f858 ,0xcf8 ); +/* BUS 0, Slot 1F, fnc 0, offset 58 */ +/* * Read the base address for the SuperIO chip. * Only the lower 16 bits are valid, but the address is word
@@ -170,7 +199,7 @@ static int __init asr_get_base_address(void) asr_base =inl (0xcfc ) &0xfffe ;/* spin_unlock_irqrestore(&pci_config_lock, flags);*/ - +#endif asr_read_addr = asr_write_addr = asr_base +JASPER_ASR_REG_OFFSET ; asr_toggle_mask =JASPER_ASR_TOGGLE_MASK ;
@@ -241,11 +270,10 @@ static ssize_t asr_write(struct file *file, const char __user *buf,return count; } -static int asr_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long asr_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {static const struct watchdog_info ident = { - .options =WDIOF_KEEPALIVEPING | + .options =WDIOF_KEEPALIVEPING |WDIOF_MAGICCLOSE , .identity ="IBM ASR" };
@@ -254,53 +282,45 @@ static int asr_ioctl(struct inode *inode, struct file *file,int heartbeat;switch (cmd) { -case WDIOC_GETSUPPORT : -return copy_to_user (argp, &ident,sizeof (ident)) ? - -EFAULT :0 ; - -case WDIOC_GETSTATUS : -case WDIOC_GETBOOTSTATUS : -return put_user (0 , p); - -case WDIOC_KEEPALIVE : +case WDIOC_GETSUPPORT : +return copy_to_user (argp, &ident,sizeof (ident)) ? -EFAULT :0 ; +case WDIOC_GETSTATUS : +case WDIOC_GETBOOTSTATUS : +return put_user (0 , p); +case WDIOC_KEEPALIVE : +asr_toggle (); +return 0 ; +/* +* The hardware has a fixed timeout value, so no WDIOC_SETTIMEOUT +* and WDIOC_GETTIMEOUT always returns 256. +*/ +case WDIOC_GETTIMEOUT : + heartbeat =256 ; +return put_user (heartbeat, p); +case WDIOC_SETOPTIONS : + { +int new_options, retval = -EINVAL ; +if (get_user (new_options, p)) +return -EFAULT ; +if (new_options &WDIOS_DISABLECARD ) { +asr_disable (); + retval =0 ; + } +if (new_options &WDIOS_ENABLECARD ) { +asr_enable ();asr_toggle (); -return 0 ; - -/* -* The hardware has a fixed timeout value, so no WDIOC_SETTIMEOUT -* and WDIOC_GETTIMEOUT always returns 256. -*/ -case WDIOC_GETTIMEOUT : - heartbeat =256 ; -return put_user (heartbeat, p); - -case WDIOC_SETOPTIONS : { -int new_options, retval = -EINVAL ; - -if (get_user (new_options, p)) -return -EFAULT ; - -if (new_options &WDIOS_DISABLECARD ) { -asr_disable (); - retval =0 ; - } - -if (new_options &WDIOS_ENABLECARD ) { -asr_enable (); -asr_toggle (); - retval =0 ; - } - -return retval; + retval =0 ; } +return retval; + } +default : +return -ENOTTY ; } - -return -ENOTTY ; }static int asr_open (struct inode *inode,struct file *file) { -if (test_and_set_bit (0 , &asr_is_open)) +if (test_and_set_bit (0 , &asr_is_open))return -EBUSY ;asr_toggle ();
@@ -314,7 +334,8 @@ static int asr_release(struct inode *inode, struct file *file)if (asr_expect_close ==42 )asr_disable ();else { - printk(KERN_CRIT PFX "unexpected close, not stopping watchdog!\n"); + printk(KERN_CRIT PFX + "unexpected close, not stopping watchdog!\n");asr_toggle (); }clear_bit (0 , &asr_is_open);
@@ -323,12 +344,12 @@ static int asr_release(struct inode *inode, struct file *file) }static const struct file_operations asr_fops = { - .owner =THIS_MODULE , - .llseek = no_llseek, - .write = asr_write, - .ioctl = asr_ioctl, - .open = asr_open, - .release = asr_release, + .owner =THIS_MODULE , + .llseek = no_llseek, + .write = asr_write, + .unlocked_ioctl = asr_ioctl, + .open = asr_open, + .release = asr_release, };static struct miscdevice asr_miscdev = {
@@ -367,6 +388,8 @@ static int __init ibmasr_init(void)if (!asr_type)return -ENODEV ; +spin_lock_init (&asr_lock); + rc =asr_get_base_address ();if (rc)return rc;
@@ -395,7 +418,9 @@ module_init(ibmasr_init);module_exit (ibmasr_exit);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) ")");MODULE_DESCRIPTION ("IBM Automatic Server Restart driver" );MODULE_AUTHOR ("Andrey Panin" );
Re: [PATCH 14/57] ibmasr: coding style, locking verify
Quoted 5 lines · Alan Cox
From: Alan Cox <[email protected]>
There is a new #if 0 section here which is a suggested fix for the horrible PCI hack in the existing code. Would be good if someone with a box that uses this device could test it.
Patch looks good, thank you. I'll test it as soon as I can. I need to find unused IBM server first :)
Unfortunately I don't have suitable machine to test the suggested fix.
Quoted 296 lines
---
drivers/watchdog/ibmasr.c | 149 ++++++++++++++++++++++++++------------------- 1 files changed, 87 insertions(+), 62 deletions(-)drivers/watchdog/ibmasr.c +87
-63@@ -19,9 +19,8 @@#include <linux/miscdevice.h> #include <linux/watchdog.h> #include <linux/dmi.h> - -#include <asm/io.h> -#include <asm/uaccess.h> +#include <linux/io.h> +#include <linux/uaccess.h> enum {@@ -70,10 +69,13 @@ static char asr_expect_close;static unsigned int asr_type, asr_base, asr_length;static unsigned int asr_read_addr, asr_write_addr;static unsigned char asr_toggle_mask, asr_disable_mask; +static spinlock_t asr_lock; -static void asr_toggle (void ) +static void __asr_toggle (void ) { -unsigned char reg =inb (asr_read_addr); +unsigned char reg; + + reg =inb (asr_read_addr);outb (reg & ~asr_toggle_mask, asr_write_addr); reg =inb (asr_read_addr);@@ -83,12 +85,21 @@ static void asr_toggle(void)outb (reg & ~asr_toggle_mask, asr_write_addr); reg =inb (asr_read_addr); +spin_unlock (&asr_lock); +} + +static void asr_toggle (void ) +{ +spin_lock (&asr_lock); +__asr_toggle (); +spin_unlock (&asr_lock); }static void asr_enable (void ) {unsigned char reg; +spin_lock (&asr_lock);if (asr_type ==ASMTYPE_TOPAZ ) {/* asr_write_addr == asr_read_addr */ reg =inb (asr_read_addr);@@ -99,17 +110,21 @@ static void asr_enable(void)* First make sure the hardware timer is reset by toggling * ASR hardware timer line. */ -asr_toggle (); +__asr_toggle (); reg =inb (asr_read_addr);outb (reg & ~asr_disable_mask, asr_write_addr); } reg =inb (asr_read_addr); +spin_unlock (&asr_lock); }static void asr_disable (void ) { -unsigned char reg =inb (asr_read_addr); +unsigned char reg; + +spin_lock (&asr_lock); + reg =inb (asr_read_addr);if (asr_type ==ASMTYPE_TOPAZ )/* asr_write_addr == asr_read_addr */ @@ -122,6 +137,7 @@ static void asr_disable(void)outb (reg | asr_disable_mask, asr_write_addr); } reg =inb (asr_read_addr); +spin_unlock (&asr_lock); }static int __init asr_get_base_address (void )@@ -133,7 +149,8 @@ static int __init asr_get_base_address(void)switch (asr_type) {case ASMTYPE_TOPAZ : -/* SELECT SuperIO CHIP FOR QUERYING (WRITE 0x07 TO BOTH 0x2E and 0x2F) */ +/* SELECT SuperIO CHIP FOR QUERYING +(WRITE 0x07 TO BOTH 0x2E and 0x2F) */ outb (0x07 ,0x2e );outb (0x07 ,0x2f );@@ -154,14 +171,26 @@ static int __init asr_get_base_address(void)case ASMTYPE_JASPER : type ="Jaspers " ; - -/* FIXME: need to use pci_config_lock here, but it's not exported */ +#if 0 +u32 r; +/* Suggested fix */ + pdev =pci_get_bus_and_slot (0 ,DEVFN (0x1f ,0 )); +if (pdev ==NULL ) +return -ENODEV ; +pci_read_config_dword (pdev,0x58 , &r); + asr_base = r &0xFFFE ; +pci_dev_put (pdev); +#else +/* FIXME: need to use pci_config_lock here, +but it's not exported */ /* spin_lock_irqsave(&pci_config_lock, flags);*/ /* Select the SuperIO chip in the PCI I/O port register */ outl (0x8000f858 ,0xcf8 ); +/* BUS 0, Slot 1F, fnc 0, offset 58 */ +/* * Read the base address for the SuperIO chip. * Only the lower 16 bits are valid, but the address is word @@ -170,7 +199,7 @@ static int __init asr_get_base_address(void) asr_base =inl (0xcfc ) &0xfffe ;/* spin_unlock_irqrestore(&pci_config_lock, flags);*/ - +#endif asr_read_addr = asr_write_addr = asr_base +JASPER_ASR_REG_OFFSET ; asr_toggle_mask =JASPER_ASR_TOGGLE_MASK ;@@ -241,11 +270,10 @@ static ssize_t asr_write(struct file *file, const char __user *buf,return count; } -static int asr_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long asr_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {static const struct watchdog_info ident = { - .options =WDIOF_KEEPALIVEPING | + .options =WDIOF_KEEPALIVEPING |WDIOF_MAGICCLOSE , .identity ="IBM ASR" };@@ -254,53 +282,45 @@ static int asr_ioctl(struct inode *inode, struct file *file,int heartbeat;switch (cmd) { -case WDIOC_GETSUPPORT : -return copy_to_user (argp, &ident,sizeof (ident)) ? - -EFAULT :0 ; - -case WDIOC_GETSTATUS : -case WDIOC_GETBOOTSTATUS : -return put_user (0 , p); - -case WDIOC_KEEPALIVE : +case WDIOC_GETSUPPORT : +return copy_to_user (argp, &ident,sizeof (ident)) ? -EFAULT :0 ; +case WDIOC_GETSTATUS : +case WDIOC_GETBOOTSTATUS : +return put_user (0 , p); +case WDIOC_KEEPALIVE : +asr_toggle (); +return 0 ; +/* +* The hardware has a fixed timeout value, so no WDIOC_SETTIMEOUT +* and WDIOC_GETTIMEOUT always returns 256. +*/ +case WDIOC_GETTIMEOUT : + heartbeat =256 ; +return put_user (heartbeat, p); +case WDIOC_SETOPTIONS : + { +int new_options, retval = -EINVAL ; +if (get_user (new_options, p)) +return -EFAULT ; +if (new_options &WDIOS_DISABLECARD ) { +asr_disable (); + retval =0 ; + } +if (new_options &WDIOS_ENABLECARD ) { +asr_enable ();asr_toggle (); -return 0 ; - -/* -* The hardware has a fixed timeout value, so no WDIOC_SETTIMEOUT -* and WDIOC_GETTIMEOUT always returns 256. -*/ -case WDIOC_GETTIMEOUT : - heartbeat =256 ; -return put_user (heartbeat, p); - -case WDIOC_SETOPTIONS : { -int new_options, retval = -EINVAL ; - -if (get_user (new_options, p)) -return -EFAULT ; - -if (new_options &WDIOS_DISABLECARD ) { -asr_disable (); - retval =0 ; - } - -if (new_options &WDIOS_ENABLECARD ) { -asr_enable (); -asr_toggle (); - retval =0 ; - } - -return retval; + retval =0 ; } +return retval; + } +default : +return -ENOTTY ; } - -return -ENOTTY ; }static int asr_open (struct inode *inode,struct file *file) { -if (test_and_set_bit (0 , &asr_is_open)) +if (test_and_set_bit (0 , &asr_is_open))return -EBUSY ;asr_toggle ();@@ -314,7 +334,8 @@ static int asr_release(struct inode *inode, struct file *file)if (asr_expect_close ==42 )asr_disable ();else { - printk(KERN_CRIT PFX "unexpected close, not stopping watchdog!\n"); + printk(KERN_CRIT PFX + "unexpected close, not stopping watchdog!\n");asr_toggle (); }clear_bit (0 , &asr_is_open);@@ -323,12 +344,12 @@ static int asr_release(struct inode *inode, struct file *file) }static const struct file_operations asr_fops = { - .owner =THIS_MODULE , - .llseek = no_llseek, - .write = asr_write, - .ioctl = asr_ioctl, - .open = asr_open, - .release = asr_release, + .owner =THIS_MODULE , + .llseek = no_llseek, + .write = asr_write, + .unlocked_ioctl = asr_ioctl, + .open = asr_open, + .release = asr_release, };static struct miscdevice asr_miscdev = {@@ -367,6 +388,8 @@ static int __init ibmasr_init(void)if (!asr_type)return -ENODEV ; +spin_lock_init (&asr_lock); + rc =asr_get_base_address ();if (rc)return rc;@@ -395,7 +418,9 @@ module_init(ibmasr_init);module_exit (ibmasr_exit);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) ")");MODULE_DESCRIPTION ("IBM Automatic Server Restart driver" );MODULE_AUTHOR ("Andrey Panin" ); --To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Signature · 2 lines
Andrey Panin | Linux and UNIX system administrator [email protected] | PGP key: wwwkeys.pgp.net
PATCH 15/57 indydog: Clean up and tidy
In reply to Alan CoxFrom: Alan Cox <[email protected]>
Switch to unlocked_ioctl as well
---
drivers/watchdog/indydog.c | 114 ++++++++++++++++++++++++-------------------- 1 files changed, 62 insertions(+), 52 deletions(-)
drivers/watchdog/indydog.c +62 -52
@@ -1,7 +1,8 @@/* * IndyDog 0.3 A Hardware Watchdog Device for SGI IP22 * -* (c) Copyright 2002 Guido Guenther <[email protected]>, All Rights Reserved. +* (c) Copyright 2002 Guido Guenther <[email protected]>, +* All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License
@@ -22,32 +23,42 @@#include <linux/notifier.h> #include <linux/reboot.h> #include <linux/init.h> -#include <asm/uaccess.h> +#include <linux/uaccess.h> #include <asm/sgi/mc.h> #define PFX "indydog: " -static int indydog_alive; +static unsigned long indydog_alive; +static spinlock_t indydog_lock;#define WATCHDOG_TIMEOUT 30/* 30 sec default 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) ")");static void indydog_start (void ) { -u32 mc_ctrl0 = sgimc->cpuctrl0; +u32 mc_ctrl0; +spin_lock (&indydog_lock); + mc_ctrl0 = sgimc->cpuctrl0; mc_ctrl0 = sgimc->cpuctrl0 |SGIMC_CCTRL0_WDOG ; sgimc->cpuctrl0 = mc_ctrl0; +spin_unlock (&indydog_lock); }static void indydog_stop (void ) { -u32 mc_ctrl0 = sgimc->cpuctrl0; +u32 mc_ctrl0; +spin_lock (&indydog_lock); + + mc_ctrl0 = sgimc->cpuctrl0; mc_ctrl0 &= ~SGIMC_CCTRL0_WDOG ; sgimc->cpuctrl0 = mc_ctrl0; +spin_unlock (&indydog_lock); printk(KERN_INFO PFX "Stopped watchdog timer.\n"); }
@@ -62,7 +73,7 @@ static void indydog_ping(void)*/ static int indydog_open (struct inode *inode,struct file *file) { -if (indydog_alive) +if (test_and_set_bit (0 , &indydog_alive))return -EBUSY ;if (nowayout)
@@ -84,23 +95,21 @@ static int indydog_release(struct inode *inode, struct file *file)* Lock it in if it's a module and we defined ...NOWAYOUT */ if (!nowayout)indydog_stop ();/* Turn the WDT off */ - - indydog_alive =0 ; - +clear_bit (0 , &indydog_alive);return 0 ; } -static ssize_t indydog_write (struct file *file,const char *data,size_t len,loff_t *ppos) +static ssize_t indydog_write (struct file *file,const char *data, +size_t len,loff_t *ppos) {/* Refresh the timer. */ -if (len) { +if (len)indydog_ping (); - }return len; } -static int indydog_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long indydog_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {int options, retval = -EINVAL ;static struct watchdog_info ident = {
@@ -111,42 +120,40 @@ static int indydog_ioctl(struct inode *inode, struct file *file, };switch (cmd) { -default : -return -ENOTTY ; -case WDIOC_GETSUPPORT : -if (copy_to_user ((struct watchdog_info *)arg, - &ident,sizeof (ident))) -return -EFAULT ; -return 0 ; -case WDIOC_GETSTATUS : -case WDIOC_GETBOOTSTATUS : -return put_user (0 ,(int *)arg); -case WDIOC_KEEPALIVE : -indydog_ping (); -return 0 ; -case WDIOC_GETTIMEOUT : -return put_user (WATCHDOG_TIMEOUT ,(int *)arg); -case WDIOC_SETOPTIONS : - { -if (get_user (options, (int *)arg)) -return -EFAULT ; - -if (options &WDIOS_DISABLECARD ) { -indydog_stop (); - retval =0 ; - } - -if (options &WDIOS_ENABLECARD ) { -indydog_start (); - retval =0 ; - } - -return retval; +case WDIOC_GETSUPPORT : +if (copy_to_user ((struct watchdog_info *)arg, + &ident,sizeof (ident))) +return -EFAULT ; +return 0 ; +case WDIOC_GETSTATUS : +case WDIOC_GETBOOTSTATUS : +return put_user (0 , (int *)arg); +case WDIOC_KEEPALIVE : +indydog_ping (); +return 0 ; +case WDIOC_GETTIMEOUT : +return put_user (WATCHDOG_TIMEOUT , (int *)arg); +case WDIOC_SETOPTIONS : + { +if (get_user (options, (int *)arg)) +return -EFAULT ; +if (options &WDIOS_DISABLECARD ) { +indydog_stop (); + retval =0 ; + } +if (options &WDIOS_ENABLECARD ) { +indydog_start (); + retval =0 ; } +return retval; + } +default : +return -ENOTTY ; } } -static int indydog_notify_sys (struct notifier_block *this,unsigned long code,void *unused) +static int indydog_notify_sys (struct notifier_block *this, +unsigned long code,void *unused) {if (code ==SYS_DOWN || code ==SYS_HALT )indydog_stop ();/* Turn the WDT off */
@@ -158,7 +165,7 @@ static const struct file_operations indydog_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = indydog_write, - .ioctl = indydog_ioctl, + .unlocked_ioctl = indydog_ioctl, .open = indydog_open, .release = indydog_release, };
@@ -180,17 +187,20 @@ static int __init watchdog_init(void) {int ret; +spin_lock_init (&indydog_lock); + ret =register_reboot_notifier (&indydog_notifier);if (ret) { - printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", - ret); + printk(KERN_ERR PFX + "cannot register reboot notifier (err=%d)\n", ret);return ret; } ret =misc_register (&indydog_miscdev);if (ret) { - printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - WATCHDOG_MINOR, ret); + printk(KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + WATCHDOG_MINOR, ret);unregister_reboot_notifier (&indydog_notifier);return ret; }
PATCH 16/57 iop: watchdog switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/iop_wdt.c | 46 +++++++++++++++++++++++--------------------- 1 files changed, 24 insertions(+), 22 deletions(-)
drivers/watchdog/iop_wdt.c +24 -22
@@ -37,6 +37,7 @@static int nowayout =WATCHDOG_NOWAYOUT ;static unsigned long wdt_status;static unsigned long boot_status; +static spinlock_t wdt_lock;#define WDT_IN_USE 0#define WDT_OK_TO_CLOSE 1
@@ -68,8 +69,10 @@ static void wdt_enable(void)/* Arm and enable the Timer to starting counting down from 0xFFFF.FFFF * Takes approx. 10.7s to timeout */ +spin_lock (&wdt_lock);write_wdtcr (IOP_WDTCR_EN_ARM );write_wdtcr (IOP_WDTCR_EN ); +spin_unlock (&wdt_lock); }/* returns 0 if the timer was successfully disabled */
@@ -77,9 +80,11 @@ static int wdt_disable(void) {/* Stop Counting */ if (wdt_supports_disable ()) { +spin_lock (&wdt_lock);write_wdtcr (IOP_WDTCR_DIS_ARM );write_wdtcr (IOP_WDTCR_DIS );clear_bit (WDT_ENABLED , &wdt_status); +spin_unlock (&wdt_lock);printk (KERN_INFO "WATCHDOG: Disabled\n" );return 0 ; }else
@@ -92,16 +97,12 @@ static int iop_wdt_open(struct inode *inode, struct file *file)return -EBUSY ;clear_bit (WDT_OK_TO_CLOSE , &wdt_status); -wdt_enable (); -set_bit (WDT_ENABLED , &wdt_status); -return nonseekable_open (inode, file); } -static ssize_t -iop_wdt_write (struct file *file,const char *data,size_t len, +static ssize_t iop_wdt_write (struct file *file,const char *data,size_t len,loff_t *ppos) {if (len) {
@@ -121,41 +122,39 @@ iop_wdt_write(struct file *file, const char *data, size_t len, }wdt_enable (); } -return len; } -static struct watchdog_info ident = { +static const struct watchdog_info ident = { .options =WDIOF_CARDRESET |WDIOF_MAGICCLOSE |WDIOF_KEEPALIVEPING , .identity ="iop watchdog" , }; -static int -iop_wdt_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long iop_wdt_ioctl (struct file *file, +unsigned int cmd,unsigned long arg) {int options;int ret = -ENOTTY ; +int __user *argp = (int __user *)arg;switch (cmd) {case WDIOC_GETSUPPORT : -if (copy_to_user - ((struct watchdog_info *)arg, &ident,sizeof ident)) +if (copy_to_user (argp, &ident,sizeof ident)) ret = -EFAULT ;else ret =0 ;break ;case WDIOC_GETSTATUS : - ret =put_user (0 , (int *)arg); + ret =put_user (0 , argp);break ;case WDIOC_GETBOOTSTATUS : - ret =put_user (boot_status, (int *)arg); + ret =put_user (boot_status, argp);break ;case WDIOC_GETTIMEOUT : - ret =put_user (iop_watchdog_timeout (), (int *)arg); + ret =put_user (iop_watchdog_timeout (), argp);break ;case WDIOC_KEEPALIVE :
@@ -177,14 +176,12 @@ iop_wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, }else ret =0 ; } -if (options &WDIOS_ENABLECARD ) {wdt_enable (); ret =0 ; }break ; } -return ret; }
@@ -214,7 +211,7 @@ static const struct file_operations iop_wdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = iop_wdt_write, - .ioctl = iop_wdt_ioctl, + .unlocked_ioctl = iop_wdt_ioctl, .open = iop_wdt_open, .release = iop_wdt_release, };
@@ -229,10 +226,8 @@ static int __init iop_wdt_init(void) {int ret; - ret =misc_register (&iop_wdt_miscdev); -if (ret ==0 ) -printk ("iop watchdog timer: timeout %lu sec\n" , -iop_watchdog_timeout ()); +spin_lock_init (&wdt_lock); +/* check if the reset was caused by the watchdog timer */ boot_status = (read_rcsr () &IOP_RCSR_WDT ) ?WDIOF_CARDRESET :0 ;
@@ -242,6 +237,13 @@ static int __init iop_wdt_init(void)*/ write_wdtsr (IOP13XX_WDTCR_IB_RESET ); +/* Register after we have the device set up so we cannot race +with an open */ + ret =misc_register (&iop_wdt_miscdev); +if (ret ==0 ) +printk ("iop watchdog timer: timeout %lu sec\n" , +iop_watchdog_timeout ()); +return ret; }
PATCH 17/57 it8712f: unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/it8712f_wdt.c | 77 ++++++++++++++-------------------------- 1 files changed, 27 insertions(+), 50 deletions(-)
drivers/watchdog/it8712f_wdt.c +27 -50
@@ -30,9 +30,8 @@#include <linux/fs.h> #include <linux/pci.h> #include <linux/spinlock.h> - -#include <asm/uaccess.h> -#include <asm/io.h> +#include <linux/uaccess.h> +#include <linux/io.h> #define NAME "it8712f_wdt"
@@ -50,7 +49,7 @@ static int nowayout = WATCHDOG_NOWAYOUT;module_param (nowayout, int,0 );MODULE_PARM_DESC (nowayout,"Disable watchdog shutdown on close" ); -static struct semaphore it8712f_wdt_sem; +static unsigned long wdt_open;static unsigned expect_close;static spinlock_t io_lock;static unsigned char revision;
@@ -86,22 +85,19 @@ static unsigned short address;#define WDT_OUT_PWROK 0x10#define WDT_OUT_KRST 0x40 -static int -superio_inb (int reg) +static int superio_inb (int reg) {outb (reg,REG );return inb (VAL ); } -static void -superio_outb (int val,int reg) +static void superio_outb (int val,int reg) {outb (reg,REG );outb (val,VAL ); } -static int -superio_inw (int reg) +static int superio_inw (int reg) {int val;outb (reg++,REG );
@@ -111,15 +107,13 @@ superio_inw(int reg)return val; } -static inline void -superio_select (int ldn) +static inline void superio_select (int ldn) {outb (LDN ,REG );outb (ldn,VAL ); } -static inline void -superio_enter (void ) +static inline void superio_enter (void ) {spin_lock (&io_lock);outb (0x87 ,REG );
@@ -128,22 +122,19 @@ superio_enter(void)outb (0x55 ,REG ); } -static inline void -superio_exit (void ) +static inline void superio_exit (void ) {outb (0x02 ,REG );outb (0x02 ,VAL );spin_unlock (&io_lock); } -static inline void -it8712f_wdt_ping (void ) +static inline void it8712f_wdt_ping (void ) {inb (address); } -static void -it8712f_wdt_update_margin (void ) +static void it8712f_wdt_update_margin (void ) {int config =WDT_OUT_KRST |WDT_OUT_PWROK ;int units = margin;
@@ -165,8 +156,7 @@ it8712f_wdt_update_margin(void)superio_outb (units,WDT_TIMEOUT ); } -static int -it8712f_wdt_get_status (void ) +static int it8712f_wdt_get_status (void ) {if (superio_inb (WDT_CONTROL ) &0x01 )return WDIOF_CARDRESET ;
@@ -174,8 +164,7 @@ it8712f_wdt_get_status(void)return 0 ; } -static void -it8712f_wdt_enable (void ) +static void it8712f_wdt_enable (void ) { printk(KERN_DEBUG NAME ": enabling watchdog timer\n");superio_enter ();
@@ -190,8 +179,7 @@ it8712f_wdt_enable(void)it8712f_wdt_ping (); } -static void -it8712f_wdt_disable (void ) +static void it8712f_wdt_disable (void ) { printk(KERN_DEBUG NAME ": disabling watchdog timer\n");
@@ -207,8 +195,7 @@ it8712f_wdt_disable(void)superio_exit (); } -static int -it8712f_wdt_notify (struct notifier_block *this, +static int it8712f_wdt_notify (struct notifier_block *this,unsigned long code,void *unused) {if (code ==SYS_HALT || code ==SYS_POWER_OFF )
@@ -222,9 +209,8 @@ static struct notifier_block it8712f_wdt_notifier = { .notifier_call = it8712f_wdt_notify, }; -static ssize_t -it8712f_wdt_write (struct file *file,const char __user *data, -size_t len,loff_t *ppos) +static ssize_t it8712f_wdt_write (struct file *file,const char __user *data, +size_t len,loff_t *ppos) {/* check for a magic close character */ if (len) {
@@ -245,9 +231,8 @@ it8712f_wdt_write(struct file *file, const char __user *data,return len; } -static int -it8712f_wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long it8712f_wdt_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {void __user *argp = (void __user *)arg;int __user *p = argp;
@@ -302,19 +287,16 @@ it8712f_wdt_ioctl(struct inode *inode, struct file *file, } } -static int -it8712f_wdt_open (struct inode *inode,struct file *file) +static int it8712f_wdt_open (struct inode *inode,struct file *file) {/* only allow one at a time */ -if (down_trylock (&it8712f_wdt_sem)) +if (test_and_set_bit (0 , &wdt_open))return -EBUSY ;it8712f_wdt_enable (); -return nonseekable_open (inode, file); } -static int -it8712f_wdt_release (struct inode *inode,struct file *file) +static int it8712f_wdt_release (struct inode *inode,struct file *file) {if (expect_close !=42 ) { printk(KERN_WARNING NAME
@@ -324,7 +306,7 @@ it8712f_wdt_release(struct inode *inode, struct file *file)it8712f_wdt_disable (); } expect_close =0 ; -up (&it8712f_wdt_sem); +clear_bit (0 , &wdt_open);return 0 ; }
@@ -333,7 +315,7 @@ static const struct file_operations it8712f_wdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = it8712f_wdt_write, - .ioctl = it8712f_wdt_ioctl, + .unlocked_ioctl = it8712f_wdt_ioctl, .open = it8712f_wdt_open, .release = it8712f_wdt_release, };
@@ -344,8 +326,7 @@ static struct miscdevice it8712f_wdt_miscdev = { .fops = &it8712f_wdt_fops, }; -static int __init -it8712f_wdt_find (unsigned short *address) +static int __init it8712f_wdt_find (unsigned short *address) {int err = -ENODEV ;int chip_type;
@@ -387,8 +368,7 @@ exit:return err; } -static int __init -it8712f_wdt_init (void ) +static int __init it8712f_wdt_init (void ) {int err =0 ;
@@ -404,8 +384,6 @@ it8712f_wdt_init(void)it8712f_wdt_disable (); -sema_init (&it8712f_wdt_sem,1 ); - err =register_reboot_notifier (&it8712f_wdt_notifier);if (err) { printk(KERN_ERR NAME ": unable to register reboot notifier\n");
@@ -430,8 +408,7 @@ out:return err; } -static void __exit -it8712f_wdt_exit (void ) +static void __exit it8712f_wdt_exit(void) {misc_deregister (&it8712f_wdt_miscdev);unregister_reboot_notifier (&it8712f_wdt_notifier);
PATCH 18/57 iTCO: unlocked_ioctl, coding style and cleanup
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/iTCO_vendor.h | 15 ++ drivers/watchdog/iTCO_vendor_support.c | 53 +++--- drivers/watchdog/iTCO_wdt.c | 294 ++++++++++++++++---------------- 3 files changed, 188 insertions(+), 174 deletions(-) create mode 100644 drivers/watchdog/iTCO_vendor.h
drivers/watchdog/iTCO_vendor.h new file +15 -0
@@ -0,0 +1,15 @@ +/* iTCO Vendor Specific Support hooks */ +#ifdef CONFIG_ITCO_VENDOR_SUPPORT +extern void iTCO_vendor_pre_start (unsigned long ,unsigned int ); +extern void iTCO_vendor_pre_stop (unsigned long ); +extern void iTCO_vendor_pre_keepalive (unsigned long ,unsigned int ); +extern void iTCO_vendor_pre_set_heartbeat (unsigned int ); +extern int iTCO_vendor_check_noreboot_on (void ); +#else +#define iTCO_vendor_pre_start (acpibase, heartbeat) {} +#define iTCO_vendor_pre_stop (acpibase) {} +#define iTCO_vendor_pre_keepalive (acpibase, heartbeat) {} +#define iTCO_vendor_pre_set_heartbeat (heartbeat) {} +#define iTCO_vendor_check_noreboot_on () 1 +/* 1=check noreboot; 0=don't check */ +#endif
drivers/watchdog/iTCO_vendor_support.c +29 -24
107 lines not on this page · raw message
drivers/watchdog/iTCO_wdt.c +144 -150
474 lines not on this page · raw message
Re: [PATCH 18/57] iTCO: unlocked_ioctl, coding style and cleanup
Quoted 3 lines · On Mon, 19 May 2008 14:06:25 +0100 Alan Cox <[email protected]> wrote:
drivers/watchdog/iTCO_vendor.h | 15 ++ drivers/watchdog/iTCO_vendor_support.c | 53 +++--- drivers/watchdog/iTCO_wdt.c | 294 ++++++++++++++++----------------
This runs afoul of git-watchdog and/or itco_wdt-ich9do-support.patch
Hunk #1 succeeded at 66 (offset 1 line).
Hunk #3 FAILED at 139.
Hunk #4 FAILED at 158.
Hunk #5 FAILED at 201.
Hunk #6 FAILED at 222.
Hunk #7 FAILED at 246.
Hunk #8 succeeded at 374 (offset 12 lines).
Hunk #9 FAILED at 429.
Hunk #10 FAILED at 458.
Hunk #11 FAILED at 472.
Hunk #12 FAILED at 480.
Hunk #13 FAILED at 489.
Hunk #14 FAILED at 518.
Hunk #15 FAILED at 534.
Hunk #16 FAILED at 588.
Hunk #17 succeeded at 454 (offset -140 lines).
Hunk #18 FAILED at 475.
Hunk #19 succeeded at 669 (offset 27 lines).
Hunk #20 succeeded at 512 (offset -140 lines).
Hunk #21 FAILED at 534.
Hunk #22 succeeded at 814 (offset 29 lines).
15 out of 22 hunks FAILED -- saving rejects to file drivers/watchdog/iTCO_wdt.c.rej
so I ducked this one.
booke-watchdog-clean-up-and-unlocked_ioctl gets 8-out-of-ten against watchdog-fix-booke_wdtc-on-mpc85xx-smp-system.patch so I ducked that one too.
w83697hf_wdt-cleanup-coding-style-and-switch-to-unlocked_ioctl gets 4-of-17 against git-watchdog - also ducked.
The rest applied, although about half of them needed fixes because Rusty has been running around fiddling with other peoples stuff renaming down_trylock to down_nowait all over the tree.
This means that the watchdog patches now have a Rusty dependency so I NEED TO KNOW if those patches aren't for 2.6.27 or if they get nacked or something.
It also means that the patches which I queued cannot go into Wim's tree as-is. If Wim queues the originals then it means that Stephen and/or myself get to fix all the rejects again, and there'll be a decent-sized smashup during the merge window. There are lessons here...
And if Wim decides to merge these patches prior to merging
itco_wdt-ich9do-support.patch watchdog-fix-booke_wdtc-on-mpc85xx-smp-system.patch
then those two patches will get wrecked.
Re: [PATCH 18/57] iTCO: unlocked_ioctl, coding style and cleanup
Quoted 1 line · On Tuesday 20 May 2008 18:26:58 Andrew Morton wrote:
On Mon, 19 May 2008 14:06:25 +0100 Alan Cox <[email protected]>
Quoted 49 lines · wrote:
Quoted 4 lines
drivers/watchdog/iTCO_vendor.h | 15 ++ drivers/watchdog/iTCO_vendor_support.c | 53 +++--- drivers/watchdog/iTCO_wdt.c | 294++++++++++++++++----------------
This runs afoul of git-watchdog and/or itco_wdt-ich9do-support.patch
Hunk #1 succeeded at 66 (offset 1 line). Hunk #3 FAILED at 139.
Hunk #4 FAILED at 158.
Hunk #5 FAILED at 201.
Hunk #6 FAILED at 222.
Hunk #7 FAILED at 246.
Hunk #8 succeeded at 374 (offset 12 lines). Hunk #9 FAILED at 429.
Hunk #10 FAILED at 458.
Hunk #11 FAILED at 472.
Hunk #12 FAILED at 480.
Hunk #13 FAILED at 489.
Hunk #14 FAILED at 518.
Hunk #15 FAILED at 534.
Hunk #16 FAILED at 588.
Hunk #17 succeeded at 454 (offset -140 lines). Hunk #18 FAILED at 475.
Hunk #19 succeeded at 669 (offset 27 lines). Hunk #20 succeeded at 512 (offset -140 lines). Hunk #21 FAILED at 534.
Hunk #22 succeeded at 814 (offset 29 lines). 15 out of 22 hunks FAILED -- saving rejects to filedrivers/watchdog/iTCO_wdt.c.rejso I ducked this one.
booke-watchdog-clean-up-and-unlocked_ioctl gets 8-out-of-ten against watchdog-fix-booke_wdtc-on-mpc85xx-smp-system.patch so I ducked that one too.
w83697hf_wdt-cleanup-coding-style-and-switch-to-unlocked_ioctl gets 4-of-17 against git-watchdog - also ducked.
The rest applied, although about half of them needed fixes because Rusty has been running around fiddling with other peoples stuff renaming
down_trylocktodown_nowaitall over the tree.This means that the watchdog patches now have a Rusty dependency so I NEED TO KNOW if those patches aren't for 2.6.27 or if they get nacked or something.
Quoted 5 lines
It also means that the patches which I queued cannot go into Wim's tree as-is. If Wim queues the originals then it means that Stephen and/or myself get to fix all the rejects again, and there'll be a decent-sized smashup during the merge window. There are lessons here...
I've been pulling out s/down_trylock/down_nowait/ patches which effect others' changes. Those patches get moved to the end of my queue, and I'll revisit them before an actual merge with Linus.
As down_trylock still works (but marked deprecated) with my patches, they're fine to drop. Just tell me which ones...
Hope that helps,
Rusty.
Re: [PATCH 18/57] iTCO: unlocked_ioctl, coding style and cleanup
Quoted 9 lines · On Wed, 21 May 2008 14:26:15 +1000 Rusty Russell <[email protected]> wrote:
Quoted 2 lines
decent-sized smashup during the merge window. There are lessons here...
I've been pulling out s/down_trylock/down_nowait/ patches which effect others' changes. Those patches get moved to the end of my queue, and I'll revisit them before an actual merge with Linus.
As
down_trylockstill works (but marked deprecated) with my patches, they're fine to drop. Just tell me which ones...
Well, a simple patch which does
/*
* comment goes here
*/
static inline int __must_check down_nowait(struct semaphore *sem)
{
return !down_trylock(sem);
}and which does not deprecate down_trylock() could go into mainline right now, (assuming that the overall concept doesn't get shot down in review - did it get reviewed?)
Then you can start trickling stuff out to people straight away.
Re: [PATCH 18/57] iTCO: unlocked_ioctl, coding style and cleanup
Quoted 1 line · On Wednesday 21 May 2008 14:36:54 Andrew Morton wrote:
On Wed, 21 May 2008 14:26:15 +1000 Rusty Russell <[email protected]>
Quoted 16 lines · wrote:
Quoted 9 lines
Quoted 2 lines
decent-sized smashup during the merge window. There are lessons here...
I've been pulling out s/down_trylock/down_nowait/ patches which effect others' changes. Those patches get moved to the end of my queue, and I'll revisit them before an actual merge with Linus.
As
down_trylockstill works (but marked deprecated) with my patches, they're fine to drop. Just tell me which ones...Well, a simple patch which does
/*
* comment goes here
*/
static inline int__must_checkdown_nowait(struct semaphore *sem)
Quoted 6 lines
{ return !down_trylock(sem); }and which does not deprecate
down_trylock()could go into mainline right now
Sure, in this case it's probably worth it.
Quoted 2 lines
, (assuming that the overall concept doesn't get shot down in review - did it get reviewed?)
Well, it got some commentry on lkml, mainly from Christoph H. He was the one who came up with "down_nowait" vs the original "down_try".
Quoted 1 line
Then you can start trickling stuff out to people straight away.
OK, I'll send a patch now.
Thanks,
Rusty.
Re: [PATCH 18/57] iTCO: unlocked_ioctl, coding style and cleanup
In reply to Rusty RussellQuoted 3 lines
I've been pulling out s/down_trylock/down_nowait/ patches which effect others' changes. Those patches get moved to the end of my queue, and I'll revisit them before an actual merge with Linus.
The watchdog drivers all got the semaphores removed in the patch set I did so you can dump that bit.
Quoted 1 line
Re: [PATCH 18/57] iTCO: unlocked_ioctl, coding style and cleanup
Quoted 6 lines · On Wednesday 21 May 2008 19:29:22 Alan Cox wrote:
Quoted 3 lines
I've been pulling out s/down_trylock/down_nowait/ patches which effect others' changes. Those patches get moved to the end of my queue, and I'll revisit them before an actual merge with Linus.
The watchdog drivers all got the semaphores removed in the patch set I did so you can dump that bit.
Done, thanks. Are you in linux-next yet? Stephen is pretty good at telling me about this kind of stuff...
Thanks,
Rusty.
Re: [PATCH 18/57] iTCO: unlocked_ioctl, coding style and cleanup
Quoted 10 lines · On Thu, 22 May 2008 15:56:26 +1000 Rusty Russell <[email protected]> wrote:
Quoted 6 lines · On Wednesday 21 May 2008 19:29:22 Alan Cox wrote:
Quoted 3 lines
I've been pulling out s/down_trylock/down_nowait/ patches which effect others' changes. Those patches get moved to the end of my queue, and I'll revisit them before an actual merge with Linus.
The watchdog drivers all got the semaphores removed in the patch set I did so you can dump that bit.
Done, thanks. Are you in linux-next yet? Stephen is pretty good at telling me about this kind of stuff...
Nope. I haven't worked out how to get -mm into linux-next yet. (Well, I have, but I haven't worked out how to do it while getting Stephen to do all the work ;)) Soon....
The route for these patches is via Wim - merge these into git-watchdog, feed git-watchdog fed into linux-next. Please.
PATCH 19/57 bfin: watchdog cleanup and unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
Scan, tidy and check for unlocked_ioctl
---
drivers/watchdog/bfin_wdt.c | 147 +++++++++++++++++++++---------------------- 1 files changed, 71 insertions(+), 76 deletions(-)
drivers/watchdog/bfin_wdt.c +71 -76
@@ -25,7 +25,7 @@#include <linux/init.h> #include <linux/interrupt.h> #include <asm/blackfin.h> -#include <asm/uaccess.h> +#include <linux/uaccess.h> #define stamp(fmt, args...) pr_debug("%s:%i: " fmt "\n", __func__, __LINE__, ## args)#define stampit () stamp("here i am")
@@ -147,7 +147,8 @@ static int bfin_wdt_set_timeout(unsigned long t)int run =bfin_wdt_running ();bfin_wdt_stop ();bfin_write_WDOG_CNT (cnt); -if (run)bfin_wdt_start (); +if (run) +bfin_wdt_start (); }spin_unlock_irqrestore (&bfin_wdt_spinlock, flags);
@@ -190,16 +191,15 @@ static int bfin_wdt_release(struct inode *inode, struct file *file) {stampit (); -if (expect_close ==42 ) { +if (expect_close ==42 )bfin_wdt_stop (); - }else { - printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); +else { + printk(KERN_CRIT PFX + "Unexpected close, not stopping watchdog!\n");bfin_wdt_keepalive (); } - expect_close =0 ;clear_bit (0 , &open_check); -return 0 ; }
@@ -213,7 +213,7 @@ static int bfin_wdt_release(struct inode *inode, struct file *file)* Pings the watchdog on write. */ static ssize_t bfin_wdt_write (struct file *file,const char __user *data, -size_t len,loff_t *ppos) +size_t len,loff_t *ppos) {stampit ();
@@ -240,7 +240,6 @@ static ssize_t bfin_wdt_write(struct file *file, const char __user *data,/** * bfin_wdt_ioctl - Query Device -* @inode: inode of device * @file: file handle of device * @cmd: watchdog command * @arg: argument
@@ -248,8 +247,8 @@ static ssize_t bfin_wdt_write(struct file *file, const char __user *data,* Query basic information from the device or ping it, as outlined by the * watchdog API. */ -static int bfin_wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long bfin_wdt_ioctl (struct file *file, +unsigned int cmd,unsigned long arg) {void __user *argp = (void __user *)arg;int __user *p = argp;
@@ -257,59 +256,49 @@ static int bfin_wdt_ioctl(struct inode *inode, struct file *file,stampit ();switch (cmd) { -default : -return -ENOTTY ; - -case WDIOC_GETSUPPORT : -if (copy_to_user (argp, &bfin_wdt_info,sizeof (bfin_wdt_info))) -return -EFAULT ; -else -return 0 ; - -case WDIOC_GETSTATUS : -case WDIOC_GETBOOTSTATUS : -return put_user (!!(_bfin_swrst &SWRST_RESET_WDOG ), p); - -case WDIOC_KEEPALIVE : -bfin_wdt_keepalive (); +case WDIOC_GETSUPPORT : +if (copy_to_user (argp, &bfin_wdt_info,sizeof (bfin_wdt_info))) +return -EFAULT ; +else return 0 ; - -case WDIOC_SETTIMEOUT : { -int new_timeout; - -if (get_user (new_timeout, p)) -return -EFAULT ; - -if (bfin_wdt_set_timeout (new_timeout)) -return -EINVAL ; +case WDIOC_GETSTATUS : +case WDIOC_GETBOOTSTATUS : +return put_user (!!(_bfin_swrst &SWRST_RESET_WDOG ), p); +case WDIOC_KEEPALIVE : +bfin_wdt_keepalive (); +return 0 ; +case WDIOC_SETTIMEOUT : { +int new_timeout; + +if (get_user (new_timeout, p)) +return -EFAULT ; +if (bfin_wdt_set_timeout (new_timeout)) +return -EINVAL ; + } +/* Fall */ +case WDIOC_GETTIMEOUT : +return put_user (timeout, p); +case WDIOC_SETOPTIONS : { +unsigned long flags; +int options, ret = -EINVAL ; + +if (get_user (options, p)) +return -EFAULT ; + +spin_lock_irqsave (&bfin_wdt_spinlock, flags); +if (options &WDIOS_DISABLECARD ) { +bfin_wdt_stop (); + ret =0 ; } -/* Fall */ -case WDIOC_GETTIMEOUT : -return put_user (timeout, p); - -case WDIOC_SETOPTIONS : { -unsigned long flags; -int options, ret = -EINVAL ; - -if (get_user (options, p)) -return -EFAULT ; - -spin_lock_irqsave (&bfin_wdt_spinlock, flags); - -if (options &WDIOS_DISABLECARD ) { -bfin_wdt_stop (); - ret =0 ; - } - -if (options &WDIOS_ENABLECARD ) { -bfin_wdt_start (); - ret =0 ; - } - -spin_unlock_irqrestore (&bfin_wdt_spinlock, flags); - -return ret; +if (options &WDIOS_ENABLECARD ) { +bfin_wdt_start (); + ret =0 ; } +spin_unlock_irqrestore (&bfin_wdt_spinlock, flags); +return ret; + } +default : +return -ENOTTY ; } }
@@ -322,8 +311,8 @@ static int bfin_wdt_ioctl(struct inode *inode, struct file *file,* Handles specific events, such as turning off the watchdog during a * shutdown event. */ -static int bfin_wdt_notify_sys (struct notifier_block *this,unsigned long code, -void *unused) +static int bfin_wdt_notify_sys (struct notifier_block *this, +unsigned long code,void *unused) {stampit ();
@@ -392,12 +381,12 @@ static struct platform_driver bfin_wdt_driver = { };static const struct file_operations bfin_wdt_fops = { - .owner =THIS_MODULE , - .llseek = no_llseek, - .write = bfin_wdt_write, - .ioctl = bfin_wdt_ioctl, - .open = bfin_wdt_open, - .release = bfin_wdt_release, + .owner =THIS_MODULE , + .llseek = no_llseek, + .write = bfin_wdt_write, + .unlocked_ioctl = bfin_wdt_ioctl, + .open = bfin_wdt_open, + .release = bfin_wdt_release, };static struct miscdevice bfin_wdt_miscdev = {
@@ -409,8 +398,8 @@ static struct miscdevice bfin_wdt_miscdev = {static struct watchdog_info bfin_wdt_info = { .identity ="Blackfin Watchdog" , .options =WDIOF_SETTIMEOUT | -WDIOF_KEEPALIVEPING | -WDIOF_MAGICCLOSE , +WDIOF_KEEPALIVEPING | +WDIOF_MAGICCLOSE , };static struct notifier_block bfin_wdt_notifier = {
@@ -446,14 +435,16 @@ static int __init bfin_wdt_init(void) ret =register_reboot_notifier (&bfin_wdt_notifier);if (ret) { - pr_init(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", ret); + pr_init(KERN_ERR PFX + "cannot register reboot notifier (err=%d)\n", ret);return ret; } ret =misc_register (&bfin_wdt_miscdev);if (ret) { - pr_init(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - WATCHDOG_MINOR, ret); + pr_init(KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + WATCHDOG_MINOR, ret);unregister_reboot_notifier (&bfin_wdt_notifier);return ret; }
@@ -485,7 +476,11 @@ MODULE_LICENSE("GPL");MODULE_ALIAS_MISCDEV (WATCHDOG_MINOR );module_param (timeout, uint,0 ); -MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (1<=timeout<=((2^32)/SCLK), default=" __MODULE_STRING(WATCHDOG_TIMEOUT) ")"); +MODULE_PARM_DESC (timeout, + "Watchdog timeout in seconds. (1<=timeout<=((2^32)/SCLK), default=" + __MODULE_STRING(WATCHDOG_TIMEOUT) ")");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) ")");
PATCH 20/57 booke watchdog: clean up and unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/booke_wdt.c | 57 ++++++++++++++++++++++-------------------- 1 files changed, 30 insertions(+), 27 deletions(-)
drivers/watchdog/booke_wdt.c +30 -27
@@ -19,9 +19,9 @@#include <linux/miscdevice.h> #include <linux/notifier.h> #include <linux/watchdog.h> +#include <linux/uaccess.h> #include <asm/reg_booke.h> -#include <asm/uaccess.h> #include <asm/system.h> /* If the kernel parameter wdt=1, the watchdog will be enabled at boot.
@@ -33,12 +33,12 @@*/ #ifdef CONFIG_FSL_BOOKE -#define WDT_PERIOD_DEFAULT 63/* Ex. wdt_period=28 bus=333Mhz , reset=~40sec */ +#define WDT_PERIOD_DEFAULT 63/* Ex. wdt_period=28 bus=333Mhz,reset=~40sec */ #else #define WDT_PERIOD_DEFAULT 3/* Refer to the PPC40x and PPC4xx manuals */ #endif /* for timing information */ -u32 booke_wdt_enabled =0 ; +u32 booke_wdt_enabled;u32 booke_wdt_period =WDT_PERIOD_DEFAULT ;#ifdef CONFIG_FSL_BOOKE
@@ -50,7 +50,7 @@ u32 booke_wdt_period = WDT_PERIOD_DEFAULT;/* * booke_wdt_ping: */ -static __inline__void booke_wdt_ping (void ) +static inline void booke_wdt_ping (void ) {mtspr (SPRN_TSR ,TSR_ENW |TSR_WIS ); }
@@ -58,7 +58,7 @@ static __inline__ void booke_wdt_ping(void)/* * booke_wdt_enable: */ -static __inline__void booke_wdt_enable (void ) +static inline void booke_wdt_enable (void ) {u32 val;
@@ -73,7 +73,7 @@ static __inline__ void booke_wdt_enable(void)/* * booke_wdt_write: */ -static ssize_t booke_wdt_write (struct file *file,const char __user *buf, +static ssize_t booke_wdt_write (struct file *file,const char __user *buf,size_t count,loff_t *ppos) {booke_wdt_ping ();
@@ -81,24 +81,23 @@ static ssize_t booke_wdt_write (struct file *file, const char __user *buf, }static struct watchdog_info ident = { - .options =WDIOF_SETTIMEOUT |WDIOF_KEEPALIVEPING , - .firmware_version =0 , - .identity ="PowerPC Book-E Watchdog" , + .options =WDIOF_SETTIMEOUT |WDIOF_KEEPALIVEPING , + .firmware_version =0 , + .identity ="PowerPC Book-E Watchdog" , };/* * booke_wdt_ioctl: */ -static int booke_wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long booke_wdt_ioctl (struct file *file, +unsigned int cmd,unsigned long arg) {u32 tmp =0 ;u32 __user *p = (u32 __user *)arg;switch (cmd) {case WDIOC_GETSUPPORT : -if (copy_to_user ((struct watchdog_info __user *) arg, &ident, -sizeof (struct watchdog_info ))) +if (copy_to_user (arg, &ident,sizeof (struct watchdog_info )))return -EFAULT ;case WDIOC_GETSTATUS :return put_user (ident.options, p);
@@ -113,7 +112,8 @@ static int booke_wdt_ioctl (struct inode *inode, struct file *file,case WDIOC_SETTIMEOUT :if (get_user (booke_wdt_period, p))return -EFAULT ; -mtspr (SPRN_TCR , (mfspr (SPRN_TCR )&~WDTP (0 ))|WDTP (booke_wdt_period)); +mtspr (SPRN_TCR , (mfspr (SPRN_TCR ) & ~WDTP (0 )) | +WDTP (booke_wdt_period));return 0 ;case WDIOC_GETTIMEOUT :return put_user (booke_wdt_period, p);
@@ -135,12 +135,13 @@ static int booke_wdt_ioctl (struct inode *inode, struct file *file,/* * booke_wdt_open: */ -static int booke_wdt_open (struct inode *inode,struct file *file) +static int booke_wdt_open (struct inode *inode,struct file *file) {if (booke_wdt_enabled ==0 ) { booke_wdt_enabled =1 ;booke_wdt_enable (); -printk (KERN_INFO "PowerPC Book-E Watchdog Timer Enabled (wdt_period=%d)\n" , +printk (KERN_INFO +"PowerPC Book-E Watchdog Timer Enabled (wdt_period=%d)\n" , booke_wdt_period); }
@@ -148,17 +149,17 @@ static int booke_wdt_open (struct inode *inode, struct file *file) }static const struct file_operations booke_wdt_fops = { - .owner =THIS_MODULE , - .llseek = no_llseek, - .write = booke_wdt_write, - .ioctl = booke_wdt_ioctl, - .open = booke_wdt_open, + .owner =THIS_MODULE , + .llseek = no_llseek, + .write = booke_wdt_write, + .unlocked_ioctl = booke_wdt_ioctl, + .open = booke_wdt_open, };static struct miscdevice booke_wdt_miscdev = { - .minor =WATCHDOG_MINOR , - .name ="watchdog" , - .fops = &booke_wdt_fops, + .minor =WATCHDOG_MINOR , + .name ="watchdog" , + .fops = &booke_wdt_fops, }; static void __exit booke_wdt_exit(void)
@@ -173,18 +174,20 @@ static int __init booke_wdt_init(void) {int ret =0 ; -printk (KERN_INFO "PowerPC Book-E Watchdog Timer Loaded\n" ); +printk (KERN_INFO "PowerPC Book-E Watchdog Timer Loaded\n" ); ident.firmware_version = cur_cpu_spec->pvr_value; ret =misc_register (&booke_wdt_miscdev);if (ret) { -printk (KERN_CRIT "Cannot register miscdev on minor=%d (err=%d)\n" , +printk (KERN_CRIT +"Cannot register miscdev on minor=%d (err=%d)\n" ,WATCHDOG_MINOR , ret);return ret; }if (booke_wdt_enabled ==1 ) { -printk (KERN_INFO "PowerPC Book-E Watchdog Timer Enabled (wdt_period=%d)\n" , +printk (KERN_INFO +"PowerPC Book-E Watchdog Timer Enabled (wdt_period=%d)\n" , booke_wdt_period);booke_wdt_enable (); }
PATCH 21/57 ixp2000_wdt: clean up and unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/ixp2000_wdt.c | 50 ++++++++++++++++++---------------------- 1 files changed, 23 insertions(+), 27 deletions(-)
drivers/watchdog/ixp2000_wdt.c +23 -27
@@ -25,42 +25,45 @@#include <linux/watchdog.h> #include <linux/init.h> #include <linux/bitops.h> +#include <linux/uaccess.h> #include <asm/hardware.h> -#include <asm/uaccess.h> static int nowayout =WATCHDOG_NOWAYOUT ;static unsigned int heartbeat =60 ;/* (secs) Default is 1 minute */ static unsigned long wdt_status; +static spinlock_t wdt_lock;#define WDT_IN_USE 0#define WDT_OK_TO_CLOSE 1static unsigned long wdt_tick_rate; -static void -wdt_enable (void ) +static void wdt_enable (void ) { +spin_lock (&wdt_lock);ixp2000_reg_write (IXP2000_RESET0 , *(IXP2000_RESET0 ) |WDT_RESET_ENABLE );ixp2000_reg_write (IXP2000_TWDE ,WDT_ENABLE );ixp2000_reg_write (IXP2000_T4_CLD , heartbeat * wdt_tick_rate);ixp2000_reg_write (IXP2000_T4_CTL ,TIMER_DIVIDER_256 |TIMER_ENABLE ); +spin_unlock (&wdt_lock); } -static void -wdt_disable (void ) +static void wdt_disable (void ) { +spin_lock (&wdt_lock);ixp2000_reg_write (IXP2000_T4_CTL ,0 ); +spin_unlock (&wdt_lock); } -static void -wdt_keepalive (void ) +static void wdt_keepalive (void ) { +spin_lock (&wdt_lock);ixp2000_reg_write (IXP2000_T4_CLD , heartbeat * wdt_tick_rate); +spin_unlock (&wdt_lock); } -static int -ixp2000_wdt_open (struct inode *inode,struct file *file) +static int ixp2000_wdt_open (struct inode *inode,struct file *file) {if (test_and_set_bit (WDT_IN_USE , &wdt_status))return -EBUSY ;
@@ -72,8 +75,8 @@ ixp2000_wdt_open(struct inode *inode, struct file *file)return nonseekable_open (inode, file); } -static ssize_t -ixp2000_wdt_write (struct file *file,const char *data,size_t len,loff_t *ppos) +static ssize_t ixp2000_wdt_write (struct file *file,const char *data, +size_t len,loff_t *ppos) {if (len) {if (!nowayout) {
@@ -103,9 +106,8 @@ static struct watchdog_info ident = { .identity = "IXP2000 Watchdog", }; -static int -ixp2000_wdt_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long ixp2000_wdt_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {int ret = -ENOTTY ;int time;
@@ -151,16 +153,13 @@ ixp2000_wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,return ret; } -static int -ixp2000_wdt_release (struct inode *inode,struct file *file) +static int ixp2000_wdt_release (struct inode *inode,struct file *file) { -if (test_bit (WDT_OK_TO_CLOSE , &wdt_status)) { +if (test_bit (WDT_OK_TO_CLOSE , &wdt_status))wdt_disable (); - }else { +else printk (KERN_CRIT "WATCHDOG: Device closed unexpectedly - " "timer will not stop\n" ); - } -clear_bit (WDT_IN_USE , &wdt_status);clear_bit (WDT_OK_TO_CLOSE , &wdt_status);
@@ -168,18 +167,16 @@ ixp2000_wdt_release(struct inode *inode, struct file *file) } -static const struct file_operations ixp2000_wdt_fops = -{ +static const struct file_operations ixp2000_wdt_fops = { .owner =THIS_MODULE , .llseek = no_llseek, .write = ixp2000_wdt_write, - .ioctl = ixp2000_wdt_ioctl, + .unlocked_ioctl = ixp2000_wdt_ioctl, .open = ixp2000_wdt_open, .release = ixp2000_wdt_release, }; -static struct miscdevice ixp2000_wdt_miscdev = -{ +static struct miscdevice ixp2000_wdt_miscdev = { .minor =WATCHDOG_MINOR , .name ="watchdog" , .fops = &ixp2000_wdt_fops,
@@ -191,9 +188,8 @@ static int __init ixp2000_wdt_init(void)printk (KERN_INFO "Unable to use IXP2000 watchdog due to IXP2800 erratum #25.\n" );return -EIO ; } - wdt_tick_rate = (*IXP2000_T1_CLD *HZ ) /256 ; - +spin_lock_init (&wdt_lock);return misc_register (&ixp2000_wdt_miscdev); }
PATCH 22/57 ixp4xx_wdt: unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/ixp4xx_wdt.c | 41 +++++++++++++++++------------------------ 1 files changed, 17 insertions(+), 24 deletions(-)
drivers/watchdog/ixp4xx_wdt.c +17 -24
@@ -30,40 +30,40 @@ static int nowayout = WATCHDOG_NOWAYOUT;static int heartbeat =60 ;/* (secs) Default is 1 minute */ static unsigned long wdt_status;static unsigned long boot_status; +static spin_lock_t wdt_lock;#define WDT_TICK_RATE (IXP4XX_PERIPHERAL_BUS_CLOCK * 1000000UL)#define WDT_IN_USE 0#define WDT_OK_TO_CLOSE 1 -static void -wdt_enable (void ) +static void wdt_enable (void ) { +spin_lock (&wdt_lock); *IXP4XX_OSWK =IXP4XX_WDT_KEY ; *IXP4XX_OSWE =0 ; *IXP4XX_OSWT =WDT_TICK_RATE * heartbeat; *IXP4XX_OSWE =IXP4XX_WDT_COUNT_ENABLE |IXP4XX_WDT_RESET_ENABLE ; *IXP4XX_OSWK =0 ; +spin_unlock (&wdt_lock); } -static void -wdt_disable (void ) +static void wdt_disable (void ) { +spin_lock (&wdt_lock); *IXP4XX_OSWK =IXP4XX_WDT_KEY ; *IXP4XX_OSWE =0 ; *IXP4XX_OSWK =0 ; +spin_unlock (&wdt_lock); } -static int -ixp4xx_wdt_open (struct inode *inode,struct file *file) +static int ixp4xx_wdt_open (struct inode *inode,struct file *file) {if (test_and_set_bit (WDT_IN_USE , &wdt_status))return -EBUSY ;clear_bit (WDT_OK_TO_CLOSE , &wdt_status); -wdt_enable (); -return nonseekable_open (inode, file); }
@@ -87,7 +87,6 @@ ixp4xx_wdt_write(struct file *file, const char *data, size_t len, loff_t *ppos) }wdt_enable (); } -return len; }
@@ -98,9 +97,8 @@ static struct watchdog_info ident = { }; -static int -ixp4xx_wdt_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long ixp4xx_wdt_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {int ret = -ENOTTY ;int time;
@@ -145,16 +143,13 @@ ixp4xx_wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,return ret; } -static int -ixp4xx_wdt_release (struct inode *inode,struct file *file) +static int ixp4xx_wdt_release (struct inode *inode,struct file *file) { -if (test_bit (WDT_OK_TO_CLOSE , &wdt_status)) { +if (test_bit (WDT_OK_TO_CLOSE , &wdt_status))wdt_disable (); - }else { +else printk (KERN_CRIT "WATCHDOG: Device closed unexpectedly - " "timer will not stop\n" ); - } -clear_bit (WDT_IN_USE , &wdt_status);clear_bit (WDT_OK_TO_CLOSE , &wdt_status);
@@ -167,7 +162,7 @@ static const struct file_operations ixp4xx_wdt_fops = .owner = THIS_MODULE, .llseek = no_llseek, .write = ixp4xx_wdt_write, - .ioctl = ixp4xx_wdt_ioctl, + .unlocked_ioctl = ixp4xx_wdt_ioctl, .open = ixp4xx_wdt_open, .release = ixp4xx_wdt_release, };
@@ -191,14 +186,12 @@ static int __init ixp4xx_wdt_init(void)return -ENODEV ; } - +spin_lock_init (&wdt_lock); + boot_status = (*IXP4XX_OSST &IXP4XX_OSST_TIMER_WARM_RESET ) ? +WDIOF_CARDRESET :0 ; ret =misc_register (&ixp4xx_wdt_miscdev);if (ret ==0 )printk ("IXP4xx Watchdog Timer: heartbeat %d sec\n" , heartbeat); - - boot_status = (*IXP4XX_OSST &IXP4XX_OSST_TIMER_WARM_RESET ) ? -WDIOF_CARDRESET :0 ; -return ret; }
PATCH 23/57 ks8695_wdt: clean up, coding style, unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/ks8695_wdt.c | 119 +++++++++++++++++++++-------------------- 1 files changed, 62 insertions(+), 57 deletions(-)
drivers/watchdog/ks8695_wdt.c +62 -57
@@ -19,8 +19,8 @@#include <linux/platform_device.h> #include <linux/types.h> #include <linux/watchdog.h> -#include <asm/io.h> -#include <asm/uaccess.h> +#include <linux/io.h> +#include <linux/uaccess.h> #include <asm/arch/regs-timer.h>
@@ -31,38 +31,44 @@ static int wdt_time = WDT_DEFAULT_TIME;static int nowayout =WATCHDOG_NOWAYOUT ;module_param (wdt_time, int,0 ); -MODULE_PARM_DESC(wdt_time, "Watchdog time in seconds. (default="__MODULE_STRING(WDT_DEFAULT_TIME) ")"); +MODULE_PARM_DESC(wdt_time, "Watchdog time in seconds. (default=" + __MODULE_STRING(WDT_DEFAULT_TIME) ")");#ifdef CONFIG_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) ")");#endif static unsigned long ks8695wdt_busy; +static spinlock_t ks8695_lock;/* ......................................................................... */ /* * Disable the watchdog. */ -static void inline ks8695_wdt_stop (void ) +static inline void ks8695_wdt_stop (void ) {unsigned long tmcon; +spin_lock (&ks8695_lock);/* disable timer0 */ tmcon =__raw_readl (KS8695_TMR_VA +KS8695_TMCON );__raw_writel (tmcon & ~TMCON_T0EN ,KS8695_TMR_VA +KS8695_TMCON ); +spin_unlock (&ks8695_lock); }/* * Enable and reset the watchdog. */ -static void inline ks8695_wdt_start (void ) +static inline void ks8695_wdt_start (void ) {unsigned long tmcon;unsigned long tval = wdt_time *CLOCK_TICK_RATE ; +spin_lock (&ks8695_lock);/* disable timer0 */ tmcon =__raw_readl (KS8695_TMR_VA +KS8695_TMCON );__raw_writel (tmcon & ~TMCON_T0EN ,KS8695_TMR_VA +KS8695_TMCON );
@@ -73,19 +79,22 @@ static void inline ks8695_wdt_start(void)/* re-enable timer0 */ tmcon =__raw_readl (KS8695_TMR_VA +KS8695_TMCON );__raw_writel (tmcon |TMCON_T0EN ,KS8695_TMR_VA +KS8695_TMCON ); +spin_unlock (&ks8695_lock); }/* * Reload the watchdog timer. (ie, pat the watchdog) */ -static void inline ks8695_wdt_reload (void ) +static inline void ks8695_wdt_reload (void ) {unsigned long tmcon; +spin_lock (&ks8695_lock);/* disable, then re-enable timer0 */ tmcon =__raw_readl (KS8695_TMR_VA +KS8695_TMCON );__raw_writel (tmcon & ~TMCON_T0EN ,KS8695_TMR_VA +KS8695_TMCON );__raw_writel (tmcon |TMCON_T0EN ,KS8695_TMR_VA +KS8695_TMCON ); +spin_unlock (&ks8695_lock); }/*
@@ -102,7 +111,8 @@ static int ks8695_wdt_settimeout(int new_time)if ((new_time <=0 ) || (new_time >WDT_MAX_TIME ))return -EINVAL ; -/* Set new watchdog time. It will be used when ks8695_wdt_start() is called. */ +/* Set new watchdog time. It will be used when +ks8695_wdt_start() is called. */ wdt_time = new_time;return 0 ; }
@@ -128,9 +138,9 @@ static int ks8695_wdt_open(struct inode *inode, struct file *file)*/ static int ks8695_wdt_close (struct inode *inode,struct file *file) { +/* Disable the watchdog when file is closed */ if (!nowayout) -ks8695_wdt_stop ();/* Disable the watchdog when file is closed */ - +ks8695_wdt_stop ();clear_bit (0 , &ks8695wdt_busy);return 0 ; }
@@ -143,60 +153,52 @@ static struct watchdog_info ks8695_wdt_info = {/* * Handle commands from user-space. */ -static int ks8695_wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long ks8695_wdt_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {void __user *argp = (void __user *)arg;int __user *p = argp;int new_value; -switch (cmd) { -case WDIOC_KEEPALIVE : -ks8695_wdt_reload ();/* pat the watchdog */ -return 0 ; - -case WDIOC_GETSUPPORT : -return copy_to_user (argp, &ks8695_wdt_info,sizeof (ks8695_wdt_info)) ? -EFAULT :0 ; - -case WDIOC_SETTIMEOUT : -if (get_user (new_value, p)) -return -EFAULT ; - -if (ks8695_wdt_settimeout (new_value)) -return -EINVAL ; - -/* Enable new time value */ +switch (cmd) { +case WDIOC_KEEPALIVE : +ks8695_wdt_reload ();/* pat the watchdog */ +return 0 ; +case WDIOC_GETSUPPORT : +return copy_to_user (argp, &ks8695_wdt_info, +sizeof (ks8695_wdt_info)) ? -EFAULT :0 ; +case WDIOC_SETTIMEOUT : +if (get_user (new_value, p)) +return -EFAULT ; +if (ks8695_wdt_settimeout (new_value)) +return -EINVAL ; +/* Enable new time value */ +ks8695_wdt_start (); +/* Return current value */ +return put_user (wdt_time, p); +case WDIOC_GETTIMEOUT : +return put_user (wdt_time, p); +case WDIOC_GETSTATUS : +case WDIOC_GETBOOTSTATUS : +return put_user (0 , p); +case WDIOC_SETOPTIONS : +if (get_user (new_value, p)) +return -EFAULT ; +if (new_value &WDIOS_DISABLECARD ) +ks8695_wdt_stop (); +if (new_value &WDIOS_ENABLECARD )ks8695_wdt_start (); - -/* Return current value */ -return put_user (wdt_time, p); - -case WDIOC_GETTIMEOUT : -return put_user (wdt_time, p); - -case WDIOC_GETSTATUS : -case WDIOC_GETBOOTSTATUS : -return put_user (0 , p); - -case WDIOC_SETOPTIONS : -if (get_user (new_value, p)) -return -EFAULT ; - -if (new_value &WDIOS_DISABLECARD ) -ks8695_wdt_stop (); -if (new_value &WDIOS_ENABLECARD ) -ks8695_wdt_start (); -return 0 ; - -default : -return -ENOTTY ; +return 0 ; +default : +return -ENOTTY ; } }/* * Pat the watchdog whenever device is written to. */ -static ssize_t ks8695_wdt_write (struct file *file,const char *data,size_t len,loff_t *ppos) +static ssize_t ks8695_wdt_write (struct file *file,const char *data, +size_t len,loff_t *ppos) {ks8695_wdt_reload ();/* pat the watchdog */ return len;
@@ -207,7 +209,7 @@ static ssize_t ks8695_wdt_write(struct file *file, const char *data, size_t len,static const struct file_operations ks8695wdt_fops = { .owner =THIS_MODULE , .llseek = no_llseek, - .ioctl = ks8695_wdt_ioctl, + .unlocked_ioctl = ks8695_wdt_ioctl, .open = ks8695_wdt_open, .release = ks8695_wdt_close, .write = ks8695_wdt_write,
@@ -231,7 +233,8 @@ static int __init ks8695wdt_probe(struct platform_device *pdev)if (res)return res; -printk ("KS8695 Watchdog Timer enabled (%d seconds%s)\n" , wdt_time, nowayout ?", nowayout" :"" ); +printk (KERN_INFO "KS8695 Watchdog Timer enabled (%d seconds%s)\n" , + wdt_time, nowayout ?", nowayout" :"" );return 0 ; }
@@ -285,12 +288,14 @@ static struct platform_driver ks8695wdt_driver = {static int __init ks8695_wdt_init (void ) { -/* Check that the heartbeat value is within range; if not reset to the default */ +spin_lock_init (&ks8695_lock); +/* Check that the heartbeat value is within range; +if not reset to the default */ if (ks8695_wdt_settimeout (wdt_time)) {ks8695_wdt_settimeout (WDT_DEFAULT_TIME ); -pr_info ("ks8695_wdt: wdt_time value must be 1 <= wdt_time <= %i, using %d\n" , wdt_time,WDT_MAX_TIME ); +pr_info ("ks8695_wdt: wdt_time value must be 1 <= wdt_time <= %i, using %d\n" , + wdt_time,WDT_MAX_TIME ); } -return platform_driver_register (&ks8695wdt_driver); }
PATCH 24/57 machzwd: clean up, coding style, unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/machzwd.c | 108 ++++++++++++++++---------------------------- 1 files changed, 40 insertions(+), 68 deletions(-)
drivers/watchdog/machzwd.c +40 -68
@@ -40,9 +40,9 @@#include <linux/notifier.h> #include <linux/reboot.h> #include <linux/init.h> +#include <linux/io.h> +#include <linux/uaccess.h> -#include <asm/io.h> -#include <asm/uaccess.h> #include <asm/system.h> /* ports */
@@ -95,7 +95,9 @@ MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);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) ")");#define PFX "machzwd"
@@ -114,7 +116,7 @@ static struct watchdog_info zf_info = {* 3 = GEN_SCI * defaults to GEN_RESET (0) */ -static int action =0 ; +static int action;module_param (action, int,0 );MODULE_PARM_DESC (action,"after watchdog resets, generate: 0 = RESET(*) 1 = SMI 2 = NMI 3 = SCI" );
@@ -123,10 +125,9 @@ static void zf_ping(unsigned long data);static int zf_action =GEN_RESET ;static unsigned long zf_is_open;static char zf_expect_close; -static DEFINE_SPINLOCK (zf_lock);static DEFINE_SPINLOCK (zf_port_lock); static DEFINE_TIMER(zf_timer, zf_ping, 0, 0); -static unsigned long next_heartbeat =0 ; +static unsigned long next_heartbeat;/* timeout for user land heart beat (10 seconds) */
@@ -171,13 +172,13 @@ static inline void zf_set_control(unsigned short new)static inline void zf_set_timer (unsigned short new,unsigned char n) { -switch (n){ -case WD1 : -zf_writew (COUNTER_1 , new); -case WD2 : -zf_writeb (COUNTER_2 , new >0xff ?0xff : new); -default : -return ; +switch (n) { +case WD1 : +zf_writew (COUNTER_1 , new); +case WD2 : +zf_writeb (COUNTER_2 , new >0xff ?0xff : new); +default : +return ; } }
@@ -241,10 +242,8 @@ static void zf_ping(unsigned long data)zf_writeb (COUNTER_2 ,0xff ); -if (time_before (jiffies, next_heartbeat)){ - +if (time_before (jiffies, next_heartbeat)) {dprintk ("time_before: %ld\n" , next_heartbeat - jiffies); -/* * reset event is activated by transition from 0 to 1 on * RESET_WD1 bit and we assume that it is already zero...
@@ -261,24 +260,21 @@ static void zf_ping(unsigned long data)spin_unlock_irqrestore (&zf_port_lock, flags);mod_timer (&zf_timer, jiffies +ZF_HW_TIMEO ); - }else { + }else printk(KERN_CRIT PFX ": I will reset your machine\n"); - } }static ssize_t zf_write (struct file *file,const char __user *buf,size_t count,loff_t *ppos) {/* See if we got the magic character */ -if (count){ - +if (count) {/* * no need to check for close confirmation * no way to disable watchdog ;) */ if (!nowayout) {size_t ofs; -/* * note: just in case someone wrote the magic character * five months ago...
@@ -286,11 +282,11 @@ static ssize_t zf_write(struct file *file, const char __user *buf, size_t count, zf_expect_close =0 ;/* now scan */ -for (ofs =0 ; ofs != count; ofs++){ +for (ofs =0 ; ofs != count; ofs++) {char c;if (get_user (c, buf + ofs))return -EFAULT ; -if (c =='V' ){ +if (c =='V' ) { zf_expect_close =42 ;dprintk ("zf_expect_close = 42\n" ); }
@@ -303,14 +299,11 @@ static ssize_t zf_write(struct file *file, const char __user *buf, size_t count,*/ next_heartbeat = jiffies +ZF_USER_TIMEO ;dprintk ("user ping at %ld\n" , jiffies); - } -return count; } -static int zf_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long zf_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {void __user *argp = (void __user *)arg;int __user *p = argp;
@@ -319,55 +312,38 @@ static int zf_ioctl(struct inode *inode, struct file *file, unsigned int cmd,if (copy_to_user (argp, &zf_info,sizeof (zf_info)))return -EFAULT ;break ; -case WDIOC_GETSTATUS :case WDIOC_GETBOOTSTATUS :return put_user (0 , p); -case WDIOC_KEEPALIVE :zf_ping (0 );break ; -default :return -ENOTTY ; } -return 0 ; }static int zf_open (struct inode *inode,struct file *file) { -spin_lock (&zf_lock); -if (test_and_set_bit (0 , &zf_is_open)) { -spin_unlock (&zf_lock); +if (test_and_set_bit (0 , &zf_is_open))return -EBUSY ; - } -if (nowayout)__module_get (THIS_MODULE ); - -spin_unlock (&zf_lock); -zf_timer_on (); -return nonseekable_open (inode, file); }static int zf_close (struct inode *inode,struct file *file) { -if (zf_expect_close ==42 ){ +if (zf_expect_close ==42 )zf_timer_off (); - }else { +else {del_timer (&zf_timer); printk(KERN_ERR PFX ": device file closed unexpectedly. Will not stop the WDT!\n"); } - -spin_lock (&zf_lock);clear_bit (0 , &zf_is_open); -spin_unlock (&zf_lock); - zf_expect_close =0 ; -return 0 ; }
@@ -378,23 +354,18 @@ static int zf_close(struct inode *inode, struct file *file)static int zf_notify_sys (struct notifier_block *this,unsigned long code,void *unused) { -if (code ==SYS_DOWN || code ==SYS_HALT ){ +if (code ==SYS_DOWN || code ==SYS_HALT )zf_timer_off (); - } -return NOTIFY_DONE ; } - - -static const struct file_operations zf_fops = { - .owner =THIS_MODULE , - .llseek = no_llseek, - .write = zf_write, - .ioctl = zf_ioctl, - .open = zf_open, - .release = zf_close, + .owner =THIS_MODULE , + .llseek = no_llseek, + .write = zf_write, + .unlocked_ioctl = zf_ioctl, + .open = zf_open, + .release = zf_close, };static struct miscdevice zf_miscdev = {
@@ -402,7 +373,7 @@ static struct miscdevice zf_miscdev = { .name = "watchdog", .fops = &zf_fops, }; - +/* * The device needs to learn about soft shutdowns in order to
@@ -423,22 +394,23 @@ static int __init zf_init(void) {int ret; - printk(KERN_INFO PFX ": MachZ ZF-Logic Watchdog driver initializing.\n"); + printk(KERN_INFO PFX + ": MachZ ZF-Logic Watchdog driver initializing.\n"); ret =zf_get_ZFL_version (); -if ((!ret) || (ret ==0xffff )) { +if (!ret || ret ==0xffff ) { printk(KERN_WARNING PFX ": no ZF-Logic found\n");return -ENODEV ; } -if ((action <=3 ) && (action >=0 )){ - zf_action = zf_action>>action; - }else +if (action <=3 && action >=0 ) + zf_action = zf_action >> action; +else action =0 ;zf_show_action (action); -if (!request_region (ZF_IOBASE ,3 ,"MachZ ZFL WDT" )){ +if (!request_region (ZF_IOBASE ,3 ,"MachZ ZFL WDT" )) {printk (KERN_ERR "cannot reserve I/O ports at %d\n" ,ZF_IOBASE ); ret = -EBUSY ;
@@ -446,14 +418,14 @@ static int __init zf_init(void) } ret =register_reboot_notifier (&zf_notifier); -if (ret){ +if (ret) {printk (KERN_ERR "can't register reboot notifier (err=%d)\n" , ret); goto no_reboot; } ret =misc_register (&zf_miscdev); -if (ret){ +if (ret) {printk (KERN_ERR "can't misc_register on minor=%d\n" ,WATCHDOG_MINOR ); goto no_misc;
PATCH 25/57 mixcomwd: coding style locking, unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/mixcomwd.c | 133 ++++++++++++++++++++----------------------- 1 files changed, 63 insertions(+), 70 deletions(-)
drivers/watchdog/mixcomwd.c +63 -70
@@ -29,7 +29,8 @@* - support for one more type board * * Version 0.5 (2001/12/14) Matt Domsch <[email protected]> -* - added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT +* - added nowayout module option to override +* CONFIG_WATCHDOG_NOWAYOUT * * Version 0.6 (2002/04/12): Rob Radez <[email protected]> * - make mixcomwd_opened unsigned,
@@ -53,8 +54,8 @@#include <linux/init.h> #include <linux/jiffies.h> #include <linux/timer.h> -#include <asm/uaccess.h> -#include <asm/io.h> +#include <linux/uaccess.h> +#include <linux/io.h> /* * We have two types of cards that can be probed:
@@ -108,18 +109,19 @@ static char expect_close;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) ")");static void mixcomwd_ping (void ) { -outb_p (55 ,watchdog_port); +outb_p (55 , watchdog_port);return ; }static void mixcomwd_timerfun (unsigned long d) {mixcomwd_ping (); -mod_timer (&mixcomwd_timer, jiffies +5 *HZ ); }
@@ -129,22 +131,22 @@ static void mixcomwd_timerfun(unsigned long d)static int mixcomwd_open (struct inode *inode,struct file *file) { -if (test_and_set_bit (0 ,&mixcomwd_opened)) { +if (test_and_set_bit (0 , &mixcomwd_opened))return -EBUSY ; - } +mixcomwd_ping (); -if (nowayout) { +if (nowayout)/* * fops_get() code via open() has already done * a try_module_get() so it is safe to do the * __module_get(). */ __module_get (THIS_MODULE ); - }else { -if (mixcomwd_timer_alive) { +else { +if (mixcomwd_timer_alive) {del_timer (&mixcomwd_timer); - mixcomwd_timer_alive=0 ; + mixcomwd_timer_alive =0 ; } }return nonseekable_open (inode, file);
@@ -153,26 +155,27 @@ static int mixcomwd_open(struct inode *inode, struct file *file)static int mixcomwd_release (struct inode *inode,struct file *file) {if (expect_close ==42 ) { -if (mixcomwd_timer_alive) { - printk(KERN_ERR PFX "release called while internal timer alive"); +if (mixcomwd_timer_alive) { + printk(KERN_ERR PFX + "release called while internal timer alive");return -EBUSY ; } - mixcomwd_timer_alive=1 ; + mixcomwd_timer_alive =1 ;mod_timer (&mixcomwd_timer, jiffies +5 *HZ ); - }else { - printk(KERN_CRIT PFX "WDT device closed unexpectedly. WDT will not stop!\n"); - } + }else + printk(KERN_CRIT PFX +"WDT device closed unexpectedly. WDT will not stop!\n" ); -clear_bit (0 ,&mixcomwd_opened); - expect_close=0 ; +clear_bit (0 , &mixcomwd_opened); + expect_close =0 ;return 0 ; } -static ssize_t mixcomwd_write (struct file *file,const char __user *data,size_t len,loff_t *ppos) +static ssize_t mixcomwd_write (struct file *file,const char __user *data, +size_t len,loff_t *ppos) { -if (len) - { +if (len) {if (!nowayout) {size_t i;
@@ -192,8 +195,8 @@ static ssize_t mixcomwd_write(struct file *file, const char __user *data, size_treturn len; } -static int mixcomwd_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long mixcomwd_ioctl (struct file *file, +unsigned int cmd,unsigned long arg) {void __user *argp = (void __user *)arg;int __user *p = argp;
@@ -204,32 +207,23 @@ static int mixcomwd_ioctl(struct inode *inode, struct file *file, .identity = "MixCOM watchdog", }; -switch (cmd) - { -case WDIOC_GETSTATUS : - status=mixcomwd_opened; -if (!nowayout) { - status|=mixcomwd_timer_alive; - } -if (copy_to_user (p, &status,sizeof (int ))) { -return -EFAULT ; - } -break ; -case WDIOC_GETBOOTSTATUS : -if (copy_to_user (p, &status,sizeof (int ))) { -return -EFAULT ; - } -break ; -case WDIOC_GETSUPPORT : -if (copy_to_user (argp, &ident,sizeof (ident))) { -return -EFAULT ; - } -break ; -case WDIOC_KEEPALIVE : -mixcomwd_ping (); -break ; -default : -return -ENOTTY ; +switch (cmd) { +case WDIOC_GETSTATUS : + status = mixcomwd_opened; +if (!nowayout) + status |= mixcomwd_timer_alive; +return put_user (status, p); +case WDIOC_GETBOOTSTATUS : +return put_user (0 , p); +case WDIOC_GETSUPPORT : +if (copy_to_user (argp, &ident,sizeof (ident))) +return -EFAULT ; +break ; +case WDIOC_KEEPALIVE : +mixcomwd_ping (); +break ; +default : +return -ENOTTY ; }return 0 ; }
@@ -238,7 +232,7 @@ static const struct file_operations mixcomwd_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = mixcomwd_write, - .ioctl = mixcomwd_ioctl, + .unlocked_ioctl = mixcomwd_ioctl, .open = mixcomwd_open, .release = mixcomwd_release, };
@@ -253,15 +247,14 @@ static int __init checkcard(int port, int card_id) {int id; -if (!request_region (port,1 ,"MixCOM watchdog" )) { +if (!request_region (port,1 ,"MixCOM watchdog" ))return 0 ; - } - id=inb_p (port); -if (card_id==MIXCOM_ID ) + id =inb_p (port); +if (card_id ==MIXCOM_ID ) id &=0x3f ; -if (id!=card_id) { +if (id != card_id) {release_region (port,1 );return 0 ; }
@@ -270,9 +263,7 @@ static int __init checkcard(int port, int card_id)static int __init mixcomwd_init (void ) { -int i; -int ret; -int found=0 ; +int i, ret, found =0 ;for (i =0 ; !found && mixcomwd_io_info[i].ioport !=0 ; i++) { if (checkcard(mixcomwd_io_info[i].ioport,
@@ -283,20 +274,22 @@ static int __init mixcomwd_init(void) }if (!found) { - printk(KERN_ERR PFX "No card detected, or port not available.\n"); + printk(KERN_ERR PFX + "No card detected, or port not available.\n");return -ENODEV ; } ret =misc_register (&mixcomwd_miscdev); -if (ret) - { - printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - WATCHDOG_MINOR, ret); +if (ret) { + printk(KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + WATCHDOG_MINOR, ret); goto error_misc_register_watchdog; } -printk (KERN_INFO "MixCOM watchdog driver v%s, watchdog port at 0x%3x\n" , -VERSION , watchdog_port); +printk (KERN_INFO +"MixCOM watchdog driver v%s, watchdog port at 0x%3x\n" , +VERSION , watchdog_port);return 0 ;
@@ -309,15 +302,15 @@ error_misc_register_watchdog: static void __exit mixcomwd_exit(void) {if (!nowayout) { -if (mixcomwd_timer_alive) { +if (mixcomwd_timer_alive) { printk(KERN_WARNING PFX "I quit now, hardware will" " probably reboot!\n");del_timer_sync (&mixcomwd_timer); - mixcomwd_timer_alive=0 ; + mixcomwd_timer_alive =0 ; } }misc_deregister (&mixcomwd_miscdev); -release_region (watchdog_port,1 ); +release_region (watchdog_port,1 ); }module_init (mixcomwd_init);
PATCH 26/57 mpc watchdog: clean up and locking
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/mpc5200_wdt.c | 20 ++++++++++++-------- drivers/watchdog/mpc83xx_wdt.c | 19 ++++++++++--------- drivers/watchdog/mpc8xx_wdt.c | 37 +++++++++++++++++++------------------ 3 files changed, 41 insertions(+), 35 deletions(-)
drivers/watchdog/mpc5200_wdt.c +12 -8
@@ -4,8 +4,8 @@#include <linux/watchdog.h> #include <linux/io.h> #include <linux/spinlock.h> -#include <asm/of_platform.h> -#include <asm/uaccess.h> +#include <linux/of_platform.h> +#include <linux/uaccess.h> #include <asm/mpc52xx.h>
@@ -57,7 +57,8 @@ static int mpc5200_wdt_start(struct mpc5200_wdt *wdt)/* set timeout, with maximum prescaler */ out_be32 (&wdt->regs->count,0x0 | wdt->count);/* enable watchdog */ -out_be32 (&wdt->regs->mode,GPT_MODE_CE |GPT_MODE_WDT |GPT_MODE_MS_TIMER ); +out_be32 (&wdt->regs->mode,GPT_MODE_CE |GPT_MODE_WDT | +GPT_MODE_MS_TIMER );spin_unlock (&wdt->io_lock);return 0 ;
@@ -66,7 +67,8 @@ static int mpc5200_wdt_ping(struct mpc5200_wdt *wdt) {spin_lock (&wdt->io_lock);/* writing A5 to OCPW resets the watchdog */ -out_be32 (&wdt->regs->mode,0xA5000000 | (0xffffff &in_be32 (&wdt->regs->mode))); +out_be32 (&wdt->regs->mode,0xA5000000 | + (0xffffff &in_be32 (&wdt->regs->mode)));spin_unlock (&wdt->io_lock);return 0 ; }
@@ -92,8 +94,8 @@ static struct watchdog_info mpc5200_wdt_info = { .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING, .identity = "mpc5200 watchdog on GPT0", }; -static int mpc5200_wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long mpc5200_wdt_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {struct mpc5200_wdt *wdt = file->private_data;int __user *data = (int __user *)arg;
@@ -103,7 +105,7 @@ static int mpc5200_wdt_ioctl(struct inode *inode, struct file *file,switch (cmd) {case WDIOC_GETSUPPORT : ret =copy_to_user (data, &mpc5200_wdt_info, -sizeof (mpc5200_wdt_info)); +sizeof (mpc5200_wdt_info));if (ret) ret = -EFAULT ;break ;
@@ -135,6 +137,7 @@ static int mpc5200_wdt_ioctl(struct inode *inode, struct file *file, }return ret; } +static int mpc5200_wdt_open (struct inode *inode,struct file *file) {/* /dev/watchdog can only be opened once */
@@ -167,7 +170,8 @@ static const struct file_operations mpc5200_wdt_fops = { };/* module operations */ -static int mpc5200_wdt_probe (struct of_device *op,const struct of_device_id *match) +static int mpc5200_wdt_probe (struct of_device *op, +const struct of_device_id *match) {struct mpc5200_wdt *wdt;int err;
drivers/watchdog/mpc83xx_wdt.c +10 -9
@@ -22,8 +22,8 @@#include <linux/platform_device.h> #include <linux/module.h> #include <linux/watchdog.h> -#include <asm/io.h> -#include <asm/uaccess.h> +#include <linux/io.h> +#include <linux/uaccess.h> struct mpc83xx_wdt {__be32 res0;
@@ -42,11 +42,13 @@ static struct mpc83xx_wdt __iomem *wd_base;static u16 timeout =0xffff ;module_param (timeout, ushort,0 ); -MODULE_PARM_DESC (timeout,"Watchdog timeout in ticks. (0<timeout<65536, default=65535" ); +MODULE_PARM_DESC (timeout, +"Watchdog timeout in ticks. (0<timeout<65536, default=65535" );static int reset =1 ;module_param (reset, bool,0 ); -MODULE_PARM_DESC (reset,"Watchdog Interrupt/Reset Mode. 0 = interrupt, 1 = reset" ); +MODULE_PARM_DESC (reset, +"Watchdog Interrupt/Reset Mode. 0 = interrupt, 1 = reset" );/* * We always prescale, but if someone really doesn't want to they can set this
@@ -105,8 +107,8 @@ static int mpc83xx_wdt_release(struct inode *inode, struct file *file)return 0 ; } -static int mpc83xx_wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long mpc83xx_wdt_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {void __user *argp = (void __user *)arg;int __user *p = argp;
@@ -136,7 +138,7 @@ static const struct file_operations mpc83xx_wdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = mpc83xx_wdt_write, - .ioctl = mpc83xx_wdt_ioctl, + .unlocked_ioctl = mpc83xx_wdt_ioctl, .open = mpc83xx_wdt_open, .release = mpc83xx_wdt_release, };
@@ -161,8 +163,7 @@ static int __devinit mpc83xx_wdt_probe(struct platform_device *dev) goto err_out; } - wd_base =ioremap (r->start,sizeof (struct mpc83xx_wdt )); - + wd_base =ioremap (r->start,sizeof (struct mpc83xx_wdt ));if (wd_base ==NULL ) { ret = -ENOMEM ; goto err_out;
drivers/watchdog/mpc8xx_wdt.c +19 -18
@@ -16,36 +16,35 @@#include <linux/module.h> #include <linux/watchdog.h> #include <asm/8xx_immap.h> -#include <asm/uaccess.h> -#include <asm/io.h> +#include <linux/uaccess.h> +#include <linux/io.h> #include <syslib/m8xx_wdt.h> static unsigned long wdt_opened;static int wdt_status; +static spinlock_t wdt_lock;static void mpc8xx_wdt_handler_disable (void ) {volatile uint __iomem *piscr; - piscr = (uint *)&((immap_t *)IMAP_ADDR )->im_sit.sit_piscr; + piscr = (uint *)&((immap_t *)IMAP_ADDR )->im_sit.sit_piscr;if (!m8xx_has_internal_rtc)m8xx_wdt_stop_timer ();else out_be32 (piscr,in_be32 (piscr) & ~(PISCR_PIE |PISCR_PTE )); -printk (KERN_NOTICE "mpc8xx_wdt: keep-alive handler deactivated\n" ); }static void mpc8xx_wdt_handler_enable (void ) {volatile uint __iomem *piscr; - piscr = (uint *)&((immap_t *)IMAP_ADDR )->im_sit.sit_piscr; + piscr = (uint *)&((immap_t *)IMAP_ADDR )->im_sit.sit_piscr;if (!m8xx_has_internal_rtc)m8xx_wdt_install_timer ();else out_be32 (piscr,in_be32 (piscr) |PISCR_PIE |PISCR_PTE ); -printk (KERN_NOTICE "mpc8xx_wdt: keep-alive handler activated\n" ); }
@@ -53,37 +52,34 @@ static int mpc8xx_wdt_open(struct inode *inode, struct file *file) {if (test_and_set_bit (0 , &wdt_opened))return -EBUSY ; -m8xx_wdt_reset ();mpc8xx_wdt_handler_disable (); -return nonseekable_open (inode, file); }static int mpc8xx_wdt_release (struct inode *inode,struct file *file) {m8xx_wdt_reset (); -#if !defined(CONFIG_WATCHDOG_NOWAYOUT )mpc8xx_wdt_handler_enable ();#endif -clear_bit (0 , &wdt_opened); -return 0 ; } -static ssize_t mpc8xx_wdt_write (struct file *file,const char *data,size_t len, -loff_t * ppos) +static ssize_t mpc8xx_wdt_write (struct file *file,const char *data, +size_t len,loff_t *ppos) { -if (len) +if (len) { +spin_lock (&wdt_lock);m8xx_wdt_reset (); - +spin_unlock (&wdt_lock); + }return len; } -static int mpc8xx_wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long mpc8xx_wdt_ioctl (struct file *file, +unsigned int cmd,unsigned long arg) {int timeout;static struct watchdog_info info = {
@@ -112,15 +108,19 @@ static int mpc8xx_wdt_ioctl(struct inode *inode, struct file *file,return -EOPNOTSUPP ;case WDIOC_KEEPALIVE : +spin_lock (&wdt_lock);m8xx_wdt_reset (); wdt_status |=WDIOF_KEEPALIVEPING ; +spin_unlock (&wdt_lock);break ;case WDIOC_SETTIMEOUT :return -EOPNOTSUPP ;case WDIOC_GETTIMEOUT : +spin_lock (&wdt_lock); timeout =m8xx_wdt_get_timeout (); +spin_unlock (&wdt_lock);if (put_user (timeout, (int *)arg))return -EFAULT ;break ;
@@ -136,7 +136,7 @@ static const struct file_operations mpc8xx_wdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = mpc8xx_wdt_write, - .ioctl = mpc8xx_wdt_ioctl, + .unlocked_ioctl = mpc8xx_wdt_ioctl, .open = mpc8xx_wdt_open, .release = mpc8xx_wdt_release, };
@@ -149,6 +149,7 @@ static struct miscdevice mpc8xx_wdt_miscdev = {static int __init mpc8xx_wdt_init (void ) { +spin_lock_init (&wdt_lock);return misc_register (&mpc8xx_wdt_miscdev); }
PATCH 27/57 mpcore watchdog: unlocked_ioctl and BKl work
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/mpcore_wdt.c | 53 +++++++++++++++++++++++++---------------- 1 files changed, 32 insertions(+), 21 deletions(-)
drivers/watchdog/mpcore_wdt.c +32 -21
@@ -29,9 +29,9 @@#include <linux/init.h> #include <linux/interrupt.h> #include <linux/platform_device.h> +#include <linux/uaccess.h> #include <asm/hardware/arm_twd.h> -#include <asm/uaccess.h> struct mpcore_wdt {unsigned long timer_alive;
@@ -43,17 +43,20 @@ struct mpcore_wdt { };static struct platform_device *mpcore_wdt_dev; -extern unsigned int mpcore_timer_rate;#define TIMER_MARGIN 60static int mpcore_margin =TIMER_MARGIN ;module_param (mpcore_margin, int,0 ); -MODULE_PARM_DESC(mpcore_margin, "MPcore timer margin in seconds. (0<mpcore_margin<65536, default=" __MODULE_STRING(TIMER_MARGIN) ")"); +MODULE_PARM_DESC (mpcore_margin, + "MPcore timer margin in seconds. (0 < mpcore_margin < 65536, default=" + __MODULE_STRING(TIMER_MARGIN) ")");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) ")");#define ONLY_TESTING 0static int mpcore_noboot =ONLY_TESTING ;
@@ -70,14 +73,12 @@ static irqreturn_t mpcore_wdt_fire(int irq, void *arg)/* Check it really was our interrupt */ if (readl (wdt->base +TWD_WDOG_INTSTAT )) { -dev_printk (KERN_CRIT , wdt->dev,"Triggered - Reboot ignored.\n" ); - +dev_printk (KERN_CRIT , wdt->dev, +"Triggered - Reboot ignored.\n" );/* Clear the interrupt on the watchdog */ writel (1 , wdt->base +TWD_WDOG_INTSTAT ); -return IRQ_HANDLED ; } -return IRQ_NONE ; }
@@ -96,22 +97,26 @@ static void mpcore_wdt_keepalive(struct mpcore_wdt *wdt) count = (mpcore_timer_rate /256 ) * mpcore_margin;/* Reload the counter */ +spin_lock (&wdt_lock);writel (count + wdt->perturb, wdt->base +TWD_WDOG_LOAD ); - wdt->perturb = wdt->perturb ?0 :1 ; +spin_unlock (&wdt_lock); }static void mpcore_wdt_stop (struct mpcore_wdt *wdt) { +spin_lock (&wdt_lock);writel (0x12345678 , wdt->base +TWD_WDOG_DISABLE );writel (0x87654321 , wdt->base +TWD_WDOG_DISABLE );writel (0x0 , wdt->base +TWD_WDOG_CONTROL ); +spin_unlock (&wdt_lock); }static void mpcore_wdt_start (struct mpcore_wdt *wdt) {dev_printk (KERN_INFO , wdt->dev,"enabling watchdog.\n" ); +spin_lock (&wdt_lock);/* This loads the count register but does NOT start the count yet */ mpcore_wdt_keepalive (wdt);
@@ -122,6 +127,7 @@ static void mpcore_wdt_start(struct mpcore_wdt *wdt)/* Enable watchdog - prescale=256, watchdog mode=1, enable=1 */ writel (0x0000FF09 , wdt->base +TWD_WDOG_CONTROL ); } +spin_unlock (&wdt_lock); }static int mpcore_wdt_set_heartbeat (int t)
@@ -164,10 +170,11 @@ static int mpcore_wdt_release(struct inode *inode, struct file *file)* Shut off the timer. * Lock it in if it's a module and we set nowayout */ -if (wdt->expect_close ==42 ) { +if (wdt->expect_close ==42 )mpcore_wdt_stop (wdt); - }else { -dev_printk (KERN_CRIT , wdt->dev,"unexpected close, not stopping watchdog!\n" ); +else { +dev_printk (KERN_CRIT , wdt->dev, +"unexpected close, not stopping watchdog!\n" );mpcore_wdt_keepalive (wdt); }clear_bit (0 , &wdt->timer_alive);
@@ -175,7 +182,8 @@ static int mpcore_wdt_release(struct inode *inode, struct file *file)return 0 ; } -static ssize_t mpcore_wdt_write (struct file *file,const char *data,size_t len,loff_t *ppos) +static ssize_t mpcore_wdt_write (struct file *file,const char *data, +size_t len,loff_t *ppos) {struct mpcore_wdt *wdt = file->private_data;
@@ -210,8 +218,8 @@ static struct watchdog_info ident = { .identity = "MPcore Watchdog", }; -static int mpcore_wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long mpcore_wdt_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {struct mpcore_wdt *wdt = file->private_data;int ret;
@@ -301,7 +309,7 @@ static const struct file_operations mpcore_wdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = mpcore_wdt_write, - .ioctl = mpcore_wdt_ioctl, + .unlocked_ioctl = mpcore_wdt_ioctl, .open = mpcore_wdt_open, .release = mpcore_wdt_release, };
@@ -349,14 +357,17 @@ static int __devinit mpcore_wdt_probe(struct platform_device *dev) mpcore_wdt_miscdev.parent = &dev->dev; ret =misc_register (&mpcore_wdt_miscdev);if (ret) { -dev_printk (KERN_ERR , _dev,"cannot register miscdev on minor=%d (err=%d)\n" , -WATCHDOG_MINOR , ret); +dev_printk (KERN_ERR , _dev, +"cannot register miscdev on minor=%d (err=%d)\n" , +WATCHDOG_MINOR , ret); goto err_misc; } - ret =request_irq (wdt->irq, mpcore_wdt_fire,IRQF_DISABLED ,"mpcore_wdt" , wdt); + ret =request_irq (wdt->irq, mpcore_wdt_fire,IRQF_DISABLED , +"mpcore_wdt" , wdt);if (ret) { -dev_printk (KERN_ERR , _dev,"cannot register IRQ%d for watchdog\n" , wdt->irq); +dev_printk (KERN_ERR , _dev, +"cannot register IRQ%d for watchdog\n" , wdt->irq); goto err_irq; }
@@ -415,7 +426,7 @@ static int __init mpcore_wdt_init(void)*/ if (mpcore_wdt_set_heartbeat (mpcore_margin)) {mpcore_wdt_set_heartbeat (TIMER_MARGIN ); -printk (KERN_INFO "mpcore_margin value must be 0<mpcore_margin<65536, using %d\n" , +printk (KERN_INFO "mpcore_margin value must be 0 < mpcore_margin < 65536, using %d\n" ,TIMER_MARGIN ); }
PATCH 28/57 mtx-1_wdt: clean up, coding style, unlocked ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/mtx-1_wdt.c | 107 ++++++++++++++++++++---------------------- 1 files changed, 52 insertions(+), 55 deletions(-)
drivers/watchdog/mtx-1_wdt.c +52 -55
@@ -1,7 +1,8 @@/* * Driver for the MTX-1 Watchdog. * -* (C) Copyright 2005 4G Systems <[email protected]>, All Rights Reserved. +* (C) Copyright 2005 4G Systems <[email protected]>, +* All Rights Reserved. * http://www.4g-systems.biz * * (C) Copyright 2007 OpenWrt.org, Florian Fainelli <[email protected]>
@@ -46,12 +47,11 @@#include <linux/jiffies.h> #include <linux/watchdog.h> #include <linux/platform_device.h> - -#include <asm/io.h> -#include <asm/uaccess.h> +#include <linux/io.h> +#include <linux/uaccess.h> +#include <linux/gpio.h> #include <asm/mach-au1x00/au1000.h> -#include <asm/gpio.h> #define MTX1_WDT_INTERVAL (5 * HZ)
@@ -59,6 +59,7 @@ static int ticks = 100 * HZ; static struct { struct completion stop; + spinlock_t lock; int running; struct timer_list timer; int queue;
@@ -71,6 +72,7 @@ static void mtx1_wdt_trigger(unsigned long unused) {u32 tmp; +spin_lock (&mtx1_wdt_device.lock);if (mtx1_wdt_device.running) ticks--;/*
@@ -79,13 +81,13 @@ static void mtx1_wdt_trigger(unsigned long unused) tmp =au_readl (GPIO2_DIR ); tmp = (tmp & ~(1 << mtx1_wdt_device.gpio)) | ((~tmp) & (1 << mtx1_wdt_device.gpio)); -au_writel (tmp,GPIO2_DIR ); +au_writel (tmp,GPIO2_DIR );if (mtx1_wdt_device.queue && ticks)mod_timer (&mtx1_wdt_device.timer, jiffies +MTX1_WDT_INTERVAL ); -else { +else complete (&mtx1_wdt_device.stop); - } +spin_unlock (&mtx1_wdt_device.lock); }static void mtx1_wdt_reset (void )
@@ -96,23 +98,25 @@ static void mtx1_wdt_reset(void)static void mtx1_wdt_start (void ) { +spin_lock_irqsave (&mtx1_wdt_device.lock, flags);if (!mtx1_wdt_device.queue) { mtx1_wdt_device.queue =1 ;gpio_set_value (mtx1_wdt_device.gpio,1 );mod_timer (&mtx1_wdt_device.timer, jiffies +MTX1_WDT_INTERVAL ); } mtx1_wdt_device.running++; +spin_unlock_irqrestore (&mtx1_wdt_device.lock, flags); }static int mtx1_wdt_stop (void ) { +spin_lock_irqsave (&mtx1_wdt_device.lock, flags);if (mtx1_wdt_device.queue) { mtx1_wdt_device.queue =0 ;gpio_set_value (mtx1_wdt_device.gpio,0 ); } - ticks = mtx1_wdt_device.default_ticks; - +spin_unlock_irqrestore (&mtx1_wdt_device.lock, flags);return 0 ; }
@@ -122,7 +126,6 @@ static int mtx1_wdt_open(struct inode *inode, struct file *file) {if (test_and_set_bit (0 , &mtx1_wdt_device.inuse))return -EBUSY ; -return nonseekable_open (inode, file); }
@@ -133,54 +136,51 @@ static int mtx1_wdt_release(struct inode *inode, struct file *file)return 0 ; } -static int mtx1_wdt_ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg) +static long mtx1_wdt_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {void __user *argp = (void __user *)arg; +int __user *p = (int __user *)argp;unsigned int value; -static struct watchdog_info ident = - { +static const struct watchdog_info ident = { .options =WDIOF_CARDRESET , .identity ="MTX-1 WDT" , }; -switch (cmd) { -case WDIOC_KEEPALIVE : -mtx1_wdt_reset (); -break ; -case WDIOC_GETSTATUS : -case WDIOC_GETBOOTSTATUS : -if (copy_to_user (argp, &value,sizeof (int )) ) -return -EFAULT ; -break ; -case WDIOC_GETSUPPORT : -if (copy_to_user (argp, &ident,sizeof (ident)) ) -return -EFAULT ; -break ; -case WDIOC_SETOPTIONS : -if (copy_from_user (&value, argp,sizeof (int )) ) -return -EFAULT ; -switch (value) { -case WDIOS_ENABLECARD : -mtx1_wdt_start (); -break ; -case WDIOS_DISABLECARD : -return mtx1_wdt_stop (); -default : -return -EINVAL ; - } -break ; -default : -return -ENOTTY ; +switch (cmd) { +case WDIOC_KEEPALIVE : +mtx1_wdt_reset (); +break ; +case WDIOC_GETSTATUS : +case WDIOC_GETBOOTSTATUS : +put_user (0 , p); +break ; +case WDIOC_GETSUPPORT : +if (copy_to_user (argp, &ident,sizeof (ident))) +return -EFAULT ; +break ; +case WDIOC_SETOPTIONS : +if (get_user (value, p)) +return -EFAULT ; +if (value &WDIOS_ENABLECARD ) +mtx1_wdt_start (); +else if (value &WDIOS_DISABLECARD ) +mtx1_wdt_stop (); +else +return -EINVAL ; +return 0 ; +default : +return -ENOTTY ; }return 0 ; } -static ssize_t mtx1_wdt_write (struct file *file,const char *buf,size_t count,loff_t *ppos) +static ssize_t mtx1_wdt_write (struct file *file,const char *buf, +size_t count,loff_t *ppos) {if (!count)return -EIO ; -mtx1_wdt_reset ();return count; }
@@ -188,7 +188,7 @@ static ssize_t mtx1_wdt_write(struct file *file, const char *buf, size_t count,static const struct file_operations mtx1_wdt_fops = { .owner =THIS_MODULE , .llseek = no_llseek, - .ioctl = mtx1_wdt_ioctl, + .unlocked_ioctl = mtx1_wdt_ioctl, .open = mtx1_wdt_open, .write = mtx1_wdt_write, .release = mtx1_wdt_release
@@ -208,29 +208,26 @@ static int mtx1_wdt_probe(struct platform_device *pdev) mtx1_wdt_device.gpio = pdev->resource[0 ].start; -if ((ret =misc_register (&mtx1_wdt_misc)) <0 ) { -printk (KERN_ERR " mtx-1_wdt : failed to register\n" ); -return ret; - } - +spin_lock_init (&mtx1_wdt_device.lock);init_completion (&mtx1_wdt_device.stop); mtx1_wdt_device.queue =0 ; -clear_bit (0 , &mtx1_wdt_device.inuse); -setup_timer (&mtx1_wdt_device.timer, mtx1_wdt_trigger,0L ); - mtx1_wdt_device.default_ticks = ticks; + ret =misc_register (&mtx1_wdt_misc); +if (ret <0 ) { +printk (KERN_ERR " mtx-1_wdt : failed to register\n" ); +return ret; + }mtx1_wdt_start (); -printk (KERN_INFO "MTX-1 Watchdog driver\n" ); -return 0 ; }static int mtx1_wdt_remove (struct platform_device *pdev) { +/* FIXME: do we need to lock this test ? */ if (mtx1_wdt_device.queue) { mtx1_wdt_device.queue =0 ;wait_for_completion (&mtx1_wdt_device.stop);
Re: [PATCH 28/57] mtx-1_wdt: clean up, coding style, unlocked ioctl
Hi Alan,
Le Monday 19 May 2008 15:07:21 Alan Cox, vous avez écrit :
Quoted 1 line
From: Alan Cox <[email protected]>
Thanks for doing this.
PATCH 29/57 mv64x60_wdt: clean up and locking checks
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/mv64x60_wdt.c | 20 +++++++++++--------- 1 files changed, 11 insertions(+), 9 deletions(-)
drivers/watchdog/mv64x60_wdt.c +11 -9
@@ -8,7 +8,7 @@* and services the watchdog. * * Derived from mpc8xx_wdt.c, with the following copyright. -* +* * 2002 (c) Florian Schirmer <[email protected]> This file is licensed under * the terms of the GNU General Public License version 2. This program * is licensed "as is" without any warranty of any kind, whether express
@@ -24,8 +24,8 @@#include <linux/platform_device.h> #include <linux/mv643xx.h> -#include <asm/uaccess.h> -#include <asm/io.h> +#include <linux/uaccess.h> +#include <linux/io.h> #define MV64x60_WDT_WDC_OFFSET 0
@@ -61,7 +61,9 @@ static DEFINE_SPINLOCK(mv64x60_wdt_spinlock);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) ")");static int mv64x60_wdt_toggle_wdc (int enabled_predicate,int field_shift) {
@@ -150,7 +152,7 @@ static int mv64x60_wdt_release(struct inode *inode, struct file *file) }static ssize_t mv64x60_wdt_write (struct file *file,const char __user *data, -size_t len,loff_t * ppos) +size_t len,loff_t *ppos) {if (len) {if (!nowayout) {
@@ -160,7 +162,7 @@ static ssize_t mv64x60_wdt_write(struct file *file, const char __user *data,for (i =0 ; i != len; i++) {char c; -if (get_user (c, data + i)) +if (get_user (c, data + i))return -EFAULT ;if (c =='V' ) expect_close =42 ;
@@ -172,8 +174,8 @@ static ssize_t mv64x60_wdt_write(struct file *file, const char __user *data,return len; } -static int mv64x60_wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long mv64x60_wdt_ioctl (struct file *file, +unsigned int cmd,unsigned long arg) {int timeout;int options;
@@ -240,7 +242,7 @@ static const struct file_operations mv64x60_wdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = mv64x60_wdt_write, - .ioctl = mv64x60_wdt_ioctl, + .unlocked_ioctl = mv64x60_wdt_ioctl, .open = mv64x60_wdt_open, .release = mv64x60_wdt_release, };
PATCH 30/57 omap_wdt: locking, unlocked_ioctl, tidy
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/omap_wdt.c | 35 +++++++++++++++++++++-------------- 1 files changed, 21 insertions(+), 14 deletions(-)
drivers/watchdog/omap_wdt.c +21 -14
@@ -41,9 +41,9 @@#include <linux/clk.h> #include <linux/bitops.h> -#include <asm/io.h> -#include <asm/uaccess.h> -#include <asm/hardware.h> +#include </io.h> +#include <linux/uaccess.h> +#include <linux/hardware.h> #include <asm/arch/prcm.h>
@@ -54,11 +54,12 @@ module_param(timer_margin, uint, 0);MODULE_PARM_DESC (timer_margin,"initial watchdog timeout (in seconds)" );static int omap_wdt_users; -static struct clk *armwdt_ck =NULL ; -static struct clk *mpu_wdt_ick =NULL ; -static struct clk *mpu_wdt_fck =NULL ; +static struct clk *armwdt_ck; +static struct clk *mpu_wdt_ick; +static struct clk *mpu_wdt_fck;static unsigned int wdt_trgr_pattern =0x1234 ; +static spinlock_t wdt_lock;static void omap_wdt_ping (void ) {
@@ -174,22 +175,23 @@ static int omap_wdt_release(struct inode *inode, struct file *file)return 0 ; } -static ssize_t -omap_wdt_write (struct file *file,const char __user *data, +static ssize_t omap_wdt_write (struct file *file,const char __user *data,size_t len,loff_t *ppos) {/* Refresh LOAD_TIME. */ -if (len) +if (len) { +spin_lock (&wdt_lock);omap_wdt_ping (); +spin_unlock (&wdt_lock); + }return len; } -static int -omap_wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long omap_wdt_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {int new_margin; -static struct watchdog_info ident = { +static const struct watchdog_info ident = { .identity ="OMAP Watchdog" , .options =WDIOF_SETTIMEOUT , .firmware_version =0 ,
@@ -211,18 +213,22 @@ omap_wdt_ioctl(struct inode *inode, struct file *file,return put_user (omap_prcm_get_reset_sources (), (int __user *)arg);case WDIOC_KEEPALIVE : +spin_lock (&wdt_lock);omap_wdt_ping (); +spin_unlock (&wdt_lock);return 0 ;case WDIOC_SETTIMEOUT :if (get_user (new_margin, (int __user *)arg))return -EFAULT ;omap_wdt_adjust_timeout (new_margin); +spin_lock (&wdt_lock);omap_wdt_disable ();omap_wdt_set_timeout ();omap_wdt_enable ();omap_wdt_ping (); +spin_unlock (&wdt_lock);/* Fall */ case WDIOC_GETTIMEOUT :return put_user (timer_margin, (int __user *)arg);
@@ -232,7 +238,7 @@ omap_wdt_ioctl(struct inode *inode, struct file *file,static const struct file_operations omap_wdt_fops = { .owner =THIS_MODULE , .write = omap_wdt_write, - .ioctl = omap_wdt_ioctl, + .unlocked_ioctl = omap_wdt_ioctl, .open = omap_wdt_open, .release = omap_wdt_release, };
@@ -373,6 +379,7 @@ static struct platform_driver omap_wdt_driver = {static int __init omap_wdt_init (void ) { +spin_lock_init (&wdt_lock);return platform_driver_register (&omap_wdt_driver); }
PATCH 31/57 pc87413_wdt: clean up, coding style, unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/pc87413_wdt.c | 211 ++++++++++++++++------------------------ 1 files changed, 87 insertions(+), 124 deletions(-)
drivers/watchdog/pc87413_wdt.c +87 -124
@@ -31,9 +31,9 @@#include <linux/spinlock.h> #include <linux/moduleparam.h> #include <linux/version.h> +#include <linux/io.h> +#include <linux/uaccess.h> -#include <asm/io.h> -#include <asm/uaccess.h> #include <asm/system.h> /* #define DEBUG 1 */
@@ -56,12 +56,12 @@static int io =0x2E ;/* Address used on Portwell Boards */ -static int timeout =DEFAULT_TIMEOUT ;/* timeout value */ -static unsigned long timer_enabled =0 ;/* is the timer enabled? */ +static int timeout =DEFAULT_TIMEOUT ;/* timeout value */ +static unsigned long timer_enabled;/* is the timer enabled? */ -static char expect_close;/* is the close expected? */ +static char expect_close;/* is the close expected? */ -static DEFINE_SPINLOCK (io_lock);/* to guard the watchdog from io races */ +static DEFINE_SPINLOCK (io_lock);/* to guard us from io races */ static int nowayout =WATCHDOG_NOWAYOUT ;
@@ -69,7 +69,7 @@ static int nowayout = WATCHDOG_NOWAYOUT;/* Select pins for Watchdog output */ -static inline void pc87413_select_wdt_out (void ) +static inline void pc87413_select_wdt_out (void ) {unsigned int cr_data =0 ;
@@ -77,7 +77,7 @@ static inline void pc87413_select_wdt_out (void)outb_p (SIOCFG2 ,WDT_INDEX_IO_PORT ); - cr_data =inb (WDT_DATA_IO_PORT ); + cr_data =inb (WDT_DATA_IO_PORT ); cr_data |=0x80 ;/* Set Bit7 to 1*/ outb_p (SIOCFG2 ,WDT_INDEX_IO_PORT );
@@ -85,8 +85,9 @@ static inline void pc87413_select_wdt_out (void)outb_p (cr_data,WDT_DATA_IO_PORT );#ifdef DEBUG - printk(KERN_INFO DPFX "Select multiple pin,pin55,as WDT output:" - " Bit7 to 1: %d\n", cr_data); + printk(KERN_INFO DPFX +"Select multiple pin,pin55,as WDT output: Bit7 to 1: %d\n" , + cr_data);#endif }
@@ -94,7 +95,7 @@ static inline void pc87413_select_wdt_out (void)static inline void pc87413_enable_swc (void ) { -unsigned int cr_data=0 ; +unsigned int cr_data =0 ;/* Step 2: Enable SWC functions */
@@ -129,12 +130,11 @@ static inline unsigned int pc87413_get_swc_base(void) addr_l =inb (WDT_DATA_IO_PORT ); swc_base_addr = (addr_h <<8 ) + addr_l; -#ifdef DEBUG - printk(KERN_INFO DPFX "Read SWC I/O Base Address: low %d, high %d," - " res %d\n", addr_l, addr_h, swc_base_addr); + printk(KERN_INFO DPFX +"Read SWC I/O Base Address: low %d, high %d, res %d\n" , + addr_l, addr_h, swc_base_addr);#endif -return swc_base_addr; }
@@ -143,9 +143,7 @@ static inline unsigned int pc87413_get_swc_base(void)static inline void pc87413_swc_bank3 (unsigned int swc_base_addr) {/* Step 4: Select Bank3 of SWC */ -outb_p (inb (swc_base_addr +0x0f ) |0x03 , swc_base_addr +0x0f ); -#ifdef DEBUG printk(KERN_INFO DPFX "Select Bank3 of SWC\n");#endif
@@ -157,9 +155,7 @@ static inline void pc87413_programm_wdto(unsigned int swc_base_addr, char pc87413_time) {/* Step 5: Programm WDTO, Twd. */ -outb_p (pc87413_time, swc_base_addr +WDTO ); -#ifdef DEBUG printk(KERN_INFO DPFX "Set WDTO to %d minutes\n", pc87413_time);#endif
@@ -170,9 +166,7 @@ static inline void pc87413_programm_wdto(unsigned int swc_base_addr,static inline void pc87413_enable_wden (unsigned int swc_base_addr) {/* Step 6: Enable WDEN */ - -outb_p (inb (swc_base_addr +WDCTL ) |0x01 , swc_base_addr +WDCTL ); - +outb_p (inb (swc_base_addr +WDCTL ) |0x01 , swc_base_addr +WDCTL );#ifdef DEBUG printk(KERN_INFO DPFX "Enable WDEN\n");#endif
@@ -182,9 +176,7 @@ static inline void pc87413_enable_wden(unsigned int swc_base_addr)static inline void pc87413_enable_sw_wd_tren (unsigned int swc_base_addr) {/* Enable SW_WD_TREN */ - -outb_p (inb (swc_base_addr +WDCFG ) |0x80 , swc_base_addr +WDCFG ); - +outb_p (inb (swc_base_addr +WDCFG ) |0x80 , swc_base_addr +WDCFG );#ifdef DEBUG printk(KERN_INFO DPFX "Enable SW_WD_TREN\n");#endif
@@ -195,9 +187,7 @@ static inline void pc87413_enable_sw_wd_tren(unsigned int swc_base_addr)static inline void pc87413_disable_sw_wd_tren (unsigned int swc_base_addr) {/* Disable SW_WD_TREN */ - -outb_p (inb (swc_base_addr +WDCFG ) &0x7f , swc_base_addr +WDCFG ); - +outb_p (inb (swc_base_addr +WDCFG ) &0x7f , swc_base_addr +WDCFG );#ifdef DEBUG printk(KERN_INFO DPFX "pc87413 - Disable SW_WD_TREN\n");#endif
@@ -208,9 +198,7 @@ static inline void pc87413_disable_sw_wd_tren(unsigned int swc_base_addr)static inline void pc87413_enable_sw_wd_trg (unsigned int swc_base_addr) {/* Enable SW_WD_TRG */ - -outb_p (inb (swc_base_addr +WDCTL ) |0x80 , swc_base_addr +WDCTL ); - +outb_p (inb (swc_base_addr +WDCTL ) |0x80 , swc_base_addr +WDCTL );#ifdef DEBUG printk(KERN_INFO DPFX "pc87413 - Enable SW_WD_TRG\n");#endif
@@ -221,9 +209,7 @@ static inline void pc87413_enable_sw_wd_trg(unsigned int swc_base_addr)static inline void pc87413_disable_sw_wd_trg (unsigned int swc_base_addr) {/* Disable SW_WD_TRG */ - -outb_p (inb (swc_base_addr +WDCTL ) &0x7f , swc_base_addr +WDCTL ); - +outb_p (inb (swc_base_addr +WDCTL ) &0x7f , swc_base_addr +WDCTL );#ifdef DEBUG printk(KERN_INFO DPFX "Disable SW_WD_TRG\n");#endif
@@ -314,8 +300,8 @@ static int pc87413_open(struct inode *inode, struct file *file)/* Reload and activate timer */ pc87413_refresh (); - printk(KERN_INFO MODNAME "Watchdog enabled. Timeout set to" - " %d minute(s).\n", timeout); + printk(KERN_INFO MODNAME + "Watchdog enabled. Timeout set to %d minute(s).\n", timeout);return nonseekable_open (inode, file); }
@@ -338,17 +324,15 @@ static int pc87413_release(struct inode *inode, struct file *file)if (expect_close ==42 ) {pc87413_disable (); - printk(KERN_INFO MODNAME "Watchdog disabled," - " sleeping again...\n"); + printk(KERN_INFO MODNAME + "Watchdog disabled, sleeping again...\n"); }else { - printk(KERN_CRIT MODNAME "Unexpected close, not stopping" - " watchdog!\n"); + printk(KERN_CRIT MODNAME + "Unexpected close, not stopping watchdog!\n");pc87413_refresh (); } -clear_bit (0 , &timer_enabled); expect_close =0 ; -return 0 ; }
@@ -386,7 +370,8 @@ static ssize_t pc87413_write(struct file *file, const char __user *data,/* reset expect flag */ expect_close =0 ; -/* scan to see whether or not we got the magic character */ +/* scan to see whether or not we got the +magic character */ for (i =0 ; i != len; i++) {char c;if (get_user (c, data+i))
@@ -404,7 +389,6 @@ static ssize_t pc87413_write(struct file *file, const char __user *data,/** * pc87413_ioctl: -* @inode: inode of the device * @file: file handle to the device * @cmd: watchdog command * @arg: argument pointer
@@ -414,8 +398,8 @@ static ssize_t pc87413_write(struct file *file, const char __user *data,* querying capabilities and current status. */ -static int pc87413_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long pc87413_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {int new_timeout;
@@ -426,75 +410,58 @@ static int pc87413_ioctl(struct inode *inode, struct file *file,static struct watchdog_info ident = { .options =WDIOF_KEEPALIVEPING | -WDIOF_SETTIMEOUT | -WDIOF_MAGICCLOSE , +WDIOF_SETTIMEOUT | +WDIOF_MAGICCLOSE , .firmware_version =1 , .identity ="PC87413(HF/F) watchdog" }; uarg.i = (int __user *)arg; -switch (cmd) { -default : -return -ENOTTY ; - -case WDIOC_GETSUPPORT : -return copy_to_user (uarg.ident, &ident, -sizeof (ident)) ? -EFAULT :0 ; - -case WDIOC_GETSTATUS : -return put_user (pc87413_status (), uarg.i); - -case WDIOC_GETBOOTSTATUS : -return put_user (0 , uarg.i); - -case WDIOC_KEEPALIVE : -pc87413_refresh (); +switch (cmd) { +case WDIOC_GETSUPPORT : +return copy_to_user (uarg.ident, &ident, +sizeof (ident)) ? -EFAULT :0 ; +case WDIOC_GETSTATUS : +return put_user (pc87413_status (), uarg.i); +case WDIOC_GETBOOTSTATUS : +return put_user (0 , uarg.i); +case WDIOC_KEEPALIVE : +pc87413_refresh ();#ifdef DEBUG - printk(KERN_INFO DPFX "keepalive\n"); + printk(KERN_INFO DPFX "keepalive\n");#endif -return 0 ; - -case WDIOC_SETTIMEOUT : -if (get_user (new_timeout, uarg.i)) -return -EFAULT ; - -// the API states this is given in secs - new_timeout /=60 ; - -if (new_timeout <0 || new_timeout >MAX_TIMEOUT ) -return -EINVAL ; - - timeout = new_timeout; -pc87413_refresh (); - -// fall through and return the new timeout... - -case WDIOC_GETTIMEOUT : - - new_timeout = timeout *60 ; - -return put_user (new_timeout, uarg.i); - -case WDIOC_SETOPTIONS : - { -int options, retval = -EINVAL ; - -if (get_user (options, uarg.i)) -return -EFAULT ; - -if (options &WDIOS_DISABLECARD ) { -pc87413_disable (); - retval =0 ; - } - -if (options &WDIOS_ENABLECARD ) { -pc87413_enable (); - retval =0 ; - } - -return retval; +return 0 ; +case WDIOC_SETTIMEOUT : +if (get_user (new_timeout, uarg.i)) +return -EFAULT ; +/* the API states this is given in secs */ + new_timeout /=60 ; +if (new_timeout <0 || new_timeout >MAX_TIMEOUT ) +return -EINVAL ; + timeout = new_timeout; +pc87413_refresh (); +/* fall through and return the new timeout... */ +case WDIOC_GETTIMEOUT : + new_timeout = timeout *60 ; +return put_user (new_timeout, uarg.i); +case WDIOC_SETOPTIONS : + { +int options, retval = -EINVAL ; +if (get_user (options, uarg.i)) +return -EFAULT ; +if (options &WDIOS_DISABLECARD ) { +pc87413_disable (); + retval =0 ; } +if (options &WDIOS_ENABLECARD ) { +pc87413_enable (); + retval =0 ; + } +return retval; + } +default : +return -ENOTTY ; } }
@@ -517,10 +484,8 @@ static int pc87413_notify_sys(struct notifier_block *this, void *unused) {if (code ==SYS_DOWN || code ==SYS_HALT ) - {/* Turn the card off */ pc87413_disable (); - }return NOTIFY_DONE ; }
@@ -530,18 +495,16 @@ static const struct file_operations pc87413_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = pc87413_write, - .ioctl = pc87413_ioctl, + .unlocked_ioctl = pc87413_ioctl, .open = pc87413_open, .release = pc87413_release, }; -static struct notifier_block pc87413_notifier = -{ +static struct notifier_block pc87413_notifier = { .notifier_call = pc87413_notify_sys, }; -static struct miscdevice pc87413_miscdev= -{ +static struct miscdevice pc87413_miscdev = { .minor =WATCHDOG_MINOR , .name ="watchdog" , .fops = &pc87413_fops
@@ -561,29 +524,26 @@ static int __init pc87413_init(void) {int ret; - printk(KERN_INFO PFX "Version " VERSION " at io 0x%X\n", WDT_INDEX_IO_PORT); + printk(KERN_INFO PFX "Version " VERSION " at io 0x%X\n", + WDT_INDEX_IO_PORT);/* request_region(io, 2, "pc87413"); */ ret =register_reboot_notifier (&pc87413_notifier);if (ret !=0 ) { - printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", - ret); + printk(KERN_ERR PFX + "cannot register reboot notifier (err=%d)\n", ret); } ret =misc_register (&pc87413_miscdev); -if (ret !=0 ) { printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", WATCHDOG_MINOR, ret);unregister_reboot_notifier (&pc87413_notifier);return ret; } - printk(KERN_INFO PFX "initialized. timeout=%d min \n", timeout); -pc87413_enable (); -return 0 ; }
@@ -600,8 +560,7 @@ static int __init pc87413_init(void) static void __exit pc87413_exit(void) {/* Stop the timer before we leave */ -if (!nowayout) - { +if (!nowayout) {pc87413_disable (); printk(KERN_INFO MODNAME "Watchdog disabled.\n"); }
@@ -626,8 +585,12 @@ module_param(io, int, 0); MODULE_PARM_DESC(io, MODNAME " I/O port (default: " __MODULE_STRING(io) ").");module_param (timeout, int,0 ); -MODULE_PARM_DESC(timeout, "Watchdog timeout in minutes (default=" __MODULE_STRING(timeout) ")."); +MODULE_PARM_DESC (timeout, + "Watchdog timeout in minutes (default=" + __MODULE_STRING(timeout) ").");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) ")");
PATCH 32/57 pcwd: clean up, unlocked_ioctl usage
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/pcwd.c | 179 ++++++++++++++++++++++++++--------------------- 1 files changed, 100 insertions(+), 79 deletions(-)
drivers/watchdog/pcwd.c +100 -79
@@ -40,13 +40,15 @@* fairly useless proc entry. * 990610 removed said useless proc code for the merge <alan> * 000403 Removed last traces of proc code. <davej> -* 011214 Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT <[email protected]> +* 011214 Added nowayout module option to override +* CONFIG_WATCHDOG_NOWAYOUT <[email protected]> * Added timeout module option to override default */ /* * A bells and whistles driver is available from http://www.pcwd.de/ -* More info available at http://www.berkprod.com/ or http://www.pcwatchdog.com/ +* More info available at http://www.berkprod.com/ or +* http://www.pcwatchdog.com/ */ #include <linux/module.h> /* For module specific items */
@@ -65,9 +67,8 @@#include <linux/isa.h> /* For isa devices */ #include <linux/ioport.h> /* For io-port access */ #include <linux/spinlock.h> /* For spin_lock/spin_unlock/... */ - -#include <asm/uaccess.h> /* For copy_to_user/put_user/... */ -#include <asm/io.h> /* For inb/outb/... */ +#include <linux/uaccess.h> /* For copy_to_user/put_user/... */ +#include <linux/io.h> /* For inb/outb/... */ /* Module and version information */ #define WATCHDOG_VERSION "1.20"
@@ -111,14 +112,16 @@ static int pcwd_ioports[] = { 0x270, 0x350, 0x370, 0x000 };#define WD_REVC_WTRP 0x01/* Watchdog Trip status */ #define WD_REVC_HRBT 0x02/* Watchdog Heartbeat */ #define WD_REVC_TTRP 0x04/* Temperature Trip status */ -#define WD_REVC_RL2A 0x08/* Relay 2 activated by on-board processor */ +#define WD_REVC_RL2A 0x08/* Relay 2 activated by +on-board processor */ #define WD_REVC_RL1A 0x10/* Relay 1 active */ #define WD_REVC_R2DS 0x40/* Relay 2 disable */ #define WD_REVC_RLY2 0x80/* Relay 2 activated? */ /* Port 2 : Control Status #2 */ #define WD_WDIS 0x10/* Watchdog Disabled */ #define WD_ENTP 0x20/* Watchdog Enable Temperature Trip */ -#define WD_SSEL 0x40/* Watchdog Switch Select (1:SW1 <-> 0:SW2) */ +#define WD_SSEL 0x40/* Watchdog Switch Select +(1:SW1 <-> 0:SW2) */ #define WD_WCMD 0x80/* Watchdog Command Mode */ /* max. time we give an ISA watchdog card to process a command */
@@ -168,11 +171,15 @@ static int cards_found;static atomic_t open_allowed =ATOMIC_INIT (1 );static char expect_close;static int temp_panic; -static struct { /* this is private data for each ISA-PC watchdog card */ + +/* this is private data for each ISA-PC watchdog card */ +static struct { char fw_ver_str[6]; /* The cards firmware version */ int revision; /* The card's revision */ - int supports_temp; /* Wether or not the card has a temperature device */ - int command_mode; /* Wether or not the card is in command mode */ + int supports_temp; /* Whether or not the card has + a temperature device */ + int command_mode; /* Whether or not the card is in + command mode */ int boot_status; /* The card's boot status */ int io_addr; /* The cards I/O address */ spinlock_t io_lock; /* the lock for io operations */
@@ -186,16 +193,20 @@ static struct { /* this is private data for each ISA-PC watchdog card */#define DEBUG 2/* print fancy stuff too */ static int debug =QUIET ;module_param (debug, int,0 ); -MODULE_PARM_DESC (debug,"Debug level: 0=Quiet, 1=Verbose, 2=Debug (default=0)" ); +MODULE_PARM_DESC (debug, +"Debug level: 0=Quiet, 1=Verbose, 2=Debug (default=0)" ); -#define WATCHDOG_HEARTBEAT 0/* default heartbeat = delay-time from dip-switches */ +/* default heartbeat = delay-time from dip-switches */ +#define WATCHDOG_HEARTBEAT 0static int heartbeat =WATCHDOG_HEARTBEAT ;module_param (heartbeat, int,0 ); -MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (2<=heartbeat<=7200 or 0=delay-time from dip-switches, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")"); +MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (2 <= heartbeat <= 7200 or 0=delay-time from dip-switches, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")");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) ")");/* * Internal functions
@@ -224,7 +235,7 @@ static int send_isa_command(int cmd)if (port0 == last_port0)break ;/* Data is stable */ -udelay (250 ); +udelay (250 ); }if (debug >=DEBUG )
@@ -236,7 +247,7 @@ static int send_isa_command(int cmd)static int set_command_mode (void ) { -int i, found=0 , count=0 ; +int i, found =0 , count =0 ;/* Set the card into command mode */ spin_lock (&pcwd_private.io_lock);
@@ -296,7 +307,8 @@ static inline void pcwd_get_firmware(void) ten =send_isa_command (CMD_ISA_VERSION_TENTH ); hund =send_isa_command (CMD_ISA_VERSION_HUNDRETH ); minor =send_isa_command (CMD_ISA_VERSION_MINOR ); -sprintf (pcwd_private.fw_ver_str,"%c.%c%c%c" , one, ten, hund, minor); +sprintf (pcwd_private.fw_ver_str,"%c.%c%c%c" , + one, ten, hund, minor); }unset_command_mode ();
@@ -305,7 +317,7 @@ static inline void pcwd_get_firmware(void)static inline int pcwd_get_option_switches (void ) { -int option_switches=0 ; +int option_switches =0 ;if (set_command_mode ()) {/* Get switch settings */
@@ -322,7 +334,9 @@ static void pcwd_show_card_info(void)/* Get some extra info from the hardware (in command/debug/diag mode) */ if (pcwd_private.revision ==PCWD_REVISION_A ) - printk(KERN_INFO PFX "ISA-PC Watchdog (REV.A) detected at port 0x%04x\n", pcwd_private.io_addr); + printk(KERN_INFO PFX +"ISA-PC Watchdog (REV.A) detected at port 0x%04x\n" , + pcwd_private.io_addr);else if (pcwd_private.revision ==PCWD_REVISION_C ) {pcwd_get_firmware (); printk(KERN_INFO PFX "ISA-PC Watchdog (REV.C) detected at port 0x%04x (Firmware version: %s)\n",
@@ -347,12 +361,15 @@ static void pcwd_show_card_info(void) printk(KERN_INFO PFX "Previous reboot was caused by the card\n");if (pcwd_private.boot_status &WDIOF_OVERHEAT ) { - printk(KERN_EMERG PFX "Card senses a CPU Overheat. Panicking!\n"); - printk(KERN_EMERG PFX "CPU Overheat\n"); + printk(KERN_EMERG PFX + "Card senses a CPU Overheat. Panicking!\n"); + printk(KERN_EMERG PFX + "CPU Overheat\n"); }if (pcwd_private.boot_status ==0 ) - printk(KERN_INFO PFX "No previous trip detected - Cold boot or reset\n"); + printk(KERN_INFO PFX +"No previous trip detected - Cold boot or reset\n" ); }static void pcwd_timer_ping (unsigned long data)
@@ -361,11 +378,12 @@ static void pcwd_timer_ping(unsigned long data)/* If we got a heartbeat pulse within the WDT_INTERVAL * we agree to ping the WDT */ -if (time_before (jiffies, pcwd_private.next_heartbeat)) { +if (time_before (jiffies, pcwd_private.next_heartbeat)) {/* Ping the watchdog */ spin_lock (&pcwd_private.io_lock);if (pcwd_private.revision ==PCWD_REVISION_A ) { -/* Rev A cards are reset by setting the WD_WDRST bit in register 1 */ +/* Rev A cards are reset by setting the +WD_WDRST bit in register 1 */ wdrst_stat =inb_p (pcwd_private.io_addr); wdrst_stat &=0x0F ; wdrst_stat |=WD_WDRST ;
@@ -381,7 +399,8 @@ static void pcwd_timer_ping(unsigned long data)spin_unlock (&pcwd_private.io_lock); }else { - printk(KERN_WARNING PFX "Heartbeat lost! Will not ping the watchdog\n"); + printk(KERN_WARNING PFX + "Heartbeat lost! Will not ping the watchdog\n"); } }
@@ -454,7 +473,7 @@ static int pcwd_keepalive(void)static int pcwd_set_heartbeat (int t) { -if ((t <2 ) || (t >7200 ))/* arbitrary upper limit */ +if (t <2 || t >7200 )/* arbitrary upper limit */ return -EINVAL ; heartbeat = t;
@@ -470,7 +489,7 @@ static int pcwd_get_status(int *status) {int control_status; - *status=0 ; + *status =0 ;spin_lock (&pcwd_private.io_lock);if (pcwd_private.revision ==PCWD_REVISION_A )/* Rev A cards return status information from
@@ -494,9 +513,9 @@ static int pcwd_get_status(int *status)if (control_status &WD_T110 ) { *status |=WDIOF_OVERHEAT ;if (temp_panic) { - printk(KERN_INFO PFX "Temperature overheat trip!\n"); + printk(KERN_INFO PFX + "Temperature overheat trip!\n");kernel_power_off (); -/* or should we just do a: panic(PFX "Temperature overheat trip!\n"); */ } } }else {
@@ -506,9 +525,9 @@ static int pcwd_get_status(int *status)if (control_status &WD_REVC_TTRP ) { *status |=WDIOF_OVERHEAT ;if (temp_panic) { - printk(KERN_INFO PFX "Temperature overheat trip!\n"); + printk(KERN_INFO PFX + "Temperature overheat trip!\n");kernel_power_off (); -/* or should we just do a: panic(PFX "Temperature overheat trip!\n"); */ } } }
@@ -524,18 +543,21 @@ static int pcwd_clear_status(void)spin_lock (&pcwd_private.io_lock);if (debug >=VERBOSE ) - printk(KERN_INFO PFX "clearing watchdog trip status\n"); + printk(KERN_INFO PFX +"clearing watchdog trip status\n" ); control_status =inb_p (pcwd_private.io_addr +1 );if (debug >=DEBUG ) { - printk(KERN_DEBUG PFX "status was: 0x%02x\n", control_status); + printk(KERN_DEBUG PFX "status was: 0x%02x\n", + control_status); printk(KERN_DEBUG PFX "sending: 0x%02x\n", (control_status & WD_REVC_R2DS)); }/* clear reset status & Keep Relay 2 disable state as it is */ -outb_p ((control_status &WD_REVC_R2DS ), pcwd_private.io_addr +1 ); +outb_p ((control_status &WD_REVC_R2DS ), + pcwd_private.io_addr +1 );spin_unlock (&pcwd_private.io_lock); }
@@ -572,8 +594,7 @@ static int pcwd_get_temperature(int *temperature)* /dev/watchdog handling */ -static int pcwd_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long pcwd_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {int rv;int status;
@@ -590,12 +611,12 @@ static int pcwd_ioctl(struct inode *inode, struct file *file, .identity = "PCWD", }; -switch (cmd) { +switch (cmd) {default :return -ENOTTY ;case WDIOC_GETSUPPORT : -if (copy_to_user (argp, &ident,sizeof (ident))) +if (copy_to_user (argp, &ident,sizeof (ident)))return -EFAULT ;return 0 ;
@@ -613,25 +634,22 @@ static int pcwd_ioctl(struct inode *inode, struct file *file,return put_user (temperature, argp);case WDIOC_SETOPTIONS : -if (pcwd_private.revision ==PCWD_REVISION_C ) - { -if (copy_from_user (&rv, argp,sizeof (int ))) +if (pcwd_private.revision ==PCWD_REVISION_C ) { +if (get_user (rv, argp))return -EFAULT ; -if (rv &WDIOS_DISABLECARD ) - { -return pcwd_stop (); +if (rv &WDIOS_DISABLECARD ) { + status =pcwd_stop (); +if (status <0 ) +return status; } - -if (rv &WDIOS_ENABLECARD ) - { -return pcwd_start (); +if (rv &WDIOS_ENABLECARD ) { + status =pcwd_start (); +if (status <0 ) +return status; } -if (rv &WDIOS_TEMPPANIC ) - { temp_panic =1 ; - } }return -EINVAL ;
@@ -682,16 +700,10 @@ static ssize_t pcwd_write(struct file *file, const char __user *buf, size_t len,static int pcwd_open (struct inode *inode,struct file *file) { -if (!atomic_dec_and_test (&open_allowed) ) { -if (debug >=VERBOSE ) - printk(KERN_ERR PFX "Attempt to open already opened device.\n"); -atomic_inc ( &open_allowed ); +if (test_and_set_bit (0 , &open_allowed))return -EBUSY ; - } -if (nowayout)__module_get (THIS_MODULE ); -/* Activate */ pcwd_start ();pcwd_keepalive ();
@@ -700,14 +712,15 @@ static int pcwd_open(struct inode *inode, struct file *file)static int pcwd_close (struct inode *inode,struct file *file) { -if (expect_close ==42 ) { +if (expect_close ==42 )pcwd_stop (); - }else { - printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); +else { + printk(KERN_CRIT PFX + "Unexpected close, not stopping watchdog!\n");pcwd_keepalive (); } expect_close =0 ; -atomic_inc ( &open_allowed ); +clear_bit (0 , &open_allowed);return 0 ; }
@@ -750,7 +763,7 @@ static const struct file_operations pcwd_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = pcwd_write, - .ioctl = pcwd_ioctl, + .unlocked_ioctl = pcwd_ioctl, .open = pcwd_open, .release = pcwd_close, };
@@ -788,7 +801,7 @@ static inline int get_revision(void)* presumes a floating bus reads as 0xff. */ if ((inb (pcwd_private.io_addr +2 ) ==0xFF ) || (inb (pcwd_private.io_addr +3 ) ==0xFF )) - r=PCWD_REVISION_A ; + r =PCWD_REVISION_A ;spin_unlock (&pcwd_private.io_lock);return r;
@@ -803,7 +816,7 @@ static inline int get_revision(void)*/ static int __devinit pcwd_isa_match (struct device *dev,unsigned int id) { -int base_addr=pcwd_ioports[id]; +int base_addr = pcwd_ioports[id];int port0, last_port0;/* Reg 0, in case it's REV A */ int port1, last_port1;/* Register 1 for REV C cards */ int i;
@@ -813,7 +826,7 @@ static int __devinit pcwd_isa_match(struct device *dev, unsigned int id) printk(KERN_DEBUG PFX "pcwd_isa_match id=%d\n", id); -if (!request_region (base_addr,4 ,"PCWD" )) { +if (!request_region (base_addr,4 ,"PCWD" )) { printk(KERN_INFO PFX "Port 0x%04x unavailable\n", base_addr);return 0 ; }
@@ -842,7 +855,7 @@ static int __devinit pcwd_isa_match(struct device *dev, unsigned int id) } } } -release_region (base_addr,4 ); +release_region (base_addr,4 );return retval; }
@@ -857,7 +870,8 @@ static int __devinit pcwd_isa_probe(struct device *dev, unsigned int id) cards_found++;if (cards_found ==1 ) - printk(KERN_INFO PFX "v%s Ken Hollis ([email protected])\n", WD_VER); + printk(KERN_INFO PFX "v%s Ken Hollis ([email protected])\n", +WD_VER );if (cards_found >1 ) { printk(KERN_ERR PFX "This driver only supports 1 device\n");
@@ -875,10 +889,11 @@ static int __devinit pcwd_isa_probe(struct device *dev, unsigned int id)/* Check card's revision */ pcwd_private.revision =get_revision (); -if (!request_region (pcwd_private.io_addr, (pcwd_private.revision ==PCWD_REVISION_A ) ?2 :4 ,"PCWD" )) { +if (!request_region (pcwd_private.io_addr, + (pcwd_private.revision ==PCWD_REVISION_A ) ?2 :4 ,"PCWD" )) { printk(KERN_ERR PFX "I/O address 0x%04x already in use\n", pcwd_private.io_addr); - ret=-EIO ; + ret = -EIO ; goto error_request_region; }
@@ -908,26 +923,30 @@ static int __devinit pcwd_isa_probe(struct device *dev, unsigned int id)if (heartbeat ==0 ) heartbeat = heartbeat_tbl[(pcwd_get_option_switches () &0x07 )]; -/* Check that the heartbeat value is within it's range ; if not reset to the default */ +/* Check that the heartbeat value is within it's range; +if not reset to the default */ if (pcwd_set_heartbeat (heartbeat)) {pcwd_set_heartbeat (WATCHDOG_HEARTBEAT ); - printk(KERN_INFO PFX "heartbeat value must be 2<=heartbeat<=7200, using %d\n", - WATCHDOG_HEARTBEAT); + printk(KERN_INFO PFX +"heartbeat value must be 2 <= heartbeat <= 7200, using %d\n" , + WATCHDOG_HEARTBEAT); }if (pcwd_private.supports_temp) { ret =misc_register (&temp_miscdev);if (ret) { - printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - TEMP_MINOR, ret); + printk(KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + TEMP_MINOR, ret); goto error_misc_register_temp; } } ret =misc_register (&pcwd_miscdev);if (ret) { - printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - WATCHDOG_MINOR, ret); + printk(KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + WATCHDOG_MINOR, ret); goto error_misc_register_watchdog; }
@@ -940,7 +959,8 @@ error_misc_register_watchdog:if (pcwd_private.supports_temp)misc_deregister (&temp_miscdev); error_misc_register_temp: -release_region (pcwd_private.io_addr, (pcwd_private.revision ==PCWD_REVISION_A ) ?2 :4 ); +release_region (pcwd_private.io_addr, + (pcwd_private.revision ==PCWD_REVISION_A ) ?2 :4 ); error_request_region: pcwd_private.io_addr =0x0000 ; cards_found--;
@@ -964,7 +984,8 @@ static int __devexit pcwd_isa_remove(struct device *dev, unsigned int id)misc_deregister (&pcwd_miscdev);if (pcwd_private.supports_temp)misc_deregister (&temp_miscdev); -release_region (pcwd_private.io_addr, (pcwd_private.revision ==PCWD_REVISION_A ) ?2 :4 ); +release_region (pcwd_private.io_addr, + (pcwd_private.revision ==PCWD_REVISION_A ) ?2 :4 ); pcwd_private.io_addr =0x0000 ; cards_found--;
PATCH 33/57 pnx4008_wdt: unlocked_ioctl setup
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/pnx4008_wdt.c | 18 ++++++++---------- 1 files changed, 8 insertions(+), 10 deletions(-)
drivers/watchdog/pnx4008_wdt.c +8 -10
@@ -30,8 +30,8 @@#include <linux/spinlock.h> #include <asm/hardware.h> -#include <asm/uaccess.h> -#include <asm/io.h> +#include <linux/uaccess.h> +#include <linux/io.h> #define MODULE_NAME "PNX4008-WDT: "
@@ -144,9 +144,8 @@ static int pnx4008_wdt_open(struct inode *inode, struct file *file)return nonseekable_open (inode, file); } -static ssize_t -pnx4008_wdt_write (struct file *file,const char *data,size_t len, -loff_t * ppos) +static ssize_t pnx4008_wdt_write (struct file *file,const char *data, +size_t len,loff_t *ppos) {if (len) {if (!nowayout) {
@@ -169,15 +168,14 @@ pnx4008_wdt_write(struct file *file, const char *data, size_t len,return len; } -static struct watchdog_info ident = { +static const struct watchdog_info ident = { .options =WDIOF_CARDRESET |WDIOF_MAGICCLOSE |WDIOF_SETTIMEOUT |WDIOF_KEEPALIVEPING , .identity ="PNX4008 Watchdog" , }; -static int -pnx4008_wdt_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long pnx4008_wdt_ioctl (struct inode *inode,struct file *file, +unsigned int cmd,unsigned long arg) {int ret = -ENOTTY ;int time;
@@ -238,7 +236,7 @@ static const struct file_operations pnx4008_wdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = pnx4008_wdt_write, - .ioctl = pnx4008_wdt_ioctl, + .unlocked_ioctl = pnx4008_wdt_ioctl, .open = pnx4008_wdt_open, .release = pnx4008_wdt_release, };
PATCH 34/57 rm9k_wdt: clean up
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/rm9k_wdt.c | 21 ++++++++++++--------- 1 files changed, 12 insertions(+), 9 deletions(-)
drivers/watchdog/rm9k_wdt.c +12 -9
@@ -29,10 +29,10 @@#include <linux/notifier.h> #include <linux/miscdevice.h> #include <linux/watchdog.h> -#include <asm/io.h> +#include <linux/io.h> +#include <linux/uaccess.h> #include <asm/atomic.h> #include <asm/processor.h> -#include <asm/uaccess.h> #include <asm/system.h> #include <asm/rm9k-ocd.h>
@@ -53,10 +53,12 @@ static void wdt_gpi_stop(void);static void wdt_gpi_set_timeout (unsigned int );static int wdt_gpi_open (struct inode *,struct file *);static int wdt_gpi_release (struct inode *,struct file *); -static ssize_t wdt_gpi_write (struct file *,const char __user *,size_t ,loff_t *); +static ssize_t wdt_gpi_write (struct file *,const char __user *,size_t , +loff_t *);static long wdt_gpi_ioctl (struct file *,unsigned int ,unsigned long );static int wdt_gpi_notify (struct notifier_block *,unsigned long ,void *); -static const struct resource *wdt_gpi_get_resource (struct platform_device *,const char *,unsigned int ); +static const struct resource *wdt_gpi_get_resource (struct platform_device *, +const char *,unsigned int );static int __init wdt_gpi_probe (struct device *); static int __exit wdt_gpi_remove(struct device *);
@@ -68,7 +70,7 @@ static int locked;/* These are set from device resources */ -static void __iomem * wd_regs; +static void __iomem *wd_regs;static unsigned int wd_irq, wd_ctr;
@@ -216,7 +218,8 @@ static int wdt_gpi_release(struct inode *inode, struct file *file)if (expect_close) {wdt_gpi_stop ();free_irq (wd_irq, &miscdev); -printk (KERN_INFO "%s: watchdog stopped\n" , wdt_gpi_name); +printk (KERN_INFO "%s: watchdog stopped\n" , + wdt_gpi_name); }else { printk(KERN_CRIT "%s: unexpected close() -" " watchdog left running\n",
@@ -241,8 +244,7 @@ wdt_gpi_write(struct file *f, const char __user *d, size_t s, loff_t *o)return s ?1 :0 ; } -static long -wdt_gpi_ioctl (struct file *f,unsigned int cmd,unsigned long arg) +static long wdt_gpi_ioctl (struct file *f,unsigned int cmd,unsigned long arg) {long res = -ENOTTY ;const long size =_IOC_SIZE (cmd);
@@ -271,7 +273,8 @@ wdt_gpi_ioctl(struct file *f, unsigned int cmd, unsigned long arg)case WDIOC_GETSUPPORT : wdinfo.options = nowayout ?WDIOF_SETTIMEOUT |WDIOF_KEEPALIVEPING : -WDIOF_SETTIMEOUT |WDIOF_KEEPALIVEPING |WDIOF_MAGICCLOSE ; +WDIOF_SETTIMEOUT |WDIOF_KEEPALIVEPING | +WDIOF_MAGICCLOSE ; res =__copy_to_user (argp, &wdinfo, size) ? -EFAULT : size;break ;
PATCH 35/57 s3c2410: watchdog cleanup and switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/s3c2410_wdt.c | 148 ++++++++++++++++++++++------------------ 1 files changed, 80 insertions(+), 68 deletions(-)
drivers/watchdog/s3c2410_wdt.c +80 -68
@@ -46,9 +46,8 @@#include <linux/platform_device.h> #include <linux/interrupt.h> #include <linux/clk.h> - -#include <asm/uaccess.h> -#include <asm/io.h> +#include <linux/uaccess.h> +#include <linux/io.h> #include <asm/arch/map.h>
@@ -65,8 +64,8 @@static int nowayout =WATCHDOG_NOWAYOUT ;static int tmr_margin =CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME ;static int tmr_atboot =CONFIG_S3C2410_WATCHDOG_ATBOOT ; -static int soft_noboot =0 ; -static int debug =0 ; +static int soft_noboot; +static int debug;module_param (tmr_margin, int,0 );module_param (tmr_atboot, int,0 );
@@ -74,24 +73,23 @@ module_param(nowayout, int, 0);module_param (soft_noboot, int,0 );module_param (debug, int,0 ); -MODULE_PARM_DESC(tmr_margin, "Watchdog tmr_margin in seconds. default=" __MODULE_STRING(CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME) ")"); - -MODULE_PARM_DESC (tmr_atboot,"Watchdog is started at boot time if set to 1, default=" __MODULE_STRING(CONFIG_S3C2410_WATCHDOG_ATBOOT )); - -MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); - +MODULE_PARM_DESC(tmr_margin, "Watchdog tmr_margin in seconds. default=" + __MODULE_STRING(CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME) ")"); +MODULE_PARM_DESC (tmr_atboot, +"Watchdog is started at boot time if set to 1, default=" + __MODULE_STRING(CONFIG_S3C2410_WATCHDOG_ATBOOT )); +MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" + __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");MODULE_PARM_DESC (soft_noboot,"Watchdog action, set to 1 to ignore reboots, 0 to reboot (default depends on ONLY_TESTING)" ); -MODULE_PARM_DESC (debug,"Watchdog debug, set to >1 for debug, (default 0)" );typedef enum close_state {CLOSE_STATE_NOT , -CLOSE_STATE_ALLOW =0x4021 +CLOSE_STATE_ALLOW =0x4021 }close_state_t ; -static DECLARE_MUTEX (open_lock); - +static unsigned long open_lock;static struct device *wdt_dev;/* platform device attached to */ static struct resource *wdt_mem;static struct resource *wdt_irq;
@@ -99,38 +97,58 @@ static struct clk *wdt_clock;static void __iomem *wdt_base;static unsigned int wdt_count;static close_state_t allow_close; +static DEFINE_SPINLOCK (wdt_lock);/* watchdog control routines */ #define DBG(msg...) do { \ if (debug) \ printk(KERN_INFO msg); \ - } while(0) + } while (0)/* functions */ -static int s3c2410wdt_keepalive (void ) +static void s3c2410wdt_keepalive (void ) { +spin_lock (&wdt_lock);writel (wdt_count, wdt_base +S3C2410_WTCNT ); -return 0 ; +spin_unlock (&wdt_lock); } -static int s3c2410wdt_stop (void ) +static void __s3c2410wdt_stop (void ) {unsigned long wtcon; +spin_lock (&wdt_lock); wtcon =readl (wdt_base +S3C2410_WTCON ); wtcon &= ~(S3C2410_WTCON_ENABLE |S3C2410_WTCON_RSTEN );writel (wtcon, wdt_base +S3C2410_WTCON ); +spin_unlock (&wdt_lock); +} -return 0 ; +static void __s3c2410wdt_stop (void ) +{ +unsigned long wtcon; + + wtcon =readl (wdt_base +S3C2410_WTCON ); + wtcon &= ~(S3C2410_WTCON_ENABLE |S3C2410_WTCON_RSTEN ); +writel (wtcon, wdt_base +S3C2410_WTCON ); +} + +static void s3c2410wdt_stop (void ) +{ +spin_lock (&wdt_lock); +__s3c2410wdt_stop (); +spin_unlock (&wdt_lock); } -static int s3c2410wdt_start (void ) +static void s3c2410wdt_start (void ) {unsigned long wtcon; -s3c2410wdt_stop (); +spin_lock (&wdt_lock); + +__s3c2410wdt_stop (); wtcon =readl (wdt_base +S3C2410_WTCON ); wtcon |=S3C2410_WTCON_ENABLE |S3C2410_WTCON_DIV128 ;
@@ -149,6 +167,7 @@ static int s3c2410wdt_start(void)writel (wdt_count, wdt_base +S3C2410_WTDAT );writel (wdt_count, wdt_base +S3C2410_WTCNT );writel (wtcon, wdt_base +S3C2410_WTCON ); +spin_unlock (&wdt_lock);return 0 ; }
@@ -211,7 +230,7 @@ static int s3c2410wdt_set_heartbeat(int timeout)static int s3c2410wdt_open (struct inode *inode,struct file *file) { -if (down_trylock (&open_lock)) +if (test_and_set_bit (0 , &open_lock))return -EBUSY ;if (nowayout)
@@ -231,15 +250,14 @@ static int s3c2410wdt_release(struct inode *inode, struct file *file)* Lock it in if it's a module and we set nowayout */ -if (allow_close ==CLOSE_STATE_ALLOW ) { +if (allow_close ==CLOSE_STATE_ALLOW )s3c2410wdt_stop (); - }else { +else {dev_err (wdt_dev,"Unexpected close, not stopping watchdog\n" );s3c2410wdt_keepalive (); } - allow_close =CLOSE_STATE_NOT ; -up (&open_lock); +clear_bit (0 , &open_lock);return 0 ; }
@@ -249,7 +267,7 @@ static ssize_t s3c2410wdt_write(struct file *file, const char __user *data,/* * Refresh the timer. */ -if (len) { +if (len) {if (!nowayout) {size_t i;
@@ -265,7 +283,6 @@ static ssize_t s3c2410wdt_write(struct file *file, const char __user *data, allow_close =CLOSE_STATE_ALLOW ; } } -s3c2410wdt_keepalive (); }return len;
@@ -273,48 +290,41 @@ static ssize_t s3c2410wdt_write(struct file *file, const char __user *data,#define OPTIONS WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE -static struct watchdog_info s3c2410_wdt_ident = { +static const struct watchdog_info s3c2410_wdt_ident = { .options =OPTIONS , .firmware_version =0 , .identity ="S3C2410 Watchdog" , }; -static int s3c2410wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long s3c2410wdt_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {void __user *argp = (void __user *)arg;int __user *p = argp;int new_margin;switch (cmd) { -default : -return -ENOTTY ; - -case WDIOC_GETSUPPORT : -return copy_to_user (argp, &s3c2410_wdt_ident, -sizeof (s3c2410_wdt_ident)) ? -EFAULT :0 ; - -case WDIOC_GETSTATUS : -case WDIOC_GETBOOTSTATUS : -return put_user (0 , p); - -case WDIOC_KEEPALIVE : -s3c2410wdt_keepalive (); -return 0 ; - -case WDIOC_SETTIMEOUT : -if (get_user (new_margin, p)) -return -EFAULT ; - -if (s3c2410wdt_set_heartbeat (new_margin)) -return -EINVAL ; - -s3c2410wdt_keepalive (); -return put_user (tmr_margin, p); - -case WDIOC_GETTIMEOUT : -return put_user (tmr_margin, p); +default : +return -ENOTTY ; +case WDIOC_GETSUPPORT : +return copy_to_user (argp, &s3c2410_wdt_ident, +sizeof (s3c2410_wdt_ident)) ? -EFAULT :0 ; +case WDIOC_GETSTATUS : +case WDIOC_GETBOOTSTATUS : +return put_user (0 , p); +case WDIOC_KEEPALIVE : +s3c2410wdt_keepalive (); +return 0 ; +case WDIOC_SETTIMEOUT : +if (get_user (new_margin, p)) +return -EFAULT ; +if (s3c2410wdt_set_heartbeat (new_margin)) +return -EINVAL ; +s3c2410wdt_keepalive (); +return put_user (tmr_margin, p); +case WDIOC_GETTIMEOUT : +return put_user (tmr_margin, p); } }
@@ -324,7 +334,7 @@ static const struct file_operations s3c2410wdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = s3c2410wdt_write, - .ioctl = s3c2410wdt_ioctl, + .unlocked_ioctl = s3c2410wdt_ioctl, .open = s3c2410wdt_open, .release = s3c2410wdt_release, };
@@ -411,14 +421,15 @@ static int s3c2410wdt_probe(struct platform_device *pdev)* not, try the default value */ if (s3c2410wdt_set_heartbeat (tmr_margin)) { - started =s3c2410wdt_set_heartbeat (CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME ); + started =s3c2410wdt_set_heartbeat ( +CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME ); -if (started ==0 ) { -dev_info (dev,"tmr_margin value out of range, default %d used\n" , +if (started ==0 ) +dev_info (dev, +"tmr_margin value out of range, default %d used\n" ,CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME ); - }else { +else dev_info (dev,"default timer value is out of range, cannot start\n" ); - } } ret =misc_register (&s3c2410wdt_miscdev);
@@ -447,7 +458,7 @@ static int s3c2410wdt_probe(struct platform_device *pdev) (wtcon &S3C2410_WTCON_ENABLE ) ?"" :"in" , (wtcon &S3C2410_WTCON_RSTEN ) ?"" :"dis" , (wtcon & S3C2410_WTCON_INTEN) ? "" : "en"); - +return 0 ; err_clk:
@@ -487,7 +498,7 @@ static int s3c2410wdt_remove(struct platform_device *dev)static void s3c2410wdt_shutdown (struct platform_device *dev) { -s3c2410wdt_stop (); +s3c2410wdt_stop (); }#ifdef CONFIG_PM
@@ -540,7 +551,8 @@ static struct platform_driver s3c2410wdt_driver = { }; -static char banner[]__initdata =KERN_INFO "S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics\n" ; +static char banner[]__initdata = +KERN_INFO "S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics\n" ;static int __init watchdog_init (void ) {
PATCH 36/57 sa1100_wdt: Switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/sa1100_wdt.c | 32 +++++++++++++++----------------- 1 files changed, 15 insertions(+), 17 deletions(-)
drivers/watchdog/sa1100_wdt.c +15 -17
@@ -26,13 +26,13 @@#include <linux/watchdog.h> #include <linux/init.h> #include <linux/bitops.h> +#include <linux/uaccess.h> #ifdef CONFIG_ARCH_PXA #include <asm/arch/pxa-regs.h> #endif #include <asm/hardware.h> -#include <asm/uaccess.h> #define OSCR_FREQ CLOCK_TICK_RATE
@@ -45,7 +45,7 @@ static int boot_status;*/ static int sa1100dog_open (struct inode *inode,struct file *file) { -if (test_and_set_bit (1 ,&sa1100wdt_users)) +if (test_and_set_bit (1 , &sa1100wdt_users))return -EBUSY ;/* Activate SA1100 Watchdog timer */
@@ -66,28 +66,27 @@ static int sa1100dog_open(struct inode *inode, struct file *file)static int sa1100dog_release (struct inode *inode,struct file *file) {printk (KERN_CRIT "WATCHDOG: Device closed - timer will not stop\n" ); -clear_bit (1 , &sa1100wdt_users); -return 0 ; } -static ssize_t sa1100dog_write (struct file *file,const char __user *data,size_t len,loff_t *ppos) +static ssize_t sa1100dog_write (struct file *file,const char __user *data, +size_t len,loff_t *ppos) {if (len)/* Refresh OSMR3 timer. */ OSMR3 =OSCR + pre_margin; -return len; } -static struct watchdog_info ident = { - .options =WDIOF_CARDRESET |WDIOF_SETTIMEOUT |WDIOF_KEEPALIVEPING , +static const struct watchdog_info ident = { + .options =WDIOF_CARDRESET |WDIOF_SETTIMEOUT + |WDIOF_KEEPALIVEPING , .identity ="SA1100/PXA255 Watchdog" , }; -static int sa1100dog_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long sa1100dog_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {int ret = -ENOTTY ;int time;
@@ -134,18 +133,16 @@ static int sa1100dog_ioctl(struct inode *inode, struct file *file,return ret; } -static const struct file_operations sa1100dog_fops = -{ +static const struct file_operations sa1100dog_fops = { .owner =THIS_MODULE , .llseek = no_llseek, .write = sa1100dog_write, - .ioctl = sa1100dog_ioctl, + .unlocked_ioctl = sa1100dog_ioctl, .open = sa1100dog_open, .release = sa1100dog_release, }; -static struct miscdevice sa1100dog_miscdev = -{ +static struct miscdevice sa1100dog_miscdev = { .minor =WATCHDOG_MINOR , .name ="watchdog" , .fops = &sa1100dog_fops,
@@ -167,8 +164,9 @@ static int __init sa1100dog_init(void) ret =misc_register (&sa1100dog_miscdev);if (ret ==0 ) -printk ("SA1100/PXA2xx Watchdog Timer: timer margin %d sec\n" , - margin); +printk (KERN_INFO +"SA1100/PXA2xx Watchdog Timer: timer margin %d sec\n" , + margin);return ret; }
PATCH 37/57 sbc60xxwdt: clean up and switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/sbc60xxwdt.c | 223 ++++++++++++++++++++--------------------- 1 files changed, 110 insertions(+), 113 deletions(-)
drivers/watchdog/sbc60xxwdt.c +110 -113
@@ -16,19 +16,23 @@* * 12/4 - 2000 [Initial revision] * 25/4 - 2000 Added /dev/watchdog support -* 09/5 - 2001 [[email protected]] fixed fop_write to "return 1" on success +* 09/5 - 2001 [[email protected]] fixed fop_write to "return 1" +* on success * 12/4 - 2002 [[email protected]] eliminate fop_read * fix possible wdt_is_open race * add CONFIG_WATCHDOG_NOWAYOUT support * remove lock_kernel/unlock_kernel pairs * added KERN_* to printk's * got rid of extraneous comments -* changed watchdog_info to correctly reflect what the driver offers -* added WDIOC_GETSTATUS, WDIOC_GETBOOTSTATUS, WDIOC_SETTIMEOUT, -* WDIOC_GETTIMEOUT, and WDIOC_SETOPTIONS ioctls +* changed watchdog_info to correctly reflect what +* the driver offers +* added WDIOC_GETSTATUS, WDIOC_GETBOOTSTATUS, +* WDIOC_SETTIMEOUT, WDIOC_GETTIMEOUT, and +* WDIOC_SETOPTIONS ioctls * 09/8 - 2003 [[email protected]] cleanup of trailing spaces * use module_param -* made timeout (the emulated heartbeat) a module_param +* made timeout (the emulated heartbeat) a +* module_param * made the keepalive ping an internal subroutine * made wdt_stop and wdt_start module params * added extra printk's for startup problems
@@ -56,9 +60,9 @@#include <linux/notifier.h> #include <linux/reboot.h> #include <linux/init.h> +#include <linux/io.h> +#include <linux/uaccess.h> -#include <asm/io.h> -#include <asm/uaccess.h> #include <asm/system.h> #define OUR_NAME "sbc60xxwdt"
@@ -94,13 +98,18 @@ MODULE_PARM_DESC(wdt_start, "SBC60xx WDT 'start' io port (default 0x443)");*/ #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 */ +static int timeout =WATCHDOG_TIMEOUT ;/* in seconds, multiplied by HZ to +get seconds to wait for a ping */ 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) ")");static void wdt_timer_ping (unsigned long ); static DEFINE_TIMER(timer, wdt_timer_ping, 0, 0);
@@ -117,15 +126,14 @@ 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 by reading from wdt_start */ inb_p (wdt_start);/* 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" ); }/*
@@ -159,40 +167,40 @@ static void wdt_keepalive(void)* /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) - { -if (!nowayout) - { +if (count) { +if (!nowayout) {size_t ofs; -/* note: just in case someone wrote the magic character -* five months ago... */ +/* note: just in case someone wrote the +magic character five months ago... */ wdt_expect_close =0 ; -/* scan to see whether or not we got the magic character */ -for (ofs =0 ; ofs != count; ofs++) - { +/* scan to see whether or not we got the +magic character */ +for (ofs =0 ; ofs != count; ofs++) {char c; -if (get_user (c, buf+ofs)) +if (get_user (c, buf+ofs))return -EFAULT ; -if (c =='V' ) +if (c =='V' ) wdt_expect_close =42 ; } } -/* 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; } -static int fop_open (struct inode * inode,struct file * file) +static int fop_open (struct inode *inode,struct file *file) {/* Just in case we're already talking to someone... */ -if (test_and_set_bit (0 , &wdt_is_open)) +if (test_and_set_bit (0 , &wdt_is_open))return -EBUSY ;if (nowayout)
@@ -203,78 +211,72 @@ static int fop_open(struct inode * inode, struct file * file)return nonseekable_open (inode, file); } -static int fop_close (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 {del_timer (&timer); - printk(KERN_CRIT PFX "device file closed unexpectedly. Will not stop the WDT!\n"); + printk(KERN_CRIT PFX + "device file closed unexpectedly. Will not stop the WDT!\n"); }clear_bit (0 , &wdt_is_open); wdt_expect_close =0 ;return 0 ; } -static int fop_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long 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 ="SBC60xx" , }; -switch (cmd) +switch (cmd) { +default : +return -ENOTTY ; +case WDIOC_GETSUPPORT : +return copy_to_user (argp, &ident,sizeof (ident))? -EFAULT :0 ; +case WDIOC_GETSTATUS : +case WDIOC_GETBOOTSTATUS : +return put_user (0 , p); +case WDIOC_KEEPALIVE : +wdt_keepalive (); +return 0 ; +case WDIOC_SETOPTIONS : { -default : -return -ENOTTY ; -case WDIOC_GETSUPPORT : -return copy_to_user (argp, &ident,sizeof (ident))?-EFAULT :0 ; -case WDIOC_GETSTATUS : -case WDIOC_GETBOOTSTATUS : -return put_user (0 , p); -case WDIOC_KEEPALIVE : -wdt_keepalive (); -return 0 ; -case WDIOC_SETOPTIONS : - { -int new_options, retval = -EINVAL ; - -if (get_user (new_options, p)) -return -EFAULT ; - -if (new_options &WDIOS_DISABLECARD ) { -wdt_turnoff (); - retval =0 ; - } - -if (new_options &WDIOS_ENABLECARD ) { -wdt_startup (); - retval =0 ; - } - -return retval; +int new_options, retval = -EINVAL ; +if (get_user (new_options, p)) +return -EFAULT ; +if (new_options &WDIOS_DISABLECARD ) { +wdt_turnoff (); + retval =0 ; } -case WDIOC_SETTIMEOUT : - { -int new_timeout; - -if (get_user (new_timeout, p)) -return -EFAULT ; - -if (new_timeout <1 || new_timeout >3600 )/* arbitrary upper limit */ -return -EINVAL ; - - timeout = new_timeout; -wdt_keepalive (); -/* Fall through */ +if (new_options &WDIOS_ENABLECARD ) { +wdt_startup (); + retval =0 ; } -case WDIOC_GETTIMEOUT : -return put_user (timeout, p); +return retval; + } +case WDIOC_SETTIMEOUT : + { +int new_timeout; +if (get_user (new_timeout, p)) +return -EFAULT ; +/* arbitrary upper limit */ +if (new_timeout <1 || new_timeout >3600 ) +return -EINVAL ; + + timeout = new_timeout; +wdt_keepalive (); +/* Fall through */ + } +case WDIOC_GETTIMEOUT : +return put_user (timeout, p); } }
@@ -284,7 +286,7 @@ static const struct file_operations wdt_fops = { .write = fop_write, .open = fop_open, .release = fop_close, - .ioctl = fop_ioctl, + .unlocked_ioctl = fop_ioctl, };static struct miscdevice wdt_miscdev = {
@@ -300,7 +302,7 @@ static struct miscdevice wdt_miscdev = {static int wdt_notify_sys (struct notifier_block *this,unsigned long code,void *unused) { -if (code==SYS_DOWN || code==SYS_HALT ) +if (code ==SYS_DOWN || code ==SYS_HALT )wdt_turnoff ();return NOTIFY_DONE ; }
@@ -310,8 +312,7 @@ static int wdt_notify_sys(struct notifier_block *this, unsigned long code,* turn the timebomb registers off. */ -static struct notifier_block wdt_notifier= -{ +static struct notifier_block wdt_notifier = { .notifier_call = wdt_notify_sys, };
@@ -324,23 +325,22 @@ static void __exit sbc60xxwdt_unload(void)unregister_reboot_notifier (&wdt_notifier);if ((wdt_stop !=0x45 ) && (wdt_stop != wdt_start)) -release_region (wdt_stop,1 ); -release_region (wdt_start,1 ); +release_region (wdt_stop,1 ); +release_region (wdt_start,1 ); }static int __init sbc60xxwdt_init (void ) {int rc = -EBUSY ; -if (timeout <1 || timeout >3600 )/* arbitrary upper limit */ - { +if (timeout <1 || timeout >3600 ) {/* arbitrary upper limit */ timeout =WATCHDOG_TIMEOUT ; - printk(KERN_INFO PFX "timeout value must be 1<=x<=3600, using %d\n", - timeout); - } + printk(KERN_INFO PFX +"timeout value must be 1 <= x <= 3600, using %d\n" , + timeout); + } -if (!request_region (wdt_start,1 ,"SBC 60XX WDT" )) - { +if (!request_region (wdt_start,1 ,"SBC 60XX WDT" )) { printk(KERN_ERR PFX "I/O address 0x%04x already in use\n", wdt_start); rc = -EIO ;
@@ -348,33 +348,30 @@ static int __init sbc60xxwdt_init(void) }/* We cannot reserve 0x45 - the kernel already has! */ -if ((wdt_stop !=0x45 ) && (wdt_stop != wdt_start)) - { -if (!request_region (wdt_stop,1 ,"SBC 60XX WDT" )) - { - printk(KERN_ERR PFX "I/O address 0x%04x already in use\n", - wdt_stop); +if (wdt_stop !=0x45 && wdt_stop != wdt_start) { +if (!request_region (wdt_stop,1 ,"SBC 60XX WDT" )) { + printk(KERN_ERR PFX +"I/O address 0x%04x already in use\n" , + wdt_stop); rc = -EIO ; goto err_out_region1; } } rc =register_reboot_notifier (&wdt_notifier); -if (rc) - { - printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", - rc); +if (rc) { + printk(KERN_ERR PFX + "cannot register reboot notifier (err=%d)\n", rc); goto err_out_region2; } rc =misc_register (&wdt_miscdev); -if (rc) - { - printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - wdt_miscdev.minor, rc); +if (rc) { + printk(KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + wdt_miscdev.minor, rc); goto err_out_reboot; } - printk(KERN_INFO PFX "WDT driver for 60XX single board computer initialised. timeout=%d sec (nowayout=%d)\n", timeout, nowayout);
@@ -383,10 +380,10 @@ static int __init sbc60xxwdt_init(void) err_out_reboot:unregister_reboot_notifier (&wdt_notifier); err_out_region2: -if ((wdt_stop !=0x45 ) && (wdt_stop != wdt_start)) -release_region (wdt_stop,1 ); +if (wdt_stop !=0x45 && wdt_stop != wdt_start) +release_region (wdt_stop,1 ); err_out_region1: -release_region (wdt_start,1 ); +release_region (wdt_start,1 ); err_out:return rc; }
PATCH 38/57 stg7240_wdt: unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/sbc7240_wdt.c | 16 +++++++--------- 1 files changed, 7 insertions(+), 9 deletions(-)
drivers/watchdog/sbc7240_wdt.c +7 -9
@@ -27,10 +27,10 @@#include <linux/reboot.h> #include <linux/types.h> #include <linux/watchdog.h> +#include <linux/io.h> +#include <linux/uaccess.h> #include <asm/atomic.h> -#include <asm/io.h> #include <asm/system.h> -#include <asm/uaccess.h> #define SBC7240_PREFIX "sbc7240_wdt: "
@@ -159,7 +159,7 @@ static int fop_close(struct inode *inode, struct file *file)return 0 ; } -static struct watchdog_info ident = { +static const struct watchdog_info ident = { .options =WDIOF_KEEPALIVEPING |WDIOF_SETTIMEOUT |WDIOF_MAGICCLOSE ,
@@ -168,14 +168,12 @@ static struct watchdog_info ident = { }; -static int fop_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long fop_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {switch (cmd) {case WDIOC_GETSUPPORT : -return copy_to_user - ((void __user *)arg, &ident,sizeof (ident)) - ? -EFAULT :0 ; +return copy_to_user ((void __user *)arg, &ident,sizeof (ident)) + ? -EFAULT :0 ;case WDIOC_GETSTATUS :case WDIOC_GETBOOTSTATUS :return put_user (0 , (int __user *)arg);
@@ -225,7 +223,7 @@ static const struct file_operations wdt_fops = { .write = fop_write, .open = fop_open, .release = fop_close, - .ioctl = fop_ioctl, + .unlocked_ioctl = fop_ioctl, };static struct miscdevice wdt_miscdev = {
PATCH 39/57 sbc8360: clean up
In reply to Alan CoxFrom: Alan Cox <[email protected]>
Needs a proper ioctl method adding and stuff
---
drivers/watchdog/sbc8360.c | 30 ++++++++++++------------------ 1 files changed, 12 insertions(+), 18 deletions(-)
drivers/watchdog/sbc8360.c +12 -18
@@ -48,13 +48,12 @@#include <linux/init.h> #include <linux/spinlock.h> #include <linux/moduleparam.h> +#include <linux/io.h> +#include <linux/uaccess.h> -#include <asm/io.h> -#include <asm/uaccess.h> #include <asm/system.h> static unsigned long sbc8360_is_open; -static DEFINE_SPINLOCK (sbc8360_lock);static char expect_close;#define PFX "sbc8360: "
@@ -204,7 +203,8 @@ module_param(timeout, int, 0);MODULE_PARM_DESC (timeout,"Index into timeout table (0-63) (default=27 (60s))" );module_param (nowayout, int,0 );MODULE_PARM_DESC (nowayout, - "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); + "Watchdog cannot be stopped once started (default=" + __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");/* * Kernel methods.
@@ -232,8 +232,8 @@ static void sbc8360_ping(void) }/* Userspace pings kernel driver, or requests clean close */ -static ssize_t sbc8360_write (struct file *file,const char __user * buf, -size_t count,loff_t * ppos) +static ssize_t sbc8360_write (struct file *file,const char __user *buf, +size_t count,loff_t *ppos) {if (count) {if (!nowayout) {
@@ -257,16 +257,12 @@ static ssize_t sbc8360_write(struct file *file, const char __user * buf,static int sbc8360_open (struct inode *inode,struct file *file) { -spin_lock (&sbc8360_lock); -if (test_and_set_bit (0 , &sbc8360_is_open)) { -spin_unlock (&sbc8360_lock); +if (test_and_set_bit (0 , &sbc8360_is_open))return -EBUSY ; - }if (nowayout)__module_get (THIS_MODULE );/* Activate and ping once to start the countdown */ -spin_unlock (&sbc8360_lock);sbc8360_activate ();sbc8360_ping ();return nonseekable_open (inode, file);
@@ -274,16 +270,14 @@ static int sbc8360_open(struct inode *inode, struct file *file)static int sbc8360_close (struct inode *inode,struct file *file) { -spin_lock (&sbc8360_lock);if (expect_close ==42 )outb (0 ,SBC8360_ENABLE );else printk(KERN_CRIT PFX -"SBC8360 device closed unexpectedly. SBC8360 will not stop!\n" ); +"SBC8360 device closed unexpectedly. SBC8360 will not stop!\n" );clear_bit (0 , &sbc8360_is_open); expect_close =0 ; -spin_unlock (&sbc8360_lock);return 0 ; }
@@ -382,13 +376,13 @@ static int __init sbc8360_init(void)return 0 ; - out_nomisc: +out_nomisc:unregister_reboot_notifier (&sbc8360_notifier); - out_noreboot: +out_noreboot:release_region (SBC8360_BASETIME ,1 ); - out_nobasetimereg: +out_nobasetimereg:release_region (SBC8360_ENABLE ,1 ); - out: +out:return res; }
PATCH 40/57 sbc_epx_c3_wdt: switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/sbc_epx_c3.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-)
drivers/watchdog/sbc_epx_c3.c +6 -6
@@ -25,8 +25,8 @@#include <linux/reboot.h> #include <linux/init.h> #include <linux/ioport.h> -#include <asm/uaccess.h> -#include <asm/io.h> +#include <linux/uaccess.h> +#include <linux/io.h> #define PFX "epx_c3: "static int epx_c3_alive;
@@ -100,12 +100,12 @@ static ssize_t epx_c3_write(struct file *file, const char __user *data,return len; } -static int epx_c3_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long epx_c3_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {int options, retval = -EINVAL ;int __user *argp = (void __user *)arg; -static struct watchdog_info ident = { +static const struct watchdog_info ident = { .options =WDIOF_KEEPALIVEPING |WDIOF_MAGICCLOSE , .firmware_version =0 ,
@@ -158,7 +158,7 @@ static const struct file_operations epx_c3_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = epx_c3_write, - .ioctl = epx_c3_ioctl, + .unlocked_ioctl = epx_c3_ioctl, .open = epx_c3_open, .release = epx_c3_release, };
PATCH 41/57 sb_wdog: Clean up and switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/sb_wdog.c | 78 +++++++++++++++++++++++--------------------- 1 files changed, 40 insertions(+), 38 deletions(-)
drivers/watchdog/sb_wdog.c +40 -38
@@ -57,6 +57,7 @@#include <asm/sibyte/sb1250_int.h> #include <asm/sibyte/sb1250_scd.h> +static DEFINE_SPINLOCK (sbwd_lock);/* * set the initial count value of a timer
@@ -65,8 +66,10 @@*/ void sbwdog_set (char __iomem *wdog,unsigned long t) { +spin_lock (&sbwd_lock);__raw_writeb (0 , wdog -0x10 );__raw_writeq (t &0x7fffffUL , wdog); +spin_unlock (&sbwd_lock); }/*
@@ -77,7 +80,9 @@ void sbwdog_set(char __iomem *wdog, unsigned long t)*/ void sbwdog_pet (char __iomem *wdog) { +spin_lock (&sbwd_lock);__raw_writeb (__raw_readb (wdog) |1 , wdog); +spin_unlock (&sbwd_lock); }static unsigned long sbwdog_gate;/* keeps it to one thread only */
@@ -86,8 +91,9 @@ static char __iomem *user_dog = (char __iomem *)(IO_BASE + (A_SCD_WDOG_CFG_1));static unsigned long timeout =0x7fffffUL ;/* useconds: 8.3ish secs. */ static int expect_close; -static struct watchdog_info ident = { - .options =WDIOF_CARDRESET |WDIOF_SETTIMEOUT |WDIOF_KEEPALIVEPING , +static const struct watchdog_info ident = { + .options =WDIOF_CARDRESET |WDIOF_SETTIMEOUT | +WDIOF_KEEPALIVEPING , .identity ="SiByte Watchdog" , };
@@ -97,9 +103,8 @@ static struct watchdog_info ident = {static int sbwdog_open (struct inode *inode,struct file *file) {nonseekable_open (inode, file); -if (test_and_set_bit (0 , &sbwdog_gate)) { +if (test_and_set_bit (0 , &sbwdog_gate))return -EBUSY ; - }__module_get (THIS_MODULE );/*
@@ -120,8 +125,9 @@ static int sbwdog_release(struct inode *inode, struct file *file)__raw_writeb (0 , user_dog);module_put (THIS_MODULE ); }else { -printk (KERN_CRIT "%s: Unexpected close, not stopping watchdog!\n" , - ident.identity); +printk (KERN_CRIT +"%s: Unexpected close, not stopping watchdog!\n" , + ident.identity);sbwdog_pet (user_dog); }clear_bit (0 , &sbwdog_gate);
@@ -147,12 +153,10 @@ static ssize_t sbwdog_write(struct file *file, const char __user *data,for (i =0 ; i != len; i++) {char c; -if (get_user (c, data + i)) { +if (get_user (c, data + i))return -EFAULT ; - } -if (c =='V' ) { +if (c =='V' ) expect_close =42 ; - } }sbwdog_pet (user_dog); }
@@ -160,8 +164,8 @@ static ssize_t sbwdog_write(struct file *file, const char __user *data,return len; } -static int sbwdog_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long sbwdog_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {int ret = -ENOTTY ;unsigned long time;
@@ -180,9 +184,8 @@ static int sbwdog_ioctl(struct inode *inode, struct file *file,case WDIOC_SETTIMEOUT : ret =get_user (time, p); -if (ret) { +if (ret)break ; - } time *=1000000 ;if (time >0x7fffffUL ) {
@@ -226,18 +229,16 @@ sbwdog_notify_sys(struct notifier_block *this, unsigned long code, void *erf)return NOTIFY_DONE ; } -static const struct file_operations sbwdog_fops = -{ +static const struct file_operations sbwdog_fops = { .owner =THIS_MODULE , .llseek = no_llseek, .write = sbwdog_write, - .ioctl = sbwdog_ioctl, + .unlocked_ioctl = sbwdog_ioctl, .open = sbwdog_open, .release = sbwdog_release, }; -static struct miscdevice sbwdog_miscdev = -{ +static struct miscdevice sbwdog_miscdev = { .minor =WATCHDOG_MINOR , .name ="watchdog" , .fops = &sbwdog_fops,
@@ -267,13 +268,12 @@ irqreturn_t sbwdog_interrupt(int irq, void *addr)/* * if it's the second watchdog timer, it's for those users */ -if (wd_cfg_reg == user_dog) { +if (wd_cfg_reg == user_dog)printk (KERN_CRIT "%s in danger of initiating system reset in %ld.%01ld seconds\n" , ident.identity, wd_init /1000000 , (wd_init /100000 ) %10 ); - }else { +else cfg |=1 ; - }__raw_writeb (cfg, wd_cfg_reg);
@@ -289,28 +289,31 @@ static int __init sbwdog_init(void)*/ ret =register_reboot_notifier (&sbwdog_notifier);if (ret) { -printk (KERN_ERR "%s: cannot register reboot notifier (err=%d)\n" , - ident.identity, ret); +printk (KERN_ERR +"%s: cannot register reboot notifier (err=%d)\n" , + ident.identity, ret);return ret; }/* * get the resources */ - ret =misc_register (&sbwdog_miscdev); -if (ret ==0 ) { -printk (KERN_INFO "%s: timeout is %ld.%ld secs\n" , ident.identity, - timeout /1000000 , (timeout /100000 ) %10 ); - } ret =request_irq (1 , sbwdog_interrupt,IRQF_DISABLED |IRQF_SHARED , ident.identity, (void *)user_dog);if (ret) { -printk (KERN_ERR "%s: failed to request irq 1 - %d\n" , ident.identity, - ret); -misc_deregister (&sbwdog_miscdev); +printk (KERN_ERR "%s: failed to request irq 1 - %d\n" , + ident.identity, ret); +return ret; } + ret =misc_register (&sbwdog_miscdev); +if (ret ==0 ) { +printk (KERN_INFO "%s: timeout is %ld.%ld secs\n" , + ident.identity, + timeout /1000000 , (timeout /100000 ) %10 ); + }else +free_irq (1 , (void *)user_dog);return ret; }
@@ -327,7 +330,7 @@ MODULE_DESCRIPTION("SiByte Watchdog");module_param (timeout, ulong,0 );MODULE_PARM_DESC (timeout, -"Watchdog timeout in microseconds (max/default 8388607 or 8.3ish secs)" ); +"Watchdog timeout in microseconds (max/default 8388607 or 8.3ish secs)" );MODULE_LICENSE ("GPL" );MODULE_ALIAS_MISCDEV (WATCHDOG_MINOR );
@@ -336,16 +339,15 @@ MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);* example code that can be put in a platform code area to utilize the * first watchdog timer for the kernels own purpose. -void -platform_wd_setup(void) +void platform_wd_setup(void) { int ret; -ret = request_irq(0, sbwdog_interrupt, IRQF_DISABLED | IRQF_SHARED, +ret = request_irq(1, sbwdog_interrupt, IRQF_DISABLED | IRQF_SHARED, "Kernel Watchdog", IOADDR(A_SCD_WDOG_CFG_0)); if (ret) { -printk(KERN_CRIT "Watchdog IRQ zero(0) failed to be requested - %d\n", -ret); +printk(KERN_CRIT +"Watchdog IRQ zero(0) failed to be requested - %d\n", ret); } }
PATCH 42/57 sc1200_wdt: clean up, fix locking and use unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/sc1200wdt.c | 203 ++++++++++++++++++++++++------------------ 1 files changed, 114 insertions(+), 89 deletions(-)
drivers/watchdog/sc1200wdt.c +114 -89
@@ -15,14 +15,18 @@* * Changelog: * 20020220 Zwane Mwaikambo Code based on datasheet, no hardware. -* 20020221 Zwane Mwaikambo Cleanups as suggested by Jeff Garzik and Alan Cox. +* 20020221 Zwane Mwaikambo Cleanups as suggested by Jeff Garzik +* and Alan Cox. * 20020222 Zwane Mwaikambo Added probing. * 20020225 Zwane Mwaikambo Added ISAPNP support. * 20020412 Rob Radez Broke out start/stop functions -* <[email protected]> Return proper status instead of temperature warning -* Add WDIOC_GETBOOTSTATUS and WDIOC_SETOPTIONS ioctls +* <[email protected]> Return proper status instead of +* temperature warning +* Add WDIOC_GETBOOTSTATUS and +* WDIOC_SETOPTIONS ioctls * Fix CONFIG_WATCHDOG_NOWAYOUT -* 20020530 Joel Becker Add Matt Domsch's nowayout module option +* 20020530 Joel Becker Add Matt Domsch's nowayout module +* option * 20030116 Adam Belay Updated to the latest pnp code * */
@@ -39,9 +43,8 @@#include <linux/pnp.h> #include <linux/fs.h> #include <linux/semaphore.h> - -#include <asm/io.h> -#include <asm/uaccess.h> +#include <linux/io.h> +#include <linux/uaccess.h> #define SC1200_MODULE_VER "build 20020303"#define SC1200_MODULE_NAME "sc1200wdt"
@@ -72,7 +75,7 @@ static char banner[] __initdata = KERN_INFO PFX SC1200_MODULE_VER;static int timeout =1 ;static int io =-1 ;static int io_len =2 ;/* for non plug and play */ -static struct semaphore open_sem; +static unsigned long open_flag;static char expect_close;static DEFINE_SPINLOCK (sc1200wdt_lock);/* io port access serialisation */
@@ -81,7 +84,8 @@ static int isapnp = 1;static struct pnp_dev *wdt_dev;module_param (isapnp, int,0 ); -MODULE_PARM_DESC (isapnp,"When set to 0 driver ISA PnP support will be disabled" ); +MODULE_PARM_DESC (isapnp, +"When set to 0 driver ISA PnP support will be disabled" );#endif module_param (io, int,0 );
@@ -91,26 +95,40 @@ MODULE_PARM_DESC(timeout, "range is 0-255 minutes, default is 1");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) ")");/* Read from Data Register */ -static inline void sc1200wdt_read_data (unsigned char index,unsigned char *data) +static inline void __sc1200wdt_read_data (unsigned char index, +unsigned char *data) { -spin_lock (&sc1200wdt_lock);outb_p (index,PMIR ); *data =inb (PMDR ); -spin_unlock (&sc1200wdt_lock); } +static void sc1200wdt_read_data (unsigned char index,unsigned char *data) +{ +spin_lock (&sc1200wdt_lock); +__sc1200wdt_read_data (index, data); +spin_unlock (&sc1200wdt_lock); +}/* Write to Data Register */ -static inline void sc1200wdt_write_data (unsigned char index,unsigned char data) +static inline void __sc1200wdt_write_data (unsigned char index, +unsigned char data) { -spin_lock (&sc1200wdt_lock);outb_p (index,PMIR );outb (data,PMDR ); +} + +static inline void sc1200wdt_write_data (unsigned char index, +unsigned char data) +{ +spin_lock (&sc1200wdt_lock); +__sc1200wdt_write_data (index, data);spin_unlock (&sc1200wdt_lock); }
@@ -118,13 +136,16 @@ static inline void sc1200wdt_write_data(unsigned char index, unsigned char data)static void sc1200wdt_start (void ) {unsigned char reg; +spin_lock (&sc1200wdt_lock); -sc1200wdt_read_data (WDCF , ®); +__sc1200wdt_read_data (WDCF , ®);/* assert WDO when any of the following interrupts are triggered too */ reg |= (KBC_IRQ |MSE_IRQ |UART1_IRQ |UART2_IRQ ); -sc1200wdt_write_data (WDCF , reg); +__sc1200wdt_write_data (WDCF , reg);/* set the timeout and get the ball rolling */ -sc1200wdt_write_data (WDTO , timeout); +__sc1200wdt_write_data (WDTO , timeout); + +spin_unlock (&sc1200wdt_lock); }
@@ -144,14 +165,15 @@ static inline int sc1200wdt_status(void)* KEEPALIVEPING which is a bit of a kludge because there's nothing * else for enabled/disabled status */ -return (ret &0x01 ) ?0 :WDIOF_KEEPALIVEPING ;/* bits 1 - 7 are undefined */ +return (ret &0x01 ) ?0 :WDIOF_KEEPALIVEPING ; +/* bits 1 - 7 are undefined */ }static int sc1200wdt_open (struct inode *inode,struct file *file) {/* allow one at a time */ -if (down_trylock (&open_sem)) +if (test_and_set_bit (0 , &open_flag))return -EBUSY ;if (timeout >MAX_TIMEOUT )
@@ -164,71 +186,71 @@ static int sc1200wdt_open(struct inode *inode, struct file *file) } -static int sc1200wdt_ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg) +static long sc1200wdt_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {int new_timeout;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 =0 , .identity ="PC87307/PC97307" , };switch (cmd) { -default : -return -ENOTTY ; - -case WDIOC_GETSUPPORT : -if (copy_to_user (argp, &ident,sizeof ident)) -return -EFAULT ; -return 0 ; -case WDIOC_GETSTATUS : -return put_user (sc1200wdt_status (), p); +case WDIOC_GETSUPPORT : +if (copy_to_user (argp, &ident,sizeof ident)) +return -EFAULT ; +return 0 ; -case WDIOC_GETBOOTSTATUS : -return put_user (0 , p); +case WDIOC_GETSTATUS : +return put_user (sc1200wdt_status (), p); -case WDIOC_KEEPALIVE : -sc1200wdt_write_data (WDTO , timeout); -return 0 ; +case WDIOC_GETBOOTSTATUS : +return put_user (0 , p); -case WDIOC_SETTIMEOUT : -if (get_user (new_timeout, p)) -return -EFAULT ; - -/* the API states this is given in secs */ - new_timeout /=60 ; -if (new_timeout <0 || new_timeout >MAX_TIMEOUT ) -return -EINVAL ; - - timeout = new_timeout; -sc1200wdt_write_data (WDTO , timeout); -/* fall through and return the new timeout */ - -case WDIOC_GETTIMEOUT : -return put_user (timeout *60 , p); +case WDIOC_KEEPALIVE : +sc1200wdt_write_data (WDTO , timeout); +return 0 ; + +case WDIOC_SETTIMEOUT : +if (get_user (new_timeout, p)) +return -EFAULT ; +/* the API states this is given in secs */ + new_timeout /=60 ; +if (new_timeout <0 || new_timeout >MAX_TIMEOUT ) +return -EINVAL ; + timeout = new_timeout; +sc1200wdt_write_data (WDTO , timeout); +/* fall through and return the new timeout */ -case WDIOC_SETOPTIONS : - { -int options, retval = -EINVAL ; +case WDIOC_GETTIMEOUT : +return put_user (timeout *60 , p); -if (get_user (options, p)) -return -EFAULT ; +case WDIOC_SETOPTIONS : + { +int options, retval = -EINVAL ; -if (options &WDIOS_DISABLECARD ) { -sc1200wdt_stop (); - retval =0 ; - } +if (get_user (options, p)) +return -EFAULT ; -if (options &WDIOS_ENABLECARD ) { -sc1200wdt_start (); - retval =0 ; - } +if (options &WDIOS_DISABLECARD ) { +sc1200wdt_stop (); + retval =0 ; + } -return retval; +if (options &WDIOS_ENABLECARD ) { +sc1200wdt_start (); + retval =0 ; } + +return retval; + } +default : +return -ENOTTY ; } }
@@ -240,16 +262,18 @@ static int sc1200wdt_release(struct inode *inode, struct file *file) printk(KERN_INFO PFX "Watchdog disabled\n"); }else {sc1200wdt_write_data (WDTO , timeout); - printk(KERN_CRIT PFX "Unexpected close!, timeout = %d min(s)\n", timeout); + printk(KERN_CRIT PFX + "Unexpected close!, timeout = %d min(s)\n", timeout); } -up (&open_sem); +clear_bit (0 , &open_flag); expect_close =0 ;return 0 ; } -static ssize_t sc1200wdt_write (struct file *file,const char __user *data,size_t len,loff_t *ppos) +static ssize_t sc1200wdt_write (struct file *file,const char __user *data, +size_t len,loff_t *ppos) {if (len) {if (!nowayout) {
@@ -275,7 +299,8 @@ static ssize_t sc1200wdt_write(struct file *file, const char __user *data, size_ } -static int sc1200wdt_notify_sys (struct notifier_block *this,unsigned long code,void *unused) +static int sc1200wdt_notify_sys (struct notifier_block *this, +unsigned long code,void *unused) {if (code ==SYS_DOWN || code ==SYS_HALT )sc1200wdt_stop ();
@@ -284,23 +309,20 @@ static int sc1200wdt_notify_sys(struct notifier_block *this, unsigned long code, } -static struct notifier_block sc1200wdt_notifier = -{ +static struct notifier_block sc1200wdt_notifier = { .notifier_call = sc1200wdt_notify_sys, }; -static const struct file_operations sc1200wdt_fops = -{ +static const struct file_operations sc1200wdt_fops = { .owner =THIS_MODULE , .llseek = no_llseek, .write = sc1200wdt_write, - .ioctl = sc1200wdt_ioctl, + .unlocked_ioctl = sc1200wdt_ioctl, .open = sc1200wdt_open, .release = sc1200wdt_release, }; -static struct miscdevice sc1200wdt_miscdev = -{ +static struct miscdevice sc1200wdt_miscdev = { .minor =WATCHDOG_MINOR , .name ="watchdog" , .fops = &sc1200wdt_fops,
@@ -312,14 +334,14 @@ static int __init sc1200wdt_probe(void)/* The probe works by reading the PMC3 register's default value of 0x0e * there is one caveat, if the device disables the parallel port or any * of the UARTs we won't be able to detect it. -* Nb. This could be done with accuracy by reading the SID registers, but -* we don't have access to those io regions. +* NB. This could be done with accuracy by reading the SID registers, +* but we don't have access to those io regions. */ unsigned char reg;sc1200wdt_read_data (PMC3 , ®); - reg &=0x0f ;/* we don't want the UART busy bits */ + reg &=0x0f ;/* we don't want the UART busy bits */ return (reg ==0x0e ) ?0 : -ENODEV ; }
@@ -332,7 +354,8 @@ static struct pnp_device_id scl200wdt_pnp_devices[] = { {.id = ""}, }; -static int scl200wdt_pnp_probe (struct pnp_dev * dev,const struct pnp_device_id *dev_id) +static int scl200wdt_pnp_probe (struct pnp_dev *dev, +const struct pnp_device_id *dev_id) {/* this driver only supports one card at a time */ if (wdt_dev || !isapnp)
@@ -347,13 +370,14 @@ static int scl200wdt_pnp_probe(struct pnp_dev * dev, const struct pnp_device_idreturn -EBUSY ; } -printk (KERN_INFO "scl200wdt: PnP device found at io port %#x/%d\n" , io, io_len); +printk (KERN_INFO "scl200wdt: PnP device found at io port %#x/%d\n" , + io, io_len);return 0 ; } -static void scl200wdt_pnp_remove (struct pnp_dev * dev) +static void scl200wdt_pnp_remove (struct pnp_dev *dev) { -if (wdt_dev){ +if (wdt_dev) {release_region (io, io_len); wdt_dev =NULL ; }
@@ -375,8 +399,6 @@ static int __init sc1200wdt_init(void)printk ("%s\n" , banner); -sema_init (&open_sem,1 ); -#if definedCONFIG_PNP if (isapnp) { ret =pnp_register_driver (&scl200wdt_pnp_driver);
@@ -410,13 +432,16 @@ static int __init sc1200wdt_init(void) ret =register_reboot_notifier (&sc1200wdt_notifier);if (ret) { - printk(KERN_ERR PFX "Unable to register reboot notifier err = %d\n", ret); + printk(KERN_ERR PFX + "Unable to register reboot notifier err = %d\n", ret); goto out_io; } ret =misc_register (&sc1200wdt_miscdev);if (ret) { - printk(KERN_ERR PFX "Unable to register miscdev on minor %d\n", WATCHDOG_MINOR); + printk(KERN_ERR PFX +"Unable to register miscdev on minor %d\n" , + WATCHDOG_MINOR); goto out_rbt; }
@@ -446,7 +471,7 @@ static void __exit sc1200wdt_exit(void)unregister_reboot_notifier (&sc1200wdt_notifier);#if definedCONFIG_PNP -if (isapnp) +if (isapnp)pnp_unregister_driver (&scl200wdt_pnp_driver); else#endif
PATCH 43/57 sc520_wdt: Clean up and switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/sc520_wdt.c | 161 ++++++++++++++++++++++-------------------- 1 files changed, 86 insertions(+), 75 deletions(-)
drivers/watchdog/sc520_wdt.c +86 -75
@@ -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"
@@ -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
@@ -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);
@@ -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" ); }/*
@@ -162,7 +166,7 @@ static void wdt_config(int writeval)/* buy some time (ping) */ spin_lock_irqsave (&wdt_spinlock, flags); - dummy=readw (wdtmrctl);/* ensure write synchronization */ + dummy =readw (wdtmrctl);/* ensure write synchronization */ writew (0xAAAA , wdtmrctl);writew (0x5555 , wdtmrctl);/* unlock WDT = make WDT configuration register writable one time */
@@ -219,10 +223,11 @@ 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) { +if (count) {if (!nowayout) {size_t ofs;
@@ -231,25 +236,26 @@ static ssize_t fop_write(struct file * file, const char __user * buf, size_t cou wdt_expect_close =0 ;/* now scan */ -for (ofs =0 ; ofs != count; ofs++) { +for (ofs =0 ; ofs != count; ofs++) {char c;if (get_user (c, buf + ofs))return -EFAULT ; -if (c =='V' ) +if (c =='V' ) wdt_expect_close =42 ; } } -/* 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; } -static int fop_open (struct inode * inode,struct file * file) +static int fop_open (struct inode *inode,struct file *file) {/* Just in case we're already talking to someone... */ -if (test_and_set_bit (0 , &wdt_is_open)) +if (test_and_set_bit (0 , &wdt_is_open))return -EBUSY ;if (nowayout)__module_get (THIS_MODULE );
@@ -259,12 +265,13 @@ static int fop_open(struct inode * inode, struct file * file)return nonseekable_open (inode, file); } -static int fop_close (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);
@@ -272,63 +279,63 @@ 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" , }; -switch (cmd) +switch (cmd) { -default : -return -ENOTTY ; -case WDIOC_GETSUPPORT : -return copy_to_user (argp, &ident,sizeof (ident))?-EFAULT :0 ; -case WDIOC_GETSTATUS : -case WDIOC_GETBOOTSTATUS : -return put_user (0 , p); -case WDIOC_KEEPALIVE : -wdt_keepalive (); -return 0 ; -case WDIOC_SETOPTIONS : - { -int new_options, retval = -EINVAL ; - -if (get_user (new_options, p)) -return -EFAULT ; - -if (new_options &WDIOS_DISABLECARD ) { -wdt_turnoff (); - retval =0 ; - } +default : +return -ENOTTY ; +case WDIOC_GETSUPPORT : +return copy_to_user (argp, &ident,sizeof (ident)) ? -EFAULT :0 ; +case WDIOC_GETSTATUS : +case WDIOC_GETBOOTSTATUS : +return put_user (0 , p); +case WDIOC_KEEPALIVE : +wdt_keepalive (); +return 0 ; +case WDIOC_SETOPTIONS : + { +int new_options, retval = -EINVAL ; -if (new_options &WDIOS_ENABLECARD ) { -wdt_startup (); - retval =0 ; - } +if (get_user (new_options, p)) +return -EFAULT ; + +if (new_options &WDIOS_DISABLECARD ) { +wdt_turnoff (); + retval =0 ; + } -return retval; +if (new_options &WDIOS_ENABLECARD ) { +wdt_startup (); + retval =0 ; } -case WDIOC_SETTIMEOUT : - { -int new_timeout; -if (get_user (new_timeout, p)) -return -EFAULT ; +return retval; + } +case WDIOC_SETTIMEOUT : + { +int new_timeout; -if (wdt_set_heartbeat (new_timeout)) -return -EINVAL ; +if (get_user (new_timeout, p)) +return -EFAULT ; -wdt_keepalive (); -/* Fall through */ - } -case WDIOC_GETTIMEOUT : -return put_user (timeout, p); +if (wdt_set_heartbeat (new_timeout)) +return -EINVAL ; + +wdt_keepalive (); +/* Fall through */ + } +case WDIOC_GETTIMEOUT : +return put_user (timeout, p); } }
@@ -354,7 +361,7 @@ static struct miscdevice wdt_miscdev = {static int wdt_notify_sys (struct notifier_block *this,unsigned long code,void *unused) { -if (code==SYS_DOWN || code==SYS_HALT ) +if (code ==SYS_DOWN || code ==SYS_HALT )wdt_turnoff ();return NOTIFY_DONE ; }
@@ -383,11 +390,13 @@ 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", - WATCHDOG_TIMEOUT); + printk(KERN_INFO PFX +"timeout value must be 1 <= timeout <= 3600, using %d\n" , + WATCHDOG_TIMEOUT); } wdtmrctl =ioremap ((unsigned long )(MMCR_BASE +OFFS_WDTMRCTL ),2 );
@@ -399,20 +408,22 @@ 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", - WATCHDOG_MINOR, rc); + 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", - timeout,nowayout); + printk(KERN_INFO PFX +"WDT driver for SC520 initialised. timeout=%d sec (nowayout=%d)\n" , + timeout, nowayout);return 0 ;
PATCH 44/57 scx200_wdt: clean up and switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/sc520_wdt.c | 4 +-- drivers/watchdog/scx200_wdt.c | 59 +++++++++++++++++++++-------------------- 2 files changed, 32 insertions(+), 31 deletions(-)
drivers/watchdog/sc520_wdt.c +2 -2
@@ -279,7 +279,7 @@ static int fop_close(struct inode *inode, struct file *file)return 0 ; } -static int fop_ioctl (struct file *file,unsigned int cmd,unsigned long arg) +static long fop_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {void __user *argp = (void __user *)arg;int __user *p = argp;
@@ -345,7 +345,7 @@ static const struct file_operations wdt_fops = { .write = fop_write, .open = fop_open, .release = fop_close, - .ioctl = fop_ioctl, + .unlocked_ioctl = fop_ioctl, };static struct miscdevice wdt_miscdev = {
drivers/watchdog/scx200_wdt.c +30 -29
162 lines not on this page · raw message
PATCH 45/57 shwdt: coding style, cleanup, switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/shwdt.c | 139 +++++++++++++++++++++++++++------------------- 1 files changed, 82 insertions(+), 57 deletions(-)
drivers/watchdog/shwdt.c +82 -57
@@ -28,9 +28,9 @@#include <linux/ioport.h> #include <linux/fs.h> #include <linux/mm.h> -#include <asm/io.h> -#include <asm/uaccess.h> -#include <asm/watchdog.h> +#include <linux/io.h> +#include <linux/uaccess.h> +#include <linux/watchdog.h> #define PFX "shwdt: "
@@ -72,6 +72,7 @@ static struct watchdog_info sh_wdt_info;static char shwdt_expect_close; static DEFINE_TIMER(timer, sh_wdt_ping, 0, 0);static unsigned long next_heartbeat; +static DEFINE_SPINLOCK (shwdt_lock);#define WATCHDOG_HEARTBEAT 30/* 30 sec default heartbeat */ static int heartbeat =WATCHDOG_HEARTBEAT ;/* in seconds */
@@ -86,6 +87,9 @@ static int nowayout = WATCHDOG_NOWAYOUT;static void sh_wdt_start (void ) {__u8 csr; +unsigned long flags; + +spin_lock_irqsave (&wdt_lock, flags); next_heartbeat = jiffies + (heartbeat *HZ );mod_timer (&timer,next_ping_period (clock_division_ratio));
@@ -123,6 +127,7 @@ static void sh_wdt_start(void) csr &= ~RSTCSR_RSTS ;sh_wdt_write_rstcsr (csr);#endif +spin_unlock_irqrestore (&wdt_lock, flags); }/**
@@ -132,12 +137,16 @@ static void sh_wdt_start(void)static void sh_wdt_stop (void ) {__u8 csr; +unsigned long flags; + +spin_lock_irqsave (&wdt_lock, flags);del_timer (&timer); csr =sh_wdt_read_csr (); csr &= ~WTCSR_TME ;sh_wdt_write_csr (csr); +spin_unlock_irqrestore (&wdt_lock, flags); }/**
@@ -146,7 +155,11 @@ static void sh_wdt_stop(void)*/ static inline void sh_wdt_keepalive (void ) { +unsigned long flags; + +spin_lock_irqsave (&wdt_lock, flags); next_heartbeat = jiffies + (heartbeat *HZ ); +spin_unlock_irqrestore (&wdt_lock, flags); }/**
@@ -155,10 +168,14 @@ static inline void sh_wdt_keepalive(void)*/ static int sh_wdt_set_heartbeat (int t) { -if (unlikely ((t <1 ) || (t >3600 )))/* arbitrary upper limit */ +unsigned long flags; + +if (unlikely (t <1 || t >3600 ))/* arbitrary upper limit */ return -EINVAL ; +spin_lock_irqsave (&wdt_lock, flags); heartbeat = t; +spin_unlock_irqrestore (&wdt_lock, flags);return 0 ; }
@@ -170,6 +187,9 @@ static int sh_wdt_set_heartbeat(int t)*/ static void sh_wdt_ping (unsigned long data) { +unsigned long flags; + +spin_lock_irqsave (&wdt_lock, flags);if (time_before (jiffies, next_heartbeat)) {__u8 csr;
@@ -183,6 +203,7 @@ static void sh_wdt_ping(unsigned long data) }else printk(KERN_WARNING PFX "Heartbeat lost! Will not ping ""the watchdog\n" ); +spin_unlock_irqrestore (&wdt_lock, flags); }/**
@@ -310,7 +331,6 @@ static int sh_wdt_mmap(struct file *file, struct vm_area_struct *vma)/** * sh_wdt_ioctl - Query Device -* @inode: inode of device * @file: file handle of device * @cmd: watchdog command * @arg: argument
@@ -318,53 +338,51 @@ static int sh_wdt_mmap(struct file *file, struct vm_area_struct *vma)* Query basic information from the device or ping it, as outlined by the * watchdog API. */ -static int sh_wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long sh_wdt_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {int new_heartbeat;int options, retval = -EINVAL ;switch (cmd) { -case WDIOC_GETSUPPORT : -return copy_to_user ((struct watchdog_info *)arg, - &sh_wdt_info, -sizeof (sh_wdt_info)) ? -EFAULT :0 ; -case WDIOC_GETSTATUS : -case WDIOC_GETBOOTSTATUS : -return put_user (0 , (int *)arg); -case WDIOC_KEEPALIVE : -sh_wdt_keepalive (); -return 0 ; -case WDIOC_SETTIMEOUT : -if (get_user (new_heartbeat, (int *)arg)) -return -EFAULT ; - -if (sh_wdt_set_heartbeat (new_heartbeat)) -return -EINVAL ; - -sh_wdt_keepalive (); -/* Fall */ -case WDIOC_GETTIMEOUT : -return put_user (heartbeat, (int *)arg); -case WDIOC_SETOPTIONS : -if (get_user (options, (int *)arg)) -return -EFAULT ; - -if (options &WDIOS_DISABLECARD ) { -sh_wdt_stop (); - retval =0 ; - } +case WDIOC_GETSUPPORT : +return copy_to_user ((struct watchdog_info *)arg, + &sh_wdt_info,sizeof (sh_wdt_info)) ? -EFAULT :0 ; +case WDIOC_GETSTATUS : +case WDIOC_GETBOOTSTATUS : +return put_user (0 , (int *)arg); +case WDIOC_KEEPALIVE : +sh_wdt_keepalive (); +return 0 ; +case WDIOC_SETTIMEOUT : +if (get_user (new_heartbeat, (int *)arg)) +return -EFAULT ; -if (options &WDIOS_ENABLECARD ) { -sh_wdt_start (); - retval =0 ; - } +if (sh_wdt_set_heartbeat (new_heartbeat)) +return -EINVAL ; -return retval; -default : -return -ENOTTY ; - } +sh_wdt_keepalive (); +/* Fall */ +case WDIOC_GETTIMEOUT : +return put_user (heartbeat, (int *)arg); +case WDIOC_SETOPTIONS : +if (get_user (options, (int *)arg)) +return -EFAULT ; + +if (options &WDIOS_DISABLECARD ) { +sh_wdt_stop (); + retval =0 ; + } + +if (options &WDIOS_ENABLECARD ) { +sh_wdt_start (); + retval =0 ; + } +return retval; +default : +return -ENOTTY ; + }return 0 ; }
@@ -390,13 +408,13 @@ static const struct file_operations sh_wdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = sh_wdt_write, - .ioctl = sh_wdt_ioctl, + .unlocked_ioctl = sh_wdt_ioctl, .open = sh_wdt_open, .release = sh_wdt_close, .mmap = sh_wdt_mmap, }; -static struct watchdog_info sh_wdt_info = { +static const struct watchdog_info sh_wdt_info = { .options =WDIOF_KEEPALIVEPING |WDIOF_SETTIMEOUT |WDIOF_MAGICCLOSE , .firmware_version =1 ,
@@ -422,30 +440,33 @@ static int __init sh_wdt_init(void) {int rc; -if ((clock_division_ratio <0x5 ) || (clock_division_ratio >0x7 )) { +if (clock_division_ratio <0x5 || clock_division_ratio >0x7 ) { clock_division_ratio =WTCSR_CKS_4096 ; - printk(KERN_INFO PFX "clock_division_ratio value must " - "be 0x5<=x<=0x7, using %d\n", clock_division_ratio); + printk(KERN_INFO PFX +"clock_division_ratio value must be 0x5<=x<=0x7, using %d\n" , + clock_division_ratio); } rc =sh_wdt_set_heartbeat (heartbeat);if (unlikely (rc)) { heartbeat =WATCHDOG_HEARTBEAT ; - printk(KERN_INFO PFX "heartbeat value must " - "be 1<=x<=3600, using %d\n", heartbeat); + printk(KERN_INFO PFX +"heartbeat value must be 1<=x<=3600, using %d\n" , + heartbeat); } rc =register_reboot_notifier (&sh_wdt_notifier);if (unlikely (rc)) { - printk(KERN_ERR PFX "Can't register reboot notifier (err=%d)\n", - rc); + printk(KERN_ERR PFX + "Can't register reboot notifier (err=%d)\n", rc);return rc; } rc =misc_register (&sh_wdt_miscdev);if (unlikely (rc)) { - printk(KERN_ERR PFX "Can't register miscdev on " - "minor=%d (err=%d)\n", sh_wdt_miscdev.minor, rc); + printk(KERN_ERR PFX +"Can't register miscdev on minor=%d (err=%d)\n" , + sh_wdt_miscdev.minor, rc);unregister_reboot_notifier (&sh_wdt_notifier);return rc; }
@@ -476,10 +497,14 @@ module_param(clock_division_ratio, int, 0); MODULE_PARM_DESC(clock_division_ratio, "Clock division ratio. Valid ranges are from 0x5 (1.31ms) to 0x7 (5.25ms). (default=" __MODULE_STRING(clock_division_ratio) ")");module_param (heartbeat, int,0 ); -MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (1<=heartbeat<=3600, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")"); +MODULE_PARM_DESC (heartbeat, + "Watchdog heartbeat in seconds. (1 <= heartbeat <= 3600, default=" + __MODULE_STRING(WATCHDOG_HEARTBEAT) ")");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) ")");module_init (sh_wdt_init);module_exit (sh_wdt_exit);
PATCH 46/57 smsc37b787_wdt: coding style, switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/smsc37b787_wdt.c | 442 +++++++++++++++++++------------------ 1 files changed, 222 insertions(+), 220 deletions(-)
drivers/watchdog/smsc37b787_wdt.c +222 -220
@@ -18,7 +18,7 @@* History: * 2003 - Created version 1.0 for Linux 2.4.x. * 2006 - Ported to Linux 2.6, added nowayout and MAGICCLOSE -* features. Released version 1.1 +* features. Released version 1.1 * * Theory of operation: *
@@ -55,9 +55,9 @@#include <linux/reboot.h> #include <linux/init.h> #include <linux/spinlock.h> +#include <linux/io.h> +#include <linux/uaccess.h> -#include <asm/io.h> -#include <asm/uaccess.h> #include <asm/system.h> /* enable support for minutes as units? */
@@ -71,15 +71,15 @@#define UNIT_MINUTE 1#define MODNAME "smsc37b787_wdt: " -#define VERSION "1.1" +#define VERSION "1.1" -#define IOPORT 0x3F0 +#define IOPORT 0x3F0#define IOPORT_SIZE 2 -#define IODEV_NO 8 +#define IODEV_NO 8 -static int unit =UNIT_SECOND ;/* timer's unit */ -static int timeout =60 ;/* timeout value: default is 60 "units" */ -static unsigned long timer_enabled =0 ;/* is the timer enabled? */ +static int unit =UNIT_SECOND ;/* timer's unit */ +static int timeout =60 ;/* timeout value: default is 60 "units" */ +static unsigned long timer_enabled;/* is the timer enabled? */ static char expect_close;/* is the close expected? */
@@ -93,114 +93,121 @@ static int nowayout = WATCHDOG_NOWAYOUT;static inline void open_io_config (void ) { -outb (0x55 ,IOPORT ); +outb (0x55 ,IOPORT );mdelay (1 ); -outb (0x55 ,IOPORT ); +outb (0x55 ,IOPORT ); }/* lock the IO chip */ static inline void close_io_config (void ) { -outb (0xAA ,IOPORT ); +outb (0xAA ,IOPORT ); }/* select the IO device */ static inline void select_io_device (unsigned char devno) { -outb (0x07 ,IOPORT ); -outb (devno,IOPORT +1 ); +outb (0x07 ,IOPORT ); +outb (devno,IOPORT +1 ); }/* write to the control register */ static inline void write_io_cr (unsigned char reg,unsigned char data) { -outb (reg,IOPORT ); -outb (data,IOPORT +1 ); +outb (reg,IOPORT ); +outb (data,IOPORT +1 ); }/* read from the control register */ static inline char read_io_cr (unsigned char reg) { -outb (reg,IOPORT ); -return inb (IOPORT +1 ); +outb (reg,IOPORT ); +return inb (IOPORT +1 ); }/* -- Medium level functions ------------------------------------*/ static inline void gpio_bit12 (unsigned char reg) { -// -- General Purpose I/O Bit 1.2 -- -// Bit 0, In/Out: 0 = Output, 1 = Input -// Bit 1, Polarity: 0 = No Invert, 1 = Invert -// Bit 2, Group Enable Intr.: 0 = Disable, 1 = Enable -// Bit 3/4, Function select: 00 = GPI/O, 01 = WDT, 10 = P17, -// 11 = Either Edge Triggered Intr. 2 -// Bit 5/6 (Reserved) -// Bit 7, Output Type: 0 = Push Pull Bit, 1 = Open Drain -write_io_cr (0xE2 , reg); +/* -- General Purpose I/O Bit 1.2 -- +* Bit 0, In/Out: 0 = Output, 1 = Input +* Bit 1, Polarity: 0 = No Invert, 1 = Invert +* Bit 2, Group Enable Intr.: 0 = Disable, 1 = Enable +* Bit 3/4, Function select: 00 = GPI/O, 01 = WDT, 10 = P17, +* 11 = Either Edge Triggered Intr. 2 +* Bit 5/6 (Reserved) +* Bit 7, Output Type: 0 = Push Pull Bit, 1 = Open Drain +*/ +write_io_cr (0xE2 , reg); }static inline void gpio_bit13 (unsigned char reg) { -// -- General Purpose I/O Bit 1.3 -- -// Bit 0, In/Out: 0 = Output, 1 = Input -// Bit 1, Polarity: 0 = No Invert, 1 = Invert -// Bit 2, Group Enable Intr.: 0 = Disable, 1 = Enable -// Bit 3, Function select: 0 = GPI/O, 1 = LED -// Bit 4-6 (Reserved) -// Bit 7, Output Type: 0 = Push Pull Bit, 1 = Open Drain -write_io_cr (0xE3 , reg); +/* -- General Purpose I/O Bit 1.3 -- +* Bit 0, In/Out: 0 = Output, 1 = Input +* Bit 1, Polarity: 0 = No Invert, 1 = Invert +* Bit 2, Group Enable Intr.: 0 = Disable, 1 = Enable +* Bit 3, Function select: 0 = GPI/O, 1 = LED +* Bit 4-6 (Reserved) +* Bit 7, Output Type: 0 = Push Pull Bit, 1 = Open Drain +*/ +write_io_cr (0xE3 , reg); }static inline void wdt_timer_units (unsigned char new_units) { -// -- Watchdog timer units -- -// Bit 0-6 (Reserved) -// Bit 7, WDT Time-out Value Units Select -// (0 = Minutes, 1 = Seconds) -write_io_cr (0xF1 , new_units); +/* -- Watchdog timer units -- +* Bit 0-6 (Reserved) +* Bit 7, WDT Time-out Value Units Select +* (0 = Minutes, 1 = Seconds) +*/ +write_io_cr (0xF1 , new_units); }static inline void wdt_timeout_value (unsigned char new_timeout) { -// -- Watchdog Timer Time-out Value -- -// Bit 0-7 Binary coded units (0=Disabled, 1..255) -write_io_cr (0xF2 , new_timeout); +/* -- Watchdog Timer Time-out Value -- +* Bit 0-7 Binary coded units (0=Disabled, 1..255) +*/ +write_io_cr (0xF2 , new_timeout); }static inline void wdt_timer_conf (unsigned char conf) { -// -- Watchdog timer configuration -- -// Bit 0 Joystick enable: 0* = No Reset, 1 = Reset WDT upon Gameport I/O -// Bit 1 Keyboard enable: 0* = No Reset, 1 = Reset WDT upon KBD Intr. -// Bit 2 Mouse enable: 0* = No Reset, 1 = Reset WDT upon Mouse Intr. -// Bit 3 Reset the timer -// (Wrong in SMsC documentation? Given as: PowerLED Timout Enabled) -// Bit 4-7 WDT Interrupt Mapping: (0000* = Disabled, -// 0001=IRQ1, 0010=(Invalid), 0011=IRQ3 to 1111=IRQ15) -write_io_cr (0xF3 , conf); +/* -- Watchdog timer configuration -- +* Bit 0 Joystick enable: 0* = No Reset, 1 = Reset WDT upon +* Gameport I/O +* Bit 1 Keyboard enable: 0* = No Reset, 1 = Reset WDT upon KBD Intr. +* Bit 2 Mouse enable: 0* = No Reset, 1 = Reset WDT upon Mouse Intr +* Bit 3 Reset the timer +* (Wrong in SMsC documentation? Given as: PowerLED Timout +* Enabled) +* Bit 4-7 WDT Interrupt Mapping: (0000* = Disabled, +* 0001=IRQ1, 0010=(Invalid), 0011=IRQ3 to 1111=IRQ15) +*/ +write_io_cr (0xF3 , conf); }static inline void wdt_timer_ctrl (unsigned char reg) { -// -- Watchdog timer control -- -// Bit 0 Status Bit: 0 = Timer counting, 1 = Timeout occured -// Bit 1 Power LED Toggle: 0 = Disable Toggle, 1 = Toggle at 1 Hz -// Bit 2 Force Timeout: 1 = Forces WD timeout event (self-cleaning) -// Bit 3 P20 Force Timeout enabled: -// 0 = P20 activity does not generate the WD timeout event -// 1 = P20 Allows rising edge of P20, from the keyboard -// controller, to force the WD timeout event. -// Bit 4 (Reserved) -// -- Soft power management -- -// Bit 5 Stop Counter: 1 = Stop software power down counter -// set via register 0xB8, (self-cleaning) -// (Upon read: 0 = Counter running, 1 = Counter stopped) -// Bit 6 Restart Counter: 1 = Restart software power down counter -// set via register 0xB8, (self-cleaning) -// Bit 7 SPOFF: 1 = Force software power down (self-cleaning) - -write_io_cr (0xF4 , reg); +/* -- Watchdog timer control -- +* Bit 0 Status Bit: 0 = Timer counting, 1 = Timeout occured +* Bit 1 Power LED Toggle: 0 = Disable Toggle, 1 = Toggle at 1 Hz +* Bit 2 Force Timeout: 1 = Forces WD timeout event (self-cleaning) +* Bit 3 P20 Force Timeout enabled: +* 0 = P20 activity does not generate the WD timeout event +* 1 = P20 Allows rising edge of P20, from the keyboard +* controller, to force the WD timeout event. +* Bit 4 (Reserved) +* -- Soft power management -- +* Bit 5 Stop Counter: 1 = Stop software power down counter +* set via register 0xB8, (self-cleaning) +* (Upon read: 0 = Counter running, 1 = Counter stopped) +* Bit 6 Restart Counter: 1 = Restart software power down counter +* set via register 0xB8, (self-cleaning) +* Bit 7 SPOFF: 1 = Force software power down (self-cleaning) +*/ +write_io_cr (0xF4 , reg); }/* -- Higher level functions ------------------------------------*/
@@ -209,33 +216,34 @@ static inline void wdt_timer_ctrl(unsigned char reg)static void wb_smsc_wdt_initialize (void ) { -unsigned char old; +unsigned char old;spin_lock (&io_lock); -open_io_config (); -select_io_device (IODEV_NO ); +open_io_config (); +select_io_device (IODEV_NO ); -// enable the watchdog -gpio_bit13 (0x08 );// Select pin 80 = LED not GPIO -gpio_bit12 (0x0A );// Set pin 79 = WDT not GPIO/Output/Polarity=Invert +/* enable the watchdog */ +gpio_bit13 (0x08 );/* Select pin 80 = LED not GPIO */ +gpio_bit12 (0x0A );/* Set pin 79 = WDT not +GPIO/Output/Polarity=Invert */ +/* disable the timeout */ +wdt_timeout_value (0 ); -// disable the timeout -wdt_timeout_value (0 ); +/* reset control register */ +wdt_timer_ctrl (0x00 ); -// reset control register -wdt_timer_ctrl (0x00 ); - -// reset configuration register +/* reset configuration register */ wdt_timer_conf (0x00 ); -// read old (timer units) register - old =read_io_cr (0xF1 ) &0x7F ; -if (unit ==UNIT_SECOND ) old |=0x80 ;// set to seconds +/* read old (timer units) register */ + old =read_io_cr (0xF1 ) &0x7F ; +if (unit ==UNIT_SECOND ) + old |=0x80 ;/* set to seconds */ -// set the watchdog timer units -wdt_timer_units (old); +/* set the watchdog timer units */ +wdt_timer_units (old); -close_io_config (); +close_io_config ();spin_unlock (&io_lock); }
@@ -244,23 +252,23 @@ static void wb_smsc_wdt_initialize(void)static void wb_smsc_wdt_shutdown (void ) {spin_lock (&io_lock); -open_io_config (); -select_io_device (IODEV_NO ); +open_io_config (); +select_io_device (IODEV_NO ); -// disable the watchdog -gpio_bit13 (0x09 ); -gpio_bit12 (0x09 ); +/* disable the watchdog */ +gpio_bit13 (0x09 ); +gpio_bit12 (0x09 ); -// reset watchdog config register +/* reset watchdog config register */ wdt_timer_conf (0x00 ); -// reset watchdog control register -wdt_timer_ctrl (0x00 ); +/* reset watchdog control register */ +wdt_timer_ctrl (0x00 ); -// disable timeout -wdt_timeout_value (0x00 ); +/* disable timeout */ +wdt_timeout_value (0x00 ); -close_io_config (); +close_io_config ();spin_unlock (&io_lock); }
@@ -269,16 +277,16 @@ static void wb_smsc_wdt_shutdown(void)static void wb_smsc_wdt_set_timeout (unsigned char new_timeout) {spin_lock (&io_lock); -open_io_config (); -select_io_device (IODEV_NO ); +open_io_config (); +select_io_device (IODEV_NO ); -// set Power LED to blink, if we enable the timeout -wdt_timer_ctrl ((new_timeout ==0 ) ?0x00 :0x02 ); +/* set Power LED to blink, if we enable the timeout */ +wdt_timer_ctrl ((new_timeout ==0 ) ?0x00 :0x02 ); -// set timeout value -wdt_timeout_value (new_timeout); +/* set timeout value */ +wdt_timeout_value (new_timeout); -close_io_config (); +close_io_config ();spin_unlock (&io_lock); }
@@ -286,32 +294,32 @@ static void wb_smsc_wdt_set_timeout(unsigned char new_timeout)static unsigned char wb_smsc_wdt_get_timeout (void ) { -unsigned char set_timeout; +unsigned char set_timeout;spin_lock (&io_lock); -open_io_config (); -select_io_device (IODEV_NO ); - set_timeout =read_io_cr (0xF2 ); -close_io_config (); +open_io_config (); +select_io_device (IODEV_NO ); + set_timeout =read_io_cr (0xF2 ); +close_io_config ();spin_unlock (&io_lock); -return set_timeout; +return set_timeout; }/* disable watchdog */ static void wb_smsc_wdt_disable (void ) { -// set the timeout to 0 to disable the watchdog -wb_smsc_wdt_set_timeout (0 ); +/* set the timeout to 0 to disable the watchdog */ +wb_smsc_wdt_set_timeout (0 ); }/* enable watchdog by setting the current timeout */ static void wb_smsc_wdt_enable (void ) { -// set the current timeout... -wb_smsc_wdt_set_timeout (timeout); +/* set the current timeout... */ +wb_smsc_wdt_set_timeout (timeout); }/* reset the timer */
@@ -319,14 +327,14 @@ static void wb_smsc_wdt_enable(void)static void wb_smsc_wdt_reset_timer (void ) {spin_lock (&io_lock); -open_io_config (); -select_io_device (IODEV_NO ); +open_io_config (); +select_io_device (IODEV_NO ); -// reset the timer +/* reset the timer */ wdt_timeout_value (timeout);wdt_timer_conf (0x08 ); -close_io_config (); +close_io_config ();spin_unlock (&io_lock); }
@@ -355,7 +363,9 @@ static int wb_smsc_wdt_open(struct inode *inode, struct file *file)/* Reload and activate timer */ wb_smsc_wdt_enable (); - printk(KERN_INFO MODNAME "Watchdog enabled. Timeout set to %d %s.\n", timeout, (unit == UNIT_SECOND) ? "second(s)" : "minute(s)"); + printk(KERN_INFO MODNAME +"Watchdog enabled. Timeout set to %d %s.\n" , + timeout, (unit == UNIT_SECOND) ? "second(s)" : "minute(s)");return nonseekable_open (inode, file); }
@@ -367,10 +377,12 @@ static int wb_smsc_wdt_release(struct inode *inode, struct file *file)/* Shut off the timer. */ if (expect_close ==42 ) { -wb_smsc_wdt_disable (); - printk(KERN_INFO MODNAME "Watchdog disabled, sleeping again...\n"); +wb_smsc_wdt_disable (); + printk(KERN_INFO MODNAME + "Watchdog disabled, sleeping again...\n"); }else { - printk(KERN_CRIT MODNAME "Unexpected close, not stopping watchdog!\n"); + printk(KERN_CRIT MODNAME + "Unexpected close, not stopping watchdog!\n");wb_smsc_wdt_reset_timer (); }
@@ -392,7 +404,8 @@ static ssize_t wb_smsc_wdt_write(struct file *file, const char __user *data,/* reset expect flag */ expect_close =0 ; -/* scan to see whether or not we got the magic character */ +/* scan to see whether or not we got the +magic character */ for (i =0 ; i != len; i++) {char c;if (get_user (c, data+i))
@@ -410,8 +423,8 @@ static ssize_t wb_smsc_wdt_write(struct file *file, const char __user *data,/* ioctl => control interface */ -static int wb_smsc_wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long wb_smsc_wdt_ioctl (struct file *file, +unsigned int cmd,unsigned long arg) {int new_timeout;
@@ -420,9 +433,9 @@ static int wb_smsc_wdt_ioctl(struct inode *inode, struct file *file,int __user *i; } uarg; -static struct watchdog_info ident = { +static const struct watchdog_info ident = { .options =WDIOF_KEEPALIVEPING | -WDIOF_SETTIMEOUT | +WDIOF_SETTIMEOUT |WDIOF_MAGICCLOSE , .firmware_version =0 , .identity ="SMsC 37B787 Watchdog"
@@ -431,78 +444,62 @@ static int wb_smsc_wdt_ioctl(struct inode *inode, struct file *file, uarg.i = (int __user *)arg;switch (cmd) { -default : -return -ENOTTY ; - -case WDIOC_GETSUPPORT : -return copy_to_user (uarg.ident, &ident, -sizeof (ident)) ? -EFAULT :0 ; - -case WDIOC_GETSTATUS : -return put_user (wb_smsc_wdt_status (), uarg.i); - -case WDIOC_GETBOOTSTATUS : -return put_user (0 , uarg.i); - -case WDIOC_KEEPALIVE : -wb_smsc_wdt_reset_timer (); -return 0 ; - -case WDIOC_SETTIMEOUT : -if (get_user (new_timeout, uarg.i)) -return -EFAULT ; - -// the API states this is given in secs -if (unit ==UNIT_MINUTE ) - new_timeout /=60 ; - -if (new_timeout <0 || new_timeout >MAX_TIMEOUT ) -return -EINVAL ; - - timeout = new_timeout; -wb_smsc_wdt_set_timeout (timeout); - -// fall through and return the new timeout... - -case WDIOC_GETTIMEOUT : - - new_timeout = timeout; - -if (unit ==UNIT_MINUTE ) +case WDIOC_GETSUPPORT : +return copy_to_user (uarg.ident, &ident,sizeof (ident)) + ? -EFAULT :0 ; +case WDIOC_GETSTATUS : +return put_user (wb_smsc_wdt_status (), uarg.i); +case WDIOC_GETBOOTSTATUS : +return put_user (0 , uarg.i); +case WDIOC_KEEPALIVE : +wb_smsc_wdt_reset_timer (); +return 0 ; +case WDIOC_SETTIMEOUT : +if (get_user (new_timeout, uarg.i)) +return -EFAULT ; +/* the API states this is given in secs */ +if (unit ==UNIT_MINUTE ) + new_timeout /=60 ; +if (new_timeout <0 || new_timeout >MAX_TIMEOUT ) +return -EINVAL ; + timeout = new_timeout; +wb_smsc_wdt_set_timeout (timeout); +/* fall through and return the new timeout... */ +case WDIOC_GETTIMEOUT : + new_timeout = timeout; +if (unit ==UNIT_MINUTE ) new_timeout *=60 ; +return put_user (new_timeout, uarg.i); +case WDIOC_SETOPTIONS : + { +int options, retval = -EINVAL ; -return put_user (new_timeout, uarg.i); - -case WDIOC_SETOPTIONS : - { -int options, retval = -EINVAL ; - -if (get_user (options, uarg.i)) -return -EFAULT ; - -if (options &WDIOS_DISABLECARD ) { -wb_smsc_wdt_disable (); - retval =0 ; - } - -if (options &WDIOS_ENABLECARD ) { -wb_smsc_wdt_enable (); - retval =0 ; - } +if (get_user (options, uarg.i)) +return -EFAULT ; -return retval; +if (options &WDIOS_DISABLECARD ) { +wb_smsc_wdt_disable (); + retval =0 ; } +if (options &WDIOS_ENABLECARD ) { +wb_smsc_wdt_enable (); + retval =0 ; + } +return retval; + } +default : +return -ENOTTY ; } }/* -- Notifier funtions -----------------------------------------*/ -static int wb_smsc_wdt_notify_sys (struct notifier_block *this,unsigned long code,void *unused) +static int wb_smsc_wdt_notify_sys (struct notifier_block *this, +unsigned long code,void *unused) { -if (code ==SYS_DOWN || code ==SYS_HALT ) - { -// set timeout to 0, to avoid possible race-condition - timeout =0 ; +if (code ==SYS_DOWN || code ==SYS_HALT ) { +/* set timeout to 0, to avoid possible race-condition */ + timeout =0 ;wb_smsc_wdt_disable (); }return NOTIFY_DONE ;
@@ -510,23 +507,20 @@ static int wb_smsc_wdt_notify_sys(struct notifier_block *this, unsigned long cod/* -- Module's structures ---------------------------------------*/ -static const struct file_operations wb_smsc_wdt_fops = -{ - .owner =THIS_MODULE , +static const struct file_operations wb_smsc_wdt_fops = { + .owner =THIS_MODULE , .llseek = no_llseek, .write = wb_smsc_wdt_write, - .ioctl = wb_smsc_wdt_ioctl, + .unlocked_ioctl = wb_smsc_wdt_ioctl, .open = wb_smsc_wdt_open, .release = wb_smsc_wdt_release, }; -static struct notifier_block wb_smsc_wdt_notifier = -{ +static struct notifier_block wb_smsc_wdt_notifier = { .notifier_call = wb_smsc_wdt_notify_sys, }; -static struct miscdevice wb_smsc_wdt_miscdev = -{ +static struct miscdevice wb_smsc_wdt_miscdev = { .minor =WATCHDOG_MINOR , .name ="watchdog" , .fops = &wb_smsc_wdt_fops,
@@ -540,39 +534,44 @@ static int __init wb_smsc_wdt_init(void) {int ret; -printk ("SMsC 37B787 watchdog component driver " VERSION " initialising...\n" ); +printk (KERN_INFO "SMsC 37B787 watchdog component driver " +VERSION " initialising...\n" );if (!request_region (IOPORT ,IOPORT_SIZE ,"SMsC 37B787 watchdog" )) { - printk(KERN_ERR MODNAME "Unable to register IO port %#x\n", IOPORT); + printk(KERN_ERR MODNAME "Unable to register IO port %#x\n", + IOPORT); ret = -EBUSY ; goto out_pnp; } -// set new maximum, if it's too big -if (timeout >MAX_TIMEOUT ) - timeout =MAX_TIMEOUT ; +/* set new maximum, if it's too big */ +if (timeout >MAX_TIMEOUT ) + timeout =MAX_TIMEOUT ; -// init the watchdog timer -wb_smsc_wdt_initialize (); +/* init the watchdog timer */ +wb_smsc_wdt_initialize (); ret =register_reboot_notifier (&wb_smsc_wdt_notifier);if (ret) { - printk(KERN_ERR MODNAME "Unable to register reboot notifier err = %d\n", ret); + printk(KERN_ERR MODNAME + "Unable to register reboot notifier err = %d\n", ret); goto out_io; } ret =misc_register (&wb_smsc_wdt_miscdev);if (ret) { - printk(KERN_ERR MODNAME "Unable to register miscdev on minor %d\n", WATCHDOG_MINOR); + printk(KERN_ERR MODNAME +"Unable to register miscdev on minor %d\n" , + WATCHDOG_MINOR); goto out_rbt; } -// output info - printk(KERN_INFO MODNAME "Timeout set to %d %s.\n", timeout, (unit == UNIT_SECOND) ? "second(s)" : "minute(s)"); - printk(KERN_INFO MODNAME "Watchdog initialized and sleeping (nowayout=%d)...\n", nowayout); - -// ret = 0 - +/* output info */ + printk(KERN_INFO MODNAME "Timeout set to %d %s.\n", + timeout, (unit == UNIT_SECOND) ? "second(s)" : "minute(s)"); + printk(KERN_INFO MODNAME +"Watchdog initialized and sleeping (nowayout=%d)...\n" , + nowayout); out_clean:return ret;
@@ -591,8 +590,7 @@ out_pnp: static void __exit wb_smsc_wdt_exit(void) {/* Stop the timer before we leave */ -if (!nowayout) - { +if (!nowayout) {wb_smsc_wdt_shutdown (); printk(KERN_INFO MODNAME "Watchdog disabled.\n"); }
@@ -601,25 +599,29 @@ static void __exit wb_smsc_wdt_exit(void)unregister_reboot_notifier (&wb_smsc_wdt_notifier);release_region (IOPORT ,IOPORT_SIZE ); -printk ("SMsC 37B787 watchdog component driver removed.\n" ); +printk (KERN_INFO "SMsC 37B787 watchdog component driver removed.\n" ); }module_init (wb_smsc_wdt_init);module_exit (wb_smsc_wdt_exit);MODULE_AUTHOR ("Sven Anders <[email protected]>" ); -MODULE_DESCRIPTION ("Driver for SMsC 37B787 watchdog component (Version " VERSION ")" ); +MODULE_DESCRIPTION ("Driver for SMsC 37B787 watchdog component (Version " +VERSION ")" );MODULE_LICENSE ("GPL" );MODULE_ALIAS_MISCDEV (WATCHDOG_MINOR );#ifdef SMSC_SUPPORT_MINUTES module_param (unit, int,0 ); -MODULE_PARM_DESC (unit,"set unit to use, 0=seconds or 1=minutes, default is 0" ); +MODULE_PARM_DESC (unit, +"set unit to use, 0=seconds or 1=minutes, default is 0" );#endif module_param (timeout, int,0 );MODULE_PARM_DESC (timeout,"range is 1-255 units, default is 60" );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) ")");
PATCH 47/57 softdog: clean up, coding style and switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/softdog.c | 87 +++++++++++++++++++++++--------------------- 1 files changed, 46 insertions(+), 41 deletions(-)
drivers/watchdog/softdog.c +46 -41
@@ -47,19 +47,22 @@#include <linux/reboot.h> #include <linux/init.h> #include <linux/jiffies.h> - -#include <asm/uaccess.h> +#include <linux/uaccess.h> #define PFX "SoftDog: "#define TIMER_MARGIN 60/* Default is 60 seconds */ static int soft_margin =TIMER_MARGIN ;/* in seconds */ module_param (soft_margin, int,0 ); -MODULE_PARM_DESC(soft_margin, "Watchdog soft_margin in seconds. (0<soft_margin<65536, default=" __MODULE_STRING(TIMER_MARGIN) ")"); +MODULE_PARM_DESC (soft_margin, + "Watchdog soft_margin in seconds. (0 < soft_margin < 65536, default=" + __MODULE_STRING(TIMER_MARGIN) ")");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) ")");#ifdef ONLY_TESTING static int soft_noboot =1 ;
@@ -93,8 +96,7 @@ static void watchdog_fire(unsigned long data)if (soft_noboot) printk(KERN_CRIT PFX "Triggered - Reboot ignored.\n"); -else - { +else { printk(KERN_CRIT PFX "Initiating system reboot.\n");emergency_restart (); printk(KERN_CRIT PFX "Reboot didn't ?????\n");
@@ -153,7 +155,8 @@ static int softdog_release(struct inode *inode, struct file *file)softdog_stop ();module_put (THIS_MODULE ); }else { - printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); + printk(KERN_CRIT PFX + "Unexpected close, not stopping watchdog!\n");set_bit (0 , &orphan_timer);softdog_keepalive (); }
@@ -162,12 +165,13 @@ static int softdog_release(struct inode *inode, struct file *file)return 0 ; } -static ssize_t softdog_write (struct file *file,const char __user *data,size_t len,loff_t *ppos) +static ssize_t softdog_write (struct file *file,const char __user *data, +size_t len,loff_t *ppos) {/* * Refresh the timer. */ -if (len) { +if (len) {if (!nowayout) {size_t i;
@@ -188,13 +192,13 @@ static ssize_t softdog_write(struct file *file, const char __user *data, size_treturn len; } -static int softdog_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long softdog_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {void __user *argp = (void __user *)arg;int __user *p = argp;int new_margin; -static struct watchdog_info ident = { +static const struct watchdog_info ident = { .options =WDIOF_SETTIMEOUT |WDIOF_KEEPALIVEPING |WDIOF_MAGICCLOSE ,
@@ -202,26 +206,25 @@ static int softdog_ioctl(struct inode *inode, struct file *file, .identity = "Software Watchdog", };switch (cmd) { -default : -return -ENOTTY ; -case WDIOC_GETSUPPORT : -return copy_to_user (argp, &ident, -sizeof (ident)) ? -EFAULT :0 ; -case WDIOC_GETSTATUS : -case WDIOC_GETBOOTSTATUS : -return put_user (0 , p); -case WDIOC_KEEPALIVE : -softdog_keepalive (); -return 0 ; -case WDIOC_SETTIMEOUT : -if (get_user (new_margin, p)) -return -EFAULT ; -if (softdog_set_heartbeat (new_margin)) -return -EINVAL ; -softdog_keepalive (); -/* Fall */ -case WDIOC_GETTIMEOUT : -return put_user (soft_margin, p); +default : +return -ENOTTY ; +case WDIOC_GETSUPPORT : +return copy_to_user (argp, &ident,sizeof (ident)) ? -EFAULT :0 ; +case WDIOC_GETSTATUS : +case WDIOC_GETBOOTSTATUS : +return put_user (0 , p); +case WDIOC_KEEPALIVE : +softdog_keepalive (); +return 0 ; +case WDIOC_SETTIMEOUT : +if (get_user (new_margin, p)) +return -EFAULT ; +if (softdog_set_heartbeat (new_margin)) +return -EINVAL ; +softdog_keepalive (); +/* Fall */ +case WDIOC_GETTIMEOUT : +return put_user (soft_margin, p); } }
@@ -232,10 +235,9 @@ static int softdog_ioctl(struct inode *inode, struct file *file,static int softdog_notify_sys (struct notifier_block *this,unsigned long code,void *unused) { -if (code==SYS_DOWN || code==SYS_HALT ) { +if (code ==SYS_DOWN || code ==SYS_HALT )/* Turn the WDT off */ softdog_stop (); - }return NOTIFY_DONE ; }
@@ -247,7 +249,7 @@ static const struct file_operations softdog_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = softdog_write, - .ioctl = softdog_ioctl, + .unlocked_ioctl = softdog_ioctl, .open = softdog_open, .release = softdog_release, };
@@ -268,24 +270,27 @@ static int __init watchdog_init(void) {int ret; -/* Check that the soft_margin value is within it's range ; if not reset to the default */ +/* Check that the soft_margin value is within it's range; +if not reset to the default */ if (softdog_set_heartbeat (soft_margin)) {softdog_set_heartbeat (TIMER_MARGIN ); - printk(KERN_INFO PFX "soft_margin value must be 0<soft_margin<65536, using %d\n", + printk(KERN_INFO PFX +"soft_margin must be 0 < soft_margin < 65536, using %d\n" , TIMER_MARGIN); } ret =register_reboot_notifier (&softdog_notifier);if (ret) { - printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", - ret); + printk(KERN_ERR PFX + "cannot register reboot notifier (err=%d)\n", ret);return ret; } ret =misc_register (&softdog_miscdev);if (ret) { - printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - WATCHDOG_MINOR, ret); + printk(KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + WATCHDOG_MINOR, ret);unregister_reboot_notifier (&softdog_notifier);return ret; }
PATCH 48/57 txx9: Fix locking, switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/txx9wdt.c | 31 +++++++++++++++++++------------ 1 files changed, 19 insertions(+), 12 deletions(-)
drivers/watchdog/txx9wdt.c +19 -12
@@ -45,27 +45,34 @@ static unsigned long txx9wdt_alive;static int expect_close;static struct txx9_tmr_reg __iomem *txx9wdt_reg;static struct clk *txx9_imclk; +static DECLARE_LOCK (txx9_lock);static void txx9wdt_ping (void ) { +spin_lock (&txx9_lock);__raw_writel (TXx9_TMWTMR_TWIE | TXx9_TMWTMR_TWC, &txx9wdt_reg->wtmr); +spin_unlock (&txx9_lock); }static void txx9wdt_start (void ) { +spin_lock (&txx9_lock);__raw_writel (WD_TIMER_CLK * timeout, &txx9wdt_reg->cpra);__raw_writel (WD_TIMER_CCD , &txx9wdt_reg->ccdr);__raw_writel (0 , &txx9wdt_reg->tisr);/* clear pending interrupt */ __raw_writel (TXx9_TMTCR_TCE | TXx9_TMTCR_CCDE | TXx9_TMTCR_TMODE_WDOG, &txx9wdt_reg->tcr);__raw_writel (TXx9_TMWTMR_TWIE | TXx9_TMWTMR_TWC, &txx9wdt_reg->wtmr); +spin_unlock (&txx9_lock); }static void txx9wdt_stop (void ) { +spin_lock (&txx9_lock);__raw_writel (TXx9_TMWTMR_WDIS, &txx9wdt_reg->wtmr);__raw_writel (__raw_readl (&txx9wdt_reg->tcr) & ~TXx9_TMTCR_TCE, &txx9wdt_reg->tcr); +spin_unlock (&txx9_lock); }static int txx9wdt_open (struct inode *inode,struct file *file)
@@ -120,13 +127,13 @@ static ssize_t txx9wdt_write(struct file *file, const char __user *data,return len; } -static int txx9wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long txx9wdt_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {void __user *argp = (void __user *)arg;int __user *p = argp;int new_timeout; -static struct watchdog_info ident = { +static const struct watchdog_info ident = { .options =WDIOF_SETTIMEOUT |WDIOF_KEEPALIVEPING |WDIOF_MAGICCLOSE ,
@@ -168,18 +175,18 @@ static int txx9wdt_notify_sys(struct notifier_block *this, unsigned long code, }static const struct file_operations txx9wdt_fops = { - .owner =THIS_MODULE , - .llseek = no_llseek, - .write = txx9wdt_write, - .ioctl = txx9wdt_ioctl, - .open = txx9wdt_open, - .release = txx9wdt_release, + .owner =THIS_MODULE , + .llseek = no_llseek, + .write = txx9wdt_write, + .unlocked_ioctl = txx9wdt_ioctl, + .open = txx9wdt_open, + .release = txx9wdt_release, };static struct miscdevice txx9wdt_miscdev = { - .minor =WATCHDOG_MINOR , - .name ="watchdog" , - .fops = &txx9wdt_fops, + .minor =WATCHDOG_MINOR , + .name ="watchdog" , + .fops = &txx9wdt_fops, };static struct notifier_block txx9wdt_notifier = {
PATCH 49/57 w83627hf: coding style, clean up and switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/w83627hf_wdt.c | 175 ++++++++++++++++++--------------------- 1 files changed, 83 insertions(+), 92 deletions(-)
drivers/watchdog/w83627hf_wdt.c +83 -92
@@ -37,9 +37,9 @@#include <linux/reboot.h> #include <linux/init.h> #include <linux/spinlock.h> +#include <linux/io.h> +#include <linux/uaccess.h> -#include <asm/io.h> -#include <asm/uaccess.h> #include <asm/system.h> #define WATCHDOG_NAME "w83627hf/thf/hg WDT"
@@ -57,22 +57,26 @@ MODULE_PARM_DESC(wdt_io, "w83627hf/thf WDT io port (default 0x2E)");static int timeout =WATCHDOG_TIMEOUT ;/* in seconds */ module_param (timeout, int,0 ); -MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=255, default=" __MODULE_STRING(WATCHDOG_TIMEOUT) "."); +MODULE_PARM_DESC (timeout, + "Watchdog timeout in seconds. 1 <= timeout <= 255, 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) ")");/* * Kernel methods. */ #define WDT_EFER (wdt_io+0)/* Extended Function Enable Registers */ -#define WDT_EFIR (wdt_io+0)/* Extended Function Index Register (same as EFER) */ +#define WDT_EFIR (wdt_io+0)/* Extended Function Index Register +(same as EFER) */ #define WDT_EFDR (WDT_EFIR+1)/* Extended Function Data Register */ -static void -w83627hf_select_wd_register (void ) +static void w83627hf_select_wd_register (void ) {unsigned char c;outb_p (0x87 ,WDT_EFER );/* Enter extended function mode */
@@ -93,43 +97,45 @@ w83627hf_select_wd_register(void)outb_p (0x01 ,WDT_EFDR );/* set bit 0 to activate GPIO2 */ } -static void -w83627hf_unselect_wd_register (void ) +static void w83627hf_unselect_wd_register (void ) {outb_p (0xAA ,WDT_EFER );/* Leave extended function mode */ }/* tyan motherboards seem to set F5 to 0x4C ? * So explicitly init to appropriate value. */ -static void -w83627hf_init (void ) + +static void w83627hf_init (void ) {unsigned char t;w83627hf_select_wd_register ();outb_p (0xF6 ,WDT_EFER );/* Select CRF6 */ - t=inb_p (WDT_EFDR );/* read CRF6 */ + t =inb_p (WDT_EFDR );/* read CRF6 */ if (t !=0 ) { - printk (KERN_INFO PFX "Watchdog already running. Resetting timeout to %d sec\n", timeout); + printk(KERN_INFO PFX +"Watchdog already running. Resetting timeout to %d sec\n" , + timeout);outb_p (timeout,WDT_EFDR );/* Write back to CRF6 */ }outb_p (0xF5 ,WDT_EFER );/* Select CRF5 */ - t=inb_p (WDT_EFDR );/* read CRF5 */ - t&=~0x0C ;/* set second mode & disable keyboard turning off watchdog */ + t =inb_p (WDT_EFDR );/* read CRF5 */ + t &= ~0x0C ;/* set second mode & disable keyboard +turning off watchdog */ outb_p (t,WDT_EFDR );/* Write back to CRF5 */ outb_p (0xF7 ,WDT_EFER );/* Select CRF7 */ - t=inb_p (WDT_EFDR );/* read CRF7 */ - t&=~0xC0 ;/* disable keyboard & mouse turning off watchdog */ + t =inb_p (WDT_EFDR );/* read CRF7 */ + t &= ~0xC0 ;/* disable keyboard & mouse turning off +watchdog */ outb_p (t,WDT_EFDR );/* Write back to CRF7 */ w83627hf_unselect_wd_register (); } -static void -wdt_ctrl (int timeout) +static void wdt_ctrl (int timeout) {spin_lock (&io_lock);
@@ -143,32 +149,28 @@ wdt_ctrl(int timeout)spin_unlock (&io_lock); } -static int -wdt_ping (void ) +static int wdt_ping (void ) {wdt_ctrl (timeout);return 0 ; } -static int -wdt_disable (void ) +static int wdt_disable (void ) {wdt_ctrl (0 );return 0 ; } -static int -wdt_set_heartbeat (int t) +static int wdt_set_heartbeat (int t) { -if ((t <1 ) || (t >255 )) +if (t <1 || t >255 )return -EINVAL ; - timeout = t;return 0 ; } -static ssize_t -wdt_write (struct file *file,const char __user *buf,size_t count,loff_t *ppos) +static ssize_t wdt_write (struct file *file,const char __user *buf, +size_t count,loff_t *ppos) {if (count) {if (!nowayout) {
@@ -189,72 +191,61 @@ wdt_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)return count; } -static int -wdt_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long wdt_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {void __user *argp = (void __user *)arg;int __user *p = argp;int new_timeout;static struct watchdog_info ident = { - .options =WDIOF_KEEPALIVEPING |WDIOF_SETTIMEOUT |WDIOF_MAGICCLOSE , + .options =WDIOF_KEEPALIVEPING |WDIOF_SETTIMEOUT | +WDIOF_MAGICCLOSE , .firmware_version =1 , .identity ="W83627HF WDT" , };switch (cmd) {case WDIOC_GETSUPPORT : -if (copy_to_user (argp, &ident,sizeof (ident))) -return -EFAULT ; -break ; - +if (copy_to_user (argp, &ident,sizeof (ident))) +return -EFAULT ; +break ;case WDIOC_GETSTATUS :case WDIOC_GETBOOTSTATUS : -return put_user (0 , p); - +return put_user (0 , p);case WDIOC_KEEPALIVE : -wdt_ping (); -break ; - +wdt_ping (); +break ;case WDIOC_SETTIMEOUT : -if (get_user (new_timeout, p)) -return -EFAULT ; -if (wdt_set_heartbeat (new_timeout)) -return -EINVAL ; -wdt_ping (); -/* Fall */ - +if (get_user (new_timeout, p)) +return -EFAULT ; +if (wdt_set_heartbeat (new_timeout)) +return -EINVAL ; +wdt_ping (); +/* Fall */ case WDIOC_GETTIMEOUT : -return put_user (timeout, p); - +return put_user (timeout, p);case WDIOC_SETOPTIONS : { -int options, retval = -EINVAL ; - -if (get_user (options, p)) -return -EFAULT ; - -if (options &WDIOS_DISABLECARD ) { -wdt_disable (); - retval =0 ; - } - -if (options &WDIOS_ENABLECARD ) { -wdt_ping (); - retval =0 ; - } +int options, retval = -EINVAL ; -return retval; +if (get_user (options, p)) +return -EFAULT ; +if (options &WDIOS_DISABLECARD ) { +wdt_disable (); + retval =0 ; + } +if (options &WDIOS_ENABLECARD ) { +wdt_ping (); + retval =0 ; + } +return retval; } -default : -return -ENOTTY ; +return -ENOTTY ; }return 0 ; } -static int -wdt_open (struct inode *inode,struct file *file) +static int wdt_open (struct inode *inode,struct file *file) {if (test_and_set_bit (0 , &wdt_is_open))return -EBUSY ;
@@ -266,13 +257,13 @@ wdt_open(struct inode *inode, struct file *file)return nonseekable_open (inode, file); } -static int -wdt_close (struct inode *inode,struct file *file) +static int wdt_close (struct inode *inode,struct file *file) { -if (expect_close ==42 ) { +if (expect_close ==42 )wdt_disable (); - }else { - printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); +else { + printk(KERN_CRIT PFX + "Unexpected close, not stopping watchdog!\n");wdt_ping (); } expect_close =0 ;
@@ -284,8 +275,7 @@ wdt_close(struct inode *inode, struct file *file)* Notifier for system down */ -static int -wdt_notify_sys (struct notifier_block *this,unsigned long code, +static int wdt_notify_sys (struct notifier_block *this,unsigned long code,void *unused) {if (code ==SYS_DOWN || code ==SYS_HALT ) {
@@ -303,7 +293,7 @@ static const struct file_operations wdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = wdt_write, - .ioctl = wdt_ioctl, + .unlocked_ioctl = wdt_ioctl, .open = wdt_open, .release = wdt_close, };
@@ -323,8 +313,7 @@ static struct notifier_block wdt_notifier = { .notifier_call = wdt_notify_sys, }; -static int __init -wdt_init (void ) +static int __init wdt_init (void ) {int ret;
@@ -332,12 +321,13 @@ wdt_init(void)if (wdt_set_heartbeat (timeout)) {wdt_set_heartbeat (WATCHDOG_TIMEOUT ); - printk (KERN_INFO PFX "timeout value must be 1<=timeout<=255, using %d\n", - WATCHDOG_TIMEOUT); + printk(KERN_INFO PFX +"timeout value must be 1 <= timeout <= 255, using %d\n" , + WATCHDOG_TIMEOUT); }if (!request_region (wdt_io,1 ,WATCHDOG_NAME )) { - printk (KERN_ERR PFX "I/O address 0x%04x already in use\n", + printk(KERN_ERR PFX "I/O address 0x%04x already in use\n", wdt_io); ret = -EIO ; goto out;
@@ -347,20 +337,22 @@ wdt_init(void) ret =register_reboot_notifier (&wdt_notifier);if (ret !=0 ) { - printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", - ret); + printk(KERN_ERR PFX + "cannot register reboot notifier (err=%d)\n", ret); goto unreg_regions; } ret =misc_register (&wdt_miscdev);if (ret !=0 ) { - printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - WATCHDOG_MINOR, ret); + printk(KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + WATCHDOG_MINOR, ret); goto unreg_reboot; } - printk (KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d)\n", - timeout, nowayout); + printk(KERN_INFO PFX +"initialized. timeout=%d sec (nowayout=%d)\n" , + timeout, nowayout); out:return ret;
@@ -371,12 +363,11 @@ unreg_regions: goto out; } -static void __exit -wdt_exit (void ) +static void __exit wdt_exit(void) {misc_deregister (&wdt_miscdev);unregister_reboot_notifier (&wdt_notifier); -release_region (wdt_io,1 ); +release_region (wdt_io,1 ); }module_init (wdt_init);
PATCH 50/57 w83697hf_wdt: cleanup, coding style and switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/w83697hf_wdt.c | 141 +++++++++++++++++++-------------------- 1 files changed, 69 insertions(+), 72 deletions(-)
drivers/watchdog/w83697hf_wdt.c +69 -72
@@ -36,9 +36,9 @@#include <linux/reboot.h> #include <linux/init.h> #include <linux/spinlock.h> +#include <linux/io.h> +#include <linux/uaccess.h> -#include <asm/io.h> -#include <asm/uaccess.h> #include <asm/system.h> #define WATCHDOG_NAME "w83697hf/hg WDT"
@@ -52,33 +52,37 @@ static DEFINE_SPINLOCK(io_lock);/* You must set this - there is no sane way to probe for this board. */ static int wdt_io =0x2e ;module_param (wdt_io, int,0 ); -MODULE_PARM_DESC (wdt_io,"w83697hf/hg WDT io port (default 0x2e, 0 = autodetect)" ); +MODULE_PARM_DESC (wdt_io, +"w83697hf/hg WDT io port (default 0x2e, 0 = autodetect)" );static int timeout =WATCHDOG_TIMEOUT ;/* in seconds */ module_param (timeout, int,0 ); -MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=255, default=" __MODULE_STRING(WATCHDOG_TIMEOUT) "."); +MODULE_PARM_DESC (timeout, + "Watchdog timeout in seconds. 1<= timeout <=255, 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) ")");/* * Kernel methods. */ -#define W83697HF_EFER (wdt_io+0)/* Extended Function Enable Register */ -#define W83697HF_EFIR (wdt_io+0)/* Extended Function Index Register (same as EFER) */ -#define W83697HF_EFDR (wdt_io+1)/* Extended Function Data Register */ +#define W83697HF_EFER (wdt_io + 0)/* Extended Function Enable Register */ +#define W83697HF_EFIR (wdt_io + 0)/* Extended Function Index Register +(same as EFER) */ +#define W83697HF_EFDR (wdt_io + 1)/* Extended Function Data Register */ -static inline void -w83697hf_unlock (void ) +static inline void w83697hf_unlock (void ) {outb_p (0x87 ,W83697HF_EFER );/* Enter extended function mode */ outb_p (0x87 ,W83697HF_EFER );/* Again according to manual */ } -static inline void -w83697hf_lock (void ) +static inline void w83697hf_lock (void ) {outb_p (0xAA ,W83697HF_EFER );/* Leave extended function mode */ }
@@ -88,41 +92,36 @@ w83697hf_lock(void)* w83697hf_write_timeout() must be called with the device unlocked. */ -static unsigned char -w83697hf_get_reg (unsigned char reg) +static unsigned char w83697hf_get_reg (unsigned char reg) {outb_p (reg,W83697HF_EFIR );return inb_p (W83697HF_EFDR ); } -static void -w83697hf_set_reg (unsigned char reg,unsigned char data) +static void w83697hf_set_reg (unsigned char reg,unsigned char data) {outb_p (reg,W83697HF_EFIR );outb_p (data,W83697HF_EFDR ); } -static void -w83697hf_write_timeout (int timeout) +static void w83697hf_write_timeout (int timeout) { -w83697hf_set_reg (0xF4 , timeout);/* Write Timeout counter to CRF4 */ +/* Write Timeout counter to CRF4 */ +w83697hf_set_reg (0xF4 , timeout); } -static void -w83697hf_select_wdt (void ) +static void w83697hf_select_wdt (void ) {w83697hf_unlock ();w83697hf_set_reg (0x07 ,0x08 );/* Switch to logic device 8 (GPIO2) */ } -static inline void -w83697hf_deselect_wdt (void ) +static inline void w83697hf_deselect_wdt (void ) {w83697hf_lock (); } -static void -w83697hf_init (void ) +static void w83697hf_init (void ) {unsigned char bbuf;
@@ -131,7 +130,9 @@ w83697hf_init(void) bbuf =w83697hf_get_reg (0x29 ); bbuf &= ~0x60 ; bbuf |=0x20 ; -w83697hf_set_reg (0x29 , bbuf);/* Set pin 119 to WDTO# mode (= CR29, WDT0) */ + +/* Set pin 119 to WDTO# mode (= CR29, WDT0) */ +w83697hf_set_reg (0x29 , bbuf); bbuf =w83697hf_get_reg (0xF3 ); bbuf &= ~0x04 ;
@@ -140,8 +141,7 @@ w83697hf_init(void)w83697hf_deselect_wdt (); } -static int -wdt_ping (void ) +static int wdt_ping (void ) {spin_lock (&io_lock);w83697hf_select_wdt ();
@@ -153,8 +153,7 @@ wdt_ping(void)return 0 ; } -static int -wdt_enable (void ) +static int wdt_enable (void ) {spin_lock (&io_lock);w83697hf_select_wdt ();
@@ -167,8 +166,7 @@ wdt_enable(void)return 0 ; } -static int -wdt_disable (void ) +static int wdt_disable (void ) {spin_lock (&io_lock);w83697hf_select_wdt ();
@@ -181,18 +179,17 @@ wdt_disable(void)return 0 ; } -static int -wdt_set_heartbeat (int t) +static int wdt_set_heartbeat (int t) { -if ((t <1 ) || (t >255 )) +if (t <1 || t >255 )return -EINVAL ; timeout = t;return 0 ; } -static ssize_t -wdt_write (struct file *file,const char __user *buf,size_t count,loff_t *ppos) +static ssize_t wdt_write (struct file *file,const char __user *buf, +size_t count,loff_t *ppos) {if (count) {if (!nowayout) {
@@ -213,15 +210,14 @@ wdt_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)return count; } -static int -wdt_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long wdt_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {void __user *argp = (void __user *)arg;int __user *p = argp;int new_timeout; -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 ="W83697HF WDT" , };
@@ -277,8 +273,7 @@ wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,return 0 ; } -static int -wdt_open (struct inode *inode,struct file *file) +static int wdt_open (struct inode *inode,struct file *file) {if (test_and_set_bit (0 , &wdt_is_open))return -EBUSY ;
@@ -290,13 +285,13 @@ wdt_open(struct inode *inode, struct file *file)return nonseekable_open (inode, file); } -static int -wdt_close (struct inode *inode,struct file *file) +static int wdt_close (struct inode *inode,struct file *file) { -if (expect_close ==42 ) { +if (expect_close ==42 )wdt_disable (); - }else { - printk (KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); +else { + printk(KERN_CRIT PFX + "Unexpected close, not stopping watchdog!\n");wdt_ping (); } expect_close =0 ;
@@ -308,8 +303,7 @@ wdt_close(struct inode *inode, struct file *file)* Notifier for system down */ -static int -wdt_notify_sys (struct notifier_block *this,unsigned long code, +static int wdt_notify_sys (struct notifier_block *this,unsigned long code,void *unused) {if (code ==SYS_DOWN || code ==SYS_HALT ) {
@@ -327,7 +321,7 @@ static const struct file_operations wdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = wdt_write, - .ioctl = wdt_ioctl, + .unlocked_ioctl = wdt_ioctl, .open = wdt_open, .release = wdt_close, };
@@ -347,36 +341,38 @@ static struct notifier_block wdt_notifier = { .notifier_call = wdt_notify_sys, }; -static int -w83697hf_check_wdt (void ) +static int w83697hf_check_wdt (void ) {if (!request_region (wdt_io,2 ,WATCHDOG_NAME )) { - printk (KERN_ERR PFX "I/O address 0x%x already in use\n", wdt_io); + printk(KERN_ERR PFX + "I/O address 0x%x already in use\n", wdt_io);return -EIO ; } - printk (KERN_DEBUG PFX "Looking for watchdog at address 0x%x\n", wdt_io); + printk(KERN_DEBUG PFX + "Looking for watchdog at address 0x%x\n", wdt_io);w83697hf_unlock ();if (w83697hf_get_reg (0x20 ) ==0x60 ) { - printk (KERN_INFO PFX "watchdog found at address 0x%x\n", wdt_io); + printk(KERN_INFO PFX + "watchdog found at address 0x%x\n", wdt_io);w83697hf_lock ();return 0 ; } -w83697hf_lock ();/* Reprotect in case it was a compatible device */ +/* Reprotect in case it was a compatible device */ +w83697hf_lock (); - printk (KERN_INFO PFX "watchdog not found at address 0x%x\n", wdt_io); + printk(KERN_INFO PFX "watchdog not found at address 0x%x\n", wdt_io);release_region (wdt_io,2 );return -EIO ; }static int w83697hf_ioports[] = {0x2e ,0x4e ,0x00 }; -static int __init -wdt_init (void ) +static int __init wdt_init (void ) {int ret, i, found =0 ; - printk (KERN_INFO PFX "WDT driver for W83697HF/HG initializing\n"); + printk(KERN_INFO PFX "WDT driver for W83697HF/HG initializing\n");if (wdt_io ==0 ) {/* we will autodetect the W83697HF/HG watchdog */
@@ -391,7 +387,7 @@ wdt_init(void) }if (!found) { - printk (KERN_ERR PFX "No W83697HF/HG could be found\n"); + printk(KERN_ERR PFX "No W83697HF/HG could be found\n"); ret = -EIO ; goto out; }
@@ -401,25 +397,27 @@ wdt_init(void)if (wdt_set_heartbeat (timeout)) {wdt_set_heartbeat (WATCHDOG_TIMEOUT ); - printk (KERN_INFO PFX "timeout value must be 1<=timeout<=255, using %d\n", - WATCHDOG_TIMEOUT); + printk(KERN_INFO PFX +"timeout value must be 1 <= timeout <= 255, using %d\n" , + WATCHDOG_TIMEOUT); } ret =register_reboot_notifier (&wdt_notifier);if (ret !=0 ) { - printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", - ret); + printk(KERN_ERR PFX + "cannot register reboot notifier (err=%d)\n", ret); goto unreg_regions; } ret =misc_register (&wdt_miscdev);if (ret !=0 ) { - printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - WATCHDOG_MINOR, ret); + printk(KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + WATCHDOG_MINOR, ret); goto unreg_reboot; } - printk (KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d)\n", + printk(KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d)\n", timeout, nowayout); out:
@@ -431,8 +429,7 @@ unreg_regions: goto out; } -static void __exit -wdt_exit (void ) +static void __exit wdt_exit(void) {misc_deregister (&wdt_miscdev);unregister_reboot_notifier (&wdt_notifier);
PATCH 51/57 w83877f_wdt: clean up code, coding style, switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/w83877f_wdt.c | 199 ++++++++++++++++++++-------------------- 1 files changed, 101 insertions(+), 98 deletions(-)
drivers/watchdog/w83877f_wdt.c +101 -98
@@ -23,13 +23,16 @@* Added KERN_* tags to printks * add CONFIG_WATCHDOG_NOWAYOUT support * fix possible wdt_is_open race -* changed watchdog_info to correctly reflect what the driver offers -* added WDIOC_GETSTATUS, WDIOC_GETBOOTSTATUS, WDIOC_SETTIMEOUT, +* changed watchdog_info to correctly reflect what +* the driver offers +* added WDIOC_GETSTATUS, WDIOC_GETBOOTSTATUS, +* WDIOC_SETTIMEOUT, * WDIOC_GETTIMEOUT, and WDIOC_SETOPTIONS ioctls * 09/8 - 2003 [[email protected]] cleanup of trailing spaces * added extra printk's for startup problems * use module_param -* made timeout (the emulated heartbeat) a module_param +* made timeout (the emulated heartbeat) a +* module_param * made the keepalive ping an internal subroutine * * This WDT driver is different from most other Linux WDT
@@ -51,8 +54,8 @@#include <linux/notifier.h> #include <linux/reboot.h> #include <linux/init.h> -#include <asm/io.h> -#include <asm/uaccess.h> +#include <linux/io.h> +#include <linux/uaccess.h> #include <asm/system.h> #define OUR_NAME "w83877f_wdt"
@@ -80,14 +83,19 @@*/ #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) ")");static void wdt_timer_ping (unsigned long ); static DEFINE_TIMER(timer, wdt_timer_ping, 0, 0);
@@ -105,8 +113,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);
@@ -118,9 +125,9 @@ static void wdt_timer_ping(unsigned long data)spin_unlock (&wdt_spinlock); - }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" ); }/*
@@ -181,22 +188,21 @@ static void wdt_keepalive(void)* /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) - { -if (!nowayout) - { +if (count) { +if (!nowayout) {size_t ofs; -/* note: just in case someone wrote the magic character -* five months ago... */ +/* note: just in case someone wrote the magic +character five months ago... */ wdt_expect_close =0 ; -/* scan to see whether or not we got the magic character */ -for (ofs =0 ; ofs != count; ofs++) - { +/* scan to see whether or not we got the +magic character */ +for (ofs =0 ; ofs != count; ofs++) {char c;if (get_user (c, buf + ofs))return -EFAULT ;
@@ -211,10 +217,10 @@ static ssize_t fop_write(struct file * file, const char __user * buf, size_t coureturn count; } -static int fop_open (struct inode * inode,struct file * file) +static int fop_open (struct inode *inode,struct file *file) {/* Just in case we're already talking to someone... */ -if (test_and_set_bit (0 , &wdt_is_open)) +if (test_and_set_bit (0 , &wdt_is_open))return -EBUSY ;/* Good, fire up the show */
@@ -222,78 +228,78 @@ static int fop_open(struct inode * inode, struct file * file)return nonseekable_open (inode, file); } -static int fop_close (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 {del_timer (&timer); - printk(KERN_CRIT PFX "device file closed unexpectedly. Will not stop the WDT!\n"); + printk(KERN_CRIT PFX + "device file closed unexpectedly. Will not stop the WDT!\n"); }clear_bit (0 , &wdt_is_open); wdt_expect_close =0 ;return 0 ; } -static int fop_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long 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 ="W83877F" , }; -switch (cmd) +switch (cmd) { +default : +return -ENOTTY ; +case WDIOC_GETSUPPORT : +return copy_to_user (argp, &ident,sizeof (ident)) ? -EFAULT :0 ; +case WDIOC_GETSTATUS : +case WDIOC_GETBOOTSTATUS : +return put_user (0 , p); +case WDIOC_KEEPALIVE : +wdt_keepalive (); +return 0 ; +case WDIOC_SETOPTIONS : { -default : -return -ENOTTY ; -case WDIOC_GETSUPPORT : -return copy_to_user (argp, &ident,sizeof (ident))?-EFAULT :0 ; -case WDIOC_GETSTATUS : -case WDIOC_GETBOOTSTATUS : -return put_user (0 , p); -case WDIOC_KEEPALIVE : -wdt_keepalive (); -return 0 ; -case WDIOC_SETOPTIONS : - { -int new_options, retval = -EINVAL ; - -if (get_user (new_options, p)) -return -EFAULT ; - -if (new_options &WDIOS_DISABLECARD ) { -wdt_turnoff (); - retval =0 ; - } +int new_options, retval = -EINVAL ; -if (new_options &WDIOS_ENABLECARD ) { -wdt_startup (); - retval =0 ; - } +if (get_user (new_options, p)) +return -EFAULT ; -return retval; +if (new_options &WDIOS_DISABLECARD ) { +wdt_turnoff (); + retval =0 ; } -case WDIOC_SETTIMEOUT : - { -int new_timeout; -if (get_user (new_timeout, p)) -return -EFAULT ; +if (new_options &WDIOS_ENABLECARD ) { +wdt_startup (); + retval =0 ; + } -if (new_timeout <1 || new_timeout >3600 )/* arbitrary upper limit */ -return -EINVAL ; +return retval; + } +case WDIOC_SETTIMEOUT : + { +int new_timeout; - timeout = new_timeout; -wdt_keepalive (); -/* Fall through */ - } -case WDIOC_GETTIMEOUT : -return put_user (timeout, p); +if (get_user (new_timeout, p)) +return -EFAULT ; + +/* arbitrary upper limit */ +if (new_timeout <1 || new_timeout >3600 ) +return -EINVAL ; + + timeout = new_timeout; +wdt_keepalive (); +/* Fall through */ + } +case WDIOC_GETTIMEOUT : +return put_user (timeout, p); } }
@@ -303,7 +309,7 @@ static const struct file_operations wdt_fops = { .write = fop_write, .open = fop_open, .release = fop_close, - .ioctl = fop_ioctl, + .unlocked_ioctl = fop_ioctl, };static struct miscdevice wdt_miscdev = {
@@ -319,7 +325,7 @@ static struct miscdevice wdt_miscdev = {static int wdt_notify_sys (struct notifier_block *this,unsigned long code,void *unused) { -if (code==SYS_DOWN || code==SYS_HALT ) +if (code ==SYS_DOWN || code ==SYS_HALT )wdt_turnoff ();return NOTIFY_DONE ; }
@@ -329,8 +335,7 @@ static int wdt_notify_sys(struct notifier_block *this, unsigned long code,* turn the timebomb registers off. */ -static struct notifier_block wdt_notifier= -{ +static struct notifier_block wdt_notifier = { .notifier_call = wdt_notify_sys, };
@@ -342,31 +347,29 @@ static void __exit w83877f_wdt_unload(void)misc_deregister (&wdt_miscdev);unregister_reboot_notifier (&wdt_notifier); -release_region (WDT_PING ,1 ); -release_region (ENABLE_W83877F_PORT ,2 ); +release_region (WDT_PING ,1 ); +release_region (ENABLE_W83877F_PORT ,2 ); }static int __init w83877f_wdt_init (void ) {int rc = -EBUSY ; -if (timeout <1 || timeout >3600 )/* arbitrary upper limit */ - { +if (timeout <1 || timeout >3600 ) {/* arbitrary upper limit */ timeout =WATCHDOG_TIMEOUT ; - printk(KERN_INFO PFX "timeout value must be 1<=x<=3600, using %d\n", - timeout); + printk(KERN_INFO PFX +"timeout value must be 1 <= x <= 3600, using %d\n" , + timeout); } -if (!request_region (ENABLE_W83877F_PORT ,2 ,"W83877F WDT" )) - { +if (!request_region (ENABLE_W83877F_PORT ,2 ,"W83877F WDT" )) { printk(KERN_ERR PFX "I/O address 0x%04x already in use\n", ENABLE_W83877F_PORT); rc = -EIO ; goto err_out; } -if (!request_region (WDT_PING ,1 ,"W8387FF WDT" )) - { +if (!request_region (WDT_PING ,1 ,"W8387FF WDT" )) { printk(KERN_ERR PFX "I/O address 0x%04x already in use\n", WDT_PING); rc = -EIO ;
@@ -374,22 +377,22 @@ static int __init w83877f_wdt_init(void) } rc =register_reboot_notifier (&wdt_notifier); -if (rc) - { - printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", - rc); +if (rc) { + printk(KERN_ERR PFX + "cannot register reboot notifier (err=%d)\n", rc); goto err_out_region2; } rc =misc_register (&wdt_miscdev); -if (rc) - { - printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - wdt_miscdev.minor, rc); +if (rc) { + printk(KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + wdt_miscdev.minor, rc); goto err_out_reboot; } - printk(KERN_INFO PFX "WDT driver for W83877F initialised. timeout=%d sec (nowayout=%d)\n", + printk(KERN_INFO PFX +"WDT driver for W83877F initialised. timeout=%d sec (nowayout=%d)\n" , timeout, nowayout);return 0 ;
@@ -397,9 +400,9 @@ static int __init w83877f_wdt_init(void) err_out_reboot:unregister_reboot_notifier (&wdt_notifier); err_out_region2: -release_region (WDT_PING ,1 ); +release_region (WDT_PING ,1 ); err_out_region1: -release_region (ENABLE_W83877F_PORT ,2 ); +release_region (ENABLE_W83877F_PORT ,2 ); err_out:return rc; }
PATCH 52/57 w83977f_wdt: clean up, coding style and switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/w83977f_wdt.c | 225 ++++++++++++++++++++-------------------- 1 files changed, 111 insertions(+), 114 deletions(-)
drivers/watchdog/w83977f_wdt.c +111 -114
@@ -26,10 +26,10 @@#include <linux/watchdog.h> #include <linux/notifier.h> #include <linux/reboot.h> +#include <linux/uaccess.h> +#include <linux/io.h> -#include <asm/io.h> #include <asm/system.h> -#include <asm/uaccess.h> #define WATCHDOG_VERSION "1.00"#define WATCHDOG_NAME "W83977F WDT"
@@ -53,13 +53,17 @@ static char expect_close;static DEFINE_SPINLOCK (spinlock);module_param (timeout, int,0 ); -MODULE_PARM_DESC(timeout,"Watchdog timeout in seconds (15..7635), default=" __MODULE_STRING(DEFAULT_TIMEOUT) ")"); +MODULE_PARM_DESC (timeout, + "Watchdog timeout in seconds (15..7635), default=" + __MODULE_STRING(DEFAULT_TIMEOUT) ")");module_param (testmode, int,0 ); -MODULE_PARM_DESC (testmode,"Watchdog testmode (1 = no reboot), default=0" ); +MODULE_PARM_DESC (testmode,"Watchdog testmode (1 = no reboot), default=0" );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) ")");/* * Start the watchdog
@@ -72,8 +76,8 @@ static int wdt_start(void)spin_lock_irqsave (&spinlock, flags);/* Unlock the SuperIO chip */ -outb_p (UNLOCK_DATA ,IO_INDEX_PORT ); -outb_p (UNLOCK_DATA ,IO_INDEX_PORT ); +outb_p (UNLOCK_DATA ,IO_INDEX_PORT ); +outb_p (UNLOCK_DATA ,IO_INDEX_PORT );/* * Select device Aux2 (device=8) to set watchdog regs F2, F3 and F4.
@@ -81,50 +85,49 @@ static int wdt_start(void)* F3 is set to enable watchdog LED blink at timeout. * F4 is used to just clear the TIMEOUT'ed state (bit 0). */ -outb_p (DEVICE_REGISTER ,IO_INDEX_PORT ); -outb_p (0x08 ,IO_DATA_PORT ); -outb_p (0xF2 ,IO_INDEX_PORT ); -outb_p (timeoutW,IO_DATA_PORT ); -outb_p (0xF3 ,IO_INDEX_PORT ); -outb_p (0x08 ,IO_DATA_PORT ); -outb_p (0xF4 ,IO_INDEX_PORT ); -outb_p (0x00 ,IO_DATA_PORT ); +outb_p (DEVICE_REGISTER ,IO_INDEX_PORT ); +outb_p (0x08 ,IO_DATA_PORT ); +outb_p (0xF2 ,IO_INDEX_PORT ); +outb_p (timeoutW,IO_DATA_PORT ); +outb_p (0xF3 ,IO_INDEX_PORT ); +outb_p (0x08 ,IO_DATA_PORT ); +outb_p (0xF4 ,IO_INDEX_PORT ); +outb_p (0x00 ,IO_DATA_PORT );/* Set device Aux2 active */ -outb_p (0x30 ,IO_INDEX_PORT ); -outb_p (0x01 ,IO_DATA_PORT ); +outb_p (0x30 ,IO_INDEX_PORT ); +outb_p (0x01 ,IO_DATA_PORT ); -/* +/* * Select device Aux1 (dev=7) to set GP16 as the watchdog output * (in reg E6) and GP13 as the watchdog LED output (in reg E3). * Map GP16 at pin 119. * In test mode watch the bit 0 on F4 to indicate "triggered" or * check watchdog LED on SBC. */ -outb_p (DEVICE_REGISTER ,IO_INDEX_PORT ); -outb_p (0x07 ,IO_DATA_PORT ); -if (!testmode) - { +outb_p (DEVICE_REGISTER ,IO_INDEX_PORT ); +outb_p (0x07 ,IO_DATA_PORT ); +if (!testmode) {unsigned pin_map; -outb_p (0xE6 ,IO_INDEX_PORT ); -outb_p (0x0A ,IO_DATA_PORT ); -outb_p (0x2C ,IO_INDEX_PORT ); +outb_p (0xE6 ,IO_INDEX_PORT ); +outb_p (0x0A ,IO_DATA_PORT ); +outb_p (0x2C ,IO_INDEX_PORT ); pin_map =inb_p (IO_DATA_PORT ); pin_map |=0x10 ; pin_map &= ~(0x20 ); -outb_p (0x2C ,IO_INDEX_PORT ); -outb_p (pin_map,IO_DATA_PORT ); +outb_p (0x2C ,IO_INDEX_PORT ); +outb_p (pin_map,IO_DATA_PORT ); } -outb_p (0xE3 ,IO_INDEX_PORT ); -outb_p (0x08 ,IO_DATA_PORT ); +outb_p (0xE3 ,IO_INDEX_PORT ); +outb_p (0x08 ,IO_DATA_PORT );/* Set device Aux1 active */ -outb_p (0x30 ,IO_INDEX_PORT ); -outb_p (0x01 ,IO_DATA_PORT ); +outb_p (0x30 ,IO_INDEX_PORT ); +outb_p (0x01 ,IO_DATA_PORT );/* Lock the SuperIO chip */ -outb_p (LOCK_DATA ,IO_INDEX_PORT ); +outb_p (LOCK_DATA ,IO_INDEX_PORT );spin_unlock_irqrestore (&spinlock, flags);
@@ -144,42 +147,41 @@ static int wdt_stop(void)spin_lock_irqsave (&spinlock, flags);/* Unlock the SuperIO chip */ -outb_p (UNLOCK_DATA ,IO_INDEX_PORT ); -outb_p (UNLOCK_DATA ,IO_INDEX_PORT ); +outb_p (UNLOCK_DATA ,IO_INDEX_PORT ); +outb_p (UNLOCK_DATA ,IO_INDEX_PORT ); -/* +/* * Select device Aux2 (device=8) to set watchdog regs F2, F3 and F4. * F2 is reset to its default value (watchdog timer disabled). * F3 is reset to its default state. * F4 clears the TIMEOUT'ed state (bit 0) - back to default. */ -outb_p (DEVICE_REGISTER ,IO_INDEX_PORT ); -outb_p (0x08 ,IO_DATA_PORT ); -outb_p (0xF2 ,IO_INDEX_PORT ); -outb_p (0xFF ,IO_DATA_PORT ); -outb_p (0xF3 ,IO_INDEX_PORT ); -outb_p (0x00 ,IO_DATA_PORT ); -outb_p (0xF4 ,IO_INDEX_PORT ); -outb_p (0x00 ,IO_DATA_PORT ); -outb_p (0xF2 ,IO_INDEX_PORT ); -outb_p (0x00 ,IO_DATA_PORT ); +outb_p (DEVICE_REGISTER ,IO_INDEX_PORT ); +outb_p (0x08 ,IO_DATA_PORT ); +outb_p (0xF2 ,IO_INDEX_PORT ); +outb_p (0xFF ,IO_DATA_PORT ); +outb_p (0xF3 ,IO_INDEX_PORT ); +outb_p (0x00 ,IO_DATA_PORT ); +outb_p (0xF4 ,IO_INDEX_PORT ); +outb_p (0x00 ,IO_DATA_PORT ); +outb_p (0xF2 ,IO_INDEX_PORT ); +outb_p (0x00 ,IO_DATA_PORT );/* -* Select device Aux1 (dev=7) to set GP16 (in reg E6) and +* Select device Aux1 (dev=7) to set GP16 (in reg E6) and * Gp13 (in reg E3) as inputs. */ -outb_p (DEVICE_REGISTER ,IO_INDEX_PORT ); -outb_p (0x07 ,IO_DATA_PORT ); -if (!testmode) - { -outb_p (0xE6 ,IO_INDEX_PORT ); -outb_p (0x01 ,IO_DATA_PORT ); +outb_p (DEVICE_REGISTER ,IO_INDEX_PORT ); +outb_p (0x07 ,IO_DATA_PORT ); +if (!testmode) { +outb_p (0xE6 ,IO_INDEX_PORT ); +outb_p (0x01 ,IO_DATA_PORT ); } -outb_p (0xE3 ,IO_INDEX_PORT ); -outb_p (0x01 ,IO_DATA_PORT ); +outb_p (0xE3 ,IO_INDEX_PORT ); +outb_p (0x01 ,IO_DATA_PORT );/* Lock the SuperIO chip */ -outb_p (LOCK_DATA ,IO_INDEX_PORT ); +outb_p (LOCK_DATA ,IO_INDEX_PORT );spin_unlock_irqrestore (&spinlock, flags);
@@ -200,17 +202,17 @@ static int wdt_keepalive(void)spin_lock_irqsave (&spinlock, flags);/* Unlock the SuperIO chip */ -outb_p (UNLOCK_DATA ,IO_INDEX_PORT ); -outb_p (UNLOCK_DATA ,IO_INDEX_PORT ); +outb_p (UNLOCK_DATA ,IO_INDEX_PORT ); +outb_p (UNLOCK_DATA ,IO_INDEX_PORT );/* Select device Aux2 (device=8) to kick watchdog reg F2 */ -outb_p (DEVICE_REGISTER ,IO_INDEX_PORT ); -outb_p (0x08 ,IO_DATA_PORT ); -outb_p (0xF2 ,IO_INDEX_PORT ); -outb_p (timeoutW,IO_DATA_PORT ); +outb_p (DEVICE_REGISTER ,IO_INDEX_PORT ); +outb_p (0x08 ,IO_DATA_PORT ); +outb_p (0xF2 ,IO_INDEX_PORT ); +outb_p (timeoutW,IO_DATA_PORT );/* Lock the SuperIO chip */ -outb_p (LOCK_DATA ,IO_INDEX_PORT ); +outb_p (LOCK_DATA ,IO_INDEX_PORT );spin_unlock_irqrestore (&spinlock, flags);
@@ -227,7 +229,7 @@ static int wdt_set_timeout(int t)/* * Convert seconds to watchdog counter time units, rounding up. -* On PCM-5335 watchdog units are 30 seconds/step with 15 sec startup +* On PCM-5335 watchdog units are 30 seconds/step with 15 sec startup * value. This information is supplied in the PCM-5335 manual and was * checked by me on a real board. This is a bit strange because W83977f * datasheet says counter unit is in minutes!
@@ -241,7 +243,7 @@ static int wdt_set_timeout(int t)return -EINVAL ;/* -* timeout is the timeout in seconds, +* timeout is the timeout in seconds, * timeoutW is the timeout in watchdog counter units. */ timeoutW = tmrval;
@@ -261,17 +263,17 @@ static int wdt_get_status(int *status)spin_lock_irqsave (&spinlock, flags);/* Unlock the SuperIO chip */ -outb_p (UNLOCK_DATA ,IO_INDEX_PORT ); -outb_p (UNLOCK_DATA ,IO_INDEX_PORT ); +outb_p (UNLOCK_DATA ,IO_INDEX_PORT ); +outb_p (UNLOCK_DATA ,IO_INDEX_PORT );/* Select device Aux2 (device=8) to read watchdog reg F4 */ -outb_p (DEVICE_REGISTER ,IO_INDEX_PORT ); -outb_p (0x08 ,IO_DATA_PORT ); -outb_p (0xF4 ,IO_INDEX_PORT ); +outb_p (DEVICE_REGISTER ,IO_INDEX_PORT ); +outb_p (0x08 ,IO_DATA_PORT ); +outb_p (0xF4 ,IO_INDEX_PORT ); new_status =inb_p (IO_DATA_PORT );/* Lock the SuperIO chip */ -outb_p (LOCK_DATA ,IO_INDEX_PORT ); +outb_p (LOCK_DATA ,IO_INDEX_PORT );spin_unlock_irqrestore (&spinlock, flags);
@@ -290,7 +292,7 @@ static int wdt_get_status(int *status)static int wdt_open (struct inode *inode,struct file *file) {/* If the watchdog is alive we don't need to start it again */ -if (test_and_set_bit (0 , &timer_alive) ) +if (test_and_set_bit (0 , &timer_alive))return -EBUSY ;if (nowayout)
@@ -306,13 +308,13 @@ static int wdt_release(struct inode *inode, struct file *file)* Shut off the timer. * Lock it in if it's a module and we set nowayout */ -if (expect_close ==42 ) - { +if (expect_close ==42 ) {wdt_stop ();clear_bit (0 , &timer_alive); }else {wdt_keepalive (); - printk(KERN_CRIT PFX "unexpected close, not stopping watchdog!\n"); + printk(KERN_CRIT PFX + "unexpected close, not stopping watchdog!\n"); } expect_close =0 ;return 0 ;
@@ -333,24 +335,22 @@ static ssize_t wdt_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) - { -if (!nowayout) - { +if (count) { +if (!nowayout) {size_t ofs; -/* note: just in case someone wrote the magic character long ago */ +/* note: just in case someone wrote the +magic character long ago */ expect_close =0 ; -/* scan to see whether or not we got the magic character */ -for (ofs =0 ; ofs != count; ofs++) - { +/* scan to see whether or not we got the +magic character */ +for (ofs =0 ; ofs != count; ofs++) {char c;if (get_user (c, buf + ofs))return -EFAULT ; -if (c =='V' ) { +if (c =='V' ) expect_close =42 ; - } } }
@@ -377,8 +377,7 @@ static struct watchdog_info ident = { .identity = WATCHDOG_NAME, }; -static int wdt_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long wdt_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {int status;int new_options, retval = -EINVAL ;
@@ -390,13 +389,13 @@ static int wdt_ioctl(struct inode *inode, struct file *file, uarg.i = (int __user *)arg; -switch (cmd) - { +switch (cmd) {default :return -ENOTTY ;case WDIOC_GETSUPPORT : -return copy_to_user (uarg.ident, &ident,sizeof (ident)) ? -EFAULT :0 ; +return copy_to_user (uarg.ident, &ident, +sizeof (ident)) ? -EFAULT :0 ;case WDIOC_GETSTATUS :wdt_get_status (&status);
@@ -410,7 +409,7 @@ static int wdt_ioctl(struct inode *inode, struct file *file,return 0 ;case WDIOC_SETOPTIONS : -if (get_user (new_options, uarg.i)) +if (get_user (new_options, uarg.i))return -EFAULT ;if (new_options &WDIOS_DISABLECARD ) {
@@ -444,23 +443,21 @@ static int wdt_ioctl(struct inode *inode, struct file *file,static int wdt_notify_sys (struct notifier_block *this,unsigned long code,void *unused) { -if (code==SYS_DOWN || code==SYS_HALT ) +if (code ==SYS_DOWN || code ==SYS_HALT )wdt_stop ();return NOTIFY_DONE ; } -static const struct file_operations wdt_fops= -{ +static const struct file_operations wdt_fops = { .owner =THIS_MODULE , .llseek = no_llseek, .write = wdt_write, - .ioctl = wdt_ioctl, + .unlocked_ioctl = wdt_ioctl, .open = wdt_open, .release = wdt_release, }; -static struct miscdevice wdt_miscdev= -{ +static struct miscdevice wdt_miscdev = { .minor =WATCHDOG_MINOR , .name ="watchdog" , .fops = &wdt_fops,
@@ -474,20 +471,20 @@ static int __init w83977f_wdt_init(void) {int rc; - printk(KERN_INFO PFX DRIVER_VERSION); + printk(KERN_INFO PFX DRIVER_VERSION);/* -* Check that the timeout value is within it's range ; +* Check that the timeout value is within it's range; * if not reset to the default */ if (wdt_set_timeout (timeout)) {wdt_set_timeout (DEFAULT_TIMEOUT ); - printk(KERN_INFO PFX "timeout value must be 15<=timeout<=7635, using %d\n", - DEFAULT_TIMEOUT); + printk(KERN_INFO PFX +"timeout value must be 15 <= timeout <= 7635, using %d\n" , + DEFAULT_TIMEOUT); } -if (!request_region (IO_INDEX_PORT ,2 ,WATCHDOG_NAME )) - { +if (!request_region (IO_INDEX_PORT ,2 ,WATCHDOG_NAME )) { printk(KERN_ERR PFX "I/O address 0x%04x already in use\n", IO_INDEX_PORT); rc = -EIO ;
@@ -495,30 +492,30 @@ static int __init w83977f_wdt_init(void) } rc =register_reboot_notifier (&wdt_notifier); -if (rc) - { - printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", - rc); +if (rc) { + printk(KERN_ERR PFX + "cannot register reboot notifier (err=%d)\n", rc); goto err_out_region; } rc =misc_register (&wdt_miscdev); -if (rc) - { - printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - wdt_miscdev.minor, rc); +if (rc) { + printk(KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + wdt_miscdev.minor, rc); goto err_out_reboot; } - printk(KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d testmode=%d)\n", - timeout, nowayout, testmode); + printk(KERN_INFO PFX +"initialized. timeout=%d sec (nowayout=%d testmode=%d)\n" , + timeout, nowayout, testmode);return 0 ; err_out_reboot:unregister_reboot_notifier (&wdt_notifier); err_out_region: -release_region (IO_INDEX_PORT ,2 ); +release_region (IO_INDEX_PORT ,2 ); err_out:return rc; }
@@ -528,7 +525,7 @@ static void __exit w83977f_wdt_exit(void)wdt_stop ();misc_deregister (&wdt_miscdev);unregister_reboot_notifier (&wdt_notifier); -release_region (IO_INDEX_PORT ,2 ); +release_region (IO_INDEX_PORT ,2 ); }module_init (w83977f_wdt_init);
PATCH 53/57 wafer5823wdt: Clean up, coding style, switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/wafer5823wdt.c | 80 ++++++++++++++++++++++----------------- 1 files changed, 46 insertions(+), 34 deletions(-)
drivers/watchdog/wafer5823wdt.c +46 -34
@@ -36,8 +36,8 @@#include <linux/reboot.h> #include <linux/init.h> #include <linux/spinlock.h> -#include <asm/io.h> -#include <asm/uaccess.h> +#include <linux/io.h> +#include <linux/uaccess.h> #define WATCHDOG_NAME "Wafer 5823 WDT"#define PFX WATCHDOG_NAME ": "
@@ -61,11 +61,15 @@ static int wdt_start = 0x443;static int timeout =WD_TIMO ;/* in seconds */ module_param (timeout, int,0 ); -MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=255, default=" __MODULE_STRING(WD_TIMO) "."); +MODULE_PARM_DESC (timeout, + "Watchdog timeout in seconds. 1 <= timeout <= 255, default=" + __MODULE_STRING(WD_TIMO) ".");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) ")");static void wafwdt_ping (void ) {
@@ -90,7 +94,8 @@ wafwdt_stop(void)inb_p (wdt_stop); } -static ssize_t wafwdt_write (struct file *file,const char __user *buf,size_t count,loff_t * ppos) +static ssize_t wafwdt_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) {
@@ -100,7 +105,8 @@ static ssize_t wafwdt_write(struct file *file, const char __user *buf, size_t co/* In case it was set long ago */ expect_close =0 ; -/* scan to see whether or not we got the magic character */ +/* scan to see whether or not we got the magic +character */ for (i =0 ; i != count; i++) {char c;if (get_user (c, buf + i))
@@ -109,27 +115,29 @@ static ssize_t wafwdt_write(struct file *file, const char __user *buf, size_t co expect_close =42 ; } } -/* Well, anyhow someone wrote to us, we should return that favour */ +/* Well, anyhow someone wrote to us, we should +return that favour */ wafwdt_ping (); }return count; } -static int wafwdt_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long wafwdt_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {int new_timeout;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 ="Wafer 5823 WDT" , };switch (cmd) {case WDIOC_GETSUPPORT : -if (copy_to_user (argp, &ident,sizeof (ident))) +if (copy_to_user (argp, &ident,sizeof (ident)))return -EFAULT ;break ;
@@ -194,10 +202,11 @@ static int wafwdt_open(struct inode *inode, struct file *file)static int wafwdt_close (struct inode *inode,struct file *file) { -if (expect_close ==42 ) { +if (expect_close ==42 )wafwdt_stop (); - }else { - printk(KERN_CRIT PFX "WDT device closed unexpectedly. WDT will not stop!\n"); +else { + printk(KERN_CRIT PFX + "WDT device closed unexpectedly. WDT will not stop!\n");wafwdt_ping (); }clear_bit (0 , &wafwdt_is_open);
@@ -209,12 +218,11 @@ wafwdt_close(struct inode *inode, struct file *file)* Notifier for system down */ -static int wafwdt_notify_sys (struct notifier_block *this,unsigned long code,void *unused) +static int wafwdt_notify_sys (struct notifier_block *this,unsigned long code, +void *unused) { -if (code ==SYS_DOWN || code ==SYS_HALT ) { -/* Turn the WDT off */ +if (code ==SYS_DOWN || code ==SYS_HALT )wafwdt_stop (); - }return NOTIFY_DONE ; }
@@ -226,7 +234,7 @@ static const struct file_operations wafwdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = wafwdt_write, - .ioctl = wafwdt_ioctl, + .unlocked_ioctl = wafwdt_ioctl, .open = wafwdt_open, .release = wafwdt_close, };
@@ -250,25 +258,28 @@ static int __init wafwdt_init(void) {int ret; -printk (KERN_INFO "WDT driver for Wafer 5823 single board computer initialising.\n" ); +printk (KERN_INFO +"WDT driver for Wafer 5823 single board computer initialising.\n" );if (timeout <1 || timeout >255 ) { timeout =WD_TIMO ; - printk (KERN_INFO PFX "timeout value must be 1<=x<=255, using %d\n", - timeout); + printk(KERN_INFO PFX +"timeout value must be 1 <= x <= 255, using %d\n" , + timeout); }if (wdt_stop != wdt_start) { -if (!request_region (wdt_stop,1 ,"Wafer 5823 WDT" )) { - printk (KERN_ERR PFX "I/O address 0x%04x already in use\n", - wdt_stop); +if (!request_region (wdt_stop,1 ,"Wafer 5823 WDT" )) { + printk(KERN_ERR PFX +"I/O address 0x%04x already in use\n" , + wdt_stop); ret = -EIO ; goto error; } } -if (!request_region (wdt_start,1 ,"Wafer 5823 WDT" )) { - printk (KERN_ERR PFX "I/O address 0x%04x already in use\n", +if (!request_region (wdt_start,1 ,"Wafer 5823 WDT" )) { + printk(KERN_ERR PFX "I/O address 0x%04x already in use\n", wdt_start); ret = -EIO ; goto error2;
@@ -276,19 +287,20 @@ static int __init wafwdt_init(void) ret =register_reboot_notifier (&wafwdt_notifier);if (ret !=0 ) { - printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", - ret); + printk(KERN_ERR PFX + "cannot register reboot notifier (err=%d)\n", ret); goto error3; } ret =misc_register (&wafwdt_miscdev);if (ret !=0 ) { - printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - WATCHDOG_MINOR, ret); + printk(KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + WATCHDOG_MINOR, ret); goto error4; } - printk (KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d)\n", + printk(KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d)\n", timeout, nowayout);return ret;
@@ -307,7 +319,7 @@ static void __exit wafwdt_exit(void) {misc_deregister (&wafwdt_miscdev);unregister_reboot_notifier (&wafwdt_notifier); -if (wdt_stop != wdt_start) +if (wdt_stop != wdt_start)release_region (wdt_stop,1 );release_region (wdt_start,1 ); }
PATCH 54/57 wdrtas: clean up, coding style, switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/wdrtas.c | 103 ++++++++++++++++++--------------------------- 1 files changed, 41 insertions(+), 62 deletions(-)
drivers/watchdog/wdrtas.c +41 -62
@@ -35,9 +35,9 @@#include <linux/reboot.h> #include <linux/types.h> #include <linux/watchdog.h> +#include <linux/uaccess.h> #include <asm/rtas.h> -#include <asm/uaccess.h> #define WDRTAS_MAGIC_CHAR 42#define WDRTAS_SUPPORTED_MASK (WDIOF_SETTIMEOUT | \
@@ -56,7 +56,7 @@ static int wdrtas_nowayout = 0;#endif static atomic_t wdrtas_miscdev_open =ATOMIC_INIT (0 ); -static char wdrtas_expect_close =0 ; +static char wdrtas_expect_close;static int wdrtas_interval;
@@ -86,8 +86,8 @@ static char wdrtas_logbuffer[WDRTAS_LOGBUFFER_LEN];* RTAS function set-indicator (surveillance). The unit of interval is * seconds. */ -static int -wdrtas_set_interval (int interval) + +static int wdrtas_set_interval (int interval) {long result;static int print_msg =10 ;
@@ -97,7 +97,7 @@ wdrtas_set_interval(int interval) result =rtas_call (wdrtas_token_set_indicator,3 ,1 ,NULL ,WDRTAS_SURVEILLANCE_IND ,0 , interval); -if ( (result <0 ) && (print_msg) ) { +if (result <0 && print_msg) {printk (KERN_ERR "wdrtas: setting the watchdog to %i " "timeout failed: %li\n" , interval, result); print_msg--;
@@ -116,16 +116,14 @@ wdrtas_set_interval(int interval)* as reported by the RTAS function ibm,get-system-parameter. The unit * of the return value is seconds. */ -static int -wdrtas_get_interval (int fallback_value) +static int wdrtas_get_interval (int fallback_value) {long result;char value[4 ]; result =rtas_call (wdrtas_token_get_sp,3 ,1 ,NULL ,WDRTAS_SP_SPI , (void *)__pa (&value),4 ); -if ( (value[0 ] !=0 ) || (value[1 ] !=2 ) || (value[3 ] !=0 ) || - (result <0 ) ) { +if (value[0 ] !=0 || value[1 ] !=2 || value[3 ] !=0 || result <0 ) {printk (KERN_WARNING "wdrtas: could not get sp_spi watchdog " "timeout (%li). Continuing\n" , result);return fallback_value;
@@ -141,8 +139,7 @@ wdrtas_get_interval(int fallback_value)* wdrtas_timer_start starts the watchdog by calling the RTAS function * set-interval (surveillance) */ -static void -wdrtas_timer_start (void ) +static void wdrtas_timer_start (void ) {wdrtas_set_interval (wdrtas_interval); }
@@ -153,8 +150,7 @@ wdrtas_timer_start(void)* wdrtas_timer_stop stops the watchdog timer by calling the RTAS function * set-interval (surveillance) */ -static void -wdrtas_timer_stop (void ) +static void wdrtas_timer_stop (void ) {wdrtas_set_interval (0 ); }
@@ -165,8 +161,7 @@ wdrtas_timer_stop(void)* wdrtas_log_scanned_event prints a message to the log buffer dumping * the results of the last event-scan call */ -static void -wdrtas_log_scanned_event (void ) +static void wdrtas_log_scanned_event (void ) {int i;
@@ -175,13 +170,13 @@ wdrtas_log_scanned_event(void)"%02x %02x %02x %02x %02x %02x %02x %02x " "%02x %02x %02x %02x %02x %02x %02x %02x\n" , (i /16 ) +1 , (WDRTAS_LOGBUFFER_LEN /16 ), - wdrtas_logbuffer[i +0 ], wdrtas_logbuffer[i +1 ], - wdrtas_logbuffer[i +2 ], wdrtas_logbuffer[i +3 ], - wdrtas_logbuffer[i +4 ], wdrtas_logbuffer[i +5 ], - wdrtas_logbuffer[i +6 ], wdrtas_logbuffer[i +7 ], - wdrtas_logbuffer[i +8 ], wdrtas_logbuffer[i +9 ], - wdrtas_logbuffer[i +10 ], wdrtas_logbuffer[i +11 ], - wdrtas_logbuffer[i +12 ], wdrtas_logbuffer[i +13 ], + wdrtas_logbuffer[i +0 ], wdrtas_logbuffer[i +1 ], + wdrtas_logbuffer[i +2 ], wdrtas_logbuffer[i +3 ], + wdrtas_logbuffer[i +4 ], wdrtas_logbuffer[i +5 ], + wdrtas_logbuffer[i +6 ], wdrtas_logbuffer[i +7 ], + wdrtas_logbuffer[i +8 ], wdrtas_logbuffer[i +9 ], + wdrtas_logbuffer[i +10 ], wdrtas_logbuffer[i +11 ], + wdrtas_logbuffer[i +12 ], wdrtas_logbuffer[i +13 ], wdrtas_logbuffer[i + 14], wdrtas_logbuffer[i + 15]); }
@@ -192,8 +187,7 @@ wdrtas_log_scanned_event(void)* RTAS function event-scan and repeats these calls as long as there are * events available. All events will be dumped. */ -static void -wdrtas_timer_keepalive (void ) +static void wdrtas_timer_keepalive (void ) {long result;
@@ -218,8 +212,7 @@ wdrtas_timer_keepalive(void)* wdrtas_get_temperature returns the current temperature in Fahrenheit. It * uses the RTAS call get-sensor-state, token 3 to do so */ -static int -wdrtas_get_temperature (void ) +static int wdrtas_get_temperature (void ) {long result;int temperature =0 ;
@@ -243,8 +236,7 @@ wdrtas_get_temperature(void)* returns a bitmask of defines WDIOF_... as defined in * include/linux/watchdog.h */ -static int -wdrtas_get_status (void ) +static int wdrtas_get_status (void ) {return 0 ;/* TODO */ }
@@ -255,8 +247,7 @@ wdrtas_get_status(void)* returns a bitmask of defines WDIOF_... as defined in * include/linux/watchdog.h, indicating why the watchdog rebooted the system */ -static int -wdrtas_get_boot_status (void ) +static int wdrtas_get_boot_status (void ) {return 0 ;/* TODO */ }
@@ -276,8 +267,7 @@ wdrtas_get_boot_status(void)* character 'V'. This character allows the watchdog device to be closed * properly. */ -static ssize_t -wdrtas_write (struct file *file,const char __user *buf, +static ssize_t wdrtas_write (struct file *file,const char __user *buf,size_t len,loff_t *ppos) {int i;
@@ -306,7 +296,6 @@ out:/** * wdrtas_ioctl - ioctl function for the watchdog device -* @inode: inode structure * @file: file structure * @cmd: command for ioctl * @arg: argument pointer
@@ -315,9 +304,9 @@ out:* * wdrtas_ioctl implements the watchdog API ioctls */ -static int -wdrtas_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) + +static long wdrtas_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {int __user *argp = (void __user *)arg;int i;
@@ -357,9 +346,9 @@ wdrtas_ioctl(struct inode *inode, struct file *file,wdrtas_timer_keepalive ();wdrtas_timer_start (); } +/* not implemented. Done by H8 if (i & WDIOS_TEMPPANIC) { -/* not implemented. Done by H8 */ - } +} */ return 0 ;case WDIOC_KEEPALIVE :
@@ -399,8 +388,7 @@ wdrtas_ioctl(struct inode *inode, struct file *file,* * function called when watchdog device is opened */ -static int -wdrtas_open (struct inode *inode,struct file *file) +static int wdrtas_open (struct inode *inode,struct file *file) {/* only open once */ if (atomic_inc_return (&wdrtas_miscdev_open) >1 ) {
@@ -423,8 +411,7 @@ wdrtas_open(struct inode *inode, struct file *file)* * close function. Always succeeds */ -static int -wdrtas_close (struct inode *inode,struct file *file) +static int wdrtas_close (struct inode *inode,struct file *file) {/* only stop watchdog, if this was announced using 'V' before */ if (wdrtas_expect_close ==WDRTAS_MAGIC_CHAR )
@@ -453,8 +440,7 @@ wdrtas_close(struct inode *inode, struct file *file)* wdrtas_temp_read gives the temperature to the users by copying this * value as one byte into the user space buffer. The unit is Fahrenheit... */ -static ssize_t -wdrtas_temp_read (struct file *file,char __user *buf, +static ssize_t wdrtas_temp_read (struct file *file,char __user *buf,size_t count,loff_t *ppos) {int temperature =0 ;
@@ -478,8 +464,7 @@ wdrtas_temp_read(struct file *file, char __user *buf,* * function called when temperature device is opened */ -static int -wdrtas_temp_open (struct inode *inode,struct file *file) +static int wdrtas_temp_open (struct inode *inode,struct file *file) {return nonseekable_open (inode, file); }
@@ -493,8 +478,7 @@ wdrtas_temp_open(struct inode *inode, struct file *file)* * close function. Always succeeds */ -static int -wdrtas_temp_close (struct inode *inode,struct file *file) +static int wdrtas_temp_close (struct inode *inode,struct file *file) {return 0 ; }
@@ -509,10 +493,10 @@ wdrtas_temp_close(struct inode *inode, struct file *file)* * wdrtas_reboot stops the watchdog in case of a reboot */ -static int -wdrtas_reboot (struct notifier_block *this,unsigned long code,void *ptr) +static int wdrtas_reboot (struct notifier_block *this, +unsigned long code,void *ptr) { -if ( (code==SYS_DOWN ) || (code==SYS_HALT ) ) +if (code ==SYS_DOWN || code ==SYS_HALT )wdrtas_timer_stop ();return NOTIFY_DONE ;
@@ -524,7 +508,7 @@ static const struct file_operations wdrtas_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = wdrtas_write, - .ioctl = wdrtas_ioctl, + .unlocked_ioctl = wdrtas_ioctl, .open = wdrtas_open, .release = wdrtas_close, };
@@ -562,8 +546,7 @@ static struct notifier_block wdrtas_notifier = {* this watchdog driver. It tolerates, if "get-sensor-state" and * "ibm,get-system-parameter" are not available. */ -static int -wdrtas_get_tokens (void ) +static int wdrtas_get_tokens (void ) { wdrtas_token_get_sensor_state =rtas_token ("get-sensor-state" );if (wdrtas_token_get_sensor_state ==RTAS_UNKNOWN_SERVICE ) {
@@ -603,8 +586,7 @@ wdrtas_get_tokens(void)* wdrtas_register_devs unregisters the watchdog and temperature watchdog * misc devs */ -static void -wdrtas_unregister_devs (void ) +static void wdrtas_unregister_devs (void ) {misc_deregister (&wdrtas_miscdev);if (wdrtas_token_get_sensor_state !=RTAS_UNKNOWN_SERVICE )
@@ -619,8 +601,7 @@ wdrtas_unregister_devs(void)* wdrtas_register_devs registers the watchdog and temperature watchdog * misc devs */ -static int -wdrtas_register_devs (void ) +static int wdrtas_register_devs (void ) {int result;
@@ -651,8 +632,7 @@ wdrtas_register_devs(void)* * registers the file handlers and the reboot notifier */ -static int __init -wdrtas_init (void ) +static int __init wdrtas_init (void ) {if (wdrtas_get_tokens ())return -ENODEV ;
@@ -680,8 +660,7 @@ wdrtas_init(void)* * unregisters the file handlers and the reboot notifier */ -static void __exit -wdrtas_exit (void ) +static void __exit wdrtas_exit(void) {if (!wdrtas_nowayout)wdrtas_timer_stop ();
PATCH 55/57 wdt285: switch to unlocked_ioctl and tidy up oddments of coding style
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/wdt285.c | 31 ++++++++++++++++--------------- 1 files changed, 16 insertions(+), 15 deletions(-)
drivers/watchdog/wdt285.c +16 -15
@@ -26,9 +26,9 @@#include <linux/reboot.h> #include <linux/init.h> #include <linux/interrupt.h> +#include <linux/uaccess.h> +#include <linux/irq.h> -#include <asm/irq.h> -#include <asm/uaccess.h> #include <asm/hardware.h> #include <asm/mach-types.h> #include <asm/hardware/dec21285.h>
@@ -115,8 +115,8 @@ static int watchdog_release(struct inode *inode, struct file *file)return 0 ; } -static ssize_t -watchdog_write (struct file *file,const char *data,size_t len,loff_t *ppos) +static ssize_t watchdog_write (struct file *file,const char *data, +size_t len,loff_t *ppos) {/* * Refresh the timer.
@@ -127,19 +127,18 @@ watchdog_write(struct file *file, const char *data, size_t len, loff_t *ppos)return len; } -static struct watchdog_info ident = { +static const struct watchdog_info ident = { .options =WDIOF_SETTIMEOUT , .identity ="Footbridge Watchdog" , }; -static int -watchdog_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long watchdog_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {unsigned int new_margin;int ret = -ENOTTY ; -switch (cmd) { +switch (cmd) {case WDIOC_GETSUPPORT : ret =0 ;if (copy_to_user ((void *)arg, &ident,sizeof (ident)))
@@ -148,7 +147,7 @@ watchdog_ioctl(struct inode *inode, struct file *file, unsigned int cmd,case WDIOC_GETSTATUS :case WDIOC_GETBOOTSTATUS : - ret =put_user (0 ,(int *)arg); + ret =put_user (0 , (int *)arg);break ;case WDIOC_KEEPALIVE :
@@ -182,7 +181,7 @@ static const struct file_operations watchdog_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = watchdog_write, - .ioctl = watchdog_ioctl, + .unlocked_ioctl = watchdog_ioctl, .open = watchdog_open, .release = watchdog_release, };
@@ -204,11 +203,13 @@ static int __init footbridge_watchdog_init(void)if (retval <0 )return retval; -printk ("Footbridge Watchdog Timer: 0.01, timer margin: %d sec\n" , - soft_margin); +printk (KERN_INFO +"Footbridge Watchdog Timer: 0.01, timer margin: %d sec\n" , + soft_margin);if (machine_is_cats ()) -printk ("Warning: Watchdog reset may not work on this machine.\n" ); +printk (KERN_WARN +"Warning: Watchdog reset may not work on this machine.\n" );return 0 ; }
@@ -223,7 +224,7 @@ MODULE_LICENSE("GPL");MODULE_ALIAS_MISCDEV (WATCHDOG_MINOR );module_param (soft_margin, int,0 ); -MODULE_PARM_DESC (soft_margin,"Watchdog timeout in seconds" ); +MODULE_PARM_DESC (soft_margin,"Watchdog timeout in seconds" );module_init (footbridge_watchdog_init);module_exit (footbridge_watchdog_exit);
PATCH 56/57 wdt977: clean up, coding style and switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/wdt977.c | 148 +++++++++++++++++++++++---------------------- 1 files changed, 74 insertions(+), 74 deletions(-)
drivers/watchdog/wdt977.c +74 -74
@@ -19,7 +19,8 @@* 07-Jul-2003 Daniele Bellucci: Audit return code of misc_register in * nwwatchdog_init. * 25-Oct-2005 Woody Suwalski: Convert addresses to #defs, add spinlocks -* remove limitiation to be used on Netwinders only +* remove limitiation to be used on +* Netwinders only */ #include <linux/module.h>
@@ -33,11 +34,11 @@#include <linux/watchdog.h> #include <linux/notifier.h> #include <linux/reboot.h> +#include <linux/io.h> +#include <linux/uaccess.h> -#include <asm/io.h> #include <asm/system.h> #include <asm/mach-types.h> -#include <asm/uaccess.h> #define WATCHDOG_VERSION "0.04"#define WATCHDOG_NAME "Wdt977"
@@ -45,7 +46,7 @@#define DRIVER_VERSION WATCHDOG_NAME " driver, v" WATCHDOG_VERSION "\n"#define IO_INDEX_PORT 0x370/* on some systems it can be 0x3F0 */ -#define IO_DATA_PORT (IO_INDEX_PORT+1) +#define IO_DATA_PORT (IO_INDEX_PORT + 1)#define UNLOCK_DATA 0x87#define LOCK_DATA 0xAA
@@ -62,13 +63,16 @@ static char expect_close;static DEFINE_SPINLOCK (spinlock);module_param (timeout, int,0 ); -MODULE_PARM_DESC(timeout,"Watchdog timeout in seconds (60..15300), default=" __MODULE_STRING(DEFAULT_TIMEOUT) ")"); +MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds (60..15300), default=" + __MODULE_STRING(DEFAULT_TIMEOUT) ")");module_param (testmode, int,0 ); -MODULE_PARM_DESC (testmode,"Watchdog testmode (1 = no reboot), default=0" ); +MODULE_PARM_DESC (testmode,"Watchdog testmode (1 = no reboot), default=0" );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) ")");/* * Start the watchdog
@@ -95,14 +99,16 @@ static int wdt977_start(void)outb_p (0xF2 ,IO_INDEX_PORT );outb_p (timeoutM,IO_DATA_PORT );outb_p (0xF3 ,IO_INDEX_PORT ); -outb_p (0x00 ,IO_DATA_PORT );/* another setting is 0E for kbd/mouse/LED */ +outb_p (0x00 ,IO_DATA_PORT );/* another setting is 0E for +kbd/mouse/LED */ outb_p (0xF4 ,IO_INDEX_PORT );outb_p (0x00 ,IO_DATA_PORT ); -/* at last select device Aux1 (dev=7) and set GP16 as a watchdog output */ -/* in test mode watch the bit 1 on F4 to indicate "triggered" */ -if (!testmode) - { +/* At last select device Aux1 (dev=7) and set GP16 as a +* watchdog output. In test mode watch the bit 1 on F4 to +* indicate "triggered" +*/ +if (!testmode) {outb_p (DEVICE_REGISTER ,IO_INDEX_PORT );outb_p (0x07 ,IO_DATA_PORT );outb_p (0xE6 ,IO_INDEX_PORT );
@@ -147,7 +153,8 @@ static int wdt977_stop(void)outb_p (0xF2 ,IO_INDEX_PORT );outb_p (0x00 ,IO_DATA_PORT ); -/* at last select device Aux1 (dev=7) and set GP16 as a watchdog output */ +/* at last select device Aux1 (dev=7) and set +GP16 as a watchdog output */ outb_p (DEVICE_REGISTER ,IO_INDEX_PORT );outb_p (0x07 ,IO_DATA_PORT );outb_p (0xE6 ,IO_INDEX_PORT );
@@ -202,16 +209,18 @@ static int wdt977_set_timeout(int t) tmrval = (t +59 ) /60 ;if (machine_is_netwinder ()) { -/* we have a hw bug somewhere, so each 977 minute is actually only 30sec -* this limits the max timeout to half of device max of 255 minutes... +/* we have a hw bug somewhere, so each 977 minute is actually +* only 30sec. This limits the max timeout to half of device +* max of 255 minutes... */ tmrval += tmrval; } -if ((tmrval <1 ) || (tmrval >255 )) +if (tmrval <1 || tmrval >255 )return -EINVAL ; -/* timeout is the timeout in seconds, timeoutM is the timeout in minutes) */ +/* timeout is the timeout in seconds, timeoutM is +the timeout in minutes) */ timeout = t; timeoutM = tmrval;return 0 ;
@@ -243,7 +252,7 @@ static int wdt977_get_status(int *status)spin_unlock_irqrestore (&spinlock, flags); - *status=0 ; + *status =0 ;if (new_status &1 ) *status |=WDIOF_CARDRESET ;
@@ -258,7 +267,7 @@ static int wdt977_get_status(int *status)static int wdt977_open (struct inode *inode,struct file *file) {/* If the watchdog is alive we don't need to start it again */ -if (test_and_set_bit (0 ,&timer_alive) ) +if (test_and_set_bit (0 , &timer_alive))return -EBUSY ;if (nowayout)
@@ -274,13 +283,13 @@ static int wdt977_release(struct inode *inode, struct file *file)* Shut off the timer. * Lock it in if it's a module and we set nowayout */ -if (expect_close ==42 ) - { +if (expect_close ==42 ) {wdt977_stop (); -clear_bit (0 ,&timer_alive); +clear_bit (0 , &timer_alive); }else {wdt977_keepalive (); - printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n"); + printk(KERN_CRIT PFX + "Unexpected close, not stopping watchdog!\n"); } expect_close =0 ;return 0 ;
@@ -301,17 +310,14 @@ static int wdt977_release(struct inode *inode, struct file *file)static ssize_t wdt977_write (struct file *file,const char __user *buf,size_t count,loff_t *ppos) { -if (count) - { -if (!nowayout) - { +if (count) { +if (!nowayout) {size_t i;/* In case it was set long ago */ expect_close =0 ; -for (i =0 ; i != count; i++) - { +for (i =0 ; i != count; i++) {char c;if (get_user (c, buf + i))return -EFAULT ;
@@ -326,6 +332,14 @@ static ssize_t wdt977_write(struct file *file, const char __user *buf,return count; } +static const struct watchdog_info ident = { + .options =WDIOF_SETTIMEOUT | +WDIOF_MAGICCLOSE | +WDIOF_KEEPALIVEPING , + .firmware_version =1 , + .identity =WATCHDOG_NAME , +}; +/* * wdt977_ioctl: * @inode: inode of the device
@@ -337,16 +351,8 @@ static ssize_t wdt977_write(struct file *file, const char __user *buf,* according to their available features. */ -static struct watchdog_info ident = { - .options =WDIOF_SETTIMEOUT | -WDIOF_MAGICCLOSE | -WDIOF_KEEPALIVEPING , - .firmware_version =1 , - .identity =WATCHDOG_NAME , -}; - -static int wdt977_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long wdt977_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {int status;int new_options, retval = -EINVAL ;
@@ -358,8 +364,7 @@ static int wdt977_ioctl(struct inode *inode, struct file *file, uarg.i = (int __user *)arg; -switch (cmd) - { +switch (cmd) {default :return -ENOTTY ;
@@ -379,7 +384,7 @@ static int wdt977_ioctl(struct inode *inode, struct file *file,return 0 ;case WDIOC_SETOPTIONS : -if (get_user (new_options, uarg.i)) +if (get_user (new_options, uarg.i))return -EFAULT ;if (new_options &WDIOS_DISABLECARD ) {
@@ -413,23 +418,21 @@ static int wdt977_ioctl(struct inode *inode, struct file *file,static int wdt977_notify_sys (struct notifier_block *this,unsigned long code,void *unused) { -if (code==SYS_DOWN || code==SYS_HALT ) +if (code ==SYS_DOWN || code ==SYS_HALT )wdt977_stop ();return NOTIFY_DONE ; } -static const struct file_operations wdt977_fops= -{ +static const struct file_operations wdt977_fops = { .owner =THIS_MODULE , .llseek = no_llseek, .write = wdt977_write, - .ioctl = wdt977_ioctl, + .unlocked_ioctl = wdt977_ioctl, .open = wdt977_open, .release = wdt977_release, }; -static struct miscdevice wdt977_miscdev= -{ +static struct miscdevice wdt977_miscdev = { .minor =WATCHDOG_MINOR , .name ="watchdog" , .fops = &wdt977_fops,
@@ -443,51 +446,48 @@ static int __init wd977_init(void) {int rc; -//if (!machine_is_netwinder()) -// return -ENODEV; - printk(KERN_INFO PFX DRIVER_VERSION); -/* Check that the timeout value is within it's range ; if not reset to the default */ -if (wdt977_set_timeout (timeout)) - { +/* Check that the timeout value is within its range; +if not reset to the default */ +if (wdt977_set_timeout (timeout)) {wdt977_set_timeout (DEFAULT_TIMEOUT ); - printk(KERN_INFO PFX "timeout value must be 60<timeout<15300, using %d\n", - DEFAULT_TIMEOUT); + printk(KERN_INFO PFX +"timeout value must be 60 < timeout < 15300, using %d\n" , + DEFAULT_TIMEOUT); }/* on Netwinder the IOports are already reserved by * arch/arm/mach-footbridge/netwinder-hw.c */ -if (!machine_is_netwinder ()) - { -if (!request_region (IO_INDEX_PORT ,2 ,WATCHDOG_NAME )) - { - printk(KERN_ERR PFX "I/O address 0x%04x already in use\n", - IO_INDEX_PORT); +if (!machine_is_netwinder ()) { +if (!request_region (IO_INDEX_PORT ,2 ,WATCHDOG_NAME )) { + printk(KERN_ERR PFX +"I/O address 0x%04x already in use\n" , + IO_INDEX_PORT); rc = -EIO ; goto err_out; } } rc =register_reboot_notifier (&wdt977_notifier); -if (rc) - { - printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", - rc); +if (rc) { + printk(KERN_ERR PFX + "cannot register reboot notifier (err=%d)\n", rc); goto err_out_region; } rc =misc_register (&wdt977_miscdev); -if (rc) - { - printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - wdt977_miscdev.minor, rc); +if (rc) { + printk(KERN_ERR PFX +"cannot register miscdev on minor=%d (err=%d)\n" , + wdt977_miscdev.minor, rc); goto err_out_reboot; } - printk(KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d, testmode=%i)\n", - timeout, nowayout, testmode); + printk(KERN_INFO PFX +"initialized. timeout=%d sec (nowayout=%d, testmode=%i)\n" , + timeout, nowayout, testmode);return 0 ;
@@ -495,7 +495,7 @@ err_out_reboot:unregister_reboot_notifier (&wdt977_notifier); err_out_region:if (!machine_is_netwinder ()) -release_region (IO_INDEX_PORT ,2 ); +release_region (IO_INDEX_PORT ,2 ); err_out:return rc; }
@@ -505,7 +505,7 @@ static void __exit wd977_exit(void)wdt977_stop ();misc_deregister (&wdt977_miscdev);unregister_reboot_notifier (&wdt977_notifier); -release_region (IO_INDEX_PORT ,2 ); +release_region (IO_INDEX_PORT ,2 ); }module_init (wd977_init);
PATCH 57/57 wdt501/pci: Clean up, coding style and switch to unlocked_ioctl
In reply to Alan CoxFrom: Alan Cox <[email protected]>
---
drivers/watchdog/wdt.c | 176 ++++++++++++++------------ drivers/watchdog/wdt_pci.c | 300 +++++++++++++++++++++++++------------------- 2 files changed, 265 insertions(+), 211 deletions(-)
drivers/watchdog/wdt.c +94 -82
@@ -24,9 +24,10 @@* Matt Crocker). * Alan Cox : Added wdt= boot option * Alan Cox : Cleaned up copy/user stuff -* Tim Hockin : Added insmod parameters, comment cleanup -* Parameterized timeout -* Tigran Aivazian : Restructured wdt_init() to handle failures +* Tim Hockin : Added insmod parameters, comment +* cleanup, parameterized timeout +* Tigran Aivazian : Restructured wdt_init() to handle +* failures * Joel Becker : Added WDIOC_GET/SETTIMEOUT * Matt Domsch : Added nowayout module option */
@@ -42,9 +43,9 @@#include <linux/notifier.h> #include <linux/reboot.h> #include <linux/init.h> +#include <linux/io.h> +#include <linux/uaccess.h> -#include <asm/io.h> -#include <asm/uaccess.h> #include <asm/system.h> #include "wd501p.h"
@@ -60,15 +61,19 @@ static char expect_close;static int heartbeat =WD_TIMO ;static int wd_heartbeat;module_param (heartbeat, int,0 ); -MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536, default=" __MODULE_STRING(WD_TIMO) ")"); +MODULE_PARM_DESC (heartbeat, + "Watchdog heartbeat in seconds. (0 < heartbeat < 65536, default=" + __MODULE_STRING(WD_TIMO) ")");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) ")");/* You must set these - there is no sane way to probe for this board. */ -static int io=0x240 ; -static int irq=11 ; +static int io =0x240 ; +static int irq =11 ;static DEFINE_SPINLOCK (wdt_lock);
@@ -82,7 +87,8 @@ MODULE_PARM_DESC(irq, "WDT irq (default=11)");static int tachometer;module_param (tachometer, int,0 ); -MODULE_PARM_DESC (tachometer,"WDT501-P Fan Tachometer support (0=disable, default=0)" ); +MODULE_PARM_DESC (tachometer, +"WDT501-P Fan Tachometer support (0=disable, default=0)" );#endif /* CONFIG_WDT_501 */ /*
@@ -91,9 +97,9 @@ MODULE_PARM_DESC(tachometer, "WDT501-P Fan Tachometer support (0=disable, defaulstatic void wdt_ctr_mode (int ctr,int mode) { - ctr<<=6 ; - ctr|=0x30 ; - ctr|=(mode<<1 ); + ctr <<=6 ; + ctr |=0x30 ; + ctr |= (mode <<1 );outb_p (ctr,WDT_CR ); }
@@ -114,12 +120,15 @@ static int wdt_start(void)unsigned long flags;spin_lock_irqsave (&wdt_lock, flags);inb_p (WDT_DC );/* Disable watchdog */ -wdt_ctr_mode (0 ,3 );/* Program CTR0 for Mode 3: Square Wave Generator */ -wdt_ctr_mode (1 ,2 );/* Program CTR1 for Mode 2: Rate Generator */ -wdt_ctr_mode (2 ,0 );/* Program CTR2 for Mode 0: Pulse on Terminal Count */ +wdt_ctr_mode (0 ,3 );/* Program CTR0 for Mode 3: +Square Wave Generator */ +wdt_ctr_mode (1 ,2 );/* Program CTR1 for Mode 2: +Rate Generator */ +wdt_ctr_mode (2 ,0 );/* Program CTR2 for Mode 0: +Pulse on Terminal Count */ wdt_ctr_load (0 ,8948 );/* Count at 100Hz */ -wdt_ctr_load (1 ,wd_heartbeat);/* Heartbeat */ -wdt_ctr_load (2 ,65535 );/* Length of reset pulse */ +wdt_ctr_load (1 , wd_heartbeat);/* Heartbeat */ +wdt_ctr_load (2 ,65535 );/* Length of reset pulse */ outb_p (0 ,WDT_DC );/* Enable watchdog */ spin_unlock_irqrestore (&wdt_lock, flags);return 0 ;
@@ -131,13 +140,13 @@ static int wdt_start(void)* Stop the watchdog driver. */ -static int wdt_stop (void ) +static int wdt_stop (void ) {unsigned long flags;spin_lock_irqsave (&wdt_lock, flags);/* Turn the card off */ inb_p (WDT_DC );/* Disable watchdog */ -wdt_ctr_load (2 ,0 );/* 0 length reset pulses now */ +wdt_ctr_load (2 ,0 );/* 0 length reset pulses now */ spin_unlock_irqrestore (&wdt_lock, flags);return 0 ; }
@@ -145,8 +154,8 @@ static int wdt_stop (void)/** * wdt_ping: * -* Reload counter one with the watchdog heartbeat. We don't bother reloading -* the cascade counter. +* Reload counter one with the watchdog heartbeat. We don't bother +* reloading the cascade counter. */ static int wdt_ping (void )
@@ -155,8 +164,9 @@ static int wdt_ping(void)spin_lock_irqsave (&wdt_lock, flags);/* Write a watchdog value */ inb_p (WDT_DC );/* Disable watchdog */ -wdt_ctr_mode (1 ,2 );/* Re-Program CTR1 for Mode 2: Rate Generator */ -wdt_ctr_load (1 ,wd_heartbeat);/* Heartbeat */ +wdt_ctr_mode (1 ,2 );/* Re-Program CTR1 for Mode 2: +Rate Generator */ +wdt_ctr_load (1 , wd_heartbeat);/* Heartbeat */ outb_p (0 ,WDT_DC );/* Enable watchdog */ spin_unlock_irqrestore (&wdt_lock, flags);return 0 ;
@@ -166,13 +176,14 @@ static int wdt_ping(void)* wdt_set_heartbeat: * @t: the new heartbeat value that needs to be set. * -* Set a new heartbeat value for the watchdog device. If the heartbeat value is -* incorrect we keep the old value and return -EINVAL. If successfull we -* return 0. +* Set a new heartbeat value for the watchdog device. If the heartbeat +* value is incorrect we keep the old value and return -EINVAL. If +* successful we return 0. */ +static int wdt_set_heartbeat (int t) { -if ((t <1 ) || (t >65535 )) +if (t <1 || t >65535 )return -EINVAL ; heartbeat = t;
@@ -200,7 +211,7 @@ static int wdt_get_status(int *status) new_status =inb_p (WDT_SR );spin_unlock_irqrestore (&wdt_lock, flags); - *status=0 ; + *status =0 ;if (new_status &WDC_SR_ISOI0 ) *status |=WDIOF_EXTERN1 ;if (new_status &WDC_SR_ISII1 )
@@ -266,7 +277,7 @@ static irqreturn_t wdt_interrupt(int irq, void *dev_id)#ifdef CONFIG_WDT_501 if (!(status &WDC_SR_TGOOD )) -printk (KERN_CRIT "Overheat alarm.(%d)\n" ,inb_p (WDT_RT )); +printk (KERN_CRIT "Overheat alarm.(%d)\n" ,inb_p (WDT_RT ));if (!(status &WDC_SR_PSUOVER ))printk (KERN_CRIT "PSU over voltage.\n" );if (!(status &WDC_SR_PSUUNDR ))
@@ -304,9 +315,10 @@ static irqreturn_t wdt_interrupt(int irq, void *dev_id)* write of data will do, as we we don't define content meaning. */ -static ssize_t wdt_write (struct file *file,const char __user *buf,size_t count,loff_t *ppos) +static ssize_t wdt_write (struct file *file,const char __user *buf, +size_t count,loff_t *ppos) { -if (count) { +if (count) {if (!nowayout) {size_t i;
@@ -328,7 +340,6 @@ static ssize_t wdt_write(struct file *file, const char __user *buf, size_t count/** * wdt_ioctl: -* @inode: inode of the device * @file: file handle to the device * @cmd: watchdog command * @arg: argument pointer
@@ -338,8 +349,7 @@ static ssize_t wdt_write(struct file *file, const char __user *buf, size_t count* querying capabilities and current status. */ -static int wdt_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) +static long wdt_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {void __user *argp = (void __user *)arg;int __user *p = argp;
@@ -362,32 +372,28 @@ static int wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, ident.options |=WDIOF_FANFAULT ;#endif /* CONFIG_WDT_501 */ -switch (cmd) - { -default : -return -ENOTTY ; -case WDIOC_GETSUPPORT : -return copy_to_user (argp, &ident,sizeof (ident))?-EFAULT :0 ; - -case WDIOC_GETSTATUS : -wdt_get_status (&status); -return put_user (status, p); -case WDIOC_GETBOOTSTATUS : -return put_user (0 , p); -case WDIOC_KEEPALIVE : -wdt_ping (); -return 0 ; -case WDIOC_SETTIMEOUT : -if (get_user (new_heartbeat, p)) -return -EFAULT ; - -if (wdt_set_heartbeat (new_heartbeat)) -return -EINVAL ; - -wdt_ping (); -/* Fall */ -case WDIOC_GETTIMEOUT : -return put_user (heartbeat, p); +switch (cmd) { +default : +return -ENOTTY ; +case WDIOC_GETSUPPORT : +return copy_to_user (argp, &ident,sizeof (ident)) ? -EFAULT :0 ; +case WDIOC_GETSTATUS : +wdt_get_status (&status); +return put_user (status, p); +case WDIOC_GETBOOTSTATUS : +return put_user (0 , p); +case WDIOC_KEEPALIVE : +wdt_ping (); +return 0 ; +case WDIOC_SETTIMEOUT : +if (get_user (new_heartbeat, p)) +return -EFAULT ; +if (wdt_set_heartbeat (new_heartbeat)) +return -EINVAL ; +wdt_ping (); +/* Fall */ +case WDIOC_GETTIMEOUT : +return put_user (heartbeat, p); } }
@@ -405,7 +411,7 @@ static int wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,static int wdt_open (struct inode *inode,struct file *file) { -if (test_and_set_bit (0 , &wdt_is_open)) +if (test_and_set_bit (0 , &wdt_is_open))return -EBUSY ;/* * Activate
@@ -432,7 +438,8 @@ static int wdt_release(struct inode *inode, struct file *file)wdt_stop ();clear_bit (0 , &wdt_is_open); }else { -printk (KERN_CRIT "wdt: WDT device closed unexpectedly. WDT will not stop!\n" ); +printk (KERN_CRIT +"wdt: WDT device closed unexpectedly. WDT will not stop!\n" );wdt_ping (); } expect_close =0 ;
@@ -451,14 +458,15 @@ static int wdt_release(struct inode *inode, struct file *file)* farenheit. It was designed by an imperial measurement luddite. */ -static ssize_t wdt_temp_read (struct file *file,char __user *buf,size_t count,loff_t *ptr) +static ssize_t wdt_temp_read (struct file *file,char __user *buf, +size_t count,loff_t *ptr) {int temperature;if (wdt_get_temperature (&temperature))return -EFAULT ; -if (copy_to_user (buf, &temperature,1 )) +if (copy_to_user (buf, &temperature,1 ))return -EFAULT ;return 1 ;
@@ -506,10 +514,8 @@ static int wdt_temp_release(struct inode *inode, struct file *file)static int wdt_notify_sys (struct notifier_block *this,unsigned long code,void *unused) { -if (code==SYS_DOWN || code==SYS_HALT ) { -/* Turn the card off */ +if (code ==SYS_DOWN || code ==SYS_HALT )wdt_stop (); - }return NOTIFY_DONE ; }
@@ -522,7 +528,7 @@ static const struct file_operations wdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = wdt_write, - .ioctl = wdt_ioctl, + .unlocked_ioctl = wdt_ioctl, .open = wdt_open, .release = wdt_release, };
@@ -576,7 +582,7 @@ static void __exit wdt_exit(void)#endif /* CONFIG_WDT_501 */ unregister_reboot_notifier (&wdt_notifier);free_irq (irq,NULL ); -release_region (io,8 ); +release_region (io,8 ); }/**
@@ -591,44 +597,49 @@ static int __init wdt_init(void) {int ret; -/* Check that the heartbeat value is within it's range ; if not reset to the default */ +/* Check that the heartbeat value is within it's range; +if not reset to the default */ if (wdt_set_heartbeat (heartbeat)) {wdt_set_heartbeat (WD_TIMO ); -printk (KERN_INFO "wdt: heartbeat value must be 0<heartbeat<65536, using %d\n" , +printk (KERN_INFO "wdt: heartbeat value must be 0 < heartbeat < 65536, using %d\n" ,WD_TIMO ); }if (!request_region (io,8 ,"wdt501p" )) { -printk (KERN_ERR "wdt: I/O address 0x%04x already in use\n" , io); +printk (KERN_ERR +"wdt: I/O address 0x%04x already in use\n" , io); ret = -EBUSY ; goto out; } ret =request_irq (irq, wdt_interrupt,IRQF_DISABLED ,"wdt501p" ,NULL ); -if (ret) { +if (ret) {printk (KERN_ERR "wdt: IRQ %d is not free.\n" , irq); goto outreg; } ret =register_reboot_notifier (&wdt_notifier); -if (ret) { -printk (KERN_ERR "wdt: cannot register reboot notifier (err=%d)\n" , ret); +if (ret) { +printk (KERN_ERR +"wdt: cannot register reboot notifier (err=%d)\n" , ret); goto outirq; }#ifdef CONFIG_WDT_501 ret =misc_register (&temp_miscdev);if (ret) { -printk (KERN_ERR "wdt: cannot register miscdev on minor=%d (err=%d)\n" , -TEMP_MINOR , ret); +printk (KERN_ERR +"wdt: cannot register miscdev on minor=%d (err=%d)\n" , +TEMP_MINOR , ret); goto outrbt; }#endif /* CONFIG_WDT_501 */ ret =misc_register (&wdt_miscdev);if (ret) { -printk (KERN_ERR "wdt: cannot register miscdev on minor=%d (err=%d)\n" , -WATCHDOG_MINOR , ret); +printk (KERN_ERR +"wdt: cannot register miscdev on minor=%d (err=%d)\n" , +WATCHDOG_MINOR , ret); goto outmisc; }
@@ -636,7 +647,8 @@ static int __init wdt_init(void)printk (KERN_INFO "WDT500/501-P driver 0.10 at 0x%04x (Interrupt %d). heartbeat=%d sec (nowayout=%d)\n" , io, irq, heartbeat, nowayout);#ifdef CONFIG_WDT_501 -printk (KERN_INFO "wdt: Fan Tachometer is %s\n" , (tachometer ?"Enabled" :"Disabled" )); +printk (KERN_INFO "wdt: Fan Tachometer is %s\n" , + (tachometer ?"Enabled" :"Disabled" ));#endif /* CONFIG_WDT_501 */ out:
@@ -651,7 +663,7 @@ outrbt: outirq:free_irq (irq,NULL ); outreg: -release_region (io,8 ); +release_region (io,8 ); goto out; }
drivers/watchdog/wdt_pci.c +171 -129
569 lines not on this page · raw message
Quoted 56 lines · On Mon, 19 May 2008 14:04:40 +0100 Alan Cox <[email protected]> wrote:
drivers/watchdog/acquirewdt.c | 119 ++++----- drivers/watchdog/advantechwdt.c | 133 ++++------ drivers/watchdog/alim1535_wdt.c | 186 +++++++------ drivers/watchdog/alim7101_wdt.c | 224 +++++++++------- drivers/watchdog/ar7_wdt.c | 29 +- drivers/watchdog/at32ap700x_wdt.c | 7 - drivers/watchdog/at91rm9200_wdt.c | 108 ++++---- drivers/watchdog/bfin_wdt.c | 147 +++++------ drivers/watchdog/booke_wdt.c | 57 ++-- drivers/watchdog/cpu5wdt.c | 144 +++++----- drivers/watchdog/davinci_wdt.c | 11 - drivers/watchdog/ep93xx_wdt.c | 17 + drivers/watchdog/eurotechwdt.c | 57 +++- drivers/watchdog/hpwdt.c | 4 drivers/watchdog/i6300esb.c | 342 ++++++++++++------------- drivers/watchdog/iTCO_vendor.h | 15 + drivers/watchdog/iTCO_vendor_support.c | 53 ++-- drivers/watchdog/iTCO_wdt.c | 294 ++++++++++----------- drivers/watchdog/ib700wdt.c | 103 ++++--- drivers/watchdog/ibmasr.c | 149 ++++++----- drivers/watchdog/indydog.c | 114 ++++---- drivers/watchdog/iop_wdt.c | 46 ++- drivers/watchdog/it8712f_wdt.c | 77 ++---- drivers/watchdog/ixp2000_wdt.c | 50 ++-- drivers/watchdog/ixp4xx_wdt.c | 41 +-- drivers/watchdog/ks8695_wdt.c | 119 ++++----- drivers/watchdog/machzwd.c | 108 +++----- drivers/watchdog/mixcomwd.c | 133 +++++----- drivers/watchdog/mpc5200_wdt.c | 20 + drivers/watchdog/mpc83xx_wdt.c | 19 + drivers/watchdog/mpc8xx_wdt.c | 37 +-- drivers/watchdog/mpcore_wdt.c | 53 ++-- drivers/watchdog/mtx-1_wdt.c | 107 ++++---- drivers/watchdog/mv64x60_wdt.c | 20 + drivers/watchdog/omap_wdt.c | 35 ++- drivers/watchdog/pc87413_wdt.c | 211 ++++++--------- drivers/watchdog/pcwd.c | 179 +++++++------ drivers/watchdog/pnx4008_wdt.c | 18 + drivers/watchdog/rm9k_wdt.c | 21 +- drivers/watchdog/s3c2410_wdt.c | 148 ++++++----- drivers/watchdog/sa1100_wdt.c | 32 +- drivers/watchdog/sb_wdog.c | 78 +++--- drivers/watchdog/sbc60xxwdt.c | 223 ++++++++-------- drivers/watchdog/sbc7240_wdt.c | 16 + drivers/watchdog/sbc8360.c | 30 +- drivers/watchdog/sbc_epx_c3.c | 12 - drivers/watchdog/sc1200wdt.c | 203 ++++++++------- drivers/watchdog/sc520_wdt.c | 163 ++++++------ drivers/watchdog/scx200_wdt.c | 59 ++-- drivers/watchdog/shwdt.c | 139 ++++++---- drivers/watchdog/smsc37b787_wdt.c | 442 ++++++++++++++++---------------- drivers/watchdog/softdog.c | 87 +++--- drivers/watchdog/txx9wdt.c | 31 +- drivers/watchdog/w83627hf_wdt.c | 175 ++++++------- drivers/watchdog/w83697hf_wdt.c | 141 +++++----- drivers/watchdog/w83877f_wdt.c | 199 +++++++-------
Quoted 8 lines
drivers/watchdog/w83977f_wdt.c | 225 ++++++++-------- drivers/watchdog/wafer5823wdt.c | 80 +++--- drivers/watchdog/wdrtas.c | 103 +++---- drivers/watchdog/wdt.c | 176 +++++++------ drivers/watchdog/wdt285.c | 31 +- drivers/watchdog/wdt977.c | 148 +++++------ drivers/watchdog/wdt_pci.c | 300 ++++++++++++---------- 65 files changed, 3479 insertions(+), 3396 deletions(-)
eek.
This comes at a time when git-watchdog has
drivers/watchdog/Kconfig | 38 +++- drivers/watchdog/Makefile | 5 + drivers/watchdog/bfin_wdt.c | 111 +++++--- drivers/watchdog/core/Kconfig | 33 +++ drivers/watchdog/core/Makefile | 7 + drivers/watchdog/core/watchdog_core.c | 200 ++++++++++++++ drivers/watchdog/core/watchdog_dev.c | 465 +++++++++++++++++++++++++++++++++ drivers/watchdog/geodewdt.c | 309 ++++++++++++++++++++++ drivers/watchdog/hpwdt.c | 27 +- drivers/watchdog/iTCO_wdt.c | 247 +++++------------- drivers/watchdog/it8712f_wdt.c | 21 ++ drivers/watchdog/rc32434_wdt.c | 344 ++++++++++++++++++++++++ drivers/watchdog/rdc321x_wdt.c | 285 ++++++++++++++++++++ drivers/watchdog/w83697hf_wdt.c | 38 +++- include/linux/watchdog.h | 49 ++++ 15 files changed, 1934 insertions(+), 245 deletions(-)
and hasn't had a commit in six weeks, missed the merge window and the most recent commit is titled "[WATCHDOG] rc32434_wdt: critical bugfixes".
Wim, come back!
(Happily there appears to be little overlap between the two diffstats there)
Quoted 7 lines
and hasn't had a commit in six weeks, missed the merge window and the most recent commit is titled "[WATCHDOG]
rc32434_wdt: critical bugfixes".Wim, come back!
(Happily there appears to be little overlap between the two diffstats there)
If Wim wants I'll start folding them all together into one tree.
Alan
Hi Andrew,
Quoted 11 lines
eek.
This comes at a time when git-watchdog has
and hasn't had a commit in six weeks, missed the merge window and the most recent commit is titled "[WATCHDOG]
rc32434_wdt: critical bugfixes".Wim, come back!
(Happily there appears to be little overlap between the two diffstats there)
Sorry guys, I had to do electricity, ... for the new house. I have to finish still one thing tonight and then things should be normal again for a few weeks. I indeed have some backlog, but Alan's patches seems rather straight forward. I'll merge them in the linux-watchdog-mm tree as soon as possible (but i'll first sent some watchdog patches over to linus because I seemed to have missed allready 2 rc releases :-( ).
Greetings,
Wim.
Quoted 12 lines · On Tue, 20 May 2008 10:01:10 +0200 Wim Van Sebroeck <[email protected]> wrote:
Hi Andrew,
Quoted 10 lines
eek.
This comes at a time when git-watchdog has
and hasn't had a commit in six weeks, missed the merge window and the most recent commit is titled "[WATCHDOG]
rc32434_wdt: critical bugfixes".Wim, come back!
Quoted 8 lines
Quoted 1 line
(Happily there appears to be little overlap between the two diffstats there)
Sorry guys, I had to do electricity, ... for the new house. I have to finish still one thing tonight and then things should be normal again for a few weeks. I indeed have some backlog, but Alan's patches seems rather straight forward. I'll merge them in the linux-watchdog-mm tree as soon as possible (but i'll first sent some watchdog patches over to linus because I seemed to have missed allready 2 rc releases :-( ).
Thanks, no probs. Linus may get grumpy, but he hopefully doesn't know where you live ;)
Please do take a look at the itco_wdt-ich9do-support.patch and watchdog-fix-booke_wdtc-on-mpc85xx-smp-system.patch which I just resent. And we need to work out what to do about the Rusty problem, which is also a linux-next problem.
Hi Andrew,
Quoted 2 lines
Thanks, no probs. Linus may get grumpy, but he hopefully doesn't know where you live ;)
He definitely knows which country, but indeed not exactly where :-) So I'll survive. My wive and children however, do know where I live and they want to be able to move end of this summer, so it's obvious what to choose :-)
Greetings,
Wim.