diff options
Diffstat (limited to 'drivers/pnp/core.c')
| -rw-r--r-- | drivers/pnp/core.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/drivers/pnp/core.c b/drivers/pnp/core.c index 20771b7d4482..a411582bcd72 100644 --- a/drivers/pnp/core.c +++ b/drivers/pnp/core.c | |||
| @@ -99,14 +99,28 @@ static void pnp_free_ids(struct pnp_dev *dev) | |||
| 99 | } | 99 | } |
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | void pnp_free_resource(struct pnp_resource *pnp_res) | ||
| 103 | { | ||
| 104 | list_del(&pnp_res->list); | ||
| 105 | kfree(pnp_res); | ||
| 106 | } | ||
| 107 | |||
| 108 | void pnp_free_resources(struct pnp_dev *dev) | ||
| 109 | { | ||
| 110 | struct pnp_resource *pnp_res, *tmp; | ||
| 111 | |||
| 112 | list_for_each_entry_safe(pnp_res, tmp, &dev->resources, list) { | ||
| 113 | pnp_free_resource(pnp_res); | ||
| 114 | } | ||
| 115 | } | ||
| 116 | |||
| 102 | static void pnp_release_device(struct device *dmdev) | 117 | static void pnp_release_device(struct device *dmdev) |
| 103 | { | 118 | { |
| 104 | struct pnp_dev *dev = to_pnp_dev(dmdev); | 119 | struct pnp_dev *dev = to_pnp_dev(dmdev); |
| 105 | 120 | ||
| 106 | pnp_free_option(dev->independent); | ||
| 107 | pnp_free_option(dev->dependent); | ||
| 108 | pnp_free_ids(dev); | 121 | pnp_free_ids(dev); |
| 109 | kfree(dev->res); | 122 | pnp_free_resources(dev); |
| 123 | pnp_free_options(dev); | ||
| 110 | kfree(dev); | 124 | kfree(dev); |
| 111 | } | 125 | } |
| 112 | 126 | ||
| @@ -119,12 +133,8 @@ struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *protocol, int id, char *pnpid | |||
| 119 | if (!dev) | 133 | if (!dev) |
| 120 | return NULL; | 134 | return NULL; |
| 121 | 135 | ||
| 122 | dev->res = kzalloc(sizeof(struct pnp_resource_table), GFP_KERNEL); | 136 | INIT_LIST_HEAD(&dev->resources); |
| 123 | if (!dev->res) { | 137 | INIT_LIST_HEAD(&dev->options); |
| 124 | kfree(dev); | ||
| 125 | return NULL; | ||
| 126 | } | ||
| 127 | |||
| 128 | dev->protocol = protocol; | 138 | dev->protocol = protocol; |
| 129 | dev->number = id; | 139 | dev->number = id; |
| 130 | dev->dma_mask = DMA_24BIT_MASK; | 140 | dev->dma_mask = DMA_24BIT_MASK; |
| @@ -140,7 +150,6 @@ struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *protocol, int id, char *pnpid | |||
| 140 | 150 | ||
| 141 | dev_id = pnp_add_id(dev, pnpid); | 151 | dev_id = pnp_add_id(dev, pnpid); |
| 142 | if (!dev_id) { | 152 | if (!dev_id) { |
| 143 | kfree(dev->res); | ||
| 144 | kfree(dev); | 153 | kfree(dev); |
| 145 | return NULL; | 154 | return NULL; |
| 146 | } | 155 | } |
