[PATCH] WATCHDOG: don't auto-grab eurotechwdt.

From: Rene Herman
Date: Sat Aug 09 2008 - 17:24:34 EST


---
drivers/watchdog/eurotechwdt.c | 82 +++++++++++++++++++++++++++-------------
1 files changed, 55 insertions(+), 27 deletions(-)

diff --git a/drivers/watchdog/eurotechwdt.c b/drivers/watchdog/eurotechwdt.c
index b14e9d1..c4eb06c 100644
--- a/drivers/watchdog/eurotechwdt.c
+++ b/drivers/watchdog/eurotechwdt.c
@@ -56,6 +56,7 @@
#include <linux/notifier.h>
#include <linux/reboot.h>
#include <linux/init.h>
+#include <linux/isa.h>

#include <asm/io.h>
#include <asm/uaccess.h>
@@ -70,8 +71,8 @@ static char eur_expect_close;
* You can use eurwdt=x,y to set these now.
*/

-static int io = 0x3f0;
-static int irq = 10;
+static int io; /* 0x3f0 */
+static int irq = -1; /* 10 */
static char *ev = "int";

#define WDT_TIMEOUT 60 /* 1 minute */
@@ -95,9 +96,9 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" _


module_param(io, int, 0);
-MODULE_PARM_DESC(io, "Eurotech WDT io port (default=0x3f0)");
+MODULE_PARM_DESC(io, "Eurotech WDT io port (mandatory)");
module_param(irq, int, 0);
-MODULE_PARM_DESC(irq, "Eurotech WDT irq (default=10)");
+MODULE_PARM_DESC(irq, "Eurotech WDT irq (mandatory)");
module_param(ev, charp, 0);
MODULE_PARM_DESC(ev, "Eurotech WDT event type (default is `int')");

@@ -385,41 +386,28 @@ static struct notifier_block eurwdt_notifier = {
.notifier_call = eurwdt_notify_sys,
};

-/**
- * cleanup_module:
- *
- * Unload the watchdog. You cannot do this with any file handles open.
- * If your watchdog is set to continue ticking on close and you unload
- * it, well it keeps ticking. We won't get the interrupt but the board
- * will not touch PC memory so all is fine. You just have to load a new
- * module in 60 seconds or reboot.
- */
-
-static void __exit eurwdt_exit(void)
+static int __devinit eurwdt_isa_match(struct device *dev, unsigned int id)
{
- eurwdt_lock_chip();
+ int match = io != 0 && irq != -1;

- misc_deregister(&eurwdt_miscdev);
+ if (!match)
+ dev_err(dev, "please specify io and irq\n");

- unregister_reboot_notifier(&eurwdt_notifier);
- release_region(io, 2);
- free_irq(irq, NULL);
+ return match;
}

-/**
- * eurwdt_init:
- *
+/*
* Set up the WDT watchdog board. After grabbing the resources
* we require we need also to unlock the device.
* The open() function will actually kick the board off.
*/

-static int __init eurwdt_init(void)
+static int __devinit eurwdt_isa_probe(struct device *dev, unsigned int id)
{
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;
}
@@ -464,8 +452,48 @@ outirq:
goto out;
}

-module_init(eurwdt_init);
-module_exit(eurwdt_exit);
+/*
+ * Unload the watchdog. You cannot do this with any file handles open.
+ * If your watchdog is set to continue ticking on close and you unload
+ * it, well it keeps ticking. We won't get the interrupt but the board
+ * will not touch PC memory so all is fine. You just have to load a new
+ * module in 60 seconds or reboot.
+ */
+
+static int __devexit eurwdt_isa_remove(struct device *dev, unsigned int id)
+{
+ eurwdt_lock_chip();
+
+ misc_deregister(&eurwdt_miscdev);
+
+ unregister_reboot_notifier(&eurwdt_notifier);
+ release_region(io, 2);
+ free_irq(irq, NULL);
+ return 0;
+}
+
+static struct isa_driver eurwdt_isa_driver = {
+ .match = eurwdt_isa_match,
+ .probe = eurwdt_isa_probe,
+ .remove = __devexit_p(eurwdt_isa_remove),
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = "eurwdt",
+ },
+};
+
+static int __init eurwdt_init_module(void)
+{
+ return isa_register_driver(&eurwdt_isa_driver, 1);
+}
+
+static void __exit eurwdt_exit_module(void)
+{
+ isa_unregister_driver(&eurwdt_isa_driver);
+}
+
+module_init(eurwdt_init_module);
+module_exit(eurwdt_exit_module);

MODULE_AUTHOR("Rodolfo Giometti");
MODULE_DESCRIPTION("Driver for Eurotech CPU-1220/1410 on board watchdog");
--
1.5.5


--------------080402090802000107010702--
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/