diff options
Diffstat (limited to 'drivers/pnp/core.c')
-rw-r--r-- | drivers/pnp/core.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/drivers/pnp/core.c b/drivers/pnp/core.c index 20771b7d4482..7182da92aec3 100644 --- a/drivers/pnp/core.c +++ b/drivers/pnp/core.c | |||
@@ -99,6 +99,21 @@ 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); |
@@ -106,7 +121,7 @@ static void pnp_release_device(struct device *dmdev) | |||
106 | pnp_free_option(dev->independent); | 121 | pnp_free_option(dev->independent); |
107 | pnp_free_option(dev->dependent); | 122 | pnp_free_option(dev->dependent); |
108 | pnp_free_ids(dev); | 123 | pnp_free_ids(dev); |
109 | kfree(dev->res); | 124 | pnp_free_resources(dev); |
110 | kfree(dev); | 125 | kfree(dev); |
111 | } | 126 | } |
112 | 127 | ||
@@ -119,12 +134,7 @@ struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *protocol, int id, char *pnpid | |||
119 | if (!dev) | 134 | if (!dev) |
120 | return NULL; | 135 | return NULL; |
121 | 136 | ||
122 | dev->res = kzalloc(sizeof(struct pnp_resource_table), GFP_KERNEL); | 137 | INIT_LIST_HEAD(&dev->resources); |
123 | if (!dev->res) { | ||
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 | } |