aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pnp/card.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pnp/card.c')
-rw-r--r--drivers/pnp/card.c49
1 files changed, 26 insertions, 23 deletions
diff --git a/drivers/pnp/card.c b/drivers/pnp/card.c
index bb19c64073c6..227600cd6360 100644
--- a/drivers/pnp/card.c
+++ b/drivers/pnp/card.c
@@ -5,7 +5,6 @@
5 * 5 *
6 */ 6 */
7 7
8#include <linux/config.h>
9#include <linux/module.h> 8#include <linux/module.h>
10#include <linux/slab.h> 9#include <linux/slab.h>
11#include <linux/pnp.h> 10#include <linux/pnp.h>
@@ -60,30 +59,34 @@ static void card_remove_first(struct pnp_dev * dev)
60 card_remove(dev); 59 card_remove(dev);
61} 60}
62 61
63static int card_probe(struct pnp_card * card, struct pnp_card_driver * drv) 62static int card_probe(struct pnp_card *card, struct pnp_card_driver *drv)
64{ 63{
65 const struct pnp_card_device_id *id = match_card(drv,card); 64 const struct pnp_card_device_id *id;
66 if (id) { 65 struct pnp_card_link *clink;
67 struct pnp_card_link * clink = pnp_alloc(sizeof(struct pnp_card_link)); 66 struct pnp_dev *dev;
68 if (!clink) 67
69 return 0; 68 if (!drv->probe)
70 clink->card = card; 69 return 0;
71 clink->driver = drv; 70 id = match_card(drv,card);
72 clink->pm_state = PMSG_ON; 71 if (!id)
73 if (drv->probe) { 72 return 0;
74 if (drv->probe(clink, id)>=0) 73
75 return 1; 74 clink = pnp_alloc(sizeof(*clink));
76 else { 75 if (!clink)
77 struct pnp_dev * dev; 76 return 0;
78 card_for_each_dev(card, dev) { 77 clink->card = card;
79 if (dev->card_link == clink) 78 clink->driver = drv;
80 pnp_release_card_device(dev); 79 clink->pm_state = PMSG_ON;
81 } 80
82 kfree(clink); 81 if (drv->probe(clink, id) >= 0)
83 } 82 return 1;
84 } else 83
85 return 1; 84 /* Recovery */
85 card_for_each_dev(card, dev) {
86 if (dev->card_link == clink)
87 pnp_release_card_device(dev);
86 } 88 }
89 kfree(clink);
87 return 0; 90 return 0;
88} 91}
89 92