diff options
| -rw-r--r-- | drivers/char/watchdog/pcwd.c | 26 | ||||
| -rw-r--r-- | drivers/char/watchdog/pcwd_pci.c | 32 | ||||
| -rw-r--r-- | drivers/char/watchdog/pcwd_usb.c | 61 | ||||
| -rw-r--r-- | drivers/char/watchdog/pnx4008_wdt.c | 3 | ||||
| -rw-r--r-- | drivers/char/watchdog/s3c2410_wdt.c | 60 |
5 files changed, 123 insertions, 59 deletions
diff --git a/drivers/char/watchdog/pcwd.c b/drivers/char/watchdog/pcwd.c index 8e1e6e48e0a7..aab6621817a0 100644 --- a/drivers/char/watchdog/pcwd.c +++ b/drivers/char/watchdog/pcwd.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * PC Watchdog Driver | 2 | * PC Watchdog Driver |
| 3 | * by Ken Hollis (khollis@bitgate.com) | 3 | * by Ken Hollis (khollis@bitgate.com) |
| 4 | * | 4 | * |
| 5 | * Permission granted from Simon Machell (73244.1270@compuserve.com) | 5 | * Permission granted from Simon Machell (smachell@berkprod.com) |
| 6 | * Written for the Linux Kernel, and GPLed by Ken Hollis | 6 | * Written for the Linux Kernel, and GPLed by Ken Hollis |
| 7 | * | 7 | * |
| 8 | * 960107 Added request_region routines, modulized the whole thing. | 8 | * 960107 Added request_region routines, modulized the whole thing. |
| @@ -70,8 +70,8 @@ | |||
| 70 | #include <asm/io.h> /* For inb/outb/... */ | 70 | #include <asm/io.h> /* For inb/outb/... */ |
| 71 | 71 | ||
| 72 | /* Module and version information */ | 72 | /* Module and version information */ |
| 73 | #define WATCHDOG_VERSION "1.17" | 73 | #define WATCHDOG_VERSION "1.18" |
| 74 | #define WATCHDOG_DATE "12 Feb 2006" | 74 | #define WATCHDOG_DATE "06 Jan 2007" |
| 75 | #define WATCHDOG_DRIVER_NAME "ISA-PC Watchdog" | 75 | #define WATCHDOG_DRIVER_NAME "ISA-PC Watchdog" |
| 76 | #define WATCHDOG_NAME "pcwd" | 76 | #define WATCHDOG_NAME "pcwd" |
| 77 | #define PFX WATCHDOG_NAME ": " | 77 | #define PFX WATCHDOG_NAME ": " |
| @@ -132,6 +132,18 @@ | |||
| 132 | #define CMD_ISA_DELAY_TIME_8SECS 0x0C | 132 | #define CMD_ISA_DELAY_TIME_8SECS 0x0C |
| 133 | #define CMD_ISA_RESET_RELAYS 0x0D | 133 | #define CMD_ISA_RESET_RELAYS 0x0D |
| 134 | 134 | ||
| 135 | /* Watchdog's Dip Switch heartbeat values */ | ||
| 136 | static const int heartbeat_tbl [] = { | ||
| 137 | 20, /* OFF-OFF-OFF = 20 Sec */ | ||
| 138 | 40, /* OFF-OFF-ON = 40 Sec */ | ||
| 139 | 60, /* OFF-ON-OFF = 1 Min */ | ||
| 140 | 300, /* OFF-ON-ON = 5 Min */ | ||
| 141 | 600, /* ON-OFF-OFF = 10 Min */ | ||
| 142 | 1800, /* ON-OFF-ON = 30 Min */ | ||
| 143 | 3600, /* ON-ON-OFF = 1 Hour */ | ||
| 144 | 7200, /* ON-ON-ON = 2 hour */ | ||
| 145 | }; | ||
| 146 | |||
| 135 | /* | 147 | /* |
| 136 | * We are using an kernel timer to do the pinging of the watchdog | 148 | * We are using an kernel timer to do the pinging of the watchdog |
| 137 | * every ~500ms. We try to set the internal heartbeat of the | 149 | * every ~500ms. We try to set the internal heartbeat of the |
| @@ -167,10 +179,10 @@ static int debug = QUIET; | |||
| 167 | module_param(debug, int, 0); | 179 | module_param(debug, int, 0); |
| 168 | MODULE_PARM_DESC(debug, "Debug level: 0=Quiet, 1=Verbose, 2=Debug (default=0)"); | 180 | MODULE_PARM_DESC(debug, "Debug level: 0=Quiet, 1=Verbose, 2=Debug (default=0)"); |
| 169 | 181 | ||
| 170 | #define WATCHDOG_HEARTBEAT 60 /* 60 sec default heartbeat */ | 182 | #define WATCHDOG_HEARTBEAT 0 /* default heartbeat = delay-time from dip-switches */ |
| 171 | static int heartbeat = WATCHDOG_HEARTBEAT; | 183 | static int heartbeat = WATCHDOG_HEARTBEAT; |
| 172 | module_param(heartbeat, int, 0); | 184 | module_param(heartbeat, int, 0); |
| 173 | MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (2<=heartbeat<=7200, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")"); | 185 | MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (2<=heartbeat<=7200 or 0=delay-time from dip-switches, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")"); |
| 174 | 186 | ||
| 175 | static int nowayout = WATCHDOG_NOWAYOUT; | 187 | static int nowayout = WATCHDOG_NOWAYOUT; |
| 176 | module_param(nowayout, int, 0); | 188 | module_param(nowayout, int, 0); |
| @@ -844,6 +856,10 @@ static int __devinit pcwatchdog_init(int base_addr) | |||
| 844 | /* Show info about the card itself */ | 856 | /* Show info about the card itself */ |
| 845 | pcwd_show_card_info(); | 857 | pcwd_show_card_info(); |
| 846 | 858 | ||
| 859 | /* If heartbeat = 0 then we use the heartbeat from the dip-switches */ | ||
| 860 | if (heartbeat == 0) | ||
| 861 | heartbeat = heartbeat_tbl[(pcwd_get_option_switches() & 0x07)]; | ||
| 862 | |||
| 847 | /* Check that the heartbeat value is within it's range ; if not reset to the default */ | 863 | /* Check that the heartbeat value is within it's range ; if not reset to the default */ |
| 848 | if (pcwd_set_heartbeat(heartbeat)) { | 864 | if (pcwd_set_heartbeat(heartbeat)) { |
| 849 | pcwd_set_heartbeat(WATCHDOG_HEARTBEAT); | 865 | pcwd_set_heartbeat(WATCHDOG_HEARTBEAT); |
diff --git a/drivers/char/watchdog/pcwd_pci.c b/drivers/char/watchdog/pcwd_pci.c index f4872c871063..95ddcd8c1db2 100644 --- a/drivers/char/watchdog/pcwd_pci.c +++ b/drivers/char/watchdog/pcwd_pci.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Berkshire PCI-PC Watchdog Card Driver | 2 | * Berkshire PCI-PC Watchdog Card Driver |
| 3 | * | 3 | * |
| 4 | * (c) Copyright 2003-2005 Wim Van Sebroeck <wim@iguana.be>. | 4 | * (c) Copyright 2003-2007 Wim Van Sebroeck <wim@iguana.be>. |
| 5 | * | 5 | * |
| 6 | * Based on source code of the following authors: | 6 | * Based on source code of the following authors: |
| 7 | * Ken Hollis <kenji@bitgate.com>, | 7 | * Ken Hollis <kenji@bitgate.com>, |
| @@ -51,8 +51,8 @@ | |||
| 51 | #include <asm/io.h> /* For inb/outb/... */ | 51 | #include <asm/io.h> /* For inb/outb/... */ |
| 52 | 52 | ||
| 53 | /* Module and version information */ | 53 | /* Module and version information */ |
| 54 | #define WATCHDOG_VERSION "1.02" | 54 | #define WATCHDOG_VERSION "1.03" |
| 55 | #define WATCHDOG_DATE "03 Sep 2005" | 55 | #define WATCHDOG_DATE "06 Jan 2007" |
| 56 | #define WATCHDOG_DRIVER_NAME "PCI-PC Watchdog" | 56 | #define WATCHDOG_DRIVER_NAME "PCI-PC Watchdog" |
| 57 | #define WATCHDOG_NAME "pcwd_pci" | 57 | #define WATCHDOG_NAME "pcwd_pci" |
| 58 | #define PFX WATCHDOG_NAME ": " | 58 | #define PFX WATCHDOG_NAME ": " |
| @@ -96,6 +96,18 @@ | |||
| 96 | #define CMD_WRITE_WATCHDOG_TIMEOUT 0x19 | 96 | #define CMD_WRITE_WATCHDOG_TIMEOUT 0x19 |
| 97 | #define CMD_GET_CLEAR_RESET_COUNT 0x84 | 97 | #define CMD_GET_CLEAR_RESET_COUNT 0x84 |
| 98 | 98 | ||
| 99 | /* Watchdog's Dip Switch heartbeat values */ | ||
| 100 | static const int heartbeat_tbl [] = { | ||
| 101 | 5, /* OFF-OFF-OFF = 5 Sec */ | ||
| 102 | 10, /* OFF-OFF-ON = 10 Sec */ | ||
| 103 | 30, /* OFF-ON-OFF = 30 Sec */ | ||
| 104 | 60, /* OFF-ON-ON = 1 Min */ | ||
| 105 | 300, /* ON-OFF-OFF = 5 Min */ | ||
| 106 | 600, /* ON-OFF-ON = 10 Min */ | ||
| 107 | 1800, /* ON-ON-OFF = 30 Min */ | ||
| 108 | 3600, /* ON-ON-ON = 1 hour */ | ||
| 109 | }; | ||
| 110 | |||
| 99 | /* We can only use 1 card due to the /dev/watchdog restriction */ | 111 | /* We can only use 1 card due to the /dev/watchdog restriction */ |
| 100 | static int cards_found; | 112 | static int cards_found; |
| 101 | 113 | ||
| @@ -119,10 +131,10 @@ static int debug = QUIET; | |||
| 119 | module_param(debug, int, 0); | 131 | module_param(debug, int, 0); |
| 120 | MODULE_PARM_DESC(debug, "Debug level: 0=Quiet, 1=Verbose, 2=Debug (default=0)"); | 132 | MODULE_PARM_DESC(debug, "Debug level: 0=Quiet, 1=Verbose, 2=Debug (default=0)"); |
| 121 | 133 | ||
| 122 | #define WATCHDOG_HEARTBEAT 2 /* 2 sec default heartbeat */ | 134 | #define WATCHDOG_HEARTBEAT 0 /* default heartbeat = delay-time from dip-switches */ |
| 123 | static int heartbeat = WATCHDOG_HEARTBEAT; | 135 | static int heartbeat = WATCHDOG_HEARTBEAT; |
| 124 | module_param(heartbeat, int, 0); | 136 | module_param(heartbeat, int, 0); |
| 125 | MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")"); | 137 | MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536 or 0=delay-time from dip-switches, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")"); |
| 126 | 138 | ||
| 127 | static int nowayout = WATCHDOG_NOWAYOUT; | 139 | static int nowayout = WATCHDOG_NOWAYOUT; |
| 128 | module_param(nowayout, int, 0); | 140 | module_param(nowayout, int, 0); |
| @@ -286,7 +298,9 @@ static int pcipcwd_stop(void) | |||
| 286 | static int pcipcwd_keepalive(void) | 298 | static int pcipcwd_keepalive(void) |
| 287 | { | 299 | { |
| 288 | /* Re-trigger watchdog by writing to port 0 */ | 300 | /* Re-trigger watchdog by writing to port 0 */ |
| 301 | spin_lock(&pcipcwd_private.io_lock); | ||
| 289 | outb_p(0x42, pcipcwd_private.io_addr); /* send out any data */ | 302 | outb_p(0x42, pcipcwd_private.io_addr); /* send out any data */ |
| 303 | spin_unlock(&pcipcwd_private.io_lock); | ||
| 290 | 304 | ||
| 291 | if (debug >= DEBUG) | 305 | if (debug >= DEBUG) |
| 292 | printk(KERN_DEBUG PFX "Watchdog keepalive signal send\n"); | 306 | printk(KERN_DEBUG PFX "Watchdog keepalive signal send\n"); |
| @@ -373,7 +387,9 @@ static int pcipcwd_get_temperature(int *temperature) | |||
| 373 | if (!pcipcwd_private.supports_temp) | 387 | if (!pcipcwd_private.supports_temp) |
| 374 | return -ENODEV; | 388 | return -ENODEV; |
| 375 | 389 | ||
| 390 | spin_lock(&pcipcwd_private.io_lock); | ||
| 376 | *temperature = inb_p(pcipcwd_private.io_addr); | 391 | *temperature = inb_p(pcipcwd_private.io_addr); |
| 392 | spin_unlock(&pcipcwd_private.io_lock); | ||
| 377 | 393 | ||
| 378 | /* | 394 | /* |
| 379 | * Convert celsius to fahrenheit, since this was | 395 | * Convert celsius to fahrenheit, since this was |
| @@ -711,6 +727,10 @@ static int __devinit pcipcwd_card_init(struct pci_dev *pdev, | |||
| 711 | /* Show info about the card itself */ | 727 | /* Show info about the card itself */ |
| 712 | pcipcwd_show_card_info(); | 728 | pcipcwd_show_card_info(); |
| 713 | 729 | ||
| 730 | /* If heartbeat = 0 then we use the heartbeat from the dip-switches */ | ||
| 731 | if (heartbeat == 0) | ||
| 732 | heartbeat = heartbeat_tbl[(pcipcwd_get_option_switches() & 0x07)]; | ||
| 733 | |||
| 714 | /* Check that the heartbeat value is within it's range ; if not reset to the default */ | 734 | /* Check that the heartbeat value is within it's range ; if not reset to the default */ |
| 715 | if (pcipcwd_set_heartbeat(heartbeat)) { | 735 | if (pcipcwd_set_heartbeat(heartbeat)) { |
| 716 | pcipcwd_set_heartbeat(WATCHDOG_HEARTBEAT); | 736 | pcipcwd_set_heartbeat(WATCHDOG_HEARTBEAT); |
| @@ -798,6 +818,8 @@ static int __init pcipcwd_init_module(void) | |||
| 798 | static void __exit pcipcwd_cleanup_module(void) | 818 | static void __exit pcipcwd_cleanup_module(void) |
| 799 | { | 819 | { |
| 800 | pci_unregister_driver(&pcipcwd_driver); | 820 | pci_unregister_driver(&pcipcwd_driver); |
| 821 | |||
| 822 | printk(KERN_INFO PFX "Watchdog Module Unloaded.\n"); | ||
| 801 | } | 823 | } |
| 802 | 824 | ||
| 803 | module_init(pcipcwd_init_module); | 825 | module_init(pcipcwd_init_module); |
diff --git a/drivers/char/watchdog/pcwd_usb.c b/drivers/char/watchdog/pcwd_usb.c index 2da5ac99687c..1ad1f22e97d7 100644 --- a/drivers/char/watchdog/pcwd_usb.c +++ b/drivers/char/watchdog/pcwd_usb.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Berkshire USB-PC Watchdog Card Driver | 2 | * Berkshire USB-PC Watchdog Card Driver |
| 3 | * | 3 | * |
| 4 | * (c) Copyright 2004 Wim Van Sebroeck <wim@iguana.be>. | 4 | * (c) Copyright 2004-2007 Wim Van Sebroeck <wim@iguana.be>. |
| 5 | * | 5 | * |
| 6 | * Based on source code of the following authors: | 6 | * Based on source code of the following authors: |
| 7 | * Ken Hollis <kenji@bitgate.com>, | 7 | * Ken Hollis <kenji@bitgate.com>, |
| @@ -24,26 +24,25 @@ | |||
| 24 | * http://www.berkprod.com/ or http://www.pcwatchdog.com/ | 24 | * http://www.berkprod.com/ or http://www.pcwatchdog.com/ |
| 25 | */ | 25 | */ |
| 26 | 26 | ||
| 27 | #include <linux/kernel.h> | 27 | #include <linux/module.h> /* For module specific items */ |
| 28 | #include <linux/errno.h> | 28 | #include <linux/moduleparam.h> /* For new moduleparam's */ |
| 29 | #include <linux/init.h> | 29 | #include <linux/types.h> /* For standard types (like size_t) */ |
| 30 | #include <linux/slab.h> | 30 | #include <linux/errno.h> /* For the -ENODEV/... values */ |
| 31 | #include <linux/module.h> | 31 | #include <linux/kernel.h> /* For printk/panic/... */ |
| 32 | #include <linux/moduleparam.h> | 32 | #include <linux/delay.h> /* For mdelay function */ |
| 33 | #include <linux/types.h> | 33 | #include <linux/miscdevice.h> /* For MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR) */ |
| 34 | #include <linux/delay.h> | 34 | #include <linux/watchdog.h> /* For the watchdog specific items */ |
| 35 | #include <linux/miscdevice.h> | 35 | #include <linux/notifier.h> /* For notifier support */ |
| 36 | #include <linux/watchdog.h> | 36 | #include <linux/reboot.h> /* For reboot_notifier stuff */ |
| 37 | #include <linux/notifier.h> | 37 | #include <linux/init.h> /* For __init/__exit/... */ |
| 38 | #include <linux/reboot.h> | 38 | #include <linux/fs.h> /* For file operations */ |
| 39 | #include <linux/fs.h> | 39 | #include <linux/usb.h> /* For USB functions */ |
| 40 | #include <linux/smp_lock.h> | 40 | #include <linux/slab.h> /* For kmalloc, ... */ |
| 41 | #include <linux/completion.h> | 41 | #include <linux/mutex.h> /* For mutex locking */ |
| 42 | #include <asm/uaccess.h> | ||
| 43 | #include <linux/usb.h> | ||
| 44 | #include <linux/mutex.h> | ||
| 45 | #include <linux/hid.h> /* For HID_REQ_SET_REPORT & HID_DT_REPORT */ | 42 | #include <linux/hid.h> /* For HID_REQ_SET_REPORT & HID_DT_REPORT */ |
| 46 | 43 | ||
| 44 | #include <asm/uaccess.h> /* For copy_to_user/put_user/... */ | ||
| 45 | |||
| 47 | 46 | ||
| 48 | #ifdef CONFIG_USB_DEBUG | 47 | #ifdef CONFIG_USB_DEBUG |
| 49 | static int debug = 1; | 48 | static int debug = 1; |
| @@ -57,8 +56,8 @@ | |||
| 57 | 56 | ||
| 58 | 57 | ||
| 59 | /* Module and Version Information */ | 58 | /* Module and Version Information */ |
| 60 | #define DRIVER_VERSION "1.01" | 59 | #define DRIVER_VERSION "1.02" |
| 61 | #define DRIVER_DATE "15 Mar 2005" | 60 | #define DRIVER_DATE "06 Jan 2007" |
| 62 | #define DRIVER_AUTHOR "Wim Van Sebroeck <wim@iguana.be>" | 61 | #define DRIVER_AUTHOR "Wim Van Sebroeck <wim@iguana.be>" |
| 63 | #define DRIVER_DESC "Berkshire USB-PC Watchdog driver" | 62 | #define DRIVER_DESC "Berkshire USB-PC Watchdog driver" |
| 64 | #define DRIVER_LICENSE "GPL" | 63 | #define DRIVER_LICENSE "GPL" |
| @@ -75,10 +74,10 @@ MODULE_ALIAS_MISCDEV(TEMP_MINOR); | |||
| 75 | module_param(debug, int, 0); | 74 | module_param(debug, int, 0); |
| 76 | MODULE_PARM_DESC(debug, "Debug enabled or not"); | 75 | MODULE_PARM_DESC(debug, "Debug enabled or not"); |
| 77 | 76 | ||
| 78 | #define WATCHDOG_HEARTBEAT 2 /* 2 sec default heartbeat */ | 77 | #define WATCHDOG_HEARTBEAT 0 /* default heartbeat = delay-time from dip-switches */ |
| 79 | static int heartbeat = WATCHDOG_HEARTBEAT; | 78 | static int heartbeat = WATCHDOG_HEARTBEAT; |
| 80 | module_param(heartbeat, int, 0); | 79 | module_param(heartbeat, int, 0); |
| 81 | MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")"); | 80 | MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536 or 0=delay-time from dip-switches, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")"); |
| 82 | 81 | ||
| 83 | static int nowayout = WATCHDOG_NOWAYOUT; | 82 | static int nowayout = WATCHDOG_NOWAYOUT; |
| 84 | module_param(nowayout, int, 0); | 83 | module_param(nowayout, int, 0); |
| @@ -110,6 +109,18 @@ MODULE_DEVICE_TABLE (usb, usb_pcwd_table); | |||
| 110 | #define CMD_ENABLE_WATCHDOG 0x30 /* Enable / Disable Watchdog */ | 109 | #define CMD_ENABLE_WATCHDOG 0x30 /* Enable / Disable Watchdog */ |
| 111 | #define CMD_DISABLE_WATCHDOG CMD_ENABLE_WATCHDOG | 110 | #define CMD_DISABLE_WATCHDOG CMD_ENABLE_WATCHDOG |
| 112 | 111 | ||
| 112 | /* Watchdog's Dip Switch heartbeat values */ | ||
| 113 | static const int heartbeat_tbl [] = { | ||
| 114 | 5, /* OFF-OFF-OFF = 5 Sec */ | ||
| 115 | 10, /* OFF-OFF-ON = 10 Sec */ | ||
| 116 | 30, /* OFF-ON-OFF = 30 Sec */ | ||
| 117 | 60, /* OFF-ON-ON = 1 Min */ | ||
| 118 | 300, /* ON-OFF-OFF = 5 Min */ | ||
| 119 | 600, /* ON-OFF-ON = 10 Min */ | ||
| 120 | 1800, /* ON-ON-OFF = 30 Min */ | ||
| 121 | 3600, /* ON-ON-ON = 1 hour */ | ||
| 122 | }; | ||
| 123 | |||
| 113 | /* We can only use 1 card due to the /dev/watchdog restriction */ | 124 | /* We can only use 1 card due to the /dev/watchdog restriction */ |
| 114 | static int cards_found; | 125 | static int cards_found; |
| 115 | 126 | ||
| @@ -682,6 +693,10 @@ static int usb_pcwd_probe(struct usb_interface *interface, const struct usb_devi | |||
| 682 | ((option_switches & 0x10) ? "ON" : "OFF"), | 693 | ((option_switches & 0x10) ? "ON" : "OFF"), |
| 683 | ((option_switches & 0x08) ? "ON" : "OFF")); | 694 | ((option_switches & 0x08) ? "ON" : "OFF")); |
| 684 | 695 | ||
| 696 | /* If heartbeat = 0 then we use the heartbeat from the dip-switches */ | ||
| 697 | if (heartbeat == 0) | ||
| 698 | heartbeat = heartbeat_tbl[(option_switches & 0x07)]; | ||
| 699 | |||
| 685 | /* Check that the heartbeat value is within it's range ; if not reset to the default */ | 700 | /* Check that the heartbeat value is within it's range ; if not reset to the default */ |
| 686 | if (usb_pcwd_set_heartbeat(usb_pcwd, heartbeat)) { | 701 | if (usb_pcwd_set_heartbeat(usb_pcwd, heartbeat)) { |
| 687 | usb_pcwd_set_heartbeat(usb_pcwd, WATCHDOG_HEARTBEAT); | 702 | usb_pcwd_set_heartbeat(usb_pcwd, WATCHDOG_HEARTBEAT); |
diff --git a/drivers/char/watchdog/pnx4008_wdt.c b/drivers/char/watchdog/pnx4008_wdt.c index 3a55fc6abcd8..0e3d589d6332 100644 --- a/drivers/char/watchdog/pnx4008_wdt.c +++ b/drivers/char/watchdog/pnx4008_wdt.c | |||
| @@ -283,7 +283,8 @@ static int pnx4008_wdt_probe(struct platform_device *pdev) | |||
| 283 | wdt_base = (void __iomem *)IO_ADDRESS(res->start); | 283 | wdt_base = (void __iomem *)IO_ADDRESS(res->start); |
| 284 | 284 | ||
| 285 | wdt_clk = clk_get(&pdev->dev, "wdt_ck"); | 285 | wdt_clk = clk_get(&pdev->dev, "wdt_ck"); |
| 286 | if (!wdt_clk) { | 286 | if (IS_ERR(wdt_clk)) { |
| 287 | ret = PTR_ERR(wdt_clk); | ||
| 287 | release_resource(wdt_mem); | 288 | release_resource(wdt_mem); |
| 288 | kfree(wdt_mem); | 289 | kfree(wdt_mem); |
| 289 | goto out; | 290 | goto out; |
diff --git a/drivers/char/watchdog/s3c2410_wdt.c b/drivers/char/watchdog/s3c2410_wdt.c index 18cb050c3862..5a5cc2a2c5af 100644 --- a/drivers/char/watchdog/s3c2410_wdt.c +++ b/drivers/char/watchdog/s3c2410_wdt.c | |||
| @@ -366,13 +366,15 @@ static int s3c2410wdt_probe(struct platform_device *pdev) | |||
| 366 | wdt_mem = request_mem_region(res->start, size, pdev->name); | 366 | wdt_mem = request_mem_region(res->start, size, pdev->name); |
| 367 | if (wdt_mem == NULL) { | 367 | if (wdt_mem == NULL) { |
| 368 | printk(KERN_INFO PFX "failed to get memory region\n"); | 368 | printk(KERN_INFO PFX "failed to get memory region\n"); |
| 369 | return -ENOENT; | 369 | ret = -ENOENT; |
| 370 | goto err_req; | ||
| 370 | } | 371 | } |
| 371 | 372 | ||
| 372 | wdt_base = ioremap(res->start, size); | 373 | wdt_base = ioremap(res->start, size); |
| 373 | if (wdt_base == 0) { | 374 | if (wdt_base == 0) { |
| 374 | printk(KERN_INFO PFX "failed to ioremap() region\n"); | 375 | printk(KERN_INFO PFX "failed to ioremap() region\n"); |
| 375 | return -EINVAL; | 376 | ret = -EINVAL; |
| 377 | goto err_req; | ||
| 376 | } | 378 | } |
| 377 | 379 | ||
| 378 | DBG("probe: mapped wdt_base=%p\n", wdt_base); | 380 | DBG("probe: mapped wdt_base=%p\n", wdt_base); |
| @@ -380,22 +382,21 @@ static int s3c2410wdt_probe(struct platform_device *pdev) | |||
| 380 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 382 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
| 381 | if (res == NULL) { | 383 | if (res == NULL) { |
| 382 | printk(KERN_INFO PFX "failed to get irq resource\n"); | 384 | printk(KERN_INFO PFX "failed to get irq resource\n"); |
| 383 | iounmap(wdt_base); | 385 | ret = -ENOENT; |
| 384 | return -ENOENT; | 386 | goto err_map; |
| 385 | } | 387 | } |
| 386 | 388 | ||
| 387 | ret = request_irq(res->start, s3c2410wdt_irq, 0, pdev->name, pdev); | 389 | ret = request_irq(res->start, s3c2410wdt_irq, 0, pdev->name, pdev); |
| 388 | if (ret != 0) { | 390 | if (ret != 0) { |
| 389 | printk(KERN_INFO PFX "failed to install irq (%d)\n", ret); | 391 | printk(KERN_INFO PFX "failed to install irq (%d)\n", ret); |
| 390 | iounmap(wdt_base); | 392 | goto err_map; |
| 391 | return ret; | ||
| 392 | } | 393 | } |
| 393 | 394 | ||
| 394 | wdt_clock = clk_get(&pdev->dev, "watchdog"); | 395 | wdt_clock = clk_get(&pdev->dev, "watchdog"); |
| 395 | if (wdt_clock == NULL) { | 396 | if (IS_ERR(wdt_clock)) { |
| 396 | printk(KERN_INFO PFX "failed to find watchdog clock source\n"); | 397 | printk(KERN_INFO PFX "failed to find watchdog clock source\n"); |
| 397 | iounmap(wdt_base); | 398 | ret = PTR_ERR(wdt_clock); |
| 398 | return -ENOENT; | 399 | goto err_irq; |
| 399 | } | 400 | } |
| 400 | 401 | ||
| 401 | clk_enable(wdt_clock); | 402 | clk_enable(wdt_clock); |
| @@ -418,8 +419,7 @@ static int s3c2410wdt_probe(struct platform_device *pdev) | |||
| 418 | if (ret) { | 419 | if (ret) { |
| 419 | printk (KERN_ERR PFX "cannot register miscdev on minor=%d (%d)\n", | 420 | printk (KERN_ERR PFX "cannot register miscdev on minor=%d (%d)\n", |
| 420 | WATCHDOG_MINOR, ret); | 421 | WATCHDOG_MINOR, ret); |
| 421 | iounmap(wdt_base); | 422 | goto err_clk; |
| 422 | return ret; | ||
| 423 | } | 423 | } |
| 424 | 424 | ||
| 425 | if (tmr_atboot && started == 0) { | 425 | if (tmr_atboot && started == 0) { |
| @@ -434,26 +434,36 @@ static int s3c2410wdt_probe(struct platform_device *pdev) | |||
| 434 | } | 434 | } |
| 435 | 435 | ||
| 436 | return 0; | 436 | return 0; |
| 437 | |||
| 438 | err_clk: | ||
| 439 | clk_disable(wdt_clock); | ||
| 440 | clk_put(wdt_clock); | ||
| 441 | |||
| 442 | err_irq: | ||
| 443 | free_irq(wdt_irq->start, pdev); | ||
| 444 | |||
| 445 | err_map: | ||
| 446 | iounmap(wdt_base); | ||
| 447 | |||
| 448 | err_req: | ||
| 449 | release_resource(wdt_mem); | ||
| 450 | kfree(wdt_mem); | ||
| 451 | |||
| 452 | return ret; | ||
| 437 | } | 453 | } |
| 438 | 454 | ||
| 439 | static int s3c2410wdt_remove(struct platform_device *dev) | 455 | static int s3c2410wdt_remove(struct platform_device *dev) |
| 440 | { | 456 | { |
| 441 | if (wdt_mem != NULL) { | 457 | release_resource(wdt_mem); |
| 442 | release_resource(wdt_mem); | 458 | kfree(wdt_mem); |
| 443 | kfree(wdt_mem); | 459 | wdt_mem = NULL; |
| 444 | wdt_mem = NULL; | ||
| 445 | } | ||
| 446 | 460 | ||
| 447 | if (wdt_irq != NULL) { | 461 | free_irq(wdt_irq->start, dev); |
| 448 | free_irq(wdt_irq->start, dev); | 462 | wdt_irq = NULL; |
| 449 | wdt_irq = NULL; | ||
| 450 | } | ||
| 451 | 463 | ||
| 452 | if (wdt_clock != NULL) { | 464 | clk_disable(wdt_clock); |
| 453 | clk_disable(wdt_clock); | 465 | clk_put(wdt_clock); |
| 454 | clk_put(wdt_clock); | 466 | wdt_clock = NULL; |
| 455 | wdt_clock = NULL; | ||
| 456 | } | ||
| 457 | 467 | ||
| 458 | iounmap(wdt_base); | 468 | iounmap(wdt_base); |
| 459 | misc_deregister(&s3c2410wdt_miscdev); | 469 | misc_deregister(&s3c2410wdt_miscdev); |
