]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - drivers/acpi/scan.c
ACPI / scan: Make it clear that acpi_bus_trim() cannot fail
[mirror_ubuntu-zesty-kernel.git] / drivers / acpi / scan.c
CommitLineData
1da177e4
LT
1/*
2 * scan.c - support for transforming the ACPI namespace into individual objects
3 */
4
5#include <linux/module.h>
6#include <linux/init.h>
5a0e3ad6 7#include <linux/slab.h>
9b6d97b6 8#include <linux/kernel.h>
1da177e4 9#include <linux/acpi.h>
74523c90
AK
10#include <linux/signal.h>
11#include <linux/kthread.h>
222e82ac 12#include <linux/dmi.h>
d1efe3c3 13#include <linux/nls.h>
1da177e4
LT
14
15#include <acpi/acpi_drivers.h>
1da177e4 16
e60cc7a6
BH
17#include "internal.h"
18
1da177e4 19#define _COMPONENT ACPI_BUS_COMPONENT
f52fd66d 20ACPI_MODULE_NAME("scan");
1da177e4 21#define STRUCT_TO_INT(s) (*((int*)&s))
4be44fcd 22extern struct acpi_device *acpi_root;
1da177e4
LT
23
24#define ACPI_BUS_CLASS "system_bus"
29b71a1c 25#define ACPI_BUS_HID "LNXSYBUS"
1da177e4
LT
26#define ACPI_BUS_DEVICE_NAME "System Bus"
27
859ac9a4
BH
28#define ACPI_IS_ROOT_DEVICE(device) (!(device)->parent)
29
620e112c 30static const char *dummy_hid = "device";
2b2ae7c7 31
91e56878
MW
32/*
33 * The following ACPI IDs are known to be suitable for representing as
34 * platform devices.
35 */
36static const struct acpi_device_id acpi_platform_device_ids[] = {
37
142b007b
AH
38 { "PNP0D40" },
39
5e7779f0
MW
40 /* Haswell LPSS devices */
41 { "INT33C0", 0 },
42 { "INT33C1", 0 },
43 { "INT33C2", 0 },
44 { "INT33C3", 0 },
45 { "INT33C4", 0 },
46 { "INT33C5", 0 },
47 { "INT33C6", 0 },
48 { "INT33C7", 0 },
49
91e56878
MW
50 { }
51};
52
1da177e4 53static LIST_HEAD(acpi_device_list);
e49bd2dd 54static LIST_HEAD(acpi_bus_id_list);
9090589d 55DEFINE_MUTEX(acpi_device_lock);
1da177e4
LT
56LIST_HEAD(acpi_wakeup_device_list);
57
e49bd2dd 58struct acpi_device_bus_id{
bb095854 59 char bus_id[15];
e49bd2dd
ZR
60 unsigned int instance_no;
61 struct list_head node;
1da177e4 62};
29b71a1c
TR
63
64/*
65 * Creates hid/cid(s) string needed for modalias and uevent
66 * e.g. on a device with hid:IBM0001 and cid:ACPI0001 you get:
67 * char *modalias: "acpi:IBM0001:ACPI0001"
68*/
b3e572d2
AB
69static int create_modalias(struct acpi_device *acpi_dev, char *modalias,
70 int size)
71{
29b71a1c 72 int len;
5c9fcb5d 73 int count;
7f47fa6c 74 struct acpi_hardware_id *id;
29b71a1c 75
2b2ae7c7
TR
76 if (list_empty(&acpi_dev->pnp.ids))
77 return 0;
78
5c9fcb5d 79 len = snprintf(modalias, size, "acpi:");
29b71a1c
TR
80 size -= len;
81
7f47fa6c
BH
82 list_for_each_entry(id, &acpi_dev->pnp.ids, list) {
83 count = snprintf(&modalias[len], size, "%s:", id->id);
5c9fcb5d
ZR
84 if (count < 0 || count >= size)
85 return -EINVAL;
86 len += count;
87 size -= count;
88 }
89
29b71a1c
TR
90 modalias[len] = '\0';
91 return len;
92}
93
94static ssize_t
95acpi_device_modalias_show(struct device *dev, struct device_attribute *attr, char *buf) {
96 struct acpi_device *acpi_dev = to_acpi_device(dev);
97 int len;
98
99 /* Device has no HID and no CID or string is >1024 */
100 len = create_modalias(acpi_dev, buf, 1024);
101 if (len <= 0)
102 return 0;
103 buf[len++] = '\n';
104 return len;
105}
106static DEVICE_ATTR(modalias, 0444, acpi_device_modalias_show, NULL);
107
c4753e57
TK
108/**
109 * acpi_bus_hot_remove_device: hot-remove a device and its children
110 * @context: struct acpi_eject_event pointer (freed in this func)
111 *
112 * Hot-remove a device and its children. This function frees up the
113 * memory space passed by arg context, so that the caller may call
114 * this function asynchronously through acpi_os_hotplug_execute().
115 */
116void acpi_bus_hot_remove_device(void *context)
1da177e4 117{
c4753e57 118 struct acpi_eject_event *ej_event = (struct acpi_eject_event *) context;
5993c467
YL
119 struct acpi_device *device = ej_event->device;
120 acpi_handle handle = device->handle;
b3c450c3 121 acpi_handle temp;
1da177e4
LT
122 struct acpi_object_list arg_list;
123 union acpi_object arg;
124 acpi_status status = AE_OK;
c4753e57 125 u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; /* default */
1da177e4 126
26d46867 127 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
0794469d 128 "Hot-removing device %s...\n", dev_name(&device->dev)));
26d46867 129
bfee26db
RW
130 acpi_bus_trim(device);
131 /* Device node has been released. */
b3c450c3
TK
132 device = NULL;
133
26d46867
ZR
134 /* power off device */
135 status = acpi_evaluate_object(handle, "_PS3", NULL, NULL);
136 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND)
55ac9a01
LM
137 printk(KERN_WARNING PREFIX
138 "Power-off device failed\n");
26d46867 139
b3c450c3 140 if (ACPI_SUCCESS(acpi_get_handle(handle, "_LCK", &temp))) {
1da177e4
LT
141 arg_list.count = 1;
142 arg_list.pointer = &arg;
143 arg.type = ACPI_TYPE_INTEGER;
144 arg.integer.value = 0;
145 acpi_evaluate_object(handle, "_LCK", &arg_list, NULL);
146 }
1da177e4 147
1da177e4
LT
148 arg_list.count = 1;
149 arg_list.pointer = &arg;
150 arg.type = ACPI_TYPE_INTEGER;
151 arg.integer.value = 1;
1da177e4 152
1da177e4
LT
153 /*
154 * TBD: _EJD support.
155 */
1da177e4 156 status = acpi_evaluate_object(handle, "_EJ0", &arg_list, NULL);
c4753e57
TK
157 if (ACPI_FAILURE(status)) {
158 if (status != AE_NOT_FOUND)
159 printk(KERN_WARNING PREFIX
160 "Eject device failed\n");
161 goto err_out;
162 }
1da177e4 163
c4753e57
TK
164 kfree(context);
165 return;
1da177e4 166
c4753e57
TK
167err_out:
168 /* Inform firmware the hot-remove operation has completed w/ error */
169 (void) acpi_evaluate_hotplug_ost(handle,
170 ej_event->event, ost_code, NULL);
171 kfree(context);
c8d72a5e 172 return;
1da177e4 173}
61622acc 174EXPORT_SYMBOL(acpi_bus_hot_remove_device);
1da177e4 175
1da177e4 176static ssize_t
f883d9db
PM
177acpi_eject_store(struct device *d, struct device_attribute *attr,
178 const char *buf, size_t count)
1da177e4 179{
4be44fcd 180 int ret = count;
4be44fcd 181 acpi_status status;
4be44fcd 182 acpi_object_type type = 0;
f883d9db 183 struct acpi_device *acpi_device = to_acpi_device(d);
c4753e57 184 struct acpi_eject_event *ej_event;
1da177e4 185
1da177e4
LT
186 if ((!count) || (buf[0] != '1')) {
187 return -EINVAL;
188 }
1da177e4 189#ifndef FORCE_EJECT
f883d9db 190 if (acpi_device->driver == NULL) {
1da177e4
LT
191 ret = -ENODEV;
192 goto err;
193 }
194#endif
f883d9db
PM
195 status = acpi_get_type(acpi_device->handle, &type);
196 if (ACPI_FAILURE(status) || (!acpi_device->flags.ejectable)) {
1da177e4
LT
197 ret = -ENODEV;
198 goto err;
199 }
1da177e4 200
c4753e57
TK
201 ej_event = kmalloc(sizeof(*ej_event), GFP_KERNEL);
202 if (!ej_event) {
203 ret = -ENOMEM;
204 goto err;
205 }
206
5993c467 207 ej_event->device = acpi_device;
c4753e57
TK
208 if (acpi_device->flags.eject_pending) {
209 /* event originated from ACPI eject notification */
210 ej_event->event = ACPI_NOTIFY_EJECT_REQUEST;
211 acpi_device->flags.eject_pending = 0;
212 } else {
213 /* event originated from user */
214 ej_event->event = ACPI_OST_EC_OSPM_EJECT;
5993c467 215 (void) acpi_evaluate_hotplug_ost(acpi_device->handle,
c4753e57
TK
216 ej_event->event, ACPI_OST_SC_EJECT_IN_PROGRESS, NULL);
217 }
218
219 acpi_os_hotplug_execute(acpi_bus_hot_remove_device, (void *)ej_event);
74523c90 220err:
1da177e4 221 return ret;
1da177e4
LT
222}
223
f883d9db 224static DEVICE_ATTR(eject, 0200, NULL, acpi_eject_store);
1da177e4 225
e49bd2dd
ZR
226static ssize_t
227acpi_device_hid_show(struct device *dev, struct device_attribute *attr, char *buf) {
228 struct acpi_device *acpi_dev = to_acpi_device(dev);
1da177e4 229
ea8d82fd 230 return sprintf(buf, "%s\n", acpi_device_hid(acpi_dev));
1da177e4 231}
e49bd2dd 232static DEVICE_ATTR(hid, 0444, acpi_device_hid_show, NULL);
1da177e4 233
923d4a45
LZ
234static ssize_t acpi_device_uid_show(struct device *dev,
235 struct device_attribute *attr, char *buf)
236{
237 struct acpi_device *acpi_dev = to_acpi_device(dev);
238
239 return sprintf(buf, "%s\n", acpi_dev->pnp.unique_id);
240}
241static DEVICE_ATTR(uid, 0444, acpi_device_uid_show, NULL);
242
243static ssize_t acpi_device_adr_show(struct device *dev,
244 struct device_attribute *attr, char *buf)
245{
246 struct acpi_device *acpi_dev = to_acpi_device(dev);
247
248 return sprintf(buf, "0x%08x\n",
249 (unsigned int)(acpi_dev->pnp.bus_address));
250}
251static DEVICE_ATTR(adr, 0444, acpi_device_adr_show, NULL);
252
e49bd2dd
ZR
253static ssize_t
254acpi_device_path_show(struct device *dev, struct device_attribute *attr, char *buf) {
255 struct acpi_device *acpi_dev = to_acpi_device(dev);
256 struct acpi_buffer path = {ACPI_ALLOCATE_BUFFER, NULL};
257 int result;
1da177e4 258
e49bd2dd 259 result = acpi_get_name(acpi_dev->handle, ACPI_FULL_PATHNAME, &path);
0c526d96 260 if (result)
e49bd2dd 261 goto end;
1da177e4 262
e49bd2dd
ZR
263 result = sprintf(buf, "%s\n", (char*)path.pointer);
264 kfree(path.pointer);
0c526d96 265end:
e49bd2dd 266 return result;
1da177e4 267}
e49bd2dd 268static DEVICE_ATTR(path, 0444, acpi_device_path_show, NULL);
1da177e4 269
d1efe3c3
LO
270/* sysfs file that shows description text from the ACPI _STR method */
271static ssize_t description_show(struct device *dev,
272 struct device_attribute *attr,
273 char *buf) {
274 struct acpi_device *acpi_dev = to_acpi_device(dev);
275 int result;
276
277 if (acpi_dev->pnp.str_obj == NULL)
278 return 0;
279
280 /*
281 * The _STR object contains a Unicode identifier for a device.
282 * We need to convert to utf-8 so it can be displayed.
283 */
284 result = utf16s_to_utf8s(
285 (wchar_t *)acpi_dev->pnp.str_obj->buffer.pointer,
286 acpi_dev->pnp.str_obj->buffer.length,
287 UTF16_LITTLE_ENDIAN, buf,
288 PAGE_SIZE);
289
290 buf[result++] = '\n';
291
292 return result;
293}
294static DEVICE_ATTR(description, 0444, description_show, NULL);
295
bb74ac23
YI
296static ssize_t
297acpi_device_sun_show(struct device *dev, struct device_attribute *attr,
298 char *buf) {
299 struct acpi_device *acpi_dev = to_acpi_device(dev);
300
301 return sprintf(buf, "%lu\n", acpi_dev->pnp.sun);
302}
303static DEVICE_ATTR(sun, 0444, acpi_device_sun_show, NULL);
304
e49bd2dd 305static int acpi_device_setup_files(struct acpi_device *dev)
1da177e4 306{
d1efe3c3 307 struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
f883d9db
PM
308 acpi_status status;
309 acpi_handle temp;
bb74ac23 310 unsigned long long sun;
e49bd2dd 311 int result = 0;
1da177e4
LT
312
313 /*
e49bd2dd 314 * Devices gotten from FADT don't have a "path" attribute
1da177e4 315 */
0c526d96 316 if (dev->handle) {
e49bd2dd 317 result = device_create_file(&dev->dev, &dev_attr_path);
0c526d96 318 if (result)
e49bd2dd 319 goto end;
1da177e4
LT
320 }
321
2b2ae7c7
TR
322 if (!list_empty(&dev->pnp.ids)) {
323 result = device_create_file(&dev->dev, &dev_attr_hid);
324 if (result)
325 goto end;
1da177e4 326
2b2ae7c7
TR
327 result = device_create_file(&dev->dev, &dev_attr_modalias);
328 if (result)
329 goto end;
330 }
29b71a1c 331
d1efe3c3
LO
332 /*
333 * If device has _STR, 'description' file is created
334 */
335 status = acpi_get_handle(dev->handle, "_STR", &temp);
336 if (ACPI_SUCCESS(status)) {
337 status = acpi_evaluate_object(dev->handle, "_STR",
338 NULL, &buffer);
339 if (ACPI_FAILURE(status))
340 buffer.pointer = NULL;
341 dev->pnp.str_obj = buffer.pointer;
342 result = device_create_file(&dev->dev, &dev_attr_description);
343 if (result)
344 goto end;
345 }
346
923d4a45
LZ
347 if (dev->flags.bus_address)
348 result = device_create_file(&dev->dev, &dev_attr_adr);
349 if (dev->pnp.unique_id)
350 result = device_create_file(&dev->dev, &dev_attr_uid);
351
bb74ac23
YI
352 status = acpi_evaluate_integer(dev->handle, "_SUN", NULL, &sun);
353 if (ACPI_SUCCESS(status)) {
354 dev->pnp.sun = (unsigned long)sun;
355 result = device_create_file(&dev->dev, &dev_attr_sun);
356 if (result)
357 goto end;
358 } else {
359 dev->pnp.sun = (unsigned long)-1;
360 }
361
e49bd2dd
ZR
362 /*
363 * If device has _EJ0, 'eject' file is created that is used to trigger
364 * hot-removal function from userland.
365 */
f883d9db
PM
366 status = acpi_get_handle(dev->handle, "_EJ0", &temp);
367 if (ACPI_SUCCESS(status))
e49bd2dd 368 result = device_create_file(&dev->dev, &dev_attr_eject);
0c526d96 369end:
e49bd2dd 370 return result;
1da177e4
LT
371}
372
f883d9db 373static void acpi_device_remove_files(struct acpi_device *dev)
1da177e4 374{
f883d9db
PM
375 acpi_status status;
376 acpi_handle temp;
1da177e4 377
f883d9db 378 /*
d1efe3c3
LO
379 * If device has _STR, remove 'description' file
380 */
381 status = acpi_get_handle(dev->handle, "_STR", &temp);
382 if (ACPI_SUCCESS(status)) {
383 kfree(dev->pnp.str_obj);
384 device_remove_file(&dev->dev, &dev_attr_description);
385 }
386 /*
387 * If device has _EJ0, remove 'eject' file.
f883d9db
PM
388 */
389 status = acpi_get_handle(dev->handle, "_EJ0", &temp);
390 if (ACPI_SUCCESS(status))
391 device_remove_file(&dev->dev, &dev_attr_eject);
1da177e4 392
bb74ac23
YI
393 status = acpi_get_handle(dev->handle, "_SUN", &temp);
394 if (ACPI_SUCCESS(status))
395 device_remove_file(&dev->dev, &dev_attr_sun);
396
923d4a45
LZ
397 if (dev->pnp.unique_id)
398 device_remove_file(&dev->dev, &dev_attr_uid);
399 if (dev->flags.bus_address)
400 device_remove_file(&dev->dev, &dev_attr_adr);
1131b938
BH
401 device_remove_file(&dev->dev, &dev_attr_modalias);
402 device_remove_file(&dev->dev, &dev_attr_hid);
0c526d96 403 if (dev->handle)
e49bd2dd 404 device_remove_file(&dev->dev, &dev_attr_path);
1da177e4 405}
1da177e4 406/* --------------------------------------------------------------------------
9e89dde2 407 ACPI Bus operations
1da177e4 408 -------------------------------------------------------------------------- */
29b71a1c 409
cf761af9
MW
410static const struct acpi_device_id *__acpi_match_device(
411 struct acpi_device *device, const struct acpi_device_id *ids)
29b71a1c
TR
412{
413 const struct acpi_device_id *id;
7f47fa6c 414 struct acpi_hardware_id *hwid;
29b71a1c 415
39a0ad87
ZY
416 /*
417 * If the device is not present, it is unnecessary to load device
418 * driver for it.
419 */
420 if (!device->status.present)
cf761af9 421 return NULL;
39a0ad87 422
7f47fa6c
BH
423 for (id = ids; id->id[0]; id++)
424 list_for_each_entry(hwid, &device->pnp.ids, list)
425 if (!strcmp((char *) id->id, hwid->id))
cf761af9
MW
426 return id;
427
428 return NULL;
429}
430
431/**
432 * acpi_match_device - Match a struct device against a given list of ACPI IDs
433 * @ids: Array of struct acpi_device_id object to match against.
434 * @dev: The device structure to match.
435 *
436 * Check if @dev has a valid ACPI handle and if there is a struct acpi_device
437 * object for that handle and use that object to match against a given list of
438 * device IDs.
439 *
440 * Return a pointer to the first matching ID on success or %NULL on failure.
441 */
442const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,
443 const struct device *dev)
444{
445 struct acpi_device *adev;
446
95f8a082
RW
447 if (!ids || !ACPI_HANDLE(dev)
448 || ACPI_FAILURE(acpi_bus_get_device(ACPI_HANDLE(dev), &adev)))
cf761af9
MW
449 return NULL;
450
451 return __acpi_match_device(adev, ids);
452}
453EXPORT_SYMBOL_GPL(acpi_match_device);
29b71a1c 454
cf761af9
MW
455int acpi_match_device_ids(struct acpi_device *device,
456 const struct acpi_device_id *ids)
457{
458 return __acpi_match_device(device, ids) ? 0 : -ENOENT;
29b71a1c
TR
459}
460EXPORT_SYMBOL(acpi_match_device_ids);
461
7f47fa6c
BH
462static void acpi_free_ids(struct acpi_device *device)
463{
464 struct acpi_hardware_id *id, *tmp;
465
466 list_for_each_entry_safe(id, tmp, &device->pnp.ids, list) {
467 kfree(id->id);
468 kfree(id);
469 }
470}
471
1890a97a 472static void acpi_device_release(struct device *dev)
1da177e4 473{
1890a97a 474 struct acpi_device *acpi_dev = to_acpi_device(dev);
1da177e4 475
7f47fa6c 476 acpi_free_ids(acpi_dev);
ccf78040 477 kfree(acpi_dev->pnp.unique_id);
1890a97a 478 kfree(acpi_dev);
1da177e4
LT
479}
480
5d9464a4 481static int acpi_bus_match(struct device *dev, struct device_driver *drv)
9e89dde2 482{
5d9464a4
PM
483 struct acpi_device *acpi_dev = to_acpi_device(dev);
484 struct acpi_driver *acpi_drv = to_acpi_driver(drv);
1da177e4 485
209d3b17 486 return acpi_dev->flags.match_driver
805d410f 487 && !acpi_match_device_ids(acpi_dev, acpi_drv->ids);
5d9464a4 488}
1da177e4 489
7eff2e7a 490static int acpi_device_uevent(struct device *dev, struct kobj_uevent_env *env)
1da177e4 491{
5d9464a4 492 struct acpi_device *acpi_dev = to_acpi_device(dev);
7eff2e7a 493 int len;
5d9464a4 494
2b2ae7c7
TR
495 if (list_empty(&acpi_dev->pnp.ids))
496 return 0;
497
7eff2e7a
KS
498 if (add_uevent_var(env, "MODALIAS="))
499 return -ENOMEM;
500 len = create_modalias(acpi_dev, &env->buf[env->buflen - 1],
501 sizeof(env->buf) - env->buflen);
502 if (len >= (sizeof(env->buf) - env->buflen))
503 return -ENOMEM;
504 env->buflen += len;
9e89dde2 505 return 0;
1da177e4
LT
506}
507
46ec8598
BH
508static void acpi_device_notify(acpi_handle handle, u32 event, void *data)
509{
510 struct acpi_device *device = data;
511
512 device->driver->ops.notify(device, event);
513}
514
515static acpi_status acpi_device_notify_fixed(void *data)
516{
517 struct acpi_device *device = data;
518
53de5356
BH
519 /* Fixed hardware devices have no handles */
520 acpi_device_notify(NULL, ACPI_FIXED_HARDWARE_EVENT, device);
46ec8598
BH
521 return AE_OK;
522}
523
524static int acpi_device_install_notify_handler(struct acpi_device *device)
525{
526 acpi_status status;
46ec8598 527
ccba2a36 528 if (device->device_type == ACPI_BUS_TYPE_POWER_BUTTON)
46ec8598
BH
529 status =
530 acpi_install_fixed_event_handler(ACPI_EVENT_POWER_BUTTON,
531 acpi_device_notify_fixed,
532 device);
ccba2a36 533 else if (device->device_type == ACPI_BUS_TYPE_SLEEP_BUTTON)
46ec8598
BH
534 status =
535 acpi_install_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON,
536 acpi_device_notify_fixed,
537 device);
538 else
539 status = acpi_install_notify_handler(device->handle,
540 ACPI_DEVICE_NOTIFY,
541 acpi_device_notify,
542 device);
543
544 if (ACPI_FAILURE(status))
545 return -EINVAL;
546 return 0;
547}
548
549static void acpi_device_remove_notify_handler(struct acpi_device *device)
550{
ccba2a36 551 if (device->device_type == ACPI_BUS_TYPE_POWER_BUTTON)
46ec8598
BH
552 acpi_remove_fixed_event_handler(ACPI_EVENT_POWER_BUTTON,
553 acpi_device_notify_fixed);
ccba2a36 554 else if (device->device_type == ACPI_BUS_TYPE_SLEEP_BUTTON)
46ec8598
BH
555 acpi_remove_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON,
556 acpi_device_notify_fixed);
557 else
558 acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY,
559 acpi_device_notify);
560}
561
5d9464a4 562static int acpi_bus_driver_init(struct acpi_device *, struct acpi_driver *);
5d9464a4 563static int acpi_device_probe(struct device * dev)
1da177e4 564{
5d9464a4
PM
565 struct acpi_device *acpi_dev = to_acpi_device(dev);
566 struct acpi_driver *acpi_drv = to_acpi_driver(dev->driver);
567 int ret;
568
569 ret = acpi_bus_driver_init(acpi_dev, acpi_drv);
570 if (!ret) {
46ec8598
BH
571 if (acpi_drv->ops.notify) {
572 ret = acpi_device_install_notify_handler(acpi_dev);
573 if (ret) {
46ec8598
BH
574 if (acpi_drv->ops.remove)
575 acpi_drv->ops.remove(acpi_dev,
576 acpi_dev->removal_type);
577 return ret;
578 }
579 }
580
5d9464a4
PM
581 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
582 "Found driver [%s] for device [%s]\n",
583 acpi_drv->name, acpi_dev->pnp.bus_id));
584 get_device(dev);
585 }
586 return ret;
587}
1da177e4 588
5d9464a4
PM
589static int acpi_device_remove(struct device * dev)
590{
591 struct acpi_device *acpi_dev = to_acpi_device(dev);
592 struct acpi_driver *acpi_drv = acpi_dev->driver;
593
594 if (acpi_drv) {
46ec8598
BH
595 if (acpi_drv->ops.notify)
596 acpi_device_remove_notify_handler(acpi_dev);
5d9464a4 597 if (acpi_drv->ops.remove)
96333578 598 acpi_drv->ops.remove(acpi_dev, acpi_dev->removal_type);
1da177e4 599 }
5d9464a4 600 acpi_dev->driver = NULL;
db89b4f0 601 acpi_dev->driver_data = NULL;
1da177e4 602
5d9464a4 603 put_device(dev);
9e89dde2
ZR
604 return 0;
605}
1da177e4 606
55955aad 607struct bus_type acpi_bus_type = {
9e89dde2 608 .name = "acpi",
5d9464a4
PM
609 .match = acpi_bus_match,
610 .probe = acpi_device_probe,
611 .remove = acpi_device_remove,
612 .uevent = acpi_device_uevent,
9e89dde2
ZR
613};
614
66b7ed40 615static int acpi_device_register(struct acpi_device *device)
1da177e4 616{
4be44fcd 617 int result;
e49bd2dd
ZR
618 struct acpi_device_bus_id *acpi_device_bus_id, *new_bus_id;
619 int found = 0;
66b7ed40 620
9e89dde2
ZR
621 /*
622 * Linkage
623 * -------
624 * Link this device to its parent and siblings.
625 */
626 INIT_LIST_HEAD(&device->children);
627 INIT_LIST_HEAD(&device->node);
9e89dde2 628 INIT_LIST_HEAD(&device->wakeup_list);
1033f904
LT
629 INIT_LIST_HEAD(&device->physical_node_list);
630 mutex_init(&device->physical_node_lock);
1da177e4 631
e49bd2dd
ZR
632 new_bus_id = kzalloc(sizeof(struct acpi_device_bus_id), GFP_KERNEL);
633 if (!new_bus_id) {
634 printk(KERN_ERR PREFIX "Memory allocation error\n");
635 return -ENOMEM;
1da177e4 636 }
e49bd2dd 637
9090589d 638 mutex_lock(&acpi_device_lock);
e49bd2dd
ZR
639 /*
640 * Find suitable bus_id and instance number in acpi_bus_id_list
641 * If failed, create one and link it into acpi_bus_id_list
642 */
643 list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node) {
1131b938
BH
644 if (!strcmp(acpi_device_bus_id->bus_id,
645 acpi_device_hid(device))) {
646 acpi_device_bus_id->instance_no++;
e49bd2dd
ZR
647 found = 1;
648 kfree(new_bus_id);
649 break;
650 }
1da177e4 651 }
0c526d96 652 if (!found) {
e49bd2dd 653 acpi_device_bus_id = new_bus_id;
1131b938 654 strcpy(acpi_device_bus_id->bus_id, acpi_device_hid(device));
e49bd2dd
ZR
655 acpi_device_bus_id->instance_no = 0;
656 list_add_tail(&acpi_device_bus_id->node, &acpi_bus_id_list);
1da177e4 657 }
0794469d 658 dev_set_name(&device->dev, "%s:%02x", acpi_device_bus_id->bus_id, acpi_device_bus_id->instance_no);
1da177e4 659
33b57150 660 if (device->parent)
9e89dde2 661 list_add_tail(&device->node, &device->parent->children);
33b57150 662
9e89dde2
ZR
663 if (device->wakeup.flags.valid)
664 list_add_tail(&device->wakeup_list, &acpi_wakeup_device_list);
9090589d 665 mutex_unlock(&acpi_device_lock);
1da177e4 666
1890a97a 667 if (device->parent)
66b7ed40 668 device->dev.parent = &device->parent->dev;
1890a97a 669 device->dev.bus = &acpi_bus_type;
1890a97a 670 device->dev.release = &acpi_device_release;
8b12b922 671 result = device_register(&device->dev);
0c526d96 672 if (result) {
8b12b922 673 dev_err(&device->dev, "Error registering device\n");
e49bd2dd 674 goto end;
1da177e4 675 }
1da177e4 676
e49bd2dd 677 result = acpi_device_setup_files(device);
0c526d96 678 if (result)
0794469d
KS
679 printk(KERN_ERR PREFIX "Error creating sysfs interface for device %s\n",
680 dev_name(&device->dev));
1da177e4 681
96333578 682 device->removal_type = ACPI_BUS_REMOVAL_NORMAL;
1da177e4 683 return 0;
0c526d96 684end:
9090589d 685 mutex_lock(&acpi_device_lock);
33b57150 686 if (device->parent)
e49bd2dd 687 list_del(&device->node);
e49bd2dd 688 list_del(&device->wakeup_list);
9090589d 689 mutex_unlock(&acpi_device_lock);
e49bd2dd 690 return result;
1da177e4
LT
691}
692
b17b537a 693static void acpi_device_unregister(struct acpi_device *device)
9e89dde2 694{
9090589d 695 mutex_lock(&acpi_device_lock);
33b57150 696 if (device->parent)
9e89dde2 697 list_del(&device->node);
1da177e4 698
9e89dde2 699 list_del(&device->wakeup_list);
9090589d 700 mutex_unlock(&acpi_device_lock);
1da177e4 701
9e89dde2 702 acpi_detach_data(device->handle, acpi_bus_data_handler);
1890a97a 703
f883d9db 704 acpi_device_remove_files(device);
1890a97a 705 device_unregister(&device->dev);
1da177e4
LT
706}
707
9e89dde2
ZR
708/* --------------------------------------------------------------------------
709 Driver Management
710 -------------------------------------------------------------------------- */
1da177e4 711/**
d758a8fa
RD
712 * acpi_bus_driver_init - add a device to a driver
713 * @device: the device to add and initialize
714 * @driver: driver for the device
715 *
0c526d96 716 * Used to initialize a device via its device driver. Called whenever a
1890a97a 717 * driver is bound to a device. Invokes the driver's add() ops.
1da177e4
LT
718 */
719static int
4be44fcd 720acpi_bus_driver_init(struct acpi_device *device, struct acpi_driver *driver)
1da177e4 721{
4be44fcd 722 int result = 0;
1da177e4 723
1da177e4 724 if (!device || !driver)
d550d98d 725 return -EINVAL;
1da177e4
LT
726
727 if (!driver->ops.add)
d550d98d 728 return -ENOSYS;
1da177e4
LT
729
730 result = driver->ops.add(device);
731 if (result) {
732 device->driver = NULL;
db89b4f0 733 device->driver_data = NULL;
d550d98d 734 return result;
1da177e4
LT
735 }
736
737 device->driver = driver;
738
739 /*
740 * TBD - Configuration Management: Assign resources to device based
741 * upon possible configuration and currently allocated resources.
742 */
743
4be44fcd
LB
744 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
745 "Driver successfully bound to device\n"));
d550d98d 746 return 0;
3fb02738
RS
747}
748
9e89dde2
ZR
749/**
750 * acpi_bus_register_driver - register a driver with the ACPI bus
751 * @driver: driver being registered
752 *
753 * Registers a driver with the ACPI bus. Searches the namespace for all
754 * devices that match the driver's criteria and binds. Returns zero for
755 * success or a negative error status for failure.
756 */
757int acpi_bus_register_driver(struct acpi_driver *driver)
1da177e4 758{
1890a97a 759 int ret;
1da177e4 760
9e89dde2
ZR
761 if (acpi_disabled)
762 return -ENODEV;
1890a97a
PM
763 driver->drv.name = driver->name;
764 driver->drv.bus = &acpi_bus_type;
765 driver->drv.owner = driver->owner;
1da177e4 766
1890a97a
PM
767 ret = driver_register(&driver->drv);
768 return ret;
9e89dde2 769}
1da177e4 770
9e89dde2
ZR
771EXPORT_SYMBOL(acpi_bus_register_driver);
772
773/**
774 * acpi_bus_unregister_driver - unregisters a driver with the APIC bus
775 * @driver: driver to unregister
776 *
777 * Unregisters a driver with the ACPI bus. Searches the namespace for all
778 * devices that match the driver's criteria and unbinds.
779 */
780void acpi_bus_unregister_driver(struct acpi_driver *driver)
781{
1890a97a 782 driver_unregister(&driver->drv);
9e89dde2
ZR
783}
784
785EXPORT_SYMBOL(acpi_bus_unregister_driver);
786
9e89dde2
ZR
787/* --------------------------------------------------------------------------
788 Device Enumeration
789 -------------------------------------------------------------------------- */
5c478f49
BH
790static struct acpi_device *acpi_bus_get_parent(acpi_handle handle)
791{
792 acpi_status status;
793 int ret;
794 struct acpi_device *device;
795
796 /*
797 * Fixed hardware devices do not appear in the namespace and do not
798 * have handles, but we fabricate acpi_devices for them, so we have
799 * to deal with them specially.
800 */
801 if (handle == NULL)
802 return acpi_root;
803
804 do {
805 status = acpi_get_parent(handle, &handle);
806 if (status == AE_NULL_ENTRY)
807 return NULL;
808 if (ACPI_FAILURE(status))
809 return acpi_root;
810
811 ret = acpi_bus_get_device(handle, &device);
812 if (ret == 0)
813 return device;
814 } while (1);
815}
816
9e89dde2
ZR
817acpi_status
818acpi_bus_get_ejd(acpi_handle handle, acpi_handle *ejd)
819{
820 acpi_status status;
821 acpi_handle tmp;
822 struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
823 union acpi_object *obj;
824
825 status = acpi_get_handle(handle, "_EJD", &tmp);
826 if (ACPI_FAILURE(status))
827 return status;
828
829 status = acpi_evaluate_object(handle, "_EJD", NULL, &buffer);
830 if (ACPI_SUCCESS(status)) {
831 obj = buffer.pointer;
3b5fee59
HM
832 status = acpi_get_handle(ACPI_ROOT_OBJECT, obj->string.pointer,
833 ejd);
9e89dde2
ZR
834 kfree(buffer.pointer);
835 }
836 return status;
837}
838EXPORT_SYMBOL_GPL(acpi_bus_get_ejd);
839
8e4319c4 840void acpi_bus_data_handler(acpi_handle handle, void *context)
9e89dde2
ZR
841{
842
843 /* TBD */
844
845 return;
846}
847
9e89dde2
ZR
848static int acpi_bus_get_perf_flags(struct acpi_device *device)
849{
850 device->performance.state = ACPI_STATE_UNKNOWN;
851 return 0;
852}
853
854static acpi_status
b581a7f9
RW
855acpi_bus_extract_wakeup_device_power_package(acpi_handle handle,
856 struct acpi_device_wakeup *wakeup)
9e89dde2 857{
b581a7f9
RW
858 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
859 union acpi_object *package = NULL;
9e89dde2 860 union acpi_object *element = NULL;
b581a7f9
RW
861 acpi_status status;
862 int i = 0;
9e89dde2 863
b581a7f9 864 if (!wakeup)
9e89dde2
ZR
865 return AE_BAD_PARAMETER;
866
b581a7f9
RW
867 /* _PRW */
868 status = acpi_evaluate_object(handle, "_PRW", NULL, &buffer);
869 if (ACPI_FAILURE(status)) {
870 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PRW"));
871 return status;
872 }
873
874 package = (union acpi_object *)buffer.pointer;
875
876 if (!package || (package->package.count < 2)) {
877 status = AE_BAD_DATA;
878 goto out;
879 }
880
9e89dde2 881 element = &(package->package.elements[0]);
b581a7f9
RW
882 if (!element) {
883 status = AE_BAD_DATA;
884 goto out;
885 }
9e89dde2
ZR
886 if (element->type == ACPI_TYPE_PACKAGE) {
887 if ((element->package.count < 2) ||
888 (element->package.elements[0].type !=
889 ACPI_TYPE_LOCAL_REFERENCE)
b581a7f9
RW
890 || (element->package.elements[1].type != ACPI_TYPE_INTEGER)) {
891 status = AE_BAD_DATA;
892 goto out;
893 }
894 wakeup->gpe_device =
9e89dde2 895 element->package.elements[0].reference.handle;
b581a7f9 896 wakeup->gpe_number =
9e89dde2
ZR
897 (u32) element->package.elements[1].integer.value;
898 } else if (element->type == ACPI_TYPE_INTEGER) {
b581a7f9
RW
899 wakeup->gpe_device = NULL;
900 wakeup->gpe_number = element->integer.value;
901 } else {
902 status = AE_BAD_DATA;
903 goto out;
904 }
9e89dde2
ZR
905
906 element = &(package->package.elements[1]);
907 if (element->type != ACPI_TYPE_INTEGER) {
b581a7f9
RW
908 status = AE_BAD_DATA;
909 goto out;
9e89dde2 910 }
b581a7f9 911 wakeup->sleep_state = element->integer.value;
9e89dde2
ZR
912
913 if ((package->package.count - 2) > ACPI_MAX_HANDLES) {
b581a7f9
RW
914 status = AE_NO_MEMORY;
915 goto out;
9e89dde2 916 }
b581a7f9
RW
917 wakeup->resources.count = package->package.count - 2;
918 for (i = 0; i < wakeup->resources.count; i++) {
9e89dde2 919 element = &(package->package.elements[i + 2]);
b581a7f9
RW
920 if (element->type != ACPI_TYPE_LOCAL_REFERENCE) {
921 status = AE_BAD_DATA;
922 goto out;
923 }
9e89dde2 924
b581a7f9 925 wakeup->resources.handles[i] = element->reference.handle;
1da177e4 926 }
9e89dde2 927
bba63a29 928 acpi_setup_gpe_for_wake(handle, wakeup->gpe_device, wakeup->gpe_number);
9874647b 929
b581a7f9
RW
930 out:
931 kfree(buffer.pointer);
932
933 return status;
1da177e4
LT
934}
935
f517709d 936static void acpi_bus_set_run_wake_flags(struct acpi_device *device)
1da177e4 937{
29b71a1c 938 struct acpi_device_id button_device_ids[] = {
29b71a1c 939 {"PNP0C0C", 0},
b7e38304 940 {"PNP0C0D", 0},
29b71a1c
TR
941 {"PNP0C0E", 0},
942 {"", 0},
943 };
f517709d
RW
944 acpi_status status;
945 acpi_event_status event_status;
946
b67ea761 947 device->wakeup.flags.notifier_present = 0;
f517709d
RW
948
949 /* Power button, Lid switch always enable wakeup */
950 if (!acpi_match_device_ids(device, button_device_ids)) {
951 device->wakeup.flags.run_wake = 1;
b7e38304
ZR
952 if (!acpi_match_device_ids(device, &button_device_ids[1])) {
953 /* Do not use Lid/sleep button for S5 wakeup */
954 if (device->wakeup.sleep_state == ACPI_STATE_S5)
955 device->wakeup.sleep_state = ACPI_STATE_S4;
956 }
f2b56bc8 957 device_set_wakeup_capable(&device->dev, true);
f517709d
RW
958 return;
959 }
960
e8e18c95
RW
961 status = acpi_get_gpe_status(device->wakeup.gpe_device,
962 device->wakeup.gpe_number,
963 &event_status);
f517709d
RW
964 if (status == AE_OK)
965 device->wakeup.flags.run_wake =
966 !!(event_status & ACPI_EVENT_FLAG_HANDLE);
967}
968
d57d09a4 969static void acpi_bus_get_wakeup_device_flags(struct acpi_device *device)
f517709d 970{
d57d09a4 971 acpi_handle temp;
f517709d 972 acpi_status status = 0;
f517709d 973 int psw_error;
29b71a1c 974
d57d09a4
RW
975 /* Presence of _PRW indicates wake capable */
976 status = acpi_get_handle(device->handle, "_PRW", &temp);
977 if (ACPI_FAILURE(status))
978 return;
979
b581a7f9
RW
980 status = acpi_bus_extract_wakeup_device_power_package(device->handle,
981 &device->wakeup);
9e89dde2
ZR
982 if (ACPI_FAILURE(status)) {
983 ACPI_EXCEPTION((AE_INFO, status, "Extracting _PRW package"));
d57d09a4 984 return;
9e89dde2 985 }
1da177e4 986
9e89dde2 987 device->wakeup.flags.valid = 1;
9b83ccd2 988 device->wakeup.prepare_count = 0;
f517709d 989 acpi_bus_set_run_wake_flags(device);
729b2bdb
ZY
990 /* Call _PSW/_DSW object to disable its ability to wake the sleeping
991 * system for the ACPI device with the _PRW object.
992 * The _PSW object is depreciated in ACPI 3.0 and is replaced by _DSW.
993 * So it is necessary to call _DSW object first. Only when it is not
994 * present will the _PSW object used.
995 */
77e76609
RW
996 psw_error = acpi_device_sleep_wake(device, 0, 0, 0);
997 if (psw_error)
998 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
999 "error in _DSW or _PSW evaluation\n"));
1da177e4 1000}
1da177e4 1001
bf325f95
RW
1002static void acpi_bus_add_power_resource(acpi_handle handle);
1003
9e89dde2 1004static int acpi_bus_get_power_flags(struct acpi_device *device)
1da177e4 1005{
9e89dde2
ZR
1006 acpi_status status = 0;
1007 acpi_handle handle = NULL;
1008 u32 i = 0;
1a365616 1009
4be44fcd 1010
9e89dde2
ZR
1011 /*
1012 * Power Management Flags
1013 */
1014 status = acpi_get_handle(device->handle, "_PSC", &handle);
1015 if (ACPI_SUCCESS(status))
1016 device->power.flags.explicit_get = 1;
1017 status = acpi_get_handle(device->handle, "_IRC", &handle);
1018 if (ACPI_SUCCESS(status))
1019 device->power.flags.inrush_current = 1;
1da177e4 1020
9e89dde2
ZR
1021 /*
1022 * Enumerate supported power management states
1023 */
1cc0c998 1024 for (i = ACPI_STATE_D0; i <= ACPI_STATE_D3_HOT; i++) {
9e89dde2
ZR
1025 struct acpi_device_power_state *ps = &device->power.states[i];
1026 char object_name[5] = { '_', 'P', 'R', '0' + i, '\0' };
1da177e4 1027
9e89dde2
ZR
1028 /* Evaluate "_PRx" to se if power resources are referenced */
1029 acpi_evaluate_reference(device->handle, object_name, NULL,
1030 &ps->resources);
1031 if (ps->resources.count) {
bf325f95
RW
1032 int j;
1033
9e89dde2 1034 device->power.flags.power_resources = 1;
bf325f95
RW
1035 for (j = 0; j < ps->resources.count; j++)
1036 acpi_bus_add_power_resource(ps->resources.handles[j]);
1da177e4 1037 }
1da177e4 1038
9e89dde2
ZR
1039 /* Evaluate "_PSx" to see if we can do explicit sets */
1040 object_name[2] = 'S';
1041 status = acpi_get_handle(device->handle, object_name, &handle);
37239978 1042 if (ACPI_SUCCESS(status))
9e89dde2 1043 ps->flags.explicit_set = 1;
1da177e4 1044
1cc0c998
LM
1045 /*
1046 * State is valid if there are means to put the device into it.
1047 * D3hot is only valid if _PR3 present.
1048 */
1049 if (ps->resources.count ||
1399dfcd 1050 (ps->flags.explicit_set && i < ACPI_STATE_D3_HOT)) {
9e89dde2 1051 ps->flags.valid = 1;
1399dfcd
AL
1052 ps->flags.os_accessible = 1;
1053 }
1da177e4 1054
9e89dde2
ZR
1055 ps->power = -1; /* Unknown - driver assigned */
1056 ps->latency = -1; /* Unknown - driver assigned */
1057 }
1da177e4 1058
9e89dde2
ZR
1059 /* Set defaults for D0 and D3 states (always valid) */
1060 device->power.states[ACPI_STATE_D0].flags.valid = 1;
1061 device->power.states[ACPI_STATE_D0].power = 100;
1062 device->power.states[ACPI_STATE_D3].flags.valid = 1;
1063 device->power.states[ACPI_STATE_D3].power = 0;
c8f7a62c 1064
5c7dd710
RW
1065 /* Set D3cold's explicit_set flag if _PS3 exists. */
1066 if (device->power.states[ACPI_STATE_D3_HOT].flags.explicit_set)
1067 device->power.states[ACPI_STATE_D3_COLD].flags.explicit_set = 1;
1068
1399dfcd
AL
1069 /* Presence of _PS3 or _PRx means we can put the device into D3 cold */
1070 if (device->power.states[ACPI_STATE_D3_HOT].flags.explicit_set ||
1071 device->power.flags.power_resources)
1072 device->power.states[ACPI_STATE_D3_COLD].flags.os_accessible = 1;
1073
ade3e7fe 1074 acpi_bus_init_power(device);
c8f7a62c 1075
9e89dde2
ZR
1076 return 0;
1077}
c8f7a62c 1078
4be44fcd 1079static int acpi_bus_get_flags(struct acpi_device *device)
1da177e4 1080{
4be44fcd
LB
1081 acpi_status status = AE_OK;
1082 acpi_handle temp = NULL;
1da177e4 1083
1da177e4
LT
1084
1085 /* Presence of _STA indicates 'dynamic_status' */
1086 status = acpi_get_handle(device->handle, "_STA", &temp);
1087 if (ACPI_SUCCESS(status))
1088 device->flags.dynamic_status = 1;
1089
1da177e4
LT
1090 /* Presence of _RMV indicates 'removable' */
1091 status = acpi_get_handle(device->handle, "_RMV", &temp);
1092 if (ACPI_SUCCESS(status))
1093 device->flags.removable = 1;
1094
1095 /* Presence of _EJD|_EJ0 indicates 'ejectable' */
1096 status = acpi_get_handle(device->handle, "_EJD", &temp);
1097 if (ACPI_SUCCESS(status))
1098 device->flags.ejectable = 1;
1099 else {
1100 status = acpi_get_handle(device->handle, "_EJ0", &temp);
1101 if (ACPI_SUCCESS(status))
1102 device->flags.ejectable = 1;
1103 }
1104
7bed50c5
RW
1105 /* Power resources cannot be power manageable. */
1106 if (device->device_type == ACPI_BUS_TYPE_POWER)
1107 return 0;
1108
1da177e4
LT
1109 /* Presence of _PS0|_PR0 indicates 'power manageable' */
1110 status = acpi_get_handle(device->handle, "_PS0", &temp);
1111 if (ACPI_FAILURE(status))
1112 status = acpi_get_handle(device->handle, "_PR0", &temp);
1113 if (ACPI_SUCCESS(status))
1114 device->flags.power_manageable = 1;
1115
3c5f9be4 1116 /* TBD: Performance management */
1da177e4 1117
d550d98d 1118 return 0;
1da177e4
LT
1119}
1120
c7bcb4e9 1121static void acpi_device_get_busid(struct acpi_device *device)
1da177e4 1122{
4be44fcd
LB
1123 char bus_id[5] = { '?', 0 };
1124 struct acpi_buffer buffer = { sizeof(bus_id), bus_id };
1125 int i = 0;
1da177e4
LT
1126
1127 /*
1128 * Bus ID
1129 * ------
1130 * The device's Bus ID is simply the object name.
1131 * TBD: Shouldn't this value be unique (within the ACPI namespace)?
1132 */
859ac9a4 1133 if (ACPI_IS_ROOT_DEVICE(device)) {
1da177e4 1134 strcpy(device->pnp.bus_id, "ACPI");
859ac9a4
BH
1135 return;
1136 }
1137
1138 switch (device->device_type) {
1da177e4
LT
1139 case ACPI_BUS_TYPE_POWER_BUTTON:
1140 strcpy(device->pnp.bus_id, "PWRF");
1141 break;
1142 case ACPI_BUS_TYPE_SLEEP_BUTTON:
1143 strcpy(device->pnp.bus_id, "SLPF");
1144 break;
1145 default:
66b7ed40 1146 acpi_get_name(device->handle, ACPI_SINGLE_NAME, &buffer);
1da177e4
LT
1147 /* Clean up trailing underscores (if any) */
1148 for (i = 3; i > 1; i--) {
1149 if (bus_id[i] == '_')
1150 bus_id[i] = '\0';
1151 else
1152 break;
1153 }
1154 strcpy(device->pnp.bus_id, bus_id);
1155 break;
1156 }
1157}
1158
54735266
ZR
1159/*
1160 * acpi_bay_match - see if a device is an ejectable driver bay
1161 *
1162 * If an acpi object is ejectable and has one of the ACPI ATA methods defined,
1163 * then we can safely call it an ejectable drive bay
1164 */
1165static int acpi_bay_match(struct acpi_device *device){
1166 acpi_status status;
1167 acpi_handle handle;
1168 acpi_handle tmp;
1169 acpi_handle phandle;
1170
1171 handle = device->handle;
1172
1173 status = acpi_get_handle(handle, "_EJ0", &tmp);
1174 if (ACPI_FAILURE(status))
1175 return -ENODEV;
1176
1177 if ((ACPI_SUCCESS(acpi_get_handle(handle, "_GTF", &tmp))) ||
1178 (ACPI_SUCCESS(acpi_get_handle(handle, "_GTM", &tmp))) ||
1179 (ACPI_SUCCESS(acpi_get_handle(handle, "_STM", &tmp))) ||
1180 (ACPI_SUCCESS(acpi_get_handle(handle, "_SDD", &tmp))))
1181 return 0;
1182
1183 if (acpi_get_parent(handle, &phandle))
1184 return -ENODEV;
1185
1186 if ((ACPI_SUCCESS(acpi_get_handle(phandle, "_GTF", &tmp))) ||
1187 (ACPI_SUCCESS(acpi_get_handle(phandle, "_GTM", &tmp))) ||
1188 (ACPI_SUCCESS(acpi_get_handle(phandle, "_STM", &tmp))) ||
1189 (ACPI_SUCCESS(acpi_get_handle(phandle, "_SDD", &tmp))))
1190 return 0;
1191
1192 return -ENODEV;
1193}
1194
3620f2f2
FS
1195/*
1196 * acpi_dock_match - see if a device has a _DCK method
1197 */
1198static int acpi_dock_match(struct acpi_device *device)
1199{
1200 acpi_handle tmp;
1201 return acpi_get_handle(device->handle, "_DCK", &tmp);
1202}
1203
620e112c 1204const char *acpi_device_hid(struct acpi_device *device)
15b8dd53 1205{
7f47fa6c 1206 struct acpi_hardware_id *hid;
15b8dd53 1207
2b2ae7c7
TR
1208 if (list_empty(&device->pnp.ids))
1209 return dummy_hid;
1210
7f47fa6c
BH
1211 hid = list_first_entry(&device->pnp.ids, struct acpi_hardware_id, list);
1212 return hid->id;
1213}
1214EXPORT_SYMBOL(acpi_device_hid);
15b8dd53 1215
7f47fa6c
BH
1216static void acpi_add_id(struct acpi_device *device, const char *dev_id)
1217{
1218 struct acpi_hardware_id *id;
15b8dd53 1219
7f47fa6c
BH
1220 id = kmalloc(sizeof(*id), GFP_KERNEL);
1221 if (!id)
1222 return;
15b8dd53 1223
581de59e 1224 id->id = kstrdup(dev_id, GFP_KERNEL);
7f47fa6c
BH
1225 if (!id->id) {
1226 kfree(id);
1227 return;
15b8dd53
BM
1228 }
1229
7f47fa6c 1230 list_add_tail(&id->list, &device->pnp.ids);
15b8dd53
BM
1231}
1232
222e82ac
DW
1233/*
1234 * Old IBM workstations have a DSDT bug wherein the SMBus object
1235 * lacks the SMBUS01 HID and the methods do not have the necessary "_"
1236 * prefix. Work around this.
1237 */
1238static int acpi_ibm_smbus_match(struct acpi_device *device)
1239{
1240 acpi_handle h_dummy;
1241 struct acpi_buffer path = {ACPI_ALLOCATE_BUFFER, NULL};
1242 int result;
1243
1244 if (!dmi_name_in_vendors("IBM"))
1245 return -ENODEV;
1246
1247 /* Look for SMBS object */
1248 result = acpi_get_name(device->handle, ACPI_SINGLE_NAME, &path);
1249 if (result)
1250 return result;
1251
1252 if (strcmp("SMBS", path.pointer)) {
1253 result = -ENODEV;
1254 goto out;
1255 }
1256
1257 /* Does it have the necessary (but misnamed) methods? */
1258 result = -ENODEV;
1259 if (ACPI_SUCCESS(acpi_get_handle(device->handle, "SBI", &h_dummy)) &&
1260 ACPI_SUCCESS(acpi_get_handle(device->handle, "SBR", &h_dummy)) &&
1261 ACPI_SUCCESS(acpi_get_handle(device->handle, "SBW", &h_dummy)))
1262 result = 0;
1263out:
1264 kfree(path.pointer);
1265 return result;
1266}
1267
c7bcb4e9 1268static void acpi_device_set_id(struct acpi_device *device)
1da177e4 1269{
4be44fcd 1270 acpi_status status;
57f3674f 1271 struct acpi_device_info *info;
78e25fef 1272 struct acpi_pnp_device_id_list *cid_list;
7f47fa6c 1273 int i;
1da177e4 1274
c7bcb4e9 1275 switch (device->device_type) {
1da177e4 1276 case ACPI_BUS_TYPE_DEVICE:
859ac9a4 1277 if (ACPI_IS_ROOT_DEVICE(device)) {
57f3674f 1278 acpi_add_id(device, ACPI_SYSTEM_HID);
859ac9a4
BH
1279 break;
1280 }
1281
66b7ed40 1282 status = acpi_get_object_info(device->handle, &info);
1da177e4 1283 if (ACPI_FAILURE(status)) {
96b2dd1f 1284 printk(KERN_ERR PREFIX "%s: Error reading device info\n", __func__);
1da177e4
LT
1285 return;
1286 }
1287
1da177e4 1288 if (info->valid & ACPI_VALID_HID)
57f3674f
BH
1289 acpi_add_id(device, info->hardware_id.string);
1290 if (info->valid & ACPI_VALID_CID) {
15b8dd53 1291 cid_list = &info->compatible_id_list;
57f3674f
BH
1292 for (i = 0; i < cid_list->count; i++)
1293 acpi_add_id(device, cid_list->ids[i].string);
1294 }
1da177e4
LT
1295 if (info->valid & ACPI_VALID_ADR) {
1296 device->pnp.bus_address = info->address;
1297 device->flags.bus_address = 1;
1298 }
ccf78040
LZ
1299 if (info->valid & ACPI_VALID_UID)
1300 device->pnp.unique_id = kstrdup(info->unique_id.string,
1301 GFP_KERNEL);
ae843332 1302
a83893ae
BH
1303 kfree(info);
1304
57f3674f
BH
1305 /*
1306 * Some devices don't reliably have _HIDs & _CIDs, so add
1307 * synthetic HIDs to make sure drivers can find them.
1308 */
c3d6de69 1309 if (acpi_is_video_device(device))
57f3674f 1310 acpi_add_id(device, ACPI_VIDEO_HID);
3620f2f2 1311 else if (ACPI_SUCCESS(acpi_bay_match(device)))
57f3674f 1312 acpi_add_id(device, ACPI_BAY_HID);
3620f2f2 1313 else if (ACPI_SUCCESS(acpi_dock_match(device)))
57f3674f 1314 acpi_add_id(device, ACPI_DOCK_HID);
222e82ac
DW
1315 else if (!acpi_ibm_smbus_match(device))
1316 acpi_add_id(device, ACPI_SMBUS_IBM_HID);
b7b30de5
BH
1317 else if (!acpi_device_hid(device) &&
1318 ACPI_IS_ROOT_DEVICE(device->parent)) {
1319 acpi_add_id(device, ACPI_BUS_HID); /* \_SB, LNXSYBUS */
1320 strcpy(device->pnp.device_name, ACPI_BUS_DEVICE_NAME);
1321 strcpy(device->pnp.device_class, ACPI_BUS_CLASS);
1322 }
54735266 1323
1da177e4
LT
1324 break;
1325 case ACPI_BUS_TYPE_POWER:
57f3674f 1326 acpi_add_id(device, ACPI_POWER_HID);
1da177e4
LT
1327 break;
1328 case ACPI_BUS_TYPE_PROCESSOR:
57f3674f 1329 acpi_add_id(device, ACPI_PROCESSOR_OBJECT_HID);
1da177e4 1330 break;
1da177e4 1331 case ACPI_BUS_TYPE_THERMAL:
57f3674f 1332 acpi_add_id(device, ACPI_THERMAL_HID);
1da177e4
LT
1333 break;
1334 case ACPI_BUS_TYPE_POWER_BUTTON:
57f3674f 1335 acpi_add_id(device, ACPI_BUTTON_HID_POWERF);
1da177e4
LT
1336 break;
1337 case ACPI_BUS_TYPE_SLEEP_BUTTON:
57f3674f 1338 acpi_add_id(device, ACPI_BUTTON_HID_SLEEPF);
1da177e4
LT
1339 break;
1340 }
1da177e4
LT
1341}
1342
bc3b0772 1343static int acpi_device_set_context(struct acpi_device *device)
1da177e4 1344{
bc3b0772
BH
1345 acpi_status status;
1346
1da177e4
LT
1347 /*
1348 * Context
1349 * -------
1350 * Attach this 'struct acpi_device' to the ACPI object. This makes
bc3b0772
BH
1351 * resolutions from handle->device very efficient. Fixed hardware
1352 * devices have no handles, so we skip them.
1da177e4 1353 */
bc3b0772
BH
1354 if (!device->handle)
1355 return 0;
1da177e4 1356
bc3b0772
BH
1357 status = acpi_attach_data(device->handle,
1358 acpi_bus_data_handler, device);
1359 if (ACPI_SUCCESS(status))
1360 return 0;
1361
1362 printk(KERN_ERR PREFIX "Error attaching device data\n");
1363 return -ENODEV;
1da177e4
LT
1364}
1365
5c478f49
BH
1366static int acpi_add_single_object(struct acpi_device **child,
1367 acpi_handle handle, int type,
209d3b17 1368 unsigned long long sta, bool match_driver)
1da177e4 1369{
77c24888
BH
1370 int result;
1371 struct acpi_device *device;
29aaefa6 1372 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
1da177e4 1373
36bcbec7 1374 device = kzalloc(sizeof(struct acpi_device), GFP_KERNEL);
1da177e4 1375 if (!device) {
6468463a 1376 printk(KERN_ERR PREFIX "Memory allocation error\n");
d550d98d 1377 return -ENOMEM;
1da177e4 1378 }
1da177e4 1379
7f47fa6c 1380 INIT_LIST_HEAD(&device->pnp.ids);
caaa6efb 1381 device->device_type = type;
1da177e4 1382 device->handle = handle;
5c478f49 1383 device->parent = acpi_bus_get_parent(handle);
778cbc1d 1384 STRUCT_TO_INT(device->status) = sta;
c4168bff 1385
c7bcb4e9 1386 acpi_device_get_busid(device);
1da177e4
LT
1387
1388 /*
1389 * Flags
1390 * -----
778cbc1d
BH
1391 * Note that we only look for object handles -- cannot evaluate objects
1392 * until we know the device is present and properly initialized.
1da177e4
LT
1393 */
1394 result = acpi_bus_get_flags(device);
1395 if (result)
1396 goto end;
1397
1da177e4
LT
1398 /*
1399 * Initialize Device
1400 * -----------------
1401 * TBD: Synch with Core's enumeration/initialization process.
1402 */
c7bcb4e9 1403 acpi_device_set_id(device);
1da177e4
LT
1404
1405 /*
1406 * Power Management
1407 * ----------------
1408 */
1409 if (device->flags.power_manageable) {
1410 result = acpi_bus_get_power_flags(device);
1411 if (result)
1412 goto end;
1413 }
1414
4be44fcd 1415 /*
1da177e4
LT
1416 * Wakeup device management
1417 *-----------------------
1418 */
d57d09a4 1419 acpi_bus_get_wakeup_device_flags(device);
1da177e4
LT
1420
1421 /*
1422 * Performance Management
1423 * ----------------------
1424 */
1425 if (device->flags.performance_manageable) {
1426 result = acpi_bus_get_perf_flags(device);
1427 if (result)
1428 goto end;
1429 }
1430
bc3b0772 1431 if ((result = acpi_device_set_context(device)))
f61f9258 1432 goto end;
1da177e4 1433
209d3b17 1434 device->flags.match_driver = match_driver;
66b7ed40 1435 result = acpi_device_register(device);
1da177e4 1436
0c526d96 1437end:
29aaefa6
BH
1438 if (!result) {
1439 acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
1440 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
1441 "Adding %s [%s] parent %s\n", dev_name(&device->dev),
1442 (char *) buffer.pointer,
1443 device->parent ? dev_name(&device->parent->dev) :
1444 "(null)"));
1445 kfree(buffer.pointer);
1da177e4 1446 *child = device;
29aaefa6 1447 } else
718fb0de 1448 acpi_device_release(&device->dev);
1da177e4 1449
d550d98d 1450 return result;
1da177e4 1451}
1da177e4 1452
778cbc1d
BH
1453#define ACPI_STA_DEFAULT (ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED | \
1454 ACPI_STA_DEVICE_UI | ACPI_STA_DEVICE_FUNCTIONING)
1455
bf325f95
RW
1456static void acpi_bus_add_power_resource(acpi_handle handle)
1457{
bf325f95
RW
1458 struct acpi_device *device = NULL;
1459
1460 acpi_bus_get_device(handle, &device);
1461 if (!device)
1462 acpi_add_single_object(&device, handle, ACPI_BUS_TYPE_POWER,
209d3b17 1463 ACPI_STA_DEFAULT, true);
bf325f95
RW
1464}
1465
778cbc1d
BH
1466static int acpi_bus_type_and_status(acpi_handle handle, int *type,
1467 unsigned long long *sta)
1da177e4 1468{
778cbc1d
BH
1469 acpi_status status;
1470 acpi_object_type acpi_type;
1da177e4 1471
778cbc1d 1472 status = acpi_get_type(handle, &acpi_type);
51a85faf 1473 if (ACPI_FAILURE(status))
778cbc1d 1474 return -ENODEV;
4be44fcd 1475
778cbc1d 1476 switch (acpi_type) {
51a85faf
BH
1477 case ACPI_TYPE_ANY: /* for ACPI_ROOT_OBJECT */
1478 case ACPI_TYPE_DEVICE:
778cbc1d
BH
1479 *type = ACPI_BUS_TYPE_DEVICE;
1480 status = acpi_bus_get_status_handle(handle, sta);
1481 if (ACPI_FAILURE(status))
1482 return -ENODEV;
51a85faf
BH
1483 break;
1484 case ACPI_TYPE_PROCESSOR:
778cbc1d
BH
1485 *type = ACPI_BUS_TYPE_PROCESSOR;
1486 status = acpi_bus_get_status_handle(handle, sta);
1487 if (ACPI_FAILURE(status))
1488 return -ENODEV;
51a85faf
BH
1489 break;
1490 case ACPI_TYPE_THERMAL:
778cbc1d
BH
1491 *type = ACPI_BUS_TYPE_THERMAL;
1492 *sta = ACPI_STA_DEFAULT;
51a85faf
BH
1493 break;
1494 case ACPI_TYPE_POWER:
778cbc1d
BH
1495 *type = ACPI_BUS_TYPE_POWER;
1496 *sta = ACPI_STA_DEFAULT;
51a85faf
BH
1497 break;
1498 default:
778cbc1d 1499 return -ENODEV;
51a85faf 1500 }
1da177e4 1501
778cbc1d
BH
1502 return 0;
1503}
1504
e3863094
RW
1505static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
1506 void *not_used, void **return_value)
778cbc1d 1507{
805d410f 1508 struct acpi_device *device = NULL;
778cbc1d
BH
1509 int type;
1510 unsigned long long sta;
e3b87f8a 1511 acpi_status status;
778cbc1d
BH
1512 int result;
1513
4002bf38
RW
1514 acpi_bus_get_device(handle, &device);
1515 if (device)
1516 goto out;
1517
778cbc1d
BH
1518 result = acpi_bus_type_and_status(handle, &type, &sta);
1519 if (result)
1520 return AE_OK;
1521
1522 if (!(sta & ACPI_STA_DEVICE_PRESENT) &&
b581a7f9 1523 !(sta & ACPI_STA_DEVICE_FUNCTIONING)) {
86e4e20e
RW
1524 struct acpi_device_wakeup wakeup;
1525 acpi_handle temp;
1526
1527 status = acpi_get_handle(handle, "_PRW", &temp);
1528 if (ACPI_SUCCESS(status))
1529 acpi_bus_extract_wakeup_device_power_package(handle,
1530 &wakeup);
778cbc1d 1531 return AE_CTRL_DEPTH;
b581a7f9 1532 }
778cbc1d 1533
f95988de
RW
1534 acpi_add_single_object(&device, handle, type, sta,
1535 type == ACPI_BUS_TYPE_POWER);
4002bf38
RW
1536 if (!device)
1537 return AE_CTRL_DEPTH;
805d410f 1538
209d3b17 1539 device->flags.match_driver = true;
1da177e4 1540
4002bf38 1541 out:
51a85faf
BH
1542 if (!*return_value)
1543 *return_value = device;
805d410f 1544
51a85faf
BH
1545 return AE_OK;
1546}
3fb02738 1547
0fc300b0
RW
1548static acpi_status acpi_bus_device_attach(acpi_handle handle, u32 lvl_not_used,
1549 void *not_used, void **ret_not_used)
805d410f 1550{
805d410f
RW
1551 acpi_status status = AE_OK;
1552 struct acpi_device *device;
1553 unsigned long long sta_not_used;
1554 int type_not_used;
1555
1556 /*
1557 * Ignore errors ignored by acpi_bus_check_add() to avoid terminating
1558 * namespace walks prematurely.
1559 */
1560 if (acpi_bus_type_and_status(handle, &type_not_used, &sta_not_used))
1561 return AE_OK;
1562
1563 if (acpi_bus_get_device(handle, &device))
1564 return AE_CTRL_DEPTH;
1565
0fc300b0
RW
1566 if (!acpi_match_device_ids(device, acpi_platform_device_ids)) {
1567 /* This is a known good platform device. */
1568 acpi_create_platform_device(device);
abe99210 1569 } else if (device_attach(&device->dev) < 0) {
0fc300b0 1570 status = AE_CTRL_DEPTH;
805d410f
RW
1571 }
1572 return status;
1573}
1574
636458de 1575/**
b8bd759a 1576 * acpi_bus_scan - Add ACPI device node objects in a given namespace scope.
636458de 1577 * @handle: Root of the namespace scope to scan.
636458de
RW
1578 *
1579 * Scan a given ACPI tree (probably recently hot-plugged) and create and add
1580 * found devices.
7779688f 1581 *
636458de
RW
1582 * If no devices were found, -ENODEV is returned, but it does not mean that
1583 * there has been a real error. There just have been no suitable ACPI objects
1584 * in the table trunk from which the kernel could create a device and add an
1585 * appropriate driver.
7779688f 1586 */
b8bd759a 1587int acpi_bus_scan(acpi_handle handle)
3fb02738 1588{
b8bd759a 1589 void *device = NULL;
d2f6650a 1590
b8bd759a
RW
1591 if (ACPI_SUCCESS(acpi_bus_check_add(handle, 0, NULL, &device)))
1592 acpi_walk_namespace(ACPI_TYPE_ANY, handle, ACPI_UINT32_MAX,
1593 acpi_bus_check_add, NULL, NULL, &device);
1594
1595 if (!device)
1596 return -ENODEV;
1597
1598 if (ACPI_SUCCESS(acpi_bus_device_attach(handle, 0, NULL, NULL)))
1599 acpi_walk_namespace(ACPI_TYPE_ANY, handle, ACPI_UINT32_MAX,
1600 acpi_bus_device_attach, NULL, NULL, NULL);
a2100801 1601
0fc300b0 1602 return 0;
3fb02738 1603}
b8bd759a 1604EXPORT_SYMBOL(acpi_bus_scan);
1da177e4 1605
05404d8f
RW
1606static acpi_status acpi_bus_device_detach(acpi_handle handle, u32 lvl_not_used,
1607 void *not_used, void **ret_not_used)
1608{
1609 struct acpi_device *device = NULL;
1610
1611 if (!acpi_bus_get_device(handle, &device)) {
1612 device->removal_type = ACPI_BUS_REMOVAL_EJECT;
1613 device_release_driver(&device->dev);
1614 }
1615 return AE_OK;
1616}
1617
1618static acpi_status acpi_bus_remove(acpi_handle handle, u32 lvl_not_used,
1619 void *not_used, void **ret_not_used)
1620{
1621 struct acpi_device *device = NULL;
1622
1623 if (!acpi_bus_get_device(handle, &device))
1624 acpi_device_unregister(device);
1625
1626 return AE_OK;
1627}
1628
bfee26db 1629void acpi_bus_trim(struct acpi_device *start)
1da177e4 1630{
05404d8f
RW
1631 /*
1632 * Execute acpi_bus_device_detach() as a post-order callback to detach
1633 * all ACPI drivers from the device nodes being removed.
1634 */
1635 acpi_walk_namespace(ACPI_TYPE_ANY, start->handle, ACPI_UINT32_MAX, NULL,
1636 acpi_bus_device_detach, NULL, NULL);
1637 acpi_bus_device_detach(start->handle, 0, NULL, NULL);
cecdb193
RW
1638 /*
1639 * Execute acpi_bus_remove() as a post-order callback to remove device
1640 * nodes in the given namespace scope.
1641 */
1642 acpi_walk_namespace(ACPI_TYPE_ANY, start->handle, ACPI_UINT32_MAX, NULL,
1643 acpi_bus_remove, NULL, NULL);
1644 acpi_bus_remove(start->handle, 0, NULL, NULL);
1da177e4 1645}
ceaba663
KA
1646EXPORT_SYMBOL_GPL(acpi_bus_trim);
1647
e8b945c9 1648static int acpi_bus_scan_fixed(void)
1da177e4 1649{
4be44fcd
LB
1650 int result = 0;
1651 struct acpi_device *device = NULL;
c4168bff 1652
1da177e4
LT
1653 /*
1654 * Enumerate all fixed-feature devices.
1655 */
cee324b1 1656 if ((acpi_gbl_FADT.flags & ACPI_FADT_POWER_BUTTON) == 0) {
5c478f49 1657 result = acpi_add_single_object(&device, NULL,
c4168bff 1658 ACPI_BUS_TYPE_POWER_BUTTON,
209d3b17 1659 ACPI_STA_DEFAULT, true);
c10d7a13 1660 device_init_wakeup(&device->dev, true);
3fb02738 1661 }
1da177e4 1662
cee324b1 1663 if ((acpi_gbl_FADT.flags & ACPI_FADT_SLEEP_BUTTON) == 0) {
5c478f49 1664 result = acpi_add_single_object(&device, NULL,
c4168bff 1665 ACPI_BUS_TYPE_SLEEP_BUTTON,
209d3b17 1666 ACPI_STA_DEFAULT, true);
3fb02738 1667 }
1da177e4 1668
d550d98d 1669 return result;
1da177e4
LT
1670}
1671
e747f274 1672int __init acpi_scan_init(void)
1da177e4
LT
1673{
1674 int result;
1da177e4 1675
5b327265
PM
1676 result = bus_register(&acpi_bus_type);
1677 if (result) {
1678 /* We don't want to quit even if we failed to add suspend/resume */
1679 printk(KERN_ERR PREFIX "Could not register bus type\n");
1680 }
1681
97d9a9e9 1682 acpi_power_init();
92ef2a25 1683 acpi_pci_root_init();
97d9a9e9 1684
1da177e4
LT
1685 /*
1686 * Enumerate devices in the ACPI namespace.
1687 */
0cd6ac52
RW
1688 result = acpi_bus_scan(ACPI_ROOT_OBJECT);
1689 if (result)
1690 return result;
c04209a7 1691
0cd6ac52 1692 result = acpi_bus_get_device(ACPI_ROOT_OBJECT, &acpi_root);
1da177e4 1693 if (result)
b8bd759a
RW
1694 return result;
1695
1696 result = acpi_bus_scan_fixed();
1697 if (result) {
b17b537a 1698 acpi_device_unregister(acpi_root);
b8bd759a
RW
1699 return result;
1700 }
1da177e4 1701
b8bd759a
RW
1702 acpi_update_all_gpes();
1703 return 0;
1da177e4 1704}