>From b31c25c371dd33e6316c327f3f143a2e260d866b Mon Sep 17 00:00:00 2001 From: Rene Herman Date: Sat, 9 Aug 2008 23:24:34 +0200 Subject: [PATCH] WATCHDOG: don't auto-grab eurotechwdt. --- 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 #include #include +#include #include #include @@ -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