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