Skip to content

Commit

Permalink
[PATCH] hp300: fix driver_register() return handling, remove dio_modu…
Browse files Browse the repository at this point in the history
…le_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.

dio_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 dio_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 <[email protected]>
Cc: Philip Blundell <[email protected]>
Cc: Jochen Friedrich <[email protected]>
Cc: "Antonino A. Daplas" <[email protected]>
Cc: Jeff Garzik <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Bjorn Helgaas authored and Linus Torvalds committed Mar 25, 2006
1 parent 5930860 commit e51c01b
Show file tree
Hide file tree
Showing 5 changed files with 11 additions and 46 deletions.
9 changes: 2 additions & 7 deletions drivers/dio/dio-driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,22 +71,17 @@ static int dio_device_probe(struct device *dev)
* @drv: the driver structure to register
*
* Adds the driver structure to the list of registered drivers
* Returns the number of DIO devices which were claimed by the driver
* during registration. The driver remains registered even if the
* return value is zero.
* Returns zero or a negative error value.
*/

int dio_register_driver(struct dio_driver *drv)
{
int count = 0;

/* initialize common driver fields */
drv->driver.name = drv->name;
drv->driver.bus = &dio_bus_type;

/* register with core */
count = driver_register(&drv->driver);
return count ? count : 1;
return driver_register(&drv->driver);
}


Expand Down
2 changes: 1 addition & 1 deletion drivers/net/hplance.c
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ static int hplance_close(struct net_device *dev)

int __init hplance_init_module(void)
{
return dio_module_init(&hplance_driver);
return dio_register_driver(&hplance_driver);
}

void __exit hplance_cleanup_module(void)
Expand Down
10 changes: 5 additions & 5 deletions drivers/serial/8250_hp300.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ static struct dio_driver hpdca_driver = {

#endif

static unsigned int num_ports;

extern int hp300_uart_scode;

/* Offset to UART registers from base of DCA */
Expand Down Expand Up @@ -199,14 +201,15 @@ static int __devinit hpdca_init_one(struct dio_dev *d,
out_8(d->resource.start + DIO_VIRADDRBASE + DCA_ID, 0xff);
udelay(100);

num_ports++;

return 0;
}
#endif

static int __init hp300_8250_init(void)
{
static int called = 0;
int num_ports;
#ifdef CONFIG_HPAPCI
int line;
unsigned long base;
Expand All @@ -221,11 +224,8 @@ static int __init hp300_8250_init(void)
if (!MACH_IS_HP300)
return -ENODEV;

num_ports = 0;

#ifdef CONFIG_HPDCA
if (dio_module_init(&hpdca_driver) == 0)
num_ports++;
dio_register_driver(&hpdca_driver);
#endif
#ifdef CONFIG_HPAPCI
if (hp300_model < HP_400) {
Expand Down
4 changes: 3 additions & 1 deletion drivers/video/hpfb.c
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,9 @@ int __init hpfb_init(void)
if (fb_get_options("hpfb", NULL))
return -ENODEV;

dio_module_init(&hpfb_driver);
err = dio_register_driver(&hpfb_driver);
if (err)
return err;

fs = get_fs();
set_fs(KERNEL_DS);
Expand Down
32 changes: 0 additions & 32 deletions include/linux/dio.h
Original file line number Diff line number Diff line change
Expand Up @@ -276,37 +276,5 @@ static inline void dio_set_drvdata (struct dio_dev *d, void *data)
dev_set_drvdata(&d->dev, data);
}

/*
* A helper function which helps ensure correct dio_driver
* setup and cleanup for commonly-encountered hotplug/modular cases
*
* This MUST stay in a header, as it checks for -DMODULE
*/
static inline int dio_module_init(struct dio_driver *drv)
{
int rc = dio_register_driver(drv);

if (rc > 0)
return 0;

/* iff CONFIG_HOTPLUG and built into kernel, we should
* leave the driver around for future hotplug events.
* For the module case, a hotplug daemon of some sort
* should load a module in response to an insert event. */
#if defined(CONFIG_HOTPLUG) && !defined(MODULE)
if (rc == 0)
return 0;
#else
if (rc == 0)
rc = -ENODEV;
#endif

/* if we get here, we need to clean up DIO driver instance
* and return some sort of error */
dio_unregister_driver(drv);

return rc;
}

#endif /* __KERNEL__ */
#endif /* ndef _LINUX_DIO_H */

0 comments on commit e51c01b

Please sign in to comment.