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> 7 #include <linux/kernel.h> 8 #include <linux/acpi.h> 9 #include <linux/signal.h> 10 #include <linux/kthread.h> 11 12 #include <acpi/acpi_drivers.h> 13 14 #include "internal.h" 15 16 #define _COMPONENT ACPI_BUS_COMPONENT 17 ACPI_MODULE_NAME("scan"); 18 #define STRUCT_TO_INT(s) (*((int*)&s)) 19 extern struct acpi_device *acpi_root; 20 21 #define ACPI_BUS_CLASS "system_bus" 22 #define ACPI_BUS_HID "LNXSYBUS" 23 #define ACPI_BUS_DEVICE_NAME "System Bus" 24 25 static LIST_HEAD(acpi_device_list); 26 static LIST_HEAD(acpi_bus_id_list); 27 DEFINE_MUTEX(acpi_device_lock); 28 LIST_HEAD(acpi_wakeup_device_list); 29 30 struct acpi_device_bus_id{ 31 char bus_id[15]; 32 unsigned int instance_no; 33 struct list_head node; 34 }; 35 36 /* 37 * Creates hid/cid(s) string needed for modalias and uevent 38 * e.g. on a device with hid:IBM0001 and cid:ACPI0001 you get: 39 * char *modalias: "acpi:IBM0001:ACPI0001" 40 */ 41 static int create_modalias(struct acpi_device *acpi_dev, char *modalias, 42 int size) 43 { 44 int len; 45 int count; 46 47 if (!acpi_dev->flags.hardware_id && !acpi_dev->flags.compatible_ids) 48 return -ENODEV; 49 50 len = snprintf(modalias, size, "acpi:"); 51 size -= len; 52 53 if (acpi_dev->flags.hardware_id) { 54 count = snprintf(&modalias[len], size, "%s:", 55 acpi_dev->pnp.hardware_id); 56 if (count < 0 || count >= size) 57 return -EINVAL; 58 len += count; 59 size -= count; 60 } 61 62 if (acpi_dev->flags.compatible_ids) { 63 struct acpi_compatible_id_list *cid_list; 64 int i; 65 66 cid_list = acpi_dev->pnp.cid_list; 67 for (i = 0; i < cid_list->count; i++) { 68 count = snprintf(&modalias[len], size, "%s:", 69 cid_list->id[i].value); 70 if (count < 0 || count >= size) { 71 printk(KERN_ERR PREFIX "%s cid[%i] exceeds event buffer size", 72 acpi_dev->pnp.device_name, i); 73 break; 74 } 75 len += count; 76 size -= count; 77 } 78 } 79 80 modalias[len] = '\0'; 81 return len; 82 } 83 84 static ssize_t 85 acpi_device_modalias_show(struct device *dev, struct device_attribute *attr, char *buf) { 86 struct acpi_device *acpi_dev = to_acpi_device(dev); 87 int len; 88 89 /* Device has no HID and no CID or string is >1024 */ 90 len = create_modalias(acpi_dev, buf, 1024); 91 if (len <= 0) 92 return 0; 93 buf[len++] = '\n'; 94 return len; 95 } 96 static DEVICE_ATTR(modalias, 0444, acpi_device_modalias_show, NULL); 97 98 static void acpi_bus_hot_remove_device(void *context) 99 { 100 struct acpi_device *device; 101 acpi_handle handle = context; 102 struct acpi_object_list arg_list; 103 union acpi_object arg; 104 acpi_status status = AE_OK; 105 106 if (acpi_bus_get_device(handle, &device)) 107 return; 108 109 if (!device) 110 return; 111 112 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 113 "Hot-removing device %s...\n", dev_name(&device->dev))); 114 115 if (acpi_bus_trim(device, 1)) { 116 printk(KERN_ERR PREFIX 117 "Removing device failed\n"); 118 return; 119 } 120 121 /* power off device */ 122 status = acpi_evaluate_object(handle, "_PS3", NULL, NULL); 123 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) 124 printk(KERN_WARNING PREFIX 125 "Power-off device failed\n"); 126 127 if (device->flags.lockable) { 128 arg_list.count = 1; 129 arg_list.pointer = &arg; 130 arg.type = ACPI_TYPE_INTEGER; 131 arg.integer.value = 0; 132 acpi_evaluate_object(handle, "_LCK", &arg_list, NULL); 133 } 134 135 arg_list.count = 1; 136 arg_list.pointer = &arg; 137 arg.type = ACPI_TYPE_INTEGER; 138 arg.integer.value = 1; 139 140 /* 141 * TBD: _EJD support. 142 */ 143 status = acpi_evaluate_object(handle, "_EJ0", &arg_list, NULL); 144 if (ACPI_FAILURE(status)) 145 printk(KERN_WARNING PREFIX 146 "Eject device failed\n"); 147 148 return; 149 } 150 151 static ssize_t 152 acpi_eject_store(struct device *d, struct device_attribute *attr, 153 const char *buf, size_t count) 154 { 155 int ret = count; 156 acpi_status status; 157 acpi_object_type type = 0; 158 struct acpi_device *acpi_device = to_acpi_device(d); 159 160 if ((!count) || (buf[0] != '1')) { 161 return -EINVAL; 162 } 163 #ifndef FORCE_EJECT 164 if (acpi_device->driver == NULL) { 165 ret = -ENODEV; 166 goto err; 167 } 168 #endif 169 status = acpi_get_type(acpi_device->handle, &type); 170 if (ACPI_FAILURE(status) || (!acpi_device->flags.ejectable)) { 171 ret = -ENODEV; 172 goto err; 173 } 174 175 acpi_os_hotplug_execute(acpi_bus_hot_remove_device, acpi_device->handle); 176 err: 177 return ret; 178 } 179 180 static DEVICE_ATTR(eject, 0200, NULL, acpi_eject_store); 181 182 static ssize_t 183 acpi_device_hid_show(struct device *dev, struct device_attribute *attr, char *buf) { 184 struct acpi_device *acpi_dev = to_acpi_device(dev); 185 186 return sprintf(buf, "%s\n", acpi_dev->pnp.hardware_id); 187 } 188 static DEVICE_ATTR(hid, 0444, acpi_device_hid_show, NULL); 189 190 static ssize_t 191 acpi_device_path_show(struct device *dev, struct device_attribute *attr, char *buf) { 192 struct acpi_device *acpi_dev = to_acpi_device(dev); 193 struct acpi_buffer path = {ACPI_ALLOCATE_BUFFER, NULL}; 194 int result; 195 196 result = acpi_get_name(acpi_dev->handle, ACPI_FULL_PATHNAME, &path); 197 if (result) 198 goto end; 199 200 result = sprintf(buf, "%s\n", (char*)path.pointer); 201 kfree(path.pointer); 202 end: 203 return result; 204 } 205 static DEVICE_ATTR(path, 0444, acpi_device_path_show, NULL); 206 207 static int acpi_device_setup_files(struct acpi_device *dev) 208 { 209 acpi_status status; 210 acpi_handle temp; 211 int result = 0; 212 213 /* 214 * Devices gotten from FADT don't have a "path" attribute 215 */ 216 if (dev->handle) { 217 result = device_create_file(&dev->dev, &dev_attr_path); 218 if (result) 219 goto end; 220 } 221 222 if (dev->flags.hardware_id) { 223 result = device_create_file(&dev->dev, &dev_attr_hid); 224 if (result) 225 goto end; 226 } 227 228 if (dev->flags.hardware_id || dev->flags.compatible_ids) { 229 result = device_create_file(&dev->dev, &dev_attr_modalias); 230 if (result) 231 goto end; 232 } 233 234 /* 235 * If device has _EJ0, 'eject' file is created that is used to trigger 236 * hot-removal function from userland. 237 */ 238 status = acpi_get_handle(dev->handle, "_EJ0", &temp); 239 if (ACPI_SUCCESS(status)) 240 result = device_create_file(&dev->dev, &dev_attr_eject); 241 end: 242 return result; 243 } 244 245 static void acpi_device_remove_files(struct acpi_device *dev) 246 { 247 acpi_status status; 248 acpi_handle temp; 249 250 /* 251 * If device has _EJ0, 'eject' file is created that is used to trigger 252 * hot-removal function from userland. 253 */ 254 status = acpi_get_handle(dev->handle, "_EJ0", &temp); 255 if (ACPI_SUCCESS(status)) 256 device_remove_file(&dev->dev, &dev_attr_eject); 257 258 if (dev->flags.hardware_id || dev->flags.compatible_ids) 259 device_remove_file(&dev->dev, &dev_attr_modalias); 260 261 if (dev->flags.hardware_id) 262 device_remove_file(&dev->dev, &dev_attr_hid); 263 if (dev->handle) 264 device_remove_file(&dev->dev, &dev_attr_path); 265 } 266 /* -------------------------------------------------------------------------- 267 ACPI Bus operations 268 -------------------------------------------------------------------------- */ 269 270 int acpi_match_device_ids(struct acpi_device *device, 271 const struct acpi_device_id *ids) 272 { 273 const struct acpi_device_id *id; 274 275 /* 276 * If the device is not present, it is unnecessary to load device 277 * driver for it. 278 */ 279 if (!device->status.present) 280 return -ENODEV; 281 282 if (device->flags.hardware_id) { 283 for (id = ids; id->id[0]; id++) { 284 if (!strcmp((char*)id->id, device->pnp.hardware_id)) 285 return 0; 286 } 287 } 288 289 if (device->flags.compatible_ids) { 290 struct acpi_compatible_id_list *cid_list = device->pnp.cid_list; 291 int i; 292 293 for (id = ids; id->id[0]; id++) { 294 /* compare multiple _CID entries against driver ids */ 295 for (i = 0; i < cid_list->count; i++) { 296 if (!strcmp((char*)id->id, 297 cid_list->id[i].value)) 298 return 0; 299 } 300 } 301 } 302 303 return -ENOENT; 304 } 305 EXPORT_SYMBOL(acpi_match_device_ids); 306 307 static void acpi_device_release(struct device *dev) 308 { 309 struct acpi_device *acpi_dev = to_acpi_device(dev); 310 311 kfree(acpi_dev->pnp.cid_list); 312 kfree(acpi_dev); 313 } 314 315 static int acpi_device_suspend(struct device *dev, pm_message_t state) 316 { 317 struct acpi_device *acpi_dev = to_acpi_device(dev); 318 struct acpi_driver *acpi_drv = acpi_dev->driver; 319 320 if (acpi_drv && acpi_drv->ops.suspend) 321 return acpi_drv->ops.suspend(acpi_dev, state); 322 return 0; 323 } 324 325 static int acpi_device_resume(struct device *dev) 326 { 327 struct acpi_device *acpi_dev = to_acpi_device(dev); 328 struct acpi_driver *acpi_drv = acpi_dev->driver; 329 330 if (acpi_drv && acpi_drv->ops.resume) 331 return acpi_drv->ops.resume(acpi_dev); 332 return 0; 333 } 334 335 static int acpi_bus_match(struct device *dev, struct device_driver *drv) 336 { 337 struct acpi_device *acpi_dev = to_acpi_device(dev); 338 struct acpi_driver *acpi_drv = to_acpi_driver(drv); 339 340 return !acpi_match_device_ids(acpi_dev, acpi_drv->ids); 341 } 342 343 static int acpi_device_uevent(struct device *dev, struct kobj_uevent_env *env) 344 { 345 struct acpi_device *acpi_dev = to_acpi_device(dev); 346 int len; 347 348 if (add_uevent_var(env, "MODALIAS=")) 349 return -ENOMEM; 350 len = create_modalias(acpi_dev, &env->buf[env->buflen - 1], 351 sizeof(env->buf) - env->buflen); 352 if (len >= (sizeof(env->buf) - env->buflen)) 353 return -ENOMEM; 354 env->buflen += len; 355 return 0; 356 } 357 358 static void acpi_device_notify(acpi_handle handle, u32 event, void *data) 359 { 360 struct acpi_device *device = data; 361 362 device->driver->ops.notify(device, event); 363 } 364 365 static acpi_status acpi_device_notify_fixed(void *data) 366 { 367 struct acpi_device *device = data; 368 369 acpi_device_notify(device->handle, ACPI_FIXED_HARDWARE_EVENT, device); 370 return AE_OK; 371 } 372 373 static int acpi_device_install_notify_handler(struct acpi_device *device) 374 { 375 acpi_status status; 376 char *hid; 377 378 hid = acpi_device_hid(device); 379 if (!strcmp(hid, ACPI_BUTTON_HID_POWERF)) 380 status = 381 acpi_install_fixed_event_handler(ACPI_EVENT_POWER_BUTTON, 382 acpi_device_notify_fixed, 383 device); 384 else if (!strcmp(hid, ACPI_BUTTON_HID_SLEEPF)) 385 status = 386 acpi_install_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON, 387 acpi_device_notify_fixed, 388 device); 389 else 390 status = acpi_install_notify_handler(device->handle, 391 ACPI_DEVICE_NOTIFY, 392 acpi_device_notify, 393 device); 394 395 if (ACPI_FAILURE(status)) 396 return -EINVAL; 397 return 0; 398 } 399 400 static void acpi_device_remove_notify_handler(struct acpi_device *device) 401 { 402 if (!strcmp(acpi_device_hid(device), ACPI_BUTTON_HID_POWERF)) 403 acpi_remove_fixed_event_handler(ACPI_EVENT_POWER_BUTTON, 404 acpi_device_notify_fixed); 405 else if (!strcmp(acpi_device_hid(device), ACPI_BUTTON_HID_SLEEPF)) 406 acpi_remove_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON, 407 acpi_device_notify_fixed); 408 else 409 acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, 410 acpi_device_notify); 411 } 412 413 static int acpi_bus_driver_init(struct acpi_device *, struct acpi_driver *); 414 static int acpi_start_single_object(struct acpi_device *); 415 static int acpi_device_probe(struct device * dev) 416 { 417 struct acpi_device *acpi_dev = to_acpi_device(dev); 418 struct acpi_driver *acpi_drv = to_acpi_driver(dev->driver); 419 int ret; 420 421 ret = acpi_bus_driver_init(acpi_dev, acpi_drv); 422 if (!ret) { 423 if (acpi_dev->bus_ops.acpi_op_start) 424 acpi_start_single_object(acpi_dev); 425 426 if (acpi_drv->ops.notify) { 427 ret = acpi_device_install_notify_handler(acpi_dev); 428 if (ret) { 429 if (acpi_drv->ops.stop) 430 acpi_drv->ops.stop(acpi_dev, 431 acpi_dev->removal_type); 432 if (acpi_drv->ops.remove) 433 acpi_drv->ops.remove(acpi_dev, 434 acpi_dev->removal_type); 435 return ret; 436 } 437 } 438 439 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 440 "Found driver [%s] for device [%s]\n", 441 acpi_drv->name, acpi_dev->pnp.bus_id)); 442 get_device(dev); 443 } 444 return ret; 445 } 446 447 static int acpi_device_remove(struct device * dev) 448 { 449 struct acpi_device *acpi_dev = to_acpi_device(dev); 450 struct acpi_driver *acpi_drv = acpi_dev->driver; 451 452 if (acpi_drv) { 453 if (acpi_drv->ops.notify) 454 acpi_device_remove_notify_handler(acpi_dev); 455 if (acpi_drv->ops.stop) 456 acpi_drv->ops.stop(acpi_dev, acpi_dev->removal_type); 457 if (acpi_drv->ops.remove) 458 acpi_drv->ops.remove(acpi_dev, acpi_dev->removal_type); 459 } 460 acpi_dev->driver = NULL; 461 acpi_dev->driver_data = NULL; 462 463 put_device(dev); 464 return 0; 465 } 466 467 struct bus_type acpi_bus_type = { 468 .name = "acpi", 469 .suspend = acpi_device_suspend, 470 .resume = acpi_device_resume, 471 .match = acpi_bus_match, 472 .probe = acpi_device_probe, 473 .remove = acpi_device_remove, 474 .uevent = acpi_device_uevent, 475 }; 476 477 static int acpi_device_register(struct acpi_device *device, 478 struct acpi_device *parent) 479 { 480 int result; 481 struct acpi_device_bus_id *acpi_device_bus_id, *new_bus_id; 482 int found = 0; 483 /* 484 * Linkage 485 * ------- 486 * Link this device to its parent and siblings. 487 */ 488 INIT_LIST_HEAD(&device->children); 489 INIT_LIST_HEAD(&device->node); 490 INIT_LIST_HEAD(&device->wakeup_list); 491 492 new_bus_id = kzalloc(sizeof(struct acpi_device_bus_id), GFP_KERNEL); 493 if (!new_bus_id) { 494 printk(KERN_ERR PREFIX "Memory allocation error\n"); 495 return -ENOMEM; 496 } 497 498 mutex_lock(&acpi_device_lock); 499 /* 500 * Find suitable bus_id and instance number in acpi_bus_id_list 501 * If failed, create one and link it into acpi_bus_id_list 502 */ 503 list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node) { 504 if(!strcmp(acpi_device_bus_id->bus_id, device->flags.hardware_id? device->pnp.hardware_id : "device")) { 505 acpi_device_bus_id->instance_no ++; 506 found = 1; 507 kfree(new_bus_id); 508 break; 509 } 510 } 511 if (!found) { 512 acpi_device_bus_id = new_bus_id; 513 strcpy(acpi_device_bus_id->bus_id, device->flags.hardware_id ? device->pnp.hardware_id : "device"); 514 acpi_device_bus_id->instance_no = 0; 515 list_add_tail(&acpi_device_bus_id->node, &acpi_bus_id_list); 516 } 517 dev_set_name(&device->dev, "%s:%02x", acpi_device_bus_id->bus_id, acpi_device_bus_id->instance_no); 518 519 if (device->parent) 520 list_add_tail(&device->node, &device->parent->children); 521 522 if (device->wakeup.flags.valid) 523 list_add_tail(&device->wakeup_list, &acpi_wakeup_device_list); 524 mutex_unlock(&acpi_device_lock); 525 526 if (device->parent) 527 device->dev.parent = &parent->dev; 528 device->dev.bus = &acpi_bus_type; 529 device->dev.release = &acpi_device_release; 530 result = device_register(&device->dev); 531 if (result) { 532 dev_err(&device->dev, "Error registering device\n"); 533 goto end; 534 } 535 536 result = acpi_device_setup_files(device); 537 if (result) 538 printk(KERN_ERR PREFIX "Error creating sysfs interface for device %s\n", 539 dev_name(&device->dev)); 540 541 device->removal_type = ACPI_BUS_REMOVAL_NORMAL; 542 return 0; 543 end: 544 mutex_lock(&acpi_device_lock); 545 if (device->parent) 546 list_del(&device->node); 547 list_del(&device->wakeup_list); 548 mutex_unlock(&acpi_device_lock); 549 return result; 550 } 551 552 static void acpi_device_unregister(struct acpi_device *device, int type) 553 { 554 mutex_lock(&acpi_device_lock); 555 if (device->parent) 556 list_del(&device->node); 557 558 list_del(&device->wakeup_list); 559 mutex_unlock(&acpi_device_lock); 560 561 acpi_detach_data(device->handle, acpi_bus_data_handler); 562 563 acpi_device_remove_files(device); 564 device_unregister(&device->dev); 565 } 566 567 /* -------------------------------------------------------------------------- 568 Driver Management 569 -------------------------------------------------------------------------- */ 570 /** 571 * acpi_bus_driver_init - add a device to a driver 572 * @device: the device to add and initialize 573 * @driver: driver for the device 574 * 575 * Used to initialize a device via its device driver. Called whenever a 576 * driver is bound to a device. Invokes the driver's add() ops. 577 */ 578 static int 579 acpi_bus_driver_init(struct acpi_device *device, struct acpi_driver *driver) 580 { 581 int result = 0; 582 583 if (!device || !driver) 584 return -EINVAL; 585 586 if (!driver->ops.add) 587 return -ENOSYS; 588 589 result = driver->ops.add(device); 590 if (result) { 591 device->driver = NULL; 592 device->driver_data = NULL; 593 return result; 594 } 595 596 device->driver = driver; 597 598 /* 599 * TBD - Configuration Management: Assign resources to device based 600 * upon possible configuration and currently allocated resources. 601 */ 602 603 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 604 "Driver successfully bound to device\n")); 605 return 0; 606 } 607 608 static int acpi_start_single_object(struct acpi_device *device) 609 { 610 int result = 0; 611 struct acpi_driver *driver; 612 613 614 if (!(driver = device->driver)) 615 return 0; 616 617 if (driver->ops.start) { 618 result = driver->ops.start(device); 619 if (result && driver->ops.remove) 620 driver->ops.remove(device, ACPI_BUS_REMOVAL_NORMAL); 621 } 622 623 return result; 624 } 625 626 /** 627 * acpi_bus_register_driver - register a driver with the ACPI bus 628 * @driver: driver being registered 629 * 630 * Registers a driver with the ACPI bus. Searches the namespace for all 631 * devices that match the driver's criteria and binds. Returns zero for 632 * success or a negative error status for failure. 633 */ 634 int acpi_bus_register_driver(struct acpi_driver *driver) 635 { 636 int ret; 637 638 if (acpi_disabled) 639 return -ENODEV; 640 driver->drv.name = driver->name; 641 driver->drv.bus = &acpi_bus_type; 642 driver->drv.owner = driver->owner; 643 644 ret = driver_register(&driver->drv); 645 return ret; 646 } 647 648 EXPORT_SYMBOL(acpi_bus_register_driver); 649 650 /** 651 * acpi_bus_unregister_driver - unregisters a driver with the APIC bus 652 * @driver: driver to unregister 653 * 654 * Unregisters a driver with the ACPI bus. Searches the namespace for all 655 * devices that match the driver's criteria and unbinds. 656 */ 657 void acpi_bus_unregister_driver(struct acpi_driver *driver) 658 { 659 driver_unregister(&driver->drv); 660 } 661 662 EXPORT_SYMBOL(acpi_bus_unregister_driver); 663 664 /* -------------------------------------------------------------------------- 665 Device Enumeration 666 -------------------------------------------------------------------------- */ 667 acpi_status 668 acpi_bus_get_ejd(acpi_handle handle, acpi_handle *ejd) 669 { 670 acpi_status status; 671 acpi_handle tmp; 672 struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; 673 union acpi_object *obj; 674 675 status = acpi_get_handle(handle, "_EJD", &tmp); 676 if (ACPI_FAILURE(status)) 677 return status; 678 679 status = acpi_evaluate_object(handle, "_EJD", NULL, &buffer); 680 if (ACPI_SUCCESS(status)) { 681 obj = buffer.pointer; 682 status = acpi_get_handle(ACPI_ROOT_OBJECT, obj->string.pointer, 683 ejd); 684 kfree(buffer.pointer); 685 } 686 return status; 687 } 688 EXPORT_SYMBOL_GPL(acpi_bus_get_ejd); 689 690 void acpi_bus_data_handler(acpi_handle handle, u32 function, void *context) 691 { 692 693 /* TBD */ 694 695 return; 696 } 697 698 static int acpi_bus_get_perf_flags(struct acpi_device *device) 699 { 700 device->performance.state = ACPI_STATE_UNKNOWN; 701 return 0; 702 } 703 704 static acpi_status 705 acpi_bus_extract_wakeup_device_power_package(struct acpi_device *device, 706 union acpi_object *package) 707 { 708 int i = 0; 709 union acpi_object *element = NULL; 710 711 if (!device || !package || (package->package.count < 2)) 712 return AE_BAD_PARAMETER; 713 714 element = &(package->package.elements[0]); 715 if (!element) 716 return AE_BAD_PARAMETER; 717 if (element->type == ACPI_TYPE_PACKAGE) { 718 if ((element->package.count < 2) || 719 (element->package.elements[0].type != 720 ACPI_TYPE_LOCAL_REFERENCE) 721 || (element->package.elements[1].type != ACPI_TYPE_INTEGER)) 722 return AE_BAD_DATA; 723 device->wakeup.gpe_device = 724 element->package.elements[0].reference.handle; 725 device->wakeup.gpe_number = 726 (u32) element->package.elements[1].integer.value; 727 } else if (element->type == ACPI_TYPE_INTEGER) { 728 device->wakeup.gpe_number = element->integer.value; 729 } else 730 return AE_BAD_DATA; 731 732 element = &(package->package.elements[1]); 733 if (element->type != ACPI_TYPE_INTEGER) { 734 return AE_BAD_DATA; 735 } 736 device->wakeup.sleep_state = element->integer.value; 737 738 if ((package->package.count - 2) > ACPI_MAX_HANDLES) { 739 return AE_NO_MEMORY; 740 } 741 device->wakeup.resources.count = package->package.count - 2; 742 for (i = 0; i < device->wakeup.resources.count; i++) { 743 element = &(package->package.elements[i + 2]); 744 if (element->type != ACPI_TYPE_LOCAL_REFERENCE) 745 return AE_BAD_DATA; 746 747 device->wakeup.resources.handles[i] = element->reference.handle; 748 } 749 750 return AE_OK; 751 } 752 753 static int acpi_bus_get_wakeup_device_flags(struct acpi_device *device) 754 { 755 acpi_status status = 0; 756 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 757 union acpi_object *package = NULL; 758 int psw_error; 759 760 struct acpi_device_id button_device_ids[] = { 761 {"PNP0C0D", 0}, 762 {"PNP0C0C", 0}, 763 {"PNP0C0E", 0}, 764 {"", 0}, 765 }; 766 767 /* _PRW */ 768 status = acpi_evaluate_object(device->handle, "_PRW", NULL, &buffer); 769 if (ACPI_FAILURE(status)) { 770 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PRW")); 771 goto end; 772 } 773 774 package = (union acpi_object *)buffer.pointer; 775 status = acpi_bus_extract_wakeup_device_power_package(device, package); 776 if (ACPI_FAILURE(status)) { 777 ACPI_EXCEPTION((AE_INFO, status, "Extracting _PRW package")); 778 goto end; 779 } 780 781 kfree(buffer.pointer); 782 783 device->wakeup.flags.valid = 1; 784 device->wakeup.prepare_count = 0; 785 /* Call _PSW/_DSW object to disable its ability to wake the sleeping 786 * system for the ACPI device with the _PRW object. 787 * The _PSW object is depreciated in ACPI 3.0 and is replaced by _DSW. 788 * So it is necessary to call _DSW object first. Only when it is not 789 * present will the _PSW object used. 790 */ 791 psw_error = acpi_device_sleep_wake(device, 0, 0, 0); 792 if (psw_error) 793 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 794 "error in _DSW or _PSW evaluation\n")); 795 796 /* Power button, Lid switch always enable wakeup */ 797 if (!acpi_match_device_ids(device, button_device_ids)) 798 device->wakeup.flags.run_wake = 1; 799 800 end: 801 if (ACPI_FAILURE(status)) 802 device->flags.wake_capable = 0; 803 return 0; 804 } 805 806 static int acpi_bus_get_power_flags(struct acpi_device *device) 807 { 808 acpi_status status = 0; 809 acpi_handle handle = NULL; 810 u32 i = 0; 811 812 813 /* 814 * Power Management Flags 815 */ 816 status = acpi_get_handle(device->handle, "_PSC", &handle); 817 if (ACPI_SUCCESS(status)) 818 device->power.flags.explicit_get = 1; 819 status = acpi_get_handle(device->handle, "_IRC", &handle); 820 if (ACPI_SUCCESS(status)) 821 device->power.flags.inrush_current = 1; 822 823 /* 824 * Enumerate supported power management states 825 */ 826 for (i = ACPI_STATE_D0; i <= ACPI_STATE_D3; i++) { 827 struct acpi_device_power_state *ps = &device->power.states[i]; 828 char object_name[5] = { '_', 'P', 'R', '0' + i, '\0' }; 829 830 /* Evaluate "_PRx" to se if power resources are referenced */ 831 acpi_evaluate_reference(device->handle, object_name, NULL, 832 &ps->resources); 833 if (ps->resources.count) { 834 device->power.flags.power_resources = 1; 835 ps->flags.valid = 1; 836 } 837 838 /* Evaluate "_PSx" to see if we can do explicit sets */ 839 object_name[2] = 'S'; 840 status = acpi_get_handle(device->handle, object_name, &handle); 841 if (ACPI_SUCCESS(status)) { 842 ps->flags.explicit_set = 1; 843 ps->flags.valid = 1; 844 } 845 846 /* State is valid if we have some power control */ 847 if (ps->resources.count || ps->flags.explicit_set) 848 ps->flags.valid = 1; 849 850 ps->power = -1; /* Unknown - driver assigned */ 851 ps->latency = -1; /* Unknown - driver assigned */ 852 } 853 854 /* Set defaults for D0 and D3 states (always valid) */ 855 device->power.states[ACPI_STATE_D0].flags.valid = 1; 856 device->power.states[ACPI_STATE_D0].power = 100; 857 device->power.states[ACPI_STATE_D3].flags.valid = 1; 858 device->power.states[ACPI_STATE_D3].power = 0; 859 860 /* TBD: System wake support and resource requirements. */ 861 862 device->power.state = ACPI_STATE_UNKNOWN; 863 acpi_bus_get_power(device->handle, &(device->power.state)); 864 865 return 0; 866 } 867 868 static int acpi_bus_get_flags(struct acpi_device *device) 869 { 870 acpi_status status = AE_OK; 871 acpi_handle temp = NULL; 872 873 874 /* Presence of _STA indicates 'dynamic_status' */ 875 status = acpi_get_handle(device->handle, "_STA", &temp); 876 if (ACPI_SUCCESS(status)) 877 device->flags.dynamic_status = 1; 878 879 /* Presence of _CID indicates 'compatible_ids' */ 880 status = acpi_get_handle(device->handle, "_CID", &temp); 881 if (ACPI_SUCCESS(status)) 882 device->flags.compatible_ids = 1; 883 884 /* Presence of _RMV indicates 'removable' */ 885 status = acpi_get_handle(device->handle, "_RMV", &temp); 886 if (ACPI_SUCCESS(status)) 887 device->flags.removable = 1; 888 889 /* Presence of _EJD|_EJ0 indicates 'ejectable' */ 890 status = acpi_get_handle(device->handle, "_EJD", &temp); 891 if (ACPI_SUCCESS(status)) 892 device->flags.ejectable = 1; 893 else { 894 status = acpi_get_handle(device->handle, "_EJ0", &temp); 895 if (ACPI_SUCCESS(status)) 896 device->flags.ejectable = 1; 897 } 898 899 /* Presence of _LCK indicates 'lockable' */ 900 status = acpi_get_handle(device->handle, "_LCK", &temp); 901 if (ACPI_SUCCESS(status)) 902 device->flags.lockable = 1; 903 904 /* Presence of _PS0|_PR0 indicates 'power manageable' */ 905 status = acpi_get_handle(device->handle, "_PS0", &temp); 906 if (ACPI_FAILURE(status)) 907 status = acpi_get_handle(device->handle, "_PR0", &temp); 908 if (ACPI_SUCCESS(status)) 909 device->flags.power_manageable = 1; 910 911 /* Presence of _PRW indicates wake capable */ 912 status = acpi_get_handle(device->handle, "_PRW", &temp); 913 if (ACPI_SUCCESS(status)) 914 device->flags.wake_capable = 1; 915 916 /* TBD: Performance management */ 917 918 return 0; 919 } 920 921 static void acpi_device_get_busid(struct acpi_device *device, 922 acpi_handle handle, int type) 923 { 924 char bus_id[5] = { '?', 0 }; 925 struct acpi_buffer buffer = { sizeof(bus_id), bus_id }; 926 int i = 0; 927 928 /* 929 * Bus ID 930 * ------ 931 * The device's Bus ID is simply the object name. 932 * TBD: Shouldn't this value be unique (within the ACPI namespace)? 933 */ 934 switch (type) { 935 case ACPI_BUS_TYPE_SYSTEM: 936 strcpy(device->pnp.bus_id, "ACPI"); 937 break; 938 case ACPI_BUS_TYPE_POWER_BUTTON: 939 strcpy(device->pnp.bus_id, "PWRF"); 940 break; 941 case ACPI_BUS_TYPE_SLEEP_BUTTON: 942 strcpy(device->pnp.bus_id, "SLPF"); 943 break; 944 default: 945 acpi_get_name(handle, ACPI_SINGLE_NAME, &buffer); 946 /* Clean up trailing underscores (if any) */ 947 for (i = 3; i > 1; i--) { 948 if (bus_id[i] == '_') 949 bus_id[i] = '\0'; 950 else 951 break; 952 } 953 strcpy(device->pnp.bus_id, bus_id); 954 break; 955 } 956 } 957 958 /* 959 * acpi_bay_match - see if a device is an ejectable driver bay 960 * 961 * If an acpi object is ejectable and has one of the ACPI ATA methods defined, 962 * then we can safely call it an ejectable drive bay 963 */ 964 static int acpi_bay_match(struct acpi_device *device){ 965 acpi_status status; 966 acpi_handle handle; 967 acpi_handle tmp; 968 acpi_handle phandle; 969 970 handle = device->handle; 971 972 status = acpi_get_handle(handle, "_EJ0", &tmp); 973 if (ACPI_FAILURE(status)) 974 return -ENODEV; 975 976 if ((ACPI_SUCCESS(acpi_get_handle(handle, "_GTF", &tmp))) || 977 (ACPI_SUCCESS(acpi_get_handle(handle, "_GTM", &tmp))) || 978 (ACPI_SUCCESS(acpi_get_handle(handle, "_STM", &tmp))) || 979 (ACPI_SUCCESS(acpi_get_handle(handle, "_SDD", &tmp)))) 980 return 0; 981 982 if (acpi_get_parent(handle, &phandle)) 983 return -ENODEV; 984 985 if ((ACPI_SUCCESS(acpi_get_handle(phandle, "_GTF", &tmp))) || 986 (ACPI_SUCCESS(acpi_get_handle(phandle, "_GTM", &tmp))) || 987 (ACPI_SUCCESS(acpi_get_handle(phandle, "_STM", &tmp))) || 988 (ACPI_SUCCESS(acpi_get_handle(phandle, "_SDD", &tmp)))) 989 return 0; 990 991 return -ENODEV; 992 } 993 994 /* 995 * acpi_dock_match - see if a device has a _DCK method 996 */ 997 static int acpi_dock_match(struct acpi_device *device) 998 { 999 acpi_handle tmp; 1000 return acpi_get_handle(device->handle, "_DCK", &tmp); 1001 } 1002 1003 static void acpi_device_set_id(struct acpi_device *device, 1004 struct acpi_device *parent, acpi_handle handle, 1005 int type) 1006 { 1007 struct acpi_device_info *info; 1008 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 1009 char *hid = NULL; 1010 char *uid = NULL; 1011 struct acpi_compatible_id_list *cid_list = NULL; 1012 const char *cid_add = NULL; 1013 acpi_status status; 1014 1015 switch (type) { 1016 case ACPI_BUS_TYPE_DEVICE: 1017 status = acpi_get_object_info(handle, &buffer); 1018 if (ACPI_FAILURE(status)) { 1019 printk(KERN_ERR PREFIX "%s: Error reading device info\n", __func__); 1020 return; 1021 } 1022 1023 info = buffer.pointer; 1024 if (info->valid & ACPI_VALID_HID) 1025 hid = info->hardware_id.value; 1026 if (info->valid & ACPI_VALID_UID) 1027 uid = info->unique_id.value; 1028 if (info->valid & ACPI_VALID_CID) 1029 cid_list = &info->compatibility_id; 1030 if (info->valid & ACPI_VALID_ADR) { 1031 device->pnp.bus_address = info->address; 1032 device->flags.bus_address = 1; 1033 } 1034 1035 /* If we have a video/bay/dock device, add our selfdefined 1036 HID to the CID list. Like that the video/bay/dock drivers 1037 will get autoloaded and the device might still match 1038 against another driver. 1039 */ 1040 if (acpi_is_video_device(device)) 1041 cid_add = ACPI_VIDEO_HID; 1042 else if (ACPI_SUCCESS(acpi_bay_match(device))) 1043 cid_add = ACPI_BAY_HID; 1044 else if (ACPI_SUCCESS(acpi_dock_match(device))) 1045 cid_add = ACPI_DOCK_HID; 1046 1047 break; 1048 case ACPI_BUS_TYPE_POWER: 1049 hid = ACPI_POWER_HID; 1050 break; 1051 case ACPI_BUS_TYPE_PROCESSOR: 1052 hid = ACPI_PROCESSOR_OBJECT_HID; 1053 break; 1054 case ACPI_BUS_TYPE_SYSTEM: 1055 hid = ACPI_SYSTEM_HID; 1056 break; 1057 case ACPI_BUS_TYPE_THERMAL: 1058 hid = ACPI_THERMAL_HID; 1059 break; 1060 case ACPI_BUS_TYPE_POWER_BUTTON: 1061 hid = ACPI_BUTTON_HID_POWERF; 1062 break; 1063 case ACPI_BUS_TYPE_SLEEP_BUTTON: 1064 hid = ACPI_BUTTON_HID_SLEEPF; 1065 break; 1066 } 1067 1068 /* 1069 * \_SB 1070 * ---- 1071 * Fix for the system root bus device -- the only root-level device. 1072 */ 1073 if (((acpi_handle)parent == ACPI_ROOT_OBJECT) && (type == ACPI_BUS_TYPE_DEVICE)) { 1074 hid = ACPI_BUS_HID; 1075 strcpy(device->pnp.device_name, ACPI_BUS_DEVICE_NAME); 1076 strcpy(device->pnp.device_class, ACPI_BUS_CLASS); 1077 } 1078 1079 if (hid) { 1080 strcpy(device->pnp.hardware_id, hid); 1081 device->flags.hardware_id = 1; 1082 } 1083 if (uid) { 1084 strcpy(device->pnp.unique_id, uid); 1085 device->flags.unique_id = 1; 1086 } 1087 if (cid_list || cid_add) { 1088 struct acpi_compatible_id_list *list; 1089 int size = 0; 1090 int count = 0; 1091 1092 if (cid_list) { 1093 size = cid_list->size; 1094 } else if (cid_add) { 1095 size = sizeof(struct acpi_compatible_id_list); 1096 cid_list = ACPI_ALLOCATE_ZEROED((acpi_size) size); 1097 if (!cid_list) { 1098 printk(KERN_ERR "Memory allocation error\n"); 1099 kfree(buffer.pointer); 1100 return; 1101 } else { 1102 cid_list->count = 0; 1103 cid_list->size = size; 1104 } 1105 } 1106 if (cid_add) 1107 size += sizeof(struct acpi_compatible_id); 1108 list = kmalloc(size, GFP_KERNEL); 1109 1110 if (list) { 1111 if (cid_list) { 1112 memcpy(list, cid_list, cid_list->size); 1113 count = cid_list->count; 1114 } 1115 if (cid_add) { 1116 strncpy(list->id[count].value, cid_add, 1117 ACPI_MAX_CID_LENGTH); 1118 count++; 1119 device->flags.compatible_ids = 1; 1120 } 1121 list->size = size; 1122 list->count = count; 1123 device->pnp.cid_list = list; 1124 } else 1125 printk(KERN_ERR PREFIX "Memory allocation error\n"); 1126 } 1127 1128 kfree(buffer.pointer); 1129 } 1130 1131 static int acpi_device_set_context(struct acpi_device *device, int type) 1132 { 1133 acpi_status status = AE_OK; 1134 int result = 0; 1135 /* 1136 * Context 1137 * ------- 1138 * Attach this 'struct acpi_device' to the ACPI object. This makes 1139 * resolutions from handle->device very efficient. Note that we need 1140 * to be careful with fixed-feature devices as they all attach to the 1141 * root object. 1142 */ 1143 if (type != ACPI_BUS_TYPE_POWER_BUTTON && 1144 type != ACPI_BUS_TYPE_SLEEP_BUTTON) { 1145 status = acpi_attach_data(device->handle, 1146 acpi_bus_data_handler, device); 1147 1148 if (ACPI_FAILURE(status)) { 1149 printk(KERN_ERR PREFIX "Error attaching device data\n"); 1150 result = -ENODEV; 1151 } 1152 } 1153 return result; 1154 } 1155 1156 static int acpi_bus_remove(struct acpi_device *dev, int rmdevice) 1157 { 1158 if (!dev) 1159 return -EINVAL; 1160 1161 dev->removal_type = ACPI_BUS_REMOVAL_EJECT; 1162 device_release_driver(&dev->dev); 1163 1164 if (!rmdevice) 1165 return 0; 1166 1167 /* 1168 * unbind _ADR-Based Devices when hot removal 1169 */ 1170 if (dev->flags.bus_address) { 1171 if ((dev->parent) && (dev->parent->ops.unbind)) 1172 dev->parent->ops.unbind(dev); 1173 } 1174 acpi_device_unregister(dev, ACPI_BUS_REMOVAL_EJECT); 1175 1176 return 0; 1177 } 1178 1179 static int 1180 acpi_add_single_object(struct acpi_device **child, 1181 struct acpi_device *parent, acpi_handle handle, int type, 1182 struct acpi_bus_ops *ops) 1183 { 1184 int result = 0; 1185 struct acpi_device *device = NULL; 1186 1187 1188 if (!child) 1189 return -EINVAL; 1190 1191 device = kzalloc(sizeof(struct acpi_device), GFP_KERNEL); 1192 if (!device) { 1193 printk(KERN_ERR PREFIX "Memory allocation error\n"); 1194 return -ENOMEM; 1195 } 1196 1197 device->handle = handle; 1198 device->parent = parent; 1199 device->bus_ops = *ops; /* workround for not call .start */ 1200 1201 1202 acpi_device_get_busid(device, handle, type); 1203 1204 /* 1205 * Flags 1206 * ----- 1207 * Get prior to calling acpi_bus_get_status() so we know whether 1208 * or not _STA is present. Note that we only look for object 1209 * handles -- cannot evaluate objects until we know the device is 1210 * present and properly initialized. 1211 */ 1212 result = acpi_bus_get_flags(device); 1213 if (result) 1214 goto end; 1215 1216 /* 1217 * Status 1218 * ------ 1219 * See if the device is present. We always assume that non-Device 1220 * and non-Processor objects (e.g. thermal zones, power resources, 1221 * etc.) are present, functioning, etc. (at least when parent object 1222 * is present). Note that _STA has a different meaning for some 1223 * objects (e.g. power resources) so we need to be careful how we use 1224 * it. 1225 */ 1226 switch (type) { 1227 case ACPI_BUS_TYPE_PROCESSOR: 1228 case ACPI_BUS_TYPE_DEVICE: 1229 result = acpi_bus_get_status(device); 1230 if (ACPI_FAILURE(result)) { 1231 result = -ENODEV; 1232 goto end; 1233 } 1234 /* 1235 * When the device is neither present nor functional, the 1236 * device should not be added to Linux ACPI device tree. 1237 * When the status of the device is not present but functinal, 1238 * it should be added to Linux ACPI tree. For example : bay 1239 * device , dock device. 1240 * In such conditions it is unncessary to check whether it is 1241 * bay device or dock device. 1242 */ 1243 if (!device->status.present && !device->status.functional) { 1244 result = -ENODEV; 1245 goto end; 1246 } 1247 break; 1248 default: 1249 STRUCT_TO_INT(device->status) = 1250 ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED | 1251 ACPI_STA_DEVICE_UI | ACPI_STA_DEVICE_FUNCTIONING; 1252 break; 1253 } 1254 1255 /* 1256 * Initialize Device 1257 * ----------------- 1258 * TBD: Synch with Core's enumeration/initialization process. 1259 */ 1260 1261 /* 1262 * Hardware ID, Unique ID, & Bus Address 1263 * ------------------------------------- 1264 */ 1265 acpi_device_set_id(device, parent, handle, type); 1266 1267 /* 1268 * The ACPI device is attached to acpi handle before getting 1269 * the power/wakeup/peformance flags. Otherwise OS can't get 1270 * the corresponding ACPI device by the acpi handle in the course 1271 * of getting the power/wakeup/performance flags. 1272 */ 1273 result = acpi_device_set_context(device, type); 1274 if (result) 1275 goto end; 1276 1277 /* 1278 * Power Management 1279 * ---------------- 1280 */ 1281 if (device->flags.power_manageable) { 1282 result = acpi_bus_get_power_flags(device); 1283 if (result) 1284 goto end; 1285 } 1286 1287 /* 1288 * Wakeup device management 1289 *----------------------- 1290 */ 1291 if (device->flags.wake_capable) { 1292 result = acpi_bus_get_wakeup_device_flags(device); 1293 if (result) 1294 goto end; 1295 } 1296 1297 /* 1298 * Performance Management 1299 * ---------------------- 1300 */ 1301 if (device->flags.performance_manageable) { 1302 result = acpi_bus_get_perf_flags(device); 1303 if (result) 1304 goto end; 1305 } 1306 1307 1308 result = acpi_device_register(device, parent); 1309 1310 /* 1311 * Bind _ADR-Based Devices when hot add 1312 */ 1313 if (device->flags.bus_address) { 1314 if (device->parent && device->parent->ops.bind) 1315 device->parent->ops.bind(device); 1316 } 1317 1318 end: 1319 if (!result) 1320 *child = device; 1321 else { 1322 kfree(device->pnp.cid_list); 1323 kfree(device); 1324 } 1325 1326 return result; 1327 } 1328 1329 static int acpi_bus_scan(struct acpi_device *start, struct acpi_bus_ops *ops) 1330 { 1331 acpi_status status = AE_OK; 1332 struct acpi_device *parent = NULL; 1333 struct acpi_device *child = NULL; 1334 acpi_handle phandle = NULL; 1335 acpi_handle chandle = NULL; 1336 acpi_object_type type = 0; 1337 u32 level = 1; 1338 1339 1340 if (!start) 1341 return -EINVAL; 1342 1343 parent = start; 1344 phandle = start->handle; 1345 1346 /* 1347 * Parse through the ACPI namespace, identify all 'devices', and 1348 * create a new 'struct acpi_device' for each. 1349 */ 1350 while ((level > 0) && parent) { 1351 1352 status = acpi_get_next_object(ACPI_TYPE_ANY, phandle, 1353 chandle, &chandle); 1354 1355 /* 1356 * If this scope is exhausted then move our way back up. 1357 */ 1358 if (ACPI_FAILURE(status)) { 1359 level--; 1360 chandle = phandle; 1361 acpi_get_parent(phandle, &phandle); 1362 if (parent->parent) 1363 parent = parent->parent; 1364 continue; 1365 } 1366 1367 status = acpi_get_type(chandle, &type); 1368 if (ACPI_FAILURE(status)) 1369 continue; 1370 1371 /* 1372 * If this is a scope object then parse it (depth-first). 1373 */ 1374 if (type == ACPI_TYPE_LOCAL_SCOPE) { 1375 level++; 1376 phandle = chandle; 1377 chandle = NULL; 1378 continue; 1379 } 1380 1381 /* 1382 * We're only interested in objects that we consider 'devices'. 1383 */ 1384 switch (type) { 1385 case ACPI_TYPE_DEVICE: 1386 type = ACPI_BUS_TYPE_DEVICE; 1387 break; 1388 case ACPI_TYPE_PROCESSOR: 1389 type = ACPI_BUS_TYPE_PROCESSOR; 1390 break; 1391 case ACPI_TYPE_THERMAL: 1392 type = ACPI_BUS_TYPE_THERMAL; 1393 break; 1394 case ACPI_TYPE_POWER: 1395 type = ACPI_BUS_TYPE_POWER; 1396 break; 1397 default: 1398 continue; 1399 } 1400 1401 if (ops->acpi_op_add) 1402 status = acpi_add_single_object(&child, parent, 1403 chandle, type, ops); 1404 else 1405 status = acpi_bus_get_device(chandle, &child); 1406 1407 if (ACPI_FAILURE(status)) 1408 continue; 1409 1410 if (ops->acpi_op_start && !(ops->acpi_op_add)) { 1411 status = acpi_start_single_object(child); 1412 if (ACPI_FAILURE(status)) 1413 continue; 1414 } 1415 1416 /* 1417 * If the device is present, enabled, and functioning then 1418 * parse its scope (depth-first). Note that we need to 1419 * represent absent devices to facilitate PnP notifications 1420 * -- but only the subtree head (not all of its children, 1421 * which will be enumerated when the parent is inserted). 1422 * 1423 * TBD: Need notifications and other detection mechanisms 1424 * in place before we can fully implement this. 1425 */ 1426 /* 1427 * When the device is not present but functional, it is also 1428 * necessary to scan the children of this device. 1429 */ 1430 if (child->status.present || (!child->status.present && 1431 child->status.functional)) { 1432 status = acpi_get_next_object(ACPI_TYPE_ANY, chandle, 1433 NULL, NULL); 1434 if (ACPI_SUCCESS(status)) { 1435 level++; 1436 phandle = chandle; 1437 chandle = NULL; 1438 parent = child; 1439 } 1440 } 1441 } 1442 1443 return 0; 1444 } 1445 1446 int 1447 acpi_bus_add(struct acpi_device **child, 1448 struct acpi_device *parent, acpi_handle handle, int type) 1449 { 1450 int result; 1451 struct acpi_bus_ops ops; 1452 1453 memset(&ops, 0, sizeof(ops)); 1454 ops.acpi_op_add = 1; 1455 1456 result = acpi_add_single_object(child, parent, handle, type, &ops); 1457 if (!result) 1458 result = acpi_bus_scan(*child, &ops); 1459 1460 return result; 1461 } 1462 EXPORT_SYMBOL(acpi_bus_add); 1463 1464 int acpi_bus_start(struct acpi_device *device) 1465 { 1466 int result; 1467 struct acpi_bus_ops ops; 1468 1469 1470 if (!device) 1471 return -EINVAL; 1472 1473 result = acpi_start_single_object(device); 1474 if (!result) { 1475 memset(&ops, 0, sizeof(ops)); 1476 ops.acpi_op_start = 1; 1477 result = acpi_bus_scan(device, &ops); 1478 } 1479 return result; 1480 } 1481 EXPORT_SYMBOL(acpi_bus_start); 1482 1483 int acpi_bus_trim(struct acpi_device *start, int rmdevice) 1484 { 1485 acpi_status status; 1486 struct acpi_device *parent, *child; 1487 acpi_handle phandle, chandle; 1488 acpi_object_type type; 1489 u32 level = 1; 1490 int err = 0; 1491 1492 parent = start; 1493 phandle = start->handle; 1494 child = chandle = NULL; 1495 1496 while ((level > 0) && parent && (!err)) { 1497 status = acpi_get_next_object(ACPI_TYPE_ANY, phandle, 1498 chandle, &chandle); 1499 1500 /* 1501 * If this scope is exhausted then move our way back up. 1502 */ 1503 if (ACPI_FAILURE(status)) { 1504 level--; 1505 chandle = phandle; 1506 acpi_get_parent(phandle, &phandle); 1507 child = parent; 1508 parent = parent->parent; 1509 1510 if (level == 0) 1511 err = acpi_bus_remove(child, rmdevice); 1512 else 1513 err = acpi_bus_remove(child, 1); 1514 1515 continue; 1516 } 1517 1518 status = acpi_get_type(chandle, &type); 1519 if (ACPI_FAILURE(status)) { 1520 continue; 1521 } 1522 /* 1523 * If there is a device corresponding to chandle then 1524 * parse it (depth-first). 1525 */ 1526 if (acpi_bus_get_device(chandle, &child) == 0) { 1527 level++; 1528 phandle = chandle; 1529 chandle = NULL; 1530 parent = child; 1531 } 1532 continue; 1533 } 1534 return err; 1535 } 1536 EXPORT_SYMBOL_GPL(acpi_bus_trim); 1537 1538 static int acpi_bus_scan_fixed(struct acpi_device *root) 1539 { 1540 int result = 0; 1541 struct acpi_device *device = NULL; 1542 struct acpi_bus_ops ops; 1543 1544 if (!root) 1545 return -ENODEV; 1546 1547 memset(&ops, 0, sizeof(ops)); 1548 ops.acpi_op_add = 1; 1549 ops.acpi_op_start = 1; 1550 1551 /* 1552 * Enumerate all fixed-feature devices. 1553 */ 1554 if ((acpi_gbl_FADT.flags & ACPI_FADT_POWER_BUTTON) == 0) { 1555 result = acpi_add_single_object(&device, acpi_root, 1556 NULL, 1557 ACPI_BUS_TYPE_POWER_BUTTON, 1558 &ops); 1559 } 1560 1561 if ((acpi_gbl_FADT.flags & ACPI_FADT_SLEEP_BUTTON) == 0) { 1562 result = acpi_add_single_object(&device, acpi_root, 1563 NULL, 1564 ACPI_BUS_TYPE_SLEEP_BUTTON, 1565 &ops); 1566 } 1567 1568 return result; 1569 } 1570 1571 int __init acpi_scan_init(void) 1572 { 1573 int result; 1574 struct acpi_bus_ops ops; 1575 1576 memset(&ops, 0, sizeof(ops)); 1577 ops.acpi_op_add = 1; 1578 ops.acpi_op_start = 1; 1579 1580 result = bus_register(&acpi_bus_type); 1581 if (result) { 1582 /* We don't want to quit even if we failed to add suspend/resume */ 1583 printk(KERN_ERR PREFIX "Could not register bus type\n"); 1584 } 1585 1586 /* 1587 * Create the root device in the bus's device tree 1588 */ 1589 result = acpi_add_single_object(&acpi_root, NULL, ACPI_ROOT_OBJECT, 1590 ACPI_BUS_TYPE_SYSTEM, &ops); 1591 if (result) 1592 goto Done; 1593 1594 /* 1595 * Enumerate devices in the ACPI namespace. 1596 */ 1597 result = acpi_bus_scan_fixed(acpi_root); 1598 1599 if (!result) 1600 result = acpi_bus_scan(acpi_root, &ops); 1601 1602 if (result) 1603 acpi_device_unregister(acpi_root, ACPI_BUS_REMOVAL_NORMAL); 1604 1605 Done: 1606 return result; 1607 } 1608