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