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