aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjorn Helgaas <bjorn.helgaas@hp.com>2006-03-25 06:07:20 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-25 11:22:53 -0500
commit33d8675ea66e79d21da3ed64ce88dfb2a18bc6a7 (patch)
tree7283a680e122e4d15f50e818bab188b84fc852a9
parentc2f6fabb2ed3b869bc254c6cdc73d6beaaaf700f (diff)
[PATCH] amiga: fix driver_register() return handling, remove zorro_module_init()
Remove the assumption that driver_register() returns the number of devices bound to the driver. In fact, it returns zero for success or a negative error value. zorro_module_init() used the device count to automatically unregister and unload drivers that found no devices. That might have worked at one time, but has been broken for some time because zorro_register_driver() returned either a negative error or a positive count (never zero). So it could only unregister on failure, when it's not needed anyway. This functionality could be resurrected in individual drivers by counting devices in their .probe() methods. Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Roman Zippel <zippel@linux-m68k.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--drivers/net/a2065.c2
-rw-r--r--drivers/net/ariadne.c2
-rw-r--r--drivers/net/hydra.c2
-rw-r--r--drivers/net/zorro8390.c2
-rw-r--r--drivers/video/cirrusfb.c2
-rw-r--r--drivers/zorro/zorro-driver.c9
-rw-r--r--include/linux/zorro.h33
7 files changed, 7 insertions, 45 deletions
diff --git a/drivers/net/a2065.c b/drivers/net/a2065.c
index 8e538a6d7d97..79bb56b8dcef 100644
--- a/drivers/net/a2065.c
+++ b/drivers/net/a2065.c
@@ -829,7 +829,7 @@ static void __devexit a2065_remove_one(struct zorro_dev *z)
829 829
830static int __init a2065_init_module(void) 830static int __init a2065_init_module(void)
831{ 831{
832 return zorro_module_init(&a2065_driver); 832 return zorro_register_driver(&a2065_driver);
833} 833}
834 834
835static void __exit a2065_cleanup_module(void) 835static void __exit a2065_cleanup_module(void)
diff --git a/drivers/net/ariadne.c b/drivers/net/ariadne.c
index 9fe93acfc8ef..d1b6b1f794e2 100644
--- a/drivers/net/ariadne.c
+++ b/drivers/net/ariadne.c
@@ -864,7 +864,7 @@ static void __devexit ariadne_remove_one(struct zorro_dev *z)
864 864
865static int __init ariadne_init_module(void) 865static int __init ariadne_init_module(void)
866{ 866{
867 return zorro_module_init(&ariadne_driver); 867 return zorro_register_driver(&ariadne_driver);
868} 868}
869 869
870static void __exit ariadne_cleanup_module(void) 870static void __exit ariadne_cleanup_module(void)
diff --git a/drivers/net/hydra.c b/drivers/net/hydra.c
index 6e0ca7340a8f..d9fb8e74e631 100644
--- a/drivers/net/hydra.c
+++ b/drivers/net/hydra.c
@@ -242,7 +242,7 @@ static void __devexit hydra_remove_one(struct zorro_dev *z)
242 242
243static int __init hydra_init_module(void) 243static int __init hydra_init_module(void)
244{ 244{
245 return zorro_module_init(&hydra_driver); 245 return zorro_register_driver(&hydra_driver);
246} 246}
247 247
248static void __exit hydra_cleanup_module(void) 248static void __exit hydra_cleanup_module(void)
diff --git a/drivers/net/zorro8390.c b/drivers/net/zorro8390.c
index 761021603597..8037e5806d0a 100644
--- a/drivers/net/zorro8390.c
+++ b/drivers/net/zorro8390.c
@@ -426,7 +426,7 @@ static void __devexit zorro8390_remove_one(struct zorro_dev *z)
426 426
427static int __init zorro8390_init_module(void) 427static int __init zorro8390_init_module(void)
428{ 428{
429 return zorro_module_init(&zorro8390_driver); 429 return zorro_register_driver(&zorro8390_driver);
430} 430}
431 431
432static void __exit zorro8390_cleanup_module(void) 432static void __exit zorro8390_cleanup_module(void)
diff --git a/drivers/video/cirrusfb.c b/drivers/video/cirrusfb.c
index e0dbdfc0c8b4..66d6f2f0a219 100644
--- a/drivers/video/cirrusfb.c
+++ b/drivers/video/cirrusfb.c
@@ -2622,7 +2622,7 @@ static int __init cirrusfb_init(void)
2622#endif 2622#endif
2623 2623
2624#ifdef CONFIG_ZORRO 2624#ifdef CONFIG_ZORRO
2625 error |= zorro_module_init(&cirrusfb_zorro_driver); 2625 error |= zorro_register_driver(&cirrusfb_zorro_driver);
2626#endif 2626#endif
2627#ifdef CONFIG_PCI 2627#ifdef CONFIG_PCI
2628 error |= pci_register_driver(&cirrusfb_pci_driver); 2628 error |= pci_register_driver(&cirrusfb_pci_driver);
diff --git a/drivers/zorro/zorro-driver.c b/drivers/zorro/zorro-driver.c
index fcbee748c592..067c07be928c 100644
--- a/drivers/zorro/zorro-driver.c
+++ b/drivers/zorro/zorro-driver.c
@@ -65,22 +65,17 @@ static int zorro_device_probe(struct device *dev)
65 * @drv: the driver structure to register 65 * @drv: the driver structure to register
66 * 66 *
67 * Adds the driver structure to the list of registered drivers 67 * Adds the driver structure to the list of registered drivers
68 * Returns the number of Zorro devices which were claimed by the driver 68 * Returns zero or a negative error value.
69 * during registration. The driver remains registered even if the
70 * return value is zero.
71 */ 69 */
72 70
73int zorro_register_driver(struct zorro_driver *drv) 71int zorro_register_driver(struct zorro_driver *drv)
74{ 72{
75 int count = 0;
76
77 /* initialize common driver fields */ 73 /* initialize common driver fields */
78 drv->driver.name = drv->name; 74 drv->driver.name = drv->name;
79 drv->driver.bus = &zorro_bus_type; 75 drv->driver.bus = &zorro_bus_type;
80 76
81 /* register with core */ 77 /* register with core */
82 count = driver_register(&drv->driver); 78 return driver_register(&drv->driver);
83 return count ? count : 1;
84} 79}
85 80
86 81
diff --git a/include/linux/zorro.h b/include/linux/zorro.h
index ba5b72768bbe..2f135cf6eef1 100644
--- a/include/linux/zorro.h
+++ b/include/linux/zorro.h
@@ -271,39 +271,6 @@ static inline void zorro_set_drvdata (struct zorro_dev *z, void *data)
271} 271}
272 272
273 273
274/*
275 * A helper function which helps ensure correct zorro_driver
276 * setup and cleanup for commonly-encountered hotplug/modular cases
277 *
278 * This MUST stay in a header, as it checks for -DMODULE
279 */
280static inline int zorro_module_init(struct zorro_driver *drv)
281{
282 int rc = zorro_register_driver(drv);
283
284 if (rc > 0)
285 return 0;
286
287 /* iff CONFIG_HOTPLUG and built into kernel, we should
288 * leave the driver around for future hotplug events.
289 * For the module case, a hotplug daemon of some sort
290 * should load a module in response to an insert event. */
291#if defined(CONFIG_HOTPLUG) && !defined(MODULE)
292 if (rc == 0)
293 return 0;
294#else
295 if (rc == 0)
296 rc = -ENODEV;
297#endif
298
299 /* if we get here, we need to clean up Zorro driver instance
300 * and return some sort of error */
301 zorro_unregister_driver(drv);
302
303 return rc;
304}
305
306
307 /* 274 /*
308 * Bitmask indicating portions of available Zorro II RAM that are unused 275 * Bitmask indicating portions of available Zorro II RAM that are unused
309 * by the system. Every bit represents a 64K chunk, for a maximum of 8MB 276 * by the system. Every bit represents a 64K chunk, for a maximum of 8MB