linux/drivers/acpi/power.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * drivers/acpi/power.c - ACPI Power Resources management.
   4 *
   5 * Copyright (C) 2001 - 2015 Intel Corp.
   6 * Author: Andy Grover <andrew.grover@intel.com>
   7 * Author: Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
   8 * Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
   9 */
  10
  11/*
  12 * ACPI power-managed devices may be controlled in two ways:
  13 * 1. via "Device Specific (D-State) Control"
  14 * 2. via "Power Resource Control".
  15 * The code below deals with ACPI Power Resources control.
  16 * 
  17 * An ACPI "power resource object" represents a software controllable power
  18 * plane, clock plane, or other resource depended on by a device.
  19 *
  20 * A device may rely on multiple power resources, and a power resource
  21 * may be shared by multiple devices.
  22 */
  23
  24#include <linux/kernel.h>
  25#include <linux/module.h>
  26#include <linux/init.h>
  27#include <linux/types.h>
  28#include <linux/slab.h>
  29#include <linux/pm_runtime.h>
  30#include <linux/sysfs.h>
  31#include <linux/acpi.h>
  32#include "sleep.h"
  33#include "internal.h"
  34
  35#define _COMPONENT                      ACPI_POWER_COMPONENT
  36ACPI_MODULE_NAME("power");
  37#define ACPI_POWER_CLASS                "power_resource"
  38#define ACPI_POWER_DEVICE_NAME          "Power Resource"
  39#define ACPI_POWER_FILE_INFO            "info"
  40#define ACPI_POWER_FILE_STATUS          "state"
  41#define ACPI_POWER_RESOURCE_STATE_OFF   0x00
  42#define ACPI_POWER_RESOURCE_STATE_ON    0x01
  43#define ACPI_POWER_RESOURCE_STATE_UNKNOWN 0xFF
  44
  45struct acpi_power_dependent_device {
  46        struct device *dev;
  47        struct list_head node;
  48};
  49
  50struct acpi_power_resource {
  51        struct acpi_device device;
  52        struct list_head list_node;
  53        char *name;
  54        u32 system_level;
  55        u32 order;
  56        unsigned int ref_count;
  57        bool wakeup_enabled;
  58        struct mutex resource_lock;
  59        struct list_head dependents;
  60};
  61
  62struct acpi_power_resource_entry {
  63        struct list_head node;
  64        struct acpi_power_resource *resource;
  65};
  66
  67static LIST_HEAD(acpi_power_resource_list);
  68static DEFINE_MUTEX(power_resource_list_lock);
  69
  70/* --------------------------------------------------------------------------
  71                             Power Resource Management
  72   -------------------------------------------------------------------------- */
  73
  74static inline
  75struct acpi_power_resource *to_power_resource(struct acpi_device *device)
  76{
  77        return container_of(device, struct acpi_power_resource, device);
  78}
  79
  80static struct acpi_power_resource *acpi_power_get_context(acpi_handle handle)
  81{
  82        struct acpi_device *device;
  83
  84        if (acpi_bus_get_device(handle, &device))
  85                return NULL;
  86
  87        return to_power_resource(device);
  88}
  89
  90static int acpi_power_resources_list_add(acpi_handle handle,
  91                                         struct list_head *list)
  92{
  93        struct acpi_power_resource *resource = acpi_power_get_context(handle);
  94        struct acpi_power_resource_entry *entry;
  95
  96        if (!resource || !list)
  97                return -EINVAL;
  98
  99        entry = kzalloc(sizeof(*entry), GFP_KERNEL);
 100        if (!entry)
 101                return -ENOMEM;
 102
 103        entry->resource = resource;
 104        if (!list_empty(list)) {
 105                struct acpi_power_resource_entry *e;
 106
 107                list_for_each_entry(e, list, node)
 108                        if (e->resource->order > resource->order) {
 109                                list_add_tail(&entry->node, &e->node);
 110                                return 0;
 111                        }
 112        }
 113        list_add_tail(&entry->node, list);
 114        return 0;
 115}
 116
 117void acpi_power_resources_list_free(struct list_head *list)
 118{
 119        struct acpi_power_resource_entry *entry, *e;
 120
 121        list_for_each_entry_safe(entry, e, list, node) {
 122                list_del(&entry->node);
 123                kfree(entry);
 124        }
 125}
 126
 127static bool acpi_power_resource_is_dup(union acpi_object *package,
 128                                       unsigned int start, unsigned int i)
 129{
 130        acpi_handle rhandle, dup;
 131        unsigned int j;
 132
 133        /* The caller is expected to check the package element types */
 134        rhandle = package->package.elements[i].reference.handle;
 135        for (j = start; j < i; j++) {
 136                dup = package->package.elements[j].reference.handle;
 137                if (dup == rhandle)
 138                        return true;
 139        }
 140
 141        return false;
 142}
 143
 144int acpi_extract_power_resources(union acpi_object *package, unsigned int start,
 145                                 struct list_head *list)
 146{
 147        unsigned int i;
 148        int err = 0;
 149
 150        for (i = start; i < package->package.count; i++) {
 151                union acpi_object *element = &package->package.elements[i];
 152                acpi_handle rhandle;
 153
 154                if (element->type != ACPI_TYPE_LOCAL_REFERENCE) {
 155                        err = -ENODATA;
 156                        break;
 157                }
 158                rhandle = element->reference.handle;
 159                if (!rhandle) {
 160                        err = -ENODEV;
 161                        break;
 162                }
 163
 164                /* Some ACPI tables contain duplicate power resource references */
 165                if (acpi_power_resource_is_dup(package, start, i))
 166                        continue;
 167
 168                err = acpi_add_power_resource(rhandle);
 169                if (err)
 170                        break;
 171
 172                err = acpi_power_resources_list_add(rhandle, list);
 173                if (err)
 174                        break;
 175        }
 176        if (err)
 177                acpi_power_resources_list_free(list);
 178
 179        return err;
 180}
 181
 182static int acpi_power_get_state(acpi_handle handle, int *state)
 183{
 184        acpi_status status = AE_OK;
 185        unsigned long long sta = 0;
 186        char node_name[5];
 187        struct acpi_buffer buffer = { sizeof(node_name), node_name };
 188
 189
 190        if (!handle || !state)
 191                return -EINVAL;
 192
 193        status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
 194        if (ACPI_FAILURE(status))
 195                return -ENODEV;
 196
 197        *state = (sta & 0x01)?ACPI_POWER_RESOURCE_STATE_ON:
 198                              ACPI_POWER_RESOURCE_STATE_OFF;
 199
 200        acpi_get_name(handle, ACPI_SINGLE_NAME, &buffer);
 201
 202        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource [%s] is %s\n",
 203                          node_name,
 204                                *state ? "on" : "off"));
 205
 206        return 0;
 207}
 208
 209static int acpi_power_get_list_state(struct list_head *list, int *state)
 210{
 211        struct acpi_power_resource_entry *entry;
 212        int cur_state;
 213
 214        if (!list || !state)
 215                return -EINVAL;
 216
 217        /* The state of the list is 'on' IFF all resources are 'on'. */
 218        cur_state = 0;
 219        list_for_each_entry(entry, list, node) {
 220                struct acpi_power_resource *resource = entry->resource;
 221                acpi_handle handle = resource->device.handle;
 222                int result;
 223
 224                mutex_lock(&resource->resource_lock);
 225                result = acpi_power_get_state(handle, &cur_state);
 226                mutex_unlock(&resource->resource_lock);
 227                if (result)
 228                        return result;
 229
 230                if (cur_state != ACPI_POWER_RESOURCE_STATE_ON)
 231                        break;
 232        }
 233
 234        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource list is %s\n",
 235                          cur_state ? "on" : "off"));
 236
 237        *state = cur_state;
 238        return 0;
 239}
 240
 241static int
 242acpi_power_resource_add_dependent(struct acpi_power_resource *resource,
 243                                  struct device *dev)
 244{
 245        struct acpi_power_dependent_device *dep;
 246        int ret = 0;
 247
 248        mutex_lock(&resource->resource_lock);
 249        list_for_each_entry(dep, &resource->dependents, node) {
 250                /* Only add it once */
 251                if (dep->dev == dev)
 252                        goto unlock;
 253        }
 254
 255        dep = kzalloc(sizeof(*dep), GFP_KERNEL);
 256        if (!dep) {
 257                ret = -ENOMEM;
 258                goto unlock;
 259        }
 260
 261        dep->dev = dev;
 262        list_add_tail(&dep->node, &resource->dependents);
 263        dev_dbg(dev, "added power dependency to [%s]\n", resource->name);
 264
 265unlock:
 266        mutex_unlock(&resource->resource_lock);
 267        return ret;
 268}
 269
 270static void
 271acpi_power_resource_remove_dependent(struct acpi_power_resource *resource,
 272                                     struct device *dev)
 273{
 274        struct acpi_power_dependent_device *dep;
 275
 276        mutex_lock(&resource->resource_lock);
 277        list_for_each_entry(dep, &resource->dependents, node) {
 278                if (dep->dev == dev) {
 279                        list_del(&dep->node);
 280                        kfree(dep);
 281                        dev_dbg(dev, "removed power dependency to [%s]\n",
 282                                resource->name);
 283                        break;
 284                }
 285        }
 286        mutex_unlock(&resource->resource_lock);
 287}
 288
 289/**
 290 * acpi_device_power_add_dependent - Add dependent device of this ACPI device
 291 * @adev: ACPI device pointer
 292 * @dev: Dependent device
 293 *
 294 * If @adev has non-empty _PR0 the @dev is added as dependent device to all
 295 * power resources returned by it. This means that whenever these power
 296 * resources are turned _ON the dependent devices get runtime resumed. This
 297 * is needed for devices such as PCI to allow its driver to re-initialize
 298 * it after it went to D0uninitialized.
 299 *
 300 * If @adev does not have _PR0 this does nothing.
 301 *
 302 * Returns %0 in case of success and negative errno otherwise.
 303 */
 304int acpi_device_power_add_dependent(struct acpi_device *adev,
 305                                    struct device *dev)
 306{
 307        struct acpi_power_resource_entry *entry;
 308        struct list_head *resources;
 309        int ret;
 310
 311        if (!adev->flags.power_manageable)
 312                return 0;
 313
 314        resources = &adev->power.states[ACPI_STATE_D0].resources;
 315        list_for_each_entry(entry, resources, node) {
 316                ret = acpi_power_resource_add_dependent(entry->resource, dev);
 317                if (ret)
 318                        goto err;
 319        }
 320
 321        return 0;
 322
 323err:
 324        list_for_each_entry(entry, resources, node)
 325                acpi_power_resource_remove_dependent(entry->resource, dev);
 326
 327        return ret;
 328}
 329
 330/**
 331 * acpi_device_power_remove_dependent - Remove dependent device
 332 * @adev: ACPI device pointer
 333 * @dev: Dependent device
 334 *
 335 * Does the opposite of acpi_device_power_add_dependent() and removes the
 336 * dependent device if it is found. Can be called to @adev that does not
 337 * have _PR0 as well.
 338 */
 339void acpi_device_power_remove_dependent(struct acpi_device *adev,
 340                                        struct device *dev)
 341{
 342        struct acpi_power_resource_entry *entry;
 343        struct list_head *resources;
 344
 345        if (!adev->flags.power_manageable)
 346                return;
 347
 348        resources = &adev->power.states[ACPI_STATE_D0].resources;
 349        list_for_each_entry_reverse(entry, resources, node)
 350                acpi_power_resource_remove_dependent(entry->resource, dev);
 351}
 352
 353static int __acpi_power_on(struct acpi_power_resource *resource)
 354{
 355        struct acpi_power_dependent_device *dep;
 356        acpi_status status = AE_OK;
 357
 358        status = acpi_evaluate_object(resource->device.handle, "_ON", NULL, NULL);
 359        if (ACPI_FAILURE(status))
 360                return -ENODEV;
 361
 362        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Power resource [%s] turned on\n",
 363                          resource->name));
 364
 365        /*
 366         * If there are other dependents on this power resource we need to
 367         * resume them now so that their drivers can re-initialize the
 368         * hardware properly after it went back to D0.
 369         */
 370        if (list_empty(&resource->dependents) ||
 371            list_is_singular(&resource->dependents))
 372                return 0;
 373
 374        list_for_each_entry(dep, &resource->dependents, node) {
 375                dev_dbg(dep->dev, "runtime resuming because [%s] turned on\n",
 376                        resource->name);
 377                pm_request_resume(dep->dev);
 378        }
 379
 380        return 0;
 381}
 382
 383static int acpi_power_on_unlocked(struct acpi_power_resource *resource)
 384{
 385        int result = 0;
 386
 387        if (resource->ref_count++) {
 388                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 389                                  "Power resource [%s] already on\n",
 390                                  resource->name));
 391        } else {
 392                result = __acpi_power_on(resource);
 393                if (result)
 394                        resource->ref_count--;
 395        }
 396        return result;
 397}
 398
 399static int acpi_power_on(struct acpi_power_resource *resource)
 400{
 401        int result;
 402
 403        mutex_lock(&resource->resource_lock);
 404        result = acpi_power_on_unlocked(resource);
 405        mutex_unlock(&resource->resource_lock);
 406        return result;
 407}
 408
 409static int __acpi_power_off(struct acpi_power_resource *resource)
 410{
 411        acpi_status status;
 412
 413        status = acpi_evaluate_object(resource->device.handle, "_OFF",
 414                                      NULL, NULL);
 415        if (ACPI_FAILURE(status))
 416                return -ENODEV;
 417
 418        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Power resource [%s] turned off\n",
 419                          resource->name));
 420        return 0;
 421}
 422
 423static int acpi_power_off_unlocked(struct acpi_power_resource *resource)
 424{
 425        int result = 0;
 426
 427        if (!resource->ref_count) {
 428                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 429                                  "Power resource [%s] already off\n",
 430                                  resource->name));
 431                return 0;
 432        }
 433
 434        if (--resource->ref_count) {
 435                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 436                                  "Power resource [%s] still in use\n",
 437                                  resource->name));
 438        } else {
 439                result = __acpi_power_off(resource);
 440                if (result)
 441                        resource->ref_count++;
 442        }
 443        return result;
 444}
 445
 446static int acpi_power_off(struct acpi_power_resource *resource)
 447{
 448        int result;
 449
 450        mutex_lock(&resource->resource_lock);
 451        result = acpi_power_off_unlocked(resource);
 452        mutex_unlock(&resource->resource_lock);
 453        return result;
 454}
 455
 456static int acpi_power_off_list(struct list_head *list)
 457{
 458        struct acpi_power_resource_entry *entry;
 459        int result = 0;
 460
 461        list_for_each_entry_reverse(entry, list, node) {
 462                result = acpi_power_off(entry->resource);
 463                if (result)
 464                        goto err;
 465        }
 466        return 0;
 467
 468 err:
 469        list_for_each_entry_continue(entry, list, node)
 470                acpi_power_on(entry->resource);
 471
 472        return result;
 473}
 474
 475static int acpi_power_on_list(struct list_head *list)
 476{
 477        struct acpi_power_resource_entry *entry;
 478        int result = 0;
 479
 480        list_for_each_entry(entry, list, node) {
 481                result = acpi_power_on(entry->resource);
 482                if (result)
 483                        goto err;
 484        }
 485        return 0;
 486
 487 err:
 488        list_for_each_entry_continue_reverse(entry, list, node)
 489                acpi_power_off(entry->resource);
 490
 491        return result;
 492}
 493
 494static struct attribute *attrs[] = {
 495        NULL,
 496};
 497
 498static const struct attribute_group attr_groups[] = {
 499        [ACPI_STATE_D0] = {
 500                .name = "power_resources_D0",
 501                .attrs = attrs,
 502        },
 503        [ACPI_STATE_D1] = {
 504                .name = "power_resources_D1",
 505                .attrs = attrs,
 506        },
 507        [ACPI_STATE_D2] = {
 508                .name = "power_resources_D2",
 509                .attrs = attrs,
 510        },
 511        [ACPI_STATE_D3_HOT] = {
 512                .name = "power_resources_D3hot",
 513                .attrs = attrs,
 514        },
 515};
 516
 517static const struct attribute_group wakeup_attr_group = {
 518        .name = "power_resources_wakeup",
 519        .attrs = attrs,
 520};
 521
 522static void acpi_power_hide_list(struct acpi_device *adev,
 523                                 struct list_head *resources,
 524                                 const struct attribute_group *attr_group)
 525{
 526        struct acpi_power_resource_entry *entry;
 527
 528        if (list_empty(resources))
 529                return;
 530
 531        list_for_each_entry_reverse(entry, resources, node) {
 532                struct acpi_device *res_dev = &entry->resource->device;
 533
 534                sysfs_remove_link_from_group(&adev->dev.kobj,
 535                                             attr_group->name,
 536                                             dev_name(&res_dev->dev));
 537        }
 538        sysfs_remove_group(&adev->dev.kobj, attr_group);
 539}
 540
 541static void acpi_power_expose_list(struct acpi_device *adev,
 542                                   struct list_head *resources,
 543                                   const struct attribute_group *attr_group)
 544{
 545        struct acpi_power_resource_entry *entry;
 546        int ret;
 547
 548        if (list_empty(resources))
 549                return;
 550
 551        ret = sysfs_create_group(&adev->dev.kobj, attr_group);
 552        if (ret)
 553                return;
 554
 555        list_for_each_entry(entry, resources, node) {
 556                struct acpi_device *res_dev = &entry->resource->device;
 557
 558                ret = sysfs_add_link_to_group(&adev->dev.kobj,
 559                                              attr_group->name,
 560                                              &res_dev->dev.kobj,
 561                                              dev_name(&res_dev->dev));
 562                if (ret) {
 563                        acpi_power_hide_list(adev, resources, attr_group);
 564                        break;
 565                }
 566        }
 567}
 568
 569static void acpi_power_expose_hide(struct acpi_device *adev,
 570                                   struct list_head *resources,
 571                                   const struct attribute_group *attr_group,
 572                                   bool expose)
 573{
 574        if (expose)
 575                acpi_power_expose_list(adev, resources, attr_group);
 576        else
 577                acpi_power_hide_list(adev, resources, attr_group);
 578}
 579
 580void acpi_power_add_remove_device(struct acpi_device *adev, bool add)
 581{
 582        int state;
 583
 584        if (adev->wakeup.flags.valid)
 585                acpi_power_expose_hide(adev, &adev->wakeup.resources,
 586                                       &wakeup_attr_group, add);
 587
 588        if (!adev->power.flags.power_resources)
 589                return;
 590
 591        for (state = ACPI_STATE_D0; state <= ACPI_STATE_D3_HOT; state++)
 592                acpi_power_expose_hide(adev,
 593                                       &adev->power.states[state].resources,
 594                                       &attr_groups[state], add);
 595}
 596
 597int acpi_power_wakeup_list_init(struct list_head *list, int *system_level_p)
 598{
 599        struct acpi_power_resource_entry *entry;
 600        int system_level = 5;
 601
 602        list_for_each_entry(entry, list, node) {
 603                struct acpi_power_resource *resource = entry->resource;
 604                acpi_handle handle = resource->device.handle;
 605                int result;
 606                int state;
 607
 608                mutex_lock(&resource->resource_lock);
 609
 610                result = acpi_power_get_state(handle, &state);
 611                if (result) {
 612                        mutex_unlock(&resource->resource_lock);
 613                        return result;
 614                }
 615                if (state == ACPI_POWER_RESOURCE_STATE_ON) {
 616                        resource->ref_count++;
 617                        resource->wakeup_enabled = true;
 618                }
 619                if (system_level > resource->system_level)
 620                        system_level = resource->system_level;
 621
 622                mutex_unlock(&resource->resource_lock);
 623        }
 624        *system_level_p = system_level;
 625        return 0;
 626}
 627
 628/* --------------------------------------------------------------------------
 629                             Device Power Management
 630   -------------------------------------------------------------------------- */
 631
 632/**
 633 * acpi_device_sleep_wake - execute _DSW (Device Sleep Wake) or (deprecated in
 634 *                          ACPI 3.0) _PSW (Power State Wake)
 635 * @dev: Device to handle.
 636 * @enable: 0 - disable, 1 - enable the wake capabilities of the device.
 637 * @sleep_state: Target sleep state of the system.
 638 * @dev_state: Target power state of the device.
 639 *
 640 * Execute _DSW (Device Sleep Wake) or (deprecated in ACPI 3.0) _PSW (Power
 641 * State Wake) for the device, if present.  On failure reset the device's
 642 * wakeup.flags.valid flag.
 643 *
 644 * RETURN VALUE:
 645 * 0 if either _DSW or _PSW has been successfully executed
 646 * 0 if neither _DSW nor _PSW has been found
 647 * -ENODEV if the execution of either _DSW or _PSW has failed
 648 */
 649int acpi_device_sleep_wake(struct acpi_device *dev,
 650                           int enable, int sleep_state, int dev_state)
 651{
 652        union acpi_object in_arg[3];
 653        struct acpi_object_list arg_list = { 3, in_arg };
 654        acpi_status status = AE_OK;
 655
 656        /*
 657         * Try to execute _DSW first.
 658         *
 659         * Three arguments are needed for the _DSW object:
 660         * Argument 0: enable/disable the wake capabilities
 661         * Argument 1: target system state
 662         * Argument 2: target device state
 663         * When _DSW object is called to disable the wake capabilities, maybe
 664         * the first argument is filled. The values of the other two arguments
 665         * are meaningless.
 666         */
 667        in_arg[0].type = ACPI_TYPE_INTEGER;
 668        in_arg[0].integer.value = enable;
 669        in_arg[1].type = ACPI_TYPE_INTEGER;
 670        in_arg[1].integer.value = sleep_state;
 671        in_arg[2].type = ACPI_TYPE_INTEGER;
 672        in_arg[2].integer.value = dev_state;
 673        status = acpi_evaluate_object(dev->handle, "_DSW", &arg_list, NULL);
 674        if (ACPI_SUCCESS(status)) {
 675                return 0;
 676        } else if (status != AE_NOT_FOUND) {
 677                printk(KERN_ERR PREFIX "_DSW execution failed\n");
 678                dev->wakeup.flags.valid = 0;
 679                return -ENODEV;
 680        }
 681
 682        /* Execute _PSW */
 683        status = acpi_execute_simple_method(dev->handle, "_PSW", enable);
 684        if (ACPI_FAILURE(status) && (status != AE_NOT_FOUND)) {
 685                printk(KERN_ERR PREFIX "_PSW execution failed\n");
 686                dev->wakeup.flags.valid = 0;
 687                return -ENODEV;
 688        }
 689
 690        return 0;
 691}
 692
 693/*
 694 * Prepare a wakeup device, two steps (Ref ACPI 2.0:P229):
 695 * 1. Power on the power resources required for the wakeup device 
 696 * 2. Execute _DSW (Device Sleep Wake) or (deprecated in ACPI 3.0) _PSW (Power
 697 *    State Wake) for the device, if present
 698 */
 699int acpi_enable_wakeup_device_power(struct acpi_device *dev, int sleep_state)
 700{
 701        struct acpi_power_resource_entry *entry;
 702        int err = 0;
 703
 704        if (!dev || !dev->wakeup.flags.valid)
 705                return -EINVAL;
 706
 707        mutex_lock(&acpi_device_lock);
 708
 709        if (dev->wakeup.prepare_count++)
 710                goto out;
 711
 712        list_for_each_entry(entry, &dev->wakeup.resources, node) {
 713                struct acpi_power_resource *resource = entry->resource;
 714
 715                mutex_lock(&resource->resource_lock);
 716
 717                if (!resource->wakeup_enabled) {
 718                        err = acpi_power_on_unlocked(resource);
 719                        if (!err)
 720                                resource->wakeup_enabled = true;
 721                }
 722
 723                mutex_unlock(&resource->resource_lock);
 724
 725                if (err) {
 726                        dev_err(&dev->dev,
 727                                "Cannot turn wakeup power resources on\n");
 728                        dev->wakeup.flags.valid = 0;
 729                        goto out;
 730                }
 731        }
 732        /*
 733         * Passing 3 as the third argument below means the device may be
 734         * put into arbitrary power state afterward.
 735         */
 736        err = acpi_device_sleep_wake(dev, 1, sleep_state, 3);
 737        if (err)
 738                dev->wakeup.prepare_count = 0;
 739
 740 out:
 741        mutex_unlock(&acpi_device_lock);
 742        return err;
 743}
 744
 745/*
 746 * Shutdown a wakeup device, counterpart of above method
 747 * 1. Execute _DSW (Device Sleep Wake) or (deprecated in ACPI 3.0) _PSW (Power
 748 *    State Wake) for the device, if present
 749 * 2. Shutdown down the power resources
 750 */
 751int acpi_disable_wakeup_device_power(struct acpi_device *dev)
 752{
 753        struct acpi_power_resource_entry *entry;
 754        int err = 0;
 755
 756        if (!dev || !dev->wakeup.flags.valid)
 757                return -EINVAL;
 758
 759        mutex_lock(&acpi_device_lock);
 760
 761        if (--dev->wakeup.prepare_count > 0)
 762                goto out;
 763
 764        /*
 765         * Executing the code below even if prepare_count is already zero when
 766         * the function is called may be useful, for example for initialisation.
 767         */
 768        if (dev->wakeup.prepare_count < 0)
 769                dev->wakeup.prepare_count = 0;
 770
 771        err = acpi_device_sleep_wake(dev, 0, 0, 0);
 772        if (err)
 773                goto out;
 774
 775        list_for_each_entry(entry, &dev->wakeup.resources, node) {
 776                struct acpi_power_resource *resource = entry->resource;
 777
 778                mutex_lock(&resource->resource_lock);
 779
 780                if (resource->wakeup_enabled) {
 781                        err = acpi_power_off_unlocked(resource);
 782                        if (!err)
 783                                resource->wakeup_enabled = false;
 784                }
 785
 786                mutex_unlock(&resource->resource_lock);
 787
 788                if (err) {
 789                        dev_err(&dev->dev,
 790                                "Cannot turn wakeup power resources off\n");
 791                        dev->wakeup.flags.valid = 0;
 792                        break;
 793                }
 794        }
 795
 796 out:
 797        mutex_unlock(&acpi_device_lock);
 798        return err;
 799}
 800
 801int acpi_power_get_inferred_state(struct acpi_device *device, int *state)
 802{
 803        int result = 0;
 804        int list_state = 0;
 805        int i = 0;
 806
 807        if (!device || !state)
 808                return -EINVAL;
 809
 810        /*
 811         * We know a device's inferred power state when all the resources
 812         * required for a given D-state are 'on'.
 813         */
 814        for (i = ACPI_STATE_D0; i <= ACPI_STATE_D3_HOT; i++) {
 815                struct list_head *list = &device->power.states[i].resources;
 816
 817                if (list_empty(list))
 818                        continue;
 819
 820                result = acpi_power_get_list_state(list, &list_state);
 821                if (result)
 822                        return result;
 823
 824                if (list_state == ACPI_POWER_RESOURCE_STATE_ON) {
 825                        *state = i;
 826                        return 0;
 827                }
 828        }
 829
 830        *state = device->power.states[ACPI_STATE_D3_COLD].flags.valid ?
 831                ACPI_STATE_D3_COLD : ACPI_STATE_D3_HOT;
 832        return 0;
 833}
 834
 835int acpi_power_on_resources(struct acpi_device *device, int state)
 836{
 837        if (!device || state < ACPI_STATE_D0 || state > ACPI_STATE_D3_HOT)
 838                return -EINVAL;
 839
 840        return acpi_power_on_list(&device->power.states[state].resources);
 841}
 842
 843int acpi_power_transition(struct acpi_device *device, int state)
 844{
 845        int result = 0;
 846
 847        if (!device || (state < ACPI_STATE_D0) || (state > ACPI_STATE_D3_COLD))
 848                return -EINVAL;
 849
 850        if (device->power.state == state || !device->flags.power_manageable)
 851                return 0;
 852
 853        if ((device->power.state < ACPI_STATE_D0)
 854            || (device->power.state > ACPI_STATE_D3_COLD))
 855                return -ENODEV;
 856
 857        /*
 858         * First we reference all power resources required in the target list
 859         * (e.g. so the device doesn't lose power while transitioning).  Then,
 860         * we dereference all power resources used in the current list.
 861         */
 862        if (state < ACPI_STATE_D3_COLD)
 863                result = acpi_power_on_list(
 864                        &device->power.states[state].resources);
 865
 866        if (!result && device->power.state < ACPI_STATE_D3_COLD)
 867                acpi_power_off_list(
 868                        &device->power.states[device->power.state].resources);
 869
 870        /* We shouldn't change the state unless the above operations succeed. */
 871        device->power.state = result ? ACPI_STATE_UNKNOWN : state;
 872
 873        return result;
 874}
 875
 876static void acpi_release_power_resource(struct device *dev)
 877{
 878        struct acpi_device *device = to_acpi_device(dev);
 879        struct acpi_power_resource *resource;
 880
 881        resource = container_of(device, struct acpi_power_resource, device);
 882
 883        mutex_lock(&power_resource_list_lock);
 884        list_del(&resource->list_node);
 885        mutex_unlock(&power_resource_list_lock);
 886
 887        acpi_free_pnp_ids(&device->pnp);
 888        kfree(resource);
 889}
 890
 891static ssize_t acpi_power_in_use_show(struct device *dev,
 892                                      struct device_attribute *attr,
 893                                      char *buf) {
 894        struct acpi_power_resource *resource;
 895
 896        resource = to_power_resource(to_acpi_device(dev));
 897        return sprintf(buf, "%u\n", !!resource->ref_count);
 898}
 899static DEVICE_ATTR(resource_in_use, 0444, acpi_power_in_use_show, NULL);
 900
 901static void acpi_power_sysfs_remove(struct acpi_device *device)
 902{
 903        device_remove_file(&device->dev, &dev_attr_resource_in_use);
 904}
 905
 906static void acpi_power_add_resource_to_list(struct acpi_power_resource *resource)
 907{
 908        mutex_lock(&power_resource_list_lock);
 909
 910        if (!list_empty(&acpi_power_resource_list)) {
 911                struct acpi_power_resource *r;
 912
 913                list_for_each_entry(r, &acpi_power_resource_list, list_node)
 914                        if (r->order > resource->order) {
 915                                list_add_tail(&resource->list_node, &r->list_node);
 916                                goto out;
 917                        }
 918        }
 919        list_add_tail(&resource->list_node, &acpi_power_resource_list);
 920
 921 out:
 922        mutex_unlock(&power_resource_list_lock);
 923}
 924
 925int acpi_add_power_resource(acpi_handle handle)
 926{
 927        struct acpi_power_resource *resource;
 928        struct acpi_device *device = NULL;
 929        union acpi_object acpi_object;
 930        struct acpi_buffer buffer = { sizeof(acpi_object), &acpi_object };
 931        acpi_status status;
 932        int state, result = -ENODEV;
 933
 934        acpi_bus_get_device(handle, &device);
 935        if (device)
 936                return 0;
 937
 938        resource = kzalloc(sizeof(*resource), GFP_KERNEL);
 939        if (!resource)
 940                return -ENOMEM;
 941
 942        device = &resource->device;
 943        acpi_init_device_object(device, handle, ACPI_BUS_TYPE_POWER,
 944                                ACPI_STA_DEFAULT);
 945        mutex_init(&resource->resource_lock);
 946        INIT_LIST_HEAD(&resource->list_node);
 947        INIT_LIST_HEAD(&resource->dependents);
 948        resource->name = device->pnp.bus_id;
 949        strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME);
 950        strcpy(acpi_device_class(device), ACPI_POWER_CLASS);
 951        device->power.state = ACPI_STATE_UNKNOWN;
 952
 953        /* Evalute the object to get the system level and resource order. */
 954        status = acpi_evaluate_object(handle, NULL, NULL, &buffer);
 955        if (ACPI_FAILURE(status))
 956                goto err;
 957
 958        resource->system_level = acpi_object.power_resource.system_level;
 959        resource->order = acpi_object.power_resource.resource_order;
 960
 961        result = acpi_power_get_state(handle, &state);
 962        if (result)
 963                goto err;
 964
 965        printk(KERN_INFO PREFIX "%s [%s] (%s)\n", acpi_device_name(device),
 966               acpi_device_bid(device), state ? "on" : "off");
 967
 968        device->flags.match_driver = true;
 969        result = acpi_device_add(device, acpi_release_power_resource);
 970        if (result)
 971                goto err;
 972
 973        if (!device_create_file(&device->dev, &dev_attr_resource_in_use))
 974                device->remove = acpi_power_sysfs_remove;
 975
 976        acpi_power_add_resource_to_list(resource);
 977        acpi_device_add_finalize(device);
 978        return 0;
 979
 980 err:
 981        acpi_release_power_resource(&device->dev);
 982        return result;
 983}
 984
 985#ifdef CONFIG_ACPI_SLEEP
 986void acpi_resume_power_resources(void)
 987{
 988        struct acpi_power_resource *resource;
 989
 990        mutex_lock(&power_resource_list_lock);
 991
 992        list_for_each_entry(resource, &acpi_power_resource_list, list_node) {
 993                int result, state;
 994
 995                mutex_lock(&resource->resource_lock);
 996
 997                result = acpi_power_get_state(resource->device.handle, &state);
 998                if (result) {
 999                        mutex_unlock(&resource->resource_lock);
1000                        continue;
1001                }
1002
1003                if (state == ACPI_POWER_RESOURCE_STATE_OFF
1004                    && resource->ref_count) {
1005                        dev_info(&resource->device.dev, "Turning ON\n");
1006                        __acpi_power_on(resource);
1007                }
1008
1009                mutex_unlock(&resource->resource_lock);
1010        }
1011
1012        mutex_unlock(&power_resource_list_lock);
1013}
1014
1015void acpi_turn_off_unused_power_resources(void)
1016{
1017        struct acpi_power_resource *resource;
1018
1019        mutex_lock(&power_resource_list_lock);
1020
1021        list_for_each_entry_reverse(resource, &acpi_power_resource_list, list_node) {
1022                int result, state;
1023
1024                mutex_lock(&resource->resource_lock);
1025
1026                result = acpi_power_get_state(resource->device.handle, &state);
1027                if (result) {
1028                        mutex_unlock(&resource->resource_lock);
1029                        continue;
1030                }
1031
1032                if (state == ACPI_POWER_RESOURCE_STATE_ON
1033                    && !resource->ref_count) {
1034                        dev_info(&resource->device.dev, "Turning OFF\n");
1035                        __acpi_power_off(resource);
1036                }
1037
1038                mutex_unlock(&resource->resource_lock);
1039        }
1040
1041        mutex_unlock(&power_resource_list_lock);
1042}
1043#endif
1044