aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDominik Brodowski <linux@dominikbrodowski.de>2005-01-11 03:24:25 -0800
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-01-11 03:24:25 -0800
commit1a0bf3c269ecfabebf0bd4db8821c7fa2518253c (patch)
tree2e6b9a63eca3ee1262303088ab4343b0a77accc8 /drivers
parentd56666b522432b244f38f52f89a3ccf275c4e41d (diff)
downloadhistory-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.c47
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");