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