aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDominik Brodowski <linux@dominikbrodowski.de>2005-01-11 03:22:07 -0800
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-01-11 03:22:07 -0800
commit41a2609e03964536a8a2db54c5bb7622e9a135f2 (patch)
treee27e74f73fa063906c9cb0e35fe86e6ab3da0316 /drivers
parent7d21bed8e0032c4d2b373cd5e8135d53e2c18cbe (diff)
downloadhistory-41a2609e03964536a8a2db54c5bb7622e9a135f2.tar.gz
[PATCH] pcmcia: get a reference to ds-socket for each pcmcia_device
Obtain a reference to struct pcmcia_bus_socket for each pcmcia_device. This means that pcmcia_device always holds an indirect reference to struct pcmcia_socket as well. 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.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c
index 2cde6e826b4572..77adb5f06185bd 100644
--- a/drivers/pcmcia/ds.c
+++ b/drivers/pcmcia/ds.c
@@ -479,6 +479,7 @@ static void pcmcia_release_dev(struct device *dev)
{
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
p_dev->socket->pcmcia->device_count = 0;
+ pcmcia_put_bus_socket(p_dev->socket->pcmcia);
kfree(p_dev);
}
@@ -693,6 +694,13 @@ static int bind_request(struct pcmcia_bus_socket *s, bind_info_t *bind_info)
}
memset(p_dev, 0, sizeof(struct pcmcia_device));
+ s = pcmcia_get_bus_socket(s);
+ if (!s) {
+ ret = -ENODEV;
+ kfree(p_dev);
+ goto err_free_client;
+ }
+
p_dev->socket = s->parent;
p_dev->device_no = (s->device_count++);
p_dev->func = bind_info->function;
@@ -706,6 +714,7 @@ static int bind_request(struct pcmcia_bus_socket *s, bind_info_t *bind_info)
ret = device_register(&p_dev->dev);
if (ret) {
kfree(p_dev);
+ pcmcia_put_bus_socket(s);
goto err_free_client;
}