linux/drivers/acpi/device_pm.c
<<
>>
Prefs
   1/*
   2 * drivers/acpi/device_pm.c - ACPI device power management routines.
   3 *
   4 * Copyright (C) 2012, Intel Corp.
   5 * Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
   6 *
   7 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   8 *
   9 *  This program is free software; you can redistribute it and/or modify
  10 *  it under the terms of the GNU General Public License version 2 as published
  11 *  by the Free Software Foundation.
  12 *
  13 *  This program is distributed in the hope that it will be useful, but
  14 *  WITHOUT ANY WARRANTY; without even the implied warranty of
  15 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16 *  General Public License for more details.
  17 *
  18 *  You should have received a copy of the GNU General Public License along
  19 *  with this program; if not, write to the Free Software Foundation, Inc.,
  20 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  21 *
  22 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  23 */
  24
  25#include <linux/device.h>
  26#include <linux/export.h>
  27#include <linux/mutex.h>
  28#include <linux/pm_qos.h>
  29#include <linux/pm_runtime.h>
  30
  31#include <acpi/acpi.h>
  32#include <acpi/acpi_bus.h>
  33
  34static DEFINE_MUTEX(acpi_pm_notifier_lock);
  35
  36/**
  37 * acpi_add_pm_notifier - Register PM notifier for given ACPI device.
  38 * @adev: ACPI device to add the notifier for.
  39 * @context: Context information to pass to the notifier routine.
  40 *
  41 * NOTE: @adev need not be a run-wake or wakeup device to be a valid source of
  42 * PM wakeup events.  For example, wakeup events may be generated for bridges
  43 * if one of the devices below the bridge is signaling wakeup, even if the
  44 * bridge itself doesn't have a wakeup GPE associated with it.
  45 */
  46acpi_status acpi_add_pm_notifier(struct acpi_device *adev,
  47                                 acpi_notify_handler handler, void *context)
  48{
  49        acpi_status status = AE_ALREADY_EXISTS;
  50
  51        mutex_lock(&acpi_pm_notifier_lock);
  52
  53        if (adev->wakeup.flags.notifier_present)
  54                goto out;
  55
  56        status = acpi_install_notify_handler(adev->handle,
  57                                             ACPI_SYSTEM_NOTIFY,
  58                                             handler, context);
  59        if (ACPI_FAILURE(status))
  60                goto out;
  61
  62        adev->wakeup.flags.notifier_present = true;
  63
  64 out:
  65        mutex_unlock(&acpi_pm_notifier_lock);
  66        return status;
  67}
  68
  69/**
  70 * acpi_remove_pm_notifier - Unregister PM notifier from given ACPI device.
  71 * @adev: ACPI device to remove the notifier from.
  72 */
  73acpi_status acpi_remove_pm_notifier(struct acpi_device *adev,
  74                                    acpi_notify_handler handler)
  75{
  76        acpi_status status = AE_BAD_PARAMETER;
  77
  78        mutex_lock(&acpi_pm_notifier_lock);
  79
  80        if (!adev->wakeup.flags.notifier_present)
  81                goto out;
  82
  83        status = acpi_remove_notify_handler(adev->handle,
  84                                            ACPI_SYSTEM_NOTIFY,
  85                                            handler);
  86        if (ACPI_FAILURE(status))
  87                goto out;
  88
  89        adev->wakeup.flags.notifier_present = false;
  90
  91 out:
  92        mutex_unlock(&acpi_pm_notifier_lock);
  93        return status;
  94}
  95
  96/**
  97 * acpi_device_power_state - Get preferred power state of ACPI device.
  98 * @dev: Device whose preferred target power state to return.
  99 * @adev: ACPI device node corresponding to @dev.
 100 * @target_state: System state to match the resultant device state.
 101 * @d_max_in: Deepest low-power state to take into consideration.
 102 * @d_min_p: Location to store the upper limit of the allowed states range.
 103 * Return value: Preferred power state of the device on success, -ENODEV
 104 * (if there's no 'struct acpi_device' for @dev) or -EINVAL on failure
 105 *
 106 * Find the lowest power (highest number) ACPI device power state that the
 107 * device can be in while the system is in the state represented by
 108 * @target_state.  If @d_min_p is set, the highest power (lowest number) device
 109 * power state that @dev can be in for the given system sleep state is stored
 110 * at the location pointed to by it.
 111 *
 112 * Callers must ensure that @dev and @adev are valid pointers and that @adev
 113 * actually corresponds to @dev before using this function.
 114 */
 115int acpi_device_power_state(struct device *dev, struct acpi_device *adev,
 116                            u32 target_state, int d_max_in, int *d_min_p)
 117{
 118        char acpi_method[] = "_SxD";
 119        unsigned long long d_min, d_max;
 120        bool wakeup = false;
 121
 122        if (d_max_in < ACPI_STATE_D0 || d_max_in > ACPI_STATE_D3)
 123                return -EINVAL;
 124
 125        if (d_max_in > ACPI_STATE_D3_HOT) {
 126                enum pm_qos_flags_status stat;
 127
 128                stat = dev_pm_qos_flags(dev, PM_QOS_FLAG_NO_POWER_OFF);
 129                if (stat == PM_QOS_FLAGS_ALL)
 130                        d_max_in = ACPI_STATE_D3_HOT;
 131        }
 132
 133        acpi_method[2] = '0' + target_state;
 134        /*
 135         * If the sleep state is S0, the lowest limit from ACPI is D3,
 136         * but if the device has _S0W, we will use the value from _S0W
 137         * as the lowest limit from ACPI.  Finally, we will constrain
 138         * the lowest limit with the specified one.
 139         */
 140        d_min = ACPI_STATE_D0;
 141        d_max = ACPI_STATE_D3;
 142
 143        /*
 144         * If present, _SxD methods return the minimum D-state (highest power
 145         * state) we can use for the corresponding S-states.  Otherwise, the
 146         * minimum D-state is D0 (ACPI 3.x).
 147         *
 148         * NOTE: We rely on acpi_evaluate_integer() not clobbering the integer
 149         * provided -- that's our fault recovery, we ignore retval.
 150         */
 151        if (target_state > ACPI_STATE_S0) {
 152                acpi_evaluate_integer(adev->handle, acpi_method, NULL, &d_min);
 153                wakeup = device_may_wakeup(dev) && adev->wakeup.flags.valid
 154                        && adev->wakeup.sleep_state >= target_state;
 155        } else if (dev_pm_qos_flags(dev, PM_QOS_FLAG_REMOTE_WAKEUP) !=
 156                        PM_QOS_FLAGS_NONE) {
 157                wakeup = adev->wakeup.flags.valid;
 158        }
 159
 160        /*
 161         * If _PRW says we can wake up the system from the target sleep state,
 162         * the D-state returned by _SxD is sufficient for that (we assume a
 163         * wakeup-aware driver if wake is set).  Still, if _SxW exists
 164         * (ACPI 3.x), it should return the maximum (lowest power) D-state that
 165         * can wake the system.  _S0W may be valid, too.
 166         */
 167        if (wakeup) {
 168                acpi_status status;
 169
 170                acpi_method[3] = 'W';
 171                status = acpi_evaluate_integer(adev->handle, acpi_method, NULL,
 172                                                &d_max);
 173                if (ACPI_FAILURE(status)) {
 174                        if (target_state != ACPI_STATE_S0 ||
 175                            status != AE_NOT_FOUND)
 176                                d_max = d_min;
 177                } else if (d_max < d_min) {
 178                        /* Warn the user of the broken DSDT */
 179                        printk(KERN_WARNING "ACPI: Wrong value from %s\n",
 180                                acpi_method);
 181                        /* Sanitize it */
 182                        d_min = d_max;
 183                }
 184        }
 185
 186        if (d_max_in < d_min)
 187                return -EINVAL;
 188        if (d_min_p)
 189                *d_min_p = d_min;
 190        /* constrain d_max with specified lowest limit (max number) */
 191        if (d_max > d_max_in) {
 192                for (d_max = d_max_in; d_max > d_min; d_max--) {
 193                        if (adev->power.states[d_max].flags.valid)
 194                                break;
 195                }
 196        }
 197        return d_max;
 198}
 199EXPORT_SYMBOL_GPL(acpi_device_power_state);
 200
 201/**
 202 * acpi_pm_device_sleep_state - Get preferred power state of ACPI device.
 203 * @dev: Device whose preferred target power state to return.
 204 * @d_min_p: Location to store the upper limit of the allowed states range.
 205 * @d_max_in: Deepest low-power state to take into consideration.
 206 * Return value: Preferred power state of the device on success, -ENODEV
 207 * (if there's no 'struct acpi_device' for @dev) or -EINVAL on failure
 208 *
 209 * The caller must ensure that @dev is valid before using this function.
 210 */
 211int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p, int d_max_in)
 212{
 213        acpi_handle handle = DEVICE_ACPI_HANDLE(dev);
 214        struct acpi_device *adev;
 215
 216        if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &adev))) {
 217                dev_dbg(dev, "ACPI handle without context in %s!\n", __func__);
 218                return -ENODEV;
 219        }
 220
 221        return acpi_device_power_state(dev, adev, acpi_target_system_state(),
 222                                       d_max_in, d_min_p);
 223}
 224EXPORT_SYMBOL(acpi_pm_device_sleep_state);
 225
 226#ifdef CONFIG_PM_RUNTIME
 227/**
 228 * acpi_wakeup_device - Wakeup notification handler for ACPI devices.
 229 * @handle: ACPI handle of the device the notification is for.
 230 * @event: Type of the signaled event.
 231 * @context: Device corresponding to @handle.
 232 */
 233static void acpi_wakeup_device(acpi_handle handle, u32 event, void *context)
 234{
 235        struct device *dev = context;
 236
 237        if (event == ACPI_NOTIFY_DEVICE_WAKE && dev) {
 238                pm_wakeup_event(dev, 0);
 239                pm_runtime_resume(dev);
 240        }
 241}
 242
 243/**
 244 * __acpi_device_run_wake - Enable/disable runtime remote wakeup for device.
 245 * @adev: ACPI device to enable/disable the remote wakeup for.
 246 * @enable: Whether to enable or disable the wakeup functionality.
 247 *
 248 * Enable/disable the GPE associated with @adev so that it can generate
 249 * wakeup signals for the device in response to external (remote) events and
 250 * enable/disable device wakeup power.
 251 *
 252 * Callers must ensure that @adev is a valid ACPI device node before executing
 253 * this function.
 254 */
 255int __acpi_device_run_wake(struct acpi_device *adev, bool enable)
 256{
 257        struct acpi_device_wakeup *wakeup = &adev->wakeup;
 258
 259        if (enable) {
 260                acpi_status res;
 261                int error;
 262
 263                error = acpi_enable_wakeup_device_power(adev, ACPI_STATE_S0);
 264                if (error)
 265                        return error;
 266
 267                res = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number);
 268                if (ACPI_FAILURE(res)) {
 269                        acpi_disable_wakeup_device_power(adev);
 270                        return -EIO;
 271                }
 272        } else {
 273                acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number);
 274                acpi_disable_wakeup_device_power(adev);
 275        }
 276        return 0;
 277}
 278
 279/**
 280 * acpi_pm_device_run_wake - Enable/disable remote wakeup for given device.
 281 * @dev: Device to enable/disable the platform to wake up.
 282 * @enable: Whether to enable or disable the wakeup functionality.
 283 */
 284int acpi_pm_device_run_wake(struct device *phys_dev, bool enable)
 285{
 286        struct acpi_device *adev;
 287        acpi_handle handle;
 288
 289        if (!device_run_wake(phys_dev))
 290                return -EINVAL;
 291
 292        handle = DEVICE_ACPI_HANDLE(phys_dev);
 293        if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &adev))) {
 294                dev_dbg(phys_dev, "ACPI handle without context in %s!\n",
 295                        __func__);
 296                return -ENODEV;
 297        }
 298
 299        return __acpi_device_run_wake(adev, enable);
 300}
 301EXPORT_SYMBOL(acpi_pm_device_run_wake);
 302#else
 303static inline void acpi_wakeup_device(acpi_handle handle, u32 event,
 304                                      void *context) {}
 305#endif /* CONFIG_PM_RUNTIME */
 306
 307 #ifdef CONFIG_PM_SLEEP
 308/**
 309 * __acpi_device_sleep_wake - Enable or disable device to wake up the system.
 310 * @dev: Device to enable/desible to wake up the system.
 311 * @target_state: System state the device is supposed to wake up from.
 312 * @enable: Whether to enable or disable @dev to wake up the system.
 313 */
 314int __acpi_device_sleep_wake(struct acpi_device *adev, u32 target_state,
 315                             bool enable)
 316{
 317        return enable ?
 318                acpi_enable_wakeup_device_power(adev, target_state) :
 319                acpi_disable_wakeup_device_power(adev);
 320}
 321
 322/**
 323 * acpi_pm_device_sleep_wake - Enable or disable device to wake up the system.
 324 * @dev: Device to enable/desible to wake up the system from sleep states.
 325 * @enable: Whether to enable or disable @dev to wake up the system.
 326 */
 327int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
 328{
 329        acpi_handle handle;
 330        struct acpi_device *adev;
 331        int error;
 332
 333        if (!device_can_wakeup(dev))
 334                return -EINVAL;
 335
 336        handle = DEVICE_ACPI_HANDLE(dev);
 337        if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &adev))) {
 338                dev_dbg(dev, "ACPI handle without context in %s!\n", __func__);
 339                return -ENODEV;
 340        }
 341
 342        error = __acpi_device_sleep_wake(adev, acpi_target_system_state(),
 343                                         enable);
 344        if (!error)
 345                dev_info(dev, "System wakeup %s by ACPI\n",
 346                                enable ? "enabled" : "disabled");
 347
 348        return error;
 349}
 350#endif /* CONFIG_PM_SLEEP */
 351
 352/**
 353 * acpi_dev_pm_get_node - Get ACPI device node for the given physical device.
 354 * @dev: Device to get the ACPI node for.
 355 */
 356static struct acpi_device *acpi_dev_pm_get_node(struct device *dev)
 357{
 358        acpi_handle handle = DEVICE_ACPI_HANDLE(dev);
 359        struct acpi_device *adev;
 360
 361        return handle && !acpi_bus_get_device(handle, &adev) ? adev : NULL;
 362}
 363
 364/**
 365 * acpi_dev_pm_low_power - Put ACPI device into a low-power state.
 366 * @dev: Device to put into a low-power state.
 367 * @adev: ACPI device node corresponding to @dev.
 368 * @system_state: System state to choose the device state for.
 369 */
 370static int acpi_dev_pm_low_power(struct device *dev, struct acpi_device *adev,
 371                                 u32 system_state)
 372{
 373        int power_state;
 374
 375        if (!acpi_device_power_manageable(adev))
 376                return 0;
 377
 378        power_state = acpi_device_power_state(dev, adev, system_state,
 379                                              ACPI_STATE_D3, NULL);
 380        if (power_state < ACPI_STATE_D0 || power_state > ACPI_STATE_D3)
 381                return -EIO;
 382
 383        return acpi_device_set_power(adev, power_state);
 384}
 385
 386/**
 387 * acpi_dev_pm_full_power - Put ACPI device into the full-power state.
 388 * @adev: ACPI device node to put into the full-power state.
 389 */
 390static int acpi_dev_pm_full_power(struct acpi_device *adev)
 391{
 392        return acpi_device_power_manageable(adev) ?
 393                acpi_device_set_power(adev, ACPI_STATE_D0) : 0;
 394}
 395
 396#ifdef CONFIG_PM_RUNTIME
 397/**
 398 * acpi_dev_runtime_suspend - Put device into a low-power state using ACPI.
 399 * @dev: Device to put into a low-power state.
 400 *
 401 * Put the given device into a runtime low-power state using the standard ACPI
 402 * mechanism.  Set up remote wakeup if desired, choose the state to put the
 403 * device into (this checks if remote wakeup is expected to work too), and set
 404 * the power state of the device.
 405 */
 406int acpi_dev_runtime_suspend(struct device *dev)
 407{
 408        struct acpi_device *adev = acpi_dev_pm_get_node(dev);
 409        bool remote_wakeup;
 410        int error;
 411
 412        if (!adev)
 413                return 0;
 414
 415        remote_wakeup = dev_pm_qos_flags(dev, PM_QOS_FLAG_REMOTE_WAKEUP) >
 416                                PM_QOS_FLAGS_NONE;
 417        error = __acpi_device_run_wake(adev, remote_wakeup);
 418        if (remote_wakeup && error)
 419                return -EAGAIN;
 420
 421        error = acpi_dev_pm_low_power(dev, adev, ACPI_STATE_S0);
 422        if (error)
 423                __acpi_device_run_wake(adev, false);
 424
 425        return error;
 426}
 427EXPORT_SYMBOL_GPL(acpi_dev_runtime_suspend);
 428
 429/**
 430 * acpi_dev_runtime_resume - Put device into the full-power state using ACPI.
 431 * @dev: Device to put into the full-power state.
 432 *
 433 * Put the given device into the full-power state using the standard ACPI
 434 * mechanism at run time.  Set the power state of the device to ACPI D0 and
 435 * disable remote wakeup.
 436 */
 437int acpi_dev_runtime_resume(struct device *dev)
 438{
 439        struct acpi_device *adev = acpi_dev_pm_get_node(dev);
 440        int error;
 441
 442        if (!adev)
 443                return 0;
 444
 445        error = acpi_dev_pm_full_power(adev);
 446        __acpi_device_run_wake(adev, false);
 447        return error;
 448}
 449EXPORT_SYMBOL_GPL(acpi_dev_runtime_resume);
 450
 451/**
 452 * acpi_subsys_runtime_suspend - Suspend device using ACPI.
 453 * @dev: Device to suspend.
 454 *
 455 * Carry out the generic runtime suspend procedure for @dev and use ACPI to put
 456 * it into a runtime low-power state.
 457 */
 458int acpi_subsys_runtime_suspend(struct device *dev)
 459{
 460        int ret = pm_generic_runtime_suspend(dev);
 461        return ret ? ret : acpi_dev_runtime_suspend(dev);
 462}
 463EXPORT_SYMBOL_GPL(acpi_subsys_runtime_suspend);
 464
 465/**
 466 * acpi_subsys_runtime_resume - Resume device using ACPI.
 467 * @dev: Device to Resume.
 468 *
 469 * Use ACPI to put the given device into the full-power state and carry out the
 470 * generic runtime resume procedure for it.
 471 */
 472int acpi_subsys_runtime_resume(struct device *dev)
 473{
 474        int ret = acpi_dev_runtime_resume(dev);
 475        return ret ? ret : pm_generic_runtime_resume(dev);
 476}
 477EXPORT_SYMBOL_GPL(acpi_subsys_runtime_resume);
 478#endif /* CONFIG_PM_RUNTIME */
 479
 480#ifdef CONFIG_PM_SLEEP
 481/**
 482 * acpi_dev_suspend_late - Put device into a low-power state using ACPI.
 483 * @dev: Device to put into a low-power state.
 484 *
 485 * Put the given device into a low-power state during system transition to a
 486 * sleep state using the standard ACPI mechanism.  Set up system wakeup if
 487 * desired, choose the state to put the device into (this checks if system
 488 * wakeup is expected to work too), and set the power state of the device.
 489 */
 490int acpi_dev_suspend_late(struct device *dev)
 491{
 492        struct acpi_device *adev = acpi_dev_pm_get_node(dev);
 493        u32 target_state;
 494        bool wakeup;
 495        int error;
 496
 497        if (!adev)
 498                return 0;
 499
 500        target_state = acpi_target_system_state();
 501        wakeup = device_may_wakeup(dev);
 502        error = __acpi_device_sleep_wake(adev, target_state, wakeup);
 503        if (wakeup && error)
 504                return error;
 505
 506        error = acpi_dev_pm_low_power(dev, adev, target_state);
 507        if (error)
 508                __acpi_device_sleep_wake(adev, ACPI_STATE_UNKNOWN, false);
 509
 510        return error;
 511}
 512EXPORT_SYMBOL_GPL(acpi_dev_suspend_late);
 513
 514/**
 515 * acpi_dev_resume_early - Put device into the full-power state using ACPI.
 516 * @dev: Device to put into the full-power state.
 517 *
 518 * Put the given device into the full-power state using the standard ACPI
 519 * mechanism during system transition to the working state.  Set the power
 520 * state of the device to ACPI D0 and disable remote wakeup.
 521 */
 522int acpi_dev_resume_early(struct device *dev)
 523{
 524        struct acpi_device *adev = acpi_dev_pm_get_node(dev);
 525        int error;
 526
 527        if (!adev)
 528                return 0;
 529
 530        error = acpi_dev_pm_full_power(adev);
 531        __acpi_device_sleep_wake(adev, ACPI_STATE_UNKNOWN, false);
 532        return error;
 533}
 534EXPORT_SYMBOL_GPL(acpi_dev_resume_early);
 535
 536/**
 537 * acpi_subsys_prepare - Prepare device for system transition to a sleep state.
 538 * @dev: Device to prepare.
 539 */
 540int acpi_subsys_prepare(struct device *dev)
 541{
 542        /*
 543         * Follow PCI and resume devices suspended at run time before running
 544         * their system suspend callbacks.
 545         */
 546        pm_runtime_resume(dev);
 547        return pm_generic_prepare(dev);
 548}
 549EXPORT_SYMBOL_GPL(acpi_subsys_prepare);
 550
 551/**
 552 * acpi_subsys_suspend_late - Suspend device using ACPI.
 553 * @dev: Device to suspend.
 554 *
 555 * Carry out the generic late suspend procedure for @dev and use ACPI to put
 556 * it into a low-power state during system transition into a sleep state.
 557 */
 558int acpi_subsys_suspend_late(struct device *dev)
 559{
 560        int ret = pm_generic_suspend_late(dev);
 561        return ret ? ret : acpi_dev_suspend_late(dev);
 562}
 563EXPORT_SYMBOL_GPL(acpi_subsys_suspend_late);
 564
 565/**
 566 * acpi_subsys_resume_early - Resume device using ACPI.
 567 * @dev: Device to Resume.
 568 *
 569 * Use ACPI to put the given device into the full-power state and carry out the
 570 * generic early resume procedure for it during system transition into the
 571 * working state.
 572 */
 573int acpi_subsys_resume_early(struct device *dev)
 574{
 575        int ret = acpi_dev_resume_early(dev);
 576        return ret ? ret : pm_generic_resume_early(dev);
 577}
 578EXPORT_SYMBOL_GPL(acpi_subsys_resume_early);
 579#endif /* CONFIG_PM_SLEEP */
 580
 581static struct dev_pm_domain acpi_general_pm_domain = {
 582        .ops = {
 583#ifdef CONFIG_PM_RUNTIME
 584                .runtime_suspend = acpi_subsys_runtime_suspend,
 585                .runtime_resume = acpi_subsys_runtime_resume,
 586                .runtime_idle = pm_generic_runtime_idle,
 587#endif
 588#ifdef CONFIG_PM_SLEEP
 589                .prepare = acpi_subsys_prepare,
 590                .suspend_late = acpi_subsys_suspend_late,
 591                .resume_early = acpi_subsys_resume_early,
 592                .poweroff_late = acpi_subsys_suspend_late,
 593                .restore_early = acpi_subsys_resume_early,
 594#endif
 595        },
 596};
 597
 598/**
 599 * acpi_dev_pm_attach - Prepare device for ACPI power management.
 600 * @dev: Device to prepare.
 601 * @power_on: Whether or not to power on the device.
 602 *
 603 * If @dev has a valid ACPI handle that has a valid struct acpi_device object
 604 * attached to it, install a wakeup notification handler for the device and
 605 * add it to the general ACPI PM domain.  If @power_on is set, the device will
 606 * be put into the ACPI D0 state before the function returns.
 607 *
 608 * This assumes that the @dev's bus type uses generic power management callbacks
 609 * (or doesn't use any power management callbacks at all).
 610 *
 611 * Callers must ensure proper synchronization of this function with power
 612 * management callbacks.
 613 */
 614int acpi_dev_pm_attach(struct device *dev, bool power_on)
 615{
 616        struct acpi_device *adev = acpi_dev_pm_get_node(dev);
 617
 618        if (!adev)
 619                return -ENODEV;
 620
 621        if (dev->pm_domain)
 622                return -EEXIST;
 623
 624        acpi_add_pm_notifier(adev, acpi_wakeup_device, dev);
 625        dev->pm_domain = &acpi_general_pm_domain;
 626        if (power_on) {
 627                acpi_dev_pm_full_power(adev);
 628                __acpi_device_run_wake(adev, false);
 629        }
 630        return 0;
 631}
 632EXPORT_SYMBOL_GPL(acpi_dev_pm_attach);
 633
 634/**
 635 * acpi_dev_pm_detach - Remove ACPI power management from the device.
 636 * @dev: Device to take care of.
 637 * @power_off: Whether or not to try to remove power from the device.
 638 *
 639 * Remove the device from the general ACPI PM domain and remove its wakeup
 640 * notifier.  If @power_off is set, additionally remove power from the device if
 641 * possible.
 642 *
 643 * Callers must ensure proper synchronization of this function with power
 644 * management callbacks.
 645 */
 646void acpi_dev_pm_detach(struct device *dev, bool power_off)
 647{
 648        struct acpi_device *adev = acpi_dev_pm_get_node(dev);
 649
 650        if (adev && dev->pm_domain == &acpi_general_pm_domain) {
 651                dev->pm_domain = NULL;
 652                acpi_remove_pm_notifier(adev, acpi_wakeup_device);
 653                if (power_off) {
 654                        /*
 655                         * If the device's PM QoS resume latency limit or flags
 656                         * have been exposed to user space, they have to be
 657                         * hidden at this point, so that they don't affect the
 658                         * choice of the low-power state to put the device into.
 659                         */
 660                        dev_pm_qos_hide_latency_limit(dev);
 661                        dev_pm_qos_hide_flags(dev);
 662                        __acpi_device_run_wake(adev, false);
 663                        acpi_dev_pm_low_power(dev, adev, ACPI_STATE_S0);
 664                }
 665        }
 666}
 667EXPORT_SYMBOL_GPL(acpi_dev_pm_detach);
 668
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.