diff options
author | Dominik Brodowski <linux@dominikbrodowski.de> | 2005-01-11 03:24:25 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-01-11 03:24:25 -0800 |
commit | 1a0bf3c269ecfabebf0bd4db8821c7fa2518253c (patch) | |
tree | 2e6b9a63eca3ee1262303088ab4343b0a77accc8 /drivers | |
parent | d56666b522432b244f38f52f89a3ccf275c4e41d (diff) | |
download | history-1a0bf3c269ecfabebf0bd4db8821c7fa2518253c.tar.gz |
[PATCH] pcmcia: use driver_find in ds
Use driver_find() in ds.c instead of legacy implementation, and make use of
its reference counting awareness.
Signed-off-by: Dominik Brodowski <linux@brodo.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/pcmcia/ds.c | 47 |
1 files changed, 21 insertions, 26 deletions
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index f6609d8f463921..bdde6f36cb7c05 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c @@ -571,11 +571,16 @@ static int bind_request(struct pcmcia_bus_socket *s, bind_info_t *bind_info) (char *)bind_info->dev_info); p_drv = get_pcmcia_driver(&bind_info->dev_info); - if ((!p_drv) || (!try_module_get(p_drv->owner))) { + if (!p_drv) { ret = -EINVAL; goto err_put; } + if (!try_module_get(p_drv->owner)) { + ret = -EINVAL; + goto err_put_driver; + } + /* Currently, the userspace pcmcia cardmgr detects pcmcia devices. * Here this information is translated into a kernel * struct pcmcia_device. @@ -636,15 +641,20 @@ static int bind_request(struct pcmcia_bus_socket *s, bind_info_t *bind_info) } } + put_driver(&p_drv->drv); + return 0; err_unregister: device_unregister(&p_dev->dev); module_put(p_drv->owner); + put_driver(&p_drv->drv); return (ret); err_put_module: module_put(p_drv->owner); + err_put_driver: + put_driver(&p_drv->drv); err_put: pcmcia_put_bus_socket(s); return (ret); @@ -1418,33 +1428,18 @@ static struct pcmcia_bus_socket * get_socket_info_by_nr(unsigned int nr) /* backwards-compatible accessing of driver --- by name! */ -struct cmp_data { - void *dev_info; - struct pcmcia_driver *drv; -}; - -static int cmp_drv_callback(struct device_driver *drv, void *data) -{ - struct cmp_data *cmp = data; - if (strncmp((char *)cmp->dev_info, (char *)drv->name, - DEV_NAME_LEN) == 0) { - cmp->drv = container_of(drv, struct pcmcia_driver, drv); - return -EINVAL; - } - return 0; -} - static struct pcmcia_driver * get_pcmcia_driver (dev_info_t *dev_info) { - int ret; - struct cmp_data cmp = { - .dev_info = dev_info, - }; - - ret = bus_for_each_drv(&pcmcia_bus_type, NULL, &cmp, cmp_drv_callback); - if (ret) - return cmp.drv; - return NULL; + struct device_driver *drv; + struct pcmcia_driver *p_drv; + + drv = driver_find((char *) dev_info, &pcmcia_bus_type); + if (!drv) + return NULL; + + p_drv = container_of(drv, struct pcmcia_driver, drv); + + return (p_drv); } MODULE_ALIAS("ds"); |