diff options
Diffstat (limited to 'drivers/pnp/pnpacpi/core.c')
-rw-r--r-- | drivers/pnp/pnpacpi/core.c | 92 |
1 files changed, 19 insertions, 73 deletions
diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c index c283a9a70d83..50902773beaf 100644 --- a/drivers/pnp/pnpacpi/core.c +++ b/drivers/pnp/pnpacpi/core.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <acpi/acpi_bus.h> | 25 | #include <acpi/acpi_bus.h> |
26 | #include <acpi/actypes.h> | 26 | #include <acpi/actypes.h> |
27 | 27 | ||
28 | #include "../base.h" | ||
28 | #include "pnpacpi.h" | 29 | #include "pnpacpi.h" |
29 | 30 | ||
30 | static int num = 0; | 31 | static int num = 0; |
@@ -44,7 +45,7 @@ static struct acpi_device_id excluded_id_list[] __initdata = { | |||
44 | {"", 0}, | 45 | {"", 0}, |
45 | }; | 46 | }; |
46 | 47 | ||
47 | static inline int is_exclusive_device(struct acpi_device *dev) | 48 | static inline int __init is_exclusive_device(struct acpi_device *dev) |
48 | { | 49 | { |
49 | return (!acpi_match_device_ids(dev, excluded_id_list)); | 50 | return (!acpi_match_device_ids(dev, excluded_id_list)); |
50 | } | 51 | } |
@@ -72,40 +73,24 @@ static int __init ispnpidacpi(char *id) | |||
72 | return 1; | 73 | return 1; |
73 | } | 74 | } |
74 | 75 | ||
75 | static void __init pnpidacpi_to_pnpid(char *id, char *str) | 76 | static int pnpacpi_get_resources(struct pnp_dev *dev) |
76 | { | 77 | { |
77 | str[0] = id[0]; | 78 | dev_dbg(&dev->dev, "get resources\n"); |
78 | str[1] = id[1]; | 79 | return pnpacpi_parse_allocated_resource(dev); |
79 | str[2] = id[2]; | ||
80 | str[3] = tolower(id[3]); | ||
81 | str[4] = tolower(id[4]); | ||
82 | str[5] = tolower(id[5]); | ||
83 | str[6] = tolower(id[6]); | ||
84 | str[7] = '\0'; | ||
85 | } | 80 | } |
86 | 81 | ||
87 | static int pnpacpi_get_resources(struct pnp_dev *dev, | 82 | static int pnpacpi_set_resources(struct pnp_dev *dev) |
88 | struct pnp_resource_table *res) | ||
89 | { | ||
90 | acpi_status status; | ||
91 | |||
92 | status = pnpacpi_parse_allocated_resource((acpi_handle) dev->data, | ||
93 | &dev->res); | ||
94 | return ACPI_FAILURE(status) ? -ENODEV : 0; | ||
95 | } | ||
96 | |||
97 | static int pnpacpi_set_resources(struct pnp_dev *dev, | ||
98 | struct pnp_resource_table *res) | ||
99 | { | 83 | { |
100 | acpi_handle handle = dev->data; | 84 | acpi_handle handle = dev->data; |
101 | struct acpi_buffer buffer; | 85 | struct acpi_buffer buffer; |
102 | int ret = 0; | 86 | int ret; |
103 | acpi_status status; | 87 | acpi_status status; |
104 | 88 | ||
105 | ret = pnpacpi_build_resource_template(handle, &buffer); | 89 | dev_dbg(&dev->dev, "set resources\n"); |
90 | ret = pnpacpi_build_resource_template(dev, &buffer); | ||
106 | if (ret) | 91 | if (ret) |
107 | return ret; | 92 | return ret; |
108 | ret = pnpacpi_encode_resources(res, &buffer); | 93 | ret = pnpacpi_encode_resources(dev, &buffer); |
109 | if (ret) { | 94 | if (ret) { |
110 | kfree(buffer.pointer); | 95 | kfree(buffer.pointer); |
111 | return ret; | 96 | return ret; |
@@ -163,7 +148,6 @@ static int __init pnpacpi_add_device(struct acpi_device *device) | |||
163 | { | 148 | { |
164 | acpi_handle temp = NULL; | 149 | acpi_handle temp = NULL; |
165 | acpi_status status; | 150 | acpi_status status; |
166 | struct pnp_id *dev_id; | ||
167 | struct pnp_dev *dev; | 151 | struct pnp_dev *dev; |
168 | 152 | ||
169 | status = acpi_get_handle(device->handle, "_CRS", &temp); | 153 | status = acpi_get_handle(device->handle, "_CRS", &temp); |
@@ -171,11 +155,10 @@ static int __init pnpacpi_add_device(struct acpi_device *device) | |||
171 | is_exclusive_device(device)) | 155 | is_exclusive_device(device)) |
172 | return 0; | 156 | return 0; |
173 | 157 | ||
174 | dev = kzalloc(sizeof(struct pnp_dev), GFP_KERNEL); | 158 | dev = pnp_alloc_dev(&pnpacpi_protocol, num, acpi_device_hid(device)); |
175 | if (!dev) { | 159 | if (!dev) |
176 | pnp_err("Out of memory"); | ||
177 | return -ENOMEM; | 160 | return -ENOMEM; |
178 | } | 161 | |
179 | dev->data = device->handle; | 162 | dev->data = device->handle; |
180 | /* .enabled means the device can decode the resources */ | 163 | /* .enabled means the device can decode the resources */ |
181 | dev->active = device->status.enabled; | 164 | dev->active = device->status.enabled; |
@@ -191,44 +174,17 @@ static int __init pnpacpi_add_device(struct acpi_device *device) | |||
191 | if (ACPI_SUCCESS(status)) | 174 | if (ACPI_SUCCESS(status)) |
192 | dev->capabilities |= PNP_DISABLE; | 175 | dev->capabilities |= PNP_DISABLE; |
193 | 176 | ||
194 | dev->protocol = &pnpacpi_protocol; | ||
195 | |||
196 | if (strlen(acpi_device_name(device))) | 177 | if (strlen(acpi_device_name(device))) |
197 | strncpy(dev->name, acpi_device_name(device), sizeof(dev->name)); | 178 | strncpy(dev->name, acpi_device_name(device), sizeof(dev->name)); |
198 | else | 179 | else |
199 | strncpy(dev->name, acpi_device_bid(device), sizeof(dev->name)); | 180 | strncpy(dev->name, acpi_device_bid(device), sizeof(dev->name)); |
200 | 181 | ||
201 | dev->number = num; | 182 | if (dev->active) |
202 | 183 | pnpacpi_parse_allocated_resource(dev); | |
203 | /* set the initial values for the PnP device */ | ||
204 | dev_id = kzalloc(sizeof(struct pnp_id), GFP_KERNEL); | ||
205 | if (!dev_id) | ||
206 | goto err; | ||
207 | pnpidacpi_to_pnpid(acpi_device_hid(device), dev_id->id); | ||
208 | pnp_add_id(dev_id, dev); | ||
209 | |||
210 | if (dev->active) { | ||
211 | /* parse allocated resource */ | ||
212 | status = pnpacpi_parse_allocated_resource(device->handle, | ||
213 | &dev->res); | ||
214 | if (ACPI_FAILURE(status) && (status != AE_NOT_FOUND)) { | ||
215 | pnp_err("PnPACPI: METHOD_NAME__CRS failure for %s", | ||
216 | dev_id->id); | ||
217 | goto err1; | ||
218 | } | ||
219 | } | ||
220 | 184 | ||
221 | if (dev->capabilities & PNP_CONFIGURABLE) { | 185 | if (dev->capabilities & PNP_CONFIGURABLE) |
222 | status = pnpacpi_parse_resource_option_data(device->handle, | 186 | pnpacpi_parse_resource_option_data(dev); |
223 | dev); | ||
224 | if (ACPI_FAILURE(status) && (status != AE_NOT_FOUND)) { | ||
225 | pnp_err("PnPACPI: METHOD_NAME__PRS failure for %s", | ||
226 | dev_id->id); | ||
227 | goto err1; | ||
228 | } | ||
229 | } | ||
230 | 187 | ||
231 | /* parse compatible ids */ | ||
232 | if (device->flags.compatible_ids) { | 188 | if (device->flags.compatible_ids) { |
233 | struct acpi_compatible_id_list *cid_list = device->pnp.cid_list; | 189 | struct acpi_compatible_id_list *cid_list = device->pnp.cid_list; |
234 | int i; | 190 | int i; |
@@ -236,27 +192,17 @@ static int __init pnpacpi_add_device(struct acpi_device *device) | |||
236 | for (i = 0; i < cid_list->count; i++) { | 192 | for (i = 0; i < cid_list->count; i++) { |
237 | if (!ispnpidacpi(cid_list->id[i].value)) | 193 | if (!ispnpidacpi(cid_list->id[i].value)) |
238 | continue; | 194 | continue; |
239 | dev_id = kzalloc(sizeof(struct pnp_id), GFP_KERNEL); | 195 | pnp_add_id(dev, cid_list->id[i].value); |
240 | if (!dev_id) | ||
241 | continue; | ||
242 | |||
243 | pnpidacpi_to_pnpid(cid_list->id[i].value, dev_id->id); | ||
244 | pnp_add_id(dev_id, dev); | ||
245 | } | 196 | } |
246 | } | 197 | } |
247 | 198 | ||
248 | /* clear out the damaged flags */ | 199 | /* clear out the damaged flags */ |
249 | if (!dev->active) | 200 | if (!dev->active) |
250 | pnp_init_resource_table(&dev->res); | 201 | pnp_init_resources(dev); |
251 | pnp_add_device(dev); | 202 | pnp_add_device(dev); |
252 | num++; | 203 | num++; |
253 | 204 | ||
254 | return AE_OK; | 205 | return AE_OK; |
255 | err1: | ||
256 | kfree(dev_id); | ||
257 | err: | ||
258 | kfree(dev); | ||
259 | return -EINVAL; | ||
260 | } | 206 | } |
261 | 207 | ||
262 | static acpi_status __init pnpacpi_add_device_handler(acpi_handle handle, | 208 | static acpi_status __init pnpacpi_add_device_handler(acpi_handle handle, |