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