1 /* 2 * drivers/base/power/runtime.c - Helper functions for device run-time PM 3 * 4 * Copyright (c) 2009 Rafael J. Wysocki <rjw@sisk.pl>, Novell Inc. 5 * 6 * This file is released under the GPLv2. 7 */ 8 9 #include <linux/sched.h> 10 #include <linux/pm_runtime.h> 11 #include <linux/jiffies.h> 12 13 static int __pm_runtime_resume(struct device *dev, bool from_wq); 14 static int __pm_request_idle(struct device *dev); 15 static int __pm_request_resume(struct device *dev); 16 17 /** 18 * pm_runtime_deactivate_timer - Deactivate given device's suspend timer. 19 * @dev: Device to handle. 20 */ 21 static void pm_runtime_deactivate_timer(struct device *dev) 22 { 23 if (dev->power.timer_expires > 0) { 24 del_timer(&dev->power.suspend_timer); 25 dev->power.timer_expires = 0; 26 } 27 } 28 29 /** 30 * pm_runtime_cancel_pending - Deactivate suspend timer and cancel requests. 31 * @dev: Device to handle. 32 */ 33 static void pm_runtime_cancel_pending(struct device *dev) 34 { 35 pm_runtime_deactivate_timer(dev); 36 /* 37 * In case there's a request pending, make sure its work function will 38 * return without doing anything. 39 */ 40 dev->power.request = RPM_REQ_NONE; 41 } 42 43 /** 44 * __pm_runtime_idle - Notify device bus type if the device can be suspended. 45 * @dev: Device to notify the bus type about. 46 * 47 * This function must be called under dev->power.lock with interrupts disabled. 48 */ 49 static int __pm_runtime_idle(struct device *dev) 50 __releases(&dev->power.lock) __acquires(&dev->power.lock) 51 { 52 int retval = 0; 53 54 if (dev->power.runtime_error) 55 retval = -EINVAL; 56 else if (dev->power.idle_notification) 57 retval = -EINPROGRESS; 58 else if (atomic_read(&dev->power.usage_count) > 0 59 || dev->power.disable_depth > 0 60 || dev->power.runtime_status != RPM_ACTIVE) 61 retval = -EAGAIN; 62 else if (!pm_children_suspended(dev)) 63 retval = -EBUSY; 64 if (retval) 65 goto out; 66 67 if (dev->power.request_pending) { 68 /* 69 * If an idle notification request is pending, cancel it. Any 70 * other pending request takes precedence over us. 71 */ 72 if (dev->power.request == RPM_REQ_IDLE) { 73 dev->power.request = RPM_REQ_NONE; 74 } else if (dev->power.request != RPM_REQ_NONE) { 75 retval = -EAGAIN; 76 goto out; 77 } 78 } 79 80 dev->power.idle_notification = true; 81 82 if (dev->bus && dev->bus->pm && dev->bus->pm->runtime_idle) { 83 spin_unlock_irq(&dev->power.lock); 84 85 dev->bus->pm->runtime_idle(dev); 86 87 spin_lock_irq(&dev->power.lock); 88 } 89 90 dev->power.idle_notification = false; 91 wake_up_all(&dev->power.wait_queue); 92 93 out: 94 return retval; 95 } 96 97 /** 98 * pm_runtime_idle - Notify device bus type if the device can be suspended. 99 * @dev: Device to notify the bus type about. 100 */ 101 int pm_runtime_idle(struct device *dev) 102 { 103 int retval; 104 105 spin_lock_irq(&dev->power.lock); 106 retval = __pm_runtime_idle(dev); 107 spin_unlock_irq(&dev->power.lock); 108 109 return retval; 110 } 111 EXPORT_SYMBOL_GPL(pm_runtime_idle); 112 113 /** 114 * __pm_runtime_suspend - Carry out run-time suspend of given device. 115 * @dev: Device to suspend. 116 * @from_wq: If set, the function has been called via pm_wq. 117 * 118 * Check if the device can be suspended and run the ->runtime_suspend() callback 119 * provided by its bus type. If another suspend has been started earlier, wait 120 * for it to finish. If an idle notification or suspend request is pending or 121 * scheduled, cancel it. 122 * 123 * This function must be called under dev->power.lock with interrupts disabled. 124 */ 125 int __pm_runtime_suspend(struct device *dev, bool from_wq) 126 __releases(&dev->power.lock) __acquires(&dev->power.lock) 127 { 128 struct device *parent = NULL; 129 bool notify = false; 130 int retval = 0; 131 132 dev_dbg(dev, "__pm_runtime_suspend()%s!\n", 133 from_wq ? " from workqueue" : ""); 134 135 repeat: 136 if (dev->power.runtime_error) { 137 retval = -EINVAL; 138 goto out; 139 } 140 141 /* Pending resume requests take precedence over us. */ 142 if (dev->power.request_pending 143 && dev->power.request == RPM_REQ_RESUME) { 144 retval = -EAGAIN; 145 goto out; 146 } 147 148 /* Other scheduled or pending requests need to be canceled. */ 149 pm_runtime_cancel_pending(dev); 150 151 if (dev->power.runtime_status == RPM_SUSPENDED) 152 retval = 1; 153 else if (dev->power.runtime_status == RPM_RESUMING 154 || dev->power.disable_depth > 0 155 || atomic_read(&dev->power.usage_count) > 0) 156 retval = -EAGAIN; 157 else if (!pm_children_suspended(dev)) 158 retval = -EBUSY; 159 if (retval) 160 goto out; 161 162 if (dev->power.runtime_status == RPM_SUSPENDING) { 163 DEFINE_WAIT(wait); 164 165 if (from_wq) { 166 retval = -EINPROGRESS; 167 goto out; 168 } 169 170 /* Wait for the other suspend running in parallel with us. */ 171 for (;;) { 172 prepare_to_wait(&dev->power.wait_queue, &wait, 173 TASK_UNINTERRUPTIBLE); 174 if (dev->power.runtime_status != RPM_SUSPENDING) 175 break; 176 177 spin_unlock_irq(&dev->power.lock); 178 179 schedule(); 180 181 spin_lock_irq(&dev->power.lock); 182 } 183 finish_wait(&dev->power.wait_queue, &wait); 184 goto repeat; 185 } 186 187 dev->power.runtime_status = RPM_SUSPENDING; 188 189 if (dev->bus && dev->bus->pm && dev->bus->pm->runtime_suspend) { 190 spin_unlock_irq(&dev->power.lock); 191 192 retval = dev->bus->pm->runtime_suspend(dev); 193 194 spin_lock_irq(&dev->power.lock); 195 dev->power.runtime_error = retval; 196 } else { 197 retval = -ENOSYS; 198 } 199 200 if (retval) { 201 dev->power.runtime_status = RPM_ACTIVE; 202 pm_runtime_cancel_pending(dev); 203 dev->power.deferred_resume = false; 204 205 if (retval == -EAGAIN || retval == -EBUSY) { 206 notify = true; 207 dev->power.runtime_error = 0; 208 } 209 } else { 210 dev->power.runtime_status = RPM_SUSPENDED; 211 212 if (dev->parent) { 213 parent = dev->parent; 214 atomic_add_unless(&parent->power.child_count, -1, 0); 215 } 216 } 217 wake_up_all(&dev->power.wait_queue); 218 219 if (dev->power.deferred_resume) { 220 dev->power.deferred_resume = false; 221 __pm_runtime_resume(dev, false); 222 retval = -EAGAIN; 223 goto out; 224 } 225 226 if (notify) 227 __pm_runtime_idle(dev); 228 229 if (parent && !parent->power.ignore_children) { 230 spin_unlock_irq(&dev->power.lock); 231 232 pm_request_idle(parent); 233 234 spin_lock_irq(&dev->power.lock); 235 } 236 237 out: 238 dev_dbg(dev, "__pm_runtime_suspend() returns %d!\n", retval); 239 240 return retval; 241 } 242 243 /** 244 * pm_runtime_suspend - Carry out run-time suspend of given device. 245 * @dev: Device to suspend. 246 */ 247 int pm_runtime_suspend(struct device *dev) 248 { 249 int retval; 250 251 spin_lock_irq(&dev->power.lock); 252 retval = __pm_runtime_suspend(dev, false); 253 spin_unlock_irq(&dev->power.lock); 254 255 return retval; 256 } 257 EXPORT_SYMBOL_GPL(pm_runtime_suspend); 258 259 /** 260 * __pm_runtime_resume - Carry out run-time resume of given device. 261 * @dev: Device to resume. 262 * @from_wq: If set, the function has been called via pm_wq. 263 * 264 * Check if the device can be woken up and run the ->runtime_resume() callback 265 * provided by its bus type. If another resume has been started earlier, wait 266 * for it to finish. If there's a suspend running in parallel with this 267 * function, wait for it to finish and resume the device. Cancel any scheduled 268 * or pending requests. 269 * 270 * This function must be called under dev->power.lock with interrupts disabled. 271 */ 272 int __pm_runtime_resume(struct device *dev, bool from_wq) 273 __releases(&dev->power.lock) __acquires(&dev->power.lock) 274 { 275 struct device *parent = NULL; 276 int retval = 0; 277 278 dev_dbg(dev, "__pm_runtime_resume()%s!\n", 279 from_wq ? " from workqueue" : ""); 280 281 repeat: 282 if (dev->power.runtime_error) { 283 retval = -EINVAL; 284 goto out; 285 } 286 287 pm_runtime_cancel_pending(dev); 288 289 if (dev->power.runtime_status == RPM_ACTIVE) 290 retval = 1; 291 else if (dev->power.disable_depth > 0) 292 retval = -EAGAIN; 293 if (retval) 294 goto out; 295 296 if (dev->power.runtime_status == RPM_RESUMING 297 || dev->power.runtime_status == RPM_SUSPENDING) { 298 DEFINE_WAIT(wait); 299 300 if (from_wq) { 301 if (dev->power.runtime_status == RPM_SUSPENDING) 302 dev->power.deferred_resume = true; 303 retval = -EINPROGRESS; 304 goto out; 305 } 306 307 /* Wait for the operation carried out in parallel with us. */ 308 for (;;) { 309 prepare_to_wait(&dev->power.wait_queue, &wait, 310 TASK_UNINTERRUPTIBLE); 311 if (dev->power.runtime_status != RPM_RESUMING 312 && dev->power.runtime_status != RPM_SUSPENDING) 313 break; 314 315 spin_unlock_irq(&dev->power.lock); 316 317 schedule(); 318 319 spin_lock_irq(&dev->power.lock); 320 } 321 finish_wait(&dev->power.wait_queue, &wait); 322 goto repeat; 323 } 324 325 if (!parent && dev->parent) { 326 /* 327 * Increment the parent's resume counter and resume it if 328 * necessary. 329 */ 330 parent = dev->parent; 331 spin_unlock_irq(&dev->power.lock); 332 333 pm_runtime_get_noresume(parent); 334 335 spin_lock_irq(&parent->power.lock); 336 /* 337 * We can resume if the parent's run-time PM is disabled or it 338 * is set to ignore children. 339 */ 340 if (!parent->power.disable_depth 341 && !parent->power.ignore_children) { 342 __pm_runtime_resume(parent, false); 343 if (parent->power.runtime_status != RPM_ACTIVE) 344 retval = -EBUSY; 345 } 346 spin_unlock_irq(&parent->power.lock); 347 348 spin_lock_irq(&dev->power.lock); 349 if (retval) 350 goto out; 351 goto repeat; 352 } 353 354 dev->power.runtime_status = RPM_RESUMING; 355 356 if (dev->bus && dev->bus->pm && dev->bus->pm->runtime_resume) { 357 spin_unlock_irq(&dev->power.lock); 358 359 retval = dev->bus->pm->runtime_resume(dev); 360 361 spin_lock_irq(&dev->power.lock); 362 dev->power.runtime_error = retval; 363 } else { 364 retval = -ENOSYS; 365 } 366 367 if (retval) { 368 dev->power.runtime_status = RPM_SUSPENDED; 369 pm_runtime_cancel_pending(dev); 370 } else { 371 dev->power.runtime_status = RPM_ACTIVE; 372 if (parent) 373 atomic_inc(&parent->power.child_count); 374 } 375 wake_up_all(&dev->power.wait_queue); 376 377 if (!retval) 378 __pm_request_idle(dev); 379 380 out: 381 if (parent) { 382 spin_unlock_irq(&dev->power.lock); 383 384 pm_runtime_put(parent); 385 386 spin_lock_irq(&dev->power.lock); 387 } 388 389 dev_dbg(dev, "__pm_runtime_resume() returns %d!\n", retval); 390 391 return retval; 392 } 393 394 /** 395 * pm_runtime_resume - Carry out run-time resume of given device. 396 * @dev: Device to suspend. 397 */ 398 int pm_runtime_resume(struct device *dev) 399 { 400 int retval; 401 402 spin_lock_irq(&dev->power.lock); 403 retval = __pm_runtime_resume(dev, false); 404 spin_unlock_irq(&dev->power.lock); 405 406 return retval; 407 } 408 EXPORT_SYMBOL_GPL(pm_runtime_resume); 409 410 /** 411 * pm_runtime_work - Universal run-time PM work function. 412 * @work: Work structure used for scheduling the execution of this function. 413 * 414 * Use @work to get the device object the work is to be done for, determine what 415 * is to be done and execute the appropriate run-time PM function. 416 */ 417 static void pm_runtime_work(struct work_struct *work) 418 { 419 struct device *dev = container_of(work, struct device, power.work); 420 enum rpm_request req; 421 422 spin_lock_irq(&dev->power.lock); 423 424 if (!dev->power.request_pending) 425 goto out; 426 427 req = dev->power.request; 428 dev->power.request = RPM_REQ_NONE; 429 dev->power.request_pending = false; 430 431 switch (req) { 432 case RPM_REQ_NONE: 433 break; 434 case RPM_REQ_IDLE: 435 __pm_runtime_idle(dev); 436 break; 437 case RPM_REQ_SUSPEND: 438 __pm_runtime_suspend(dev, true); 439 break; 440 case RPM_REQ_RESUME: 441 __pm_runtime_resume(dev, true); 442 break; 443 } 444 445 out: 446 spin_unlock_irq(&dev->power.lock); 447 } 448 449 /** 450 * __pm_request_idle - Submit an idle notification request for given device. 451 * @dev: Device to handle. 452 * 453 * Check if the device's run-time PM status is correct for suspending the device 454 * and queue up a request to run __pm_runtime_idle() for it. 455 * 456 * This function must be called under dev->power.lock with interrupts disabled. 457 */ 458 static int __pm_request_idle(struct device *dev) 459 { 460 int retval = 0; 461 462 if (dev->power.runtime_error) 463 retval = -EINVAL; 464 else if (atomic_read(&dev->power.usage_count) > 0 465 || dev->power.disable_depth > 0 466 || dev->power.runtime_status == RPM_SUSPENDED 467 || dev->power.runtime_status == RPM_SUSPENDING) 468 retval = -EAGAIN; 469 else if (!pm_children_suspended(dev)) 470 retval = -EBUSY; 471 if (retval) 472 return retval; 473 474 if (dev->power.request_pending) { 475 /* Any requests other then RPM_REQ_IDLE take precedence. */ 476 if (dev->power.request == RPM_REQ_NONE) 477 dev->power.request = RPM_REQ_IDLE; 478 else if (dev->power.request != RPM_REQ_IDLE) 479 retval = -EAGAIN; 480 return retval; 481 } 482 483 dev->power.request = RPM_REQ_IDLE; 484 dev->power.request_pending = true; 485 queue_work(pm_wq, &dev->power.work); 486 487 return retval; 488 } 489 490 /** 491 * pm_request_idle - Submit an idle notification request for given device. 492 * @dev: Device to handle. 493 */ 494 int pm_request_idle(struct device *dev) 495 { 496 unsigned long flags; 497 int retval; 498 499 spin_lock_irqsave(&dev->power.lock, flags); 500 retval = __pm_request_idle(dev); 501 spin_unlock_irqrestore(&dev->power.lock, flags); 502 503 return retval; 504 } 505 EXPORT_SYMBOL_GPL(pm_request_idle); 506 507 /** 508 * __pm_request_suspend - Submit a suspend request for given device. 509 * @dev: Device to suspend. 510 * 511 * This function must be called under dev->power.lock with interrupts disabled. 512 */ 513 static int __pm_request_suspend(struct device *dev) 514 { 515 int retval = 0; 516 517 if (dev->power.runtime_error) 518 return -EINVAL; 519 520 if (dev->power.runtime_status == RPM_SUSPENDED) 521 retval = 1; 522 else if (atomic_read(&dev->power.usage_count) > 0 523 || dev->power.disable_depth > 0) 524 retval = -EAGAIN; 525 else if (dev->power.runtime_status == RPM_SUSPENDING) 526 retval = -EINPROGRESS; 527 else if (!pm_children_suspended(dev)) 528 retval = -EBUSY; 529 if (retval < 0) 530 return retval; 531 532 pm_runtime_deactivate_timer(dev); 533 534 if (dev->power.request_pending) { 535 /* 536 * Pending resume requests take precedence over us, but we can 537 * overtake any other pending request. 538 */ 539 if (dev->power.request == RPM_REQ_RESUME) 540 retval = -EAGAIN; 541 else if (dev->power.request != RPM_REQ_SUSPEND) 542 dev->power.request = retval ? 543 RPM_REQ_NONE : RPM_REQ_SUSPEND; 544 return retval; 545 } else if (retval) { 546 return retval; 547 } 548 549 dev->power.request = RPM_REQ_SUSPEND; 550 dev->power.request_pending = true; 551 queue_work(pm_wq, &dev->power.work); 552 553 return 0; 554 } 555 556 /** 557 * pm_suspend_timer_fn - Timer function for pm_schedule_suspend(). 558 * @data: Device pointer passed by pm_schedule_suspend(). 559 * 560 * Check if the time is right and execute __pm_request_suspend() in that case. 561 */ 562 static void pm_suspend_timer_fn(unsigned long data) 563 { 564 struct device *dev = (struct device *)data; 565 unsigned long flags; 566 unsigned long expires; 567 568 spin_lock_irqsave(&dev->power.lock, flags); 569 570 expires = dev->power.timer_expires; 571 /* If 'expire' is after 'jiffies' we've been called too early. */ 572 if (expires > 0 && !time_after(expires, jiffies)) { 573 dev->power.timer_expires = 0; 574 __pm_request_suspend(dev); 575 } 576 577 spin_unlock_irqrestore(&dev->power.lock, flags); 578 } 579 580 /** 581 * pm_schedule_suspend - Set up a timer to submit a suspend request in future. 582 * @dev: Device to suspend. 583 * @delay: Time to wait before submitting a suspend request, in milliseconds. 584 */ 585 int pm_schedule_suspend(struct device *dev, unsigned int delay) 586 { 587 unsigned long flags; 588 int retval = 0; 589 590 spin_lock_irqsave(&dev->power.lock, flags); 591 592 if (dev->power.runtime_error) { 593 retval = -EINVAL; 594 goto out; 595 } 596 597 if (!delay) { 598 retval = __pm_request_suspend(dev); 599 goto out; 600 } 601 602 pm_runtime_deactivate_timer(dev); 603 604 if (dev->power.request_pending) { 605 /* 606 * Pending resume requests take precedence over us, but any 607 * other pending requests have to be canceled. 608 */ 609 if (dev->power.request == RPM_REQ_RESUME) { 610 retval = -EAGAIN; 611 goto out; 612 } 613 dev->power.request = RPM_REQ_NONE; 614 } 615 616 if (dev->power.runtime_status == RPM_SUSPENDED) 617 retval = 1; 618 else if (dev->power.runtime_status == RPM_SUSPENDING) 619 retval = -EINPROGRESS; 620 else if (atomic_read(&dev->power.usage_count) > 0 621 || dev->power.disable_depth > 0) 622 retval = -EAGAIN; 623 else if (!pm_children_suspended(dev)) 624 retval = -EBUSY; 625 if (retval) 626 goto out; 627 628 dev->power.timer_expires = jiffies + msecs_to_jiffies(delay); 629 mod_timer(&dev->power.suspend_timer, dev->power.timer_expires); 630 631 out: 632 spin_unlock_irqrestore(&dev->power.lock, flags); 633 634 return retval; 635 } 636 EXPORT_SYMBOL_GPL(pm_schedule_suspend); 637 638 /** 639 * pm_request_resume - Submit a resume request for given device. 640 * @dev: Device to resume. 641 * 642 * This function must be called under dev->power.lock with interrupts disabled. 643 */ 644 static int __pm_request_resume(struct device *dev) 645 { 646 int retval = 0; 647 648 if (dev->power.runtime_error) 649 return -EINVAL; 650 651 if (dev->power.runtime_status == RPM_ACTIVE) 652 retval = 1; 653 else if (dev->power.runtime_status == RPM_RESUMING) 654 retval = -EINPROGRESS; 655 else if (dev->power.disable_depth > 0) 656 retval = -EAGAIN; 657 if (retval < 0) 658 return retval; 659 660 pm_runtime_deactivate_timer(dev); 661 662 if (dev->power.request_pending) { 663 /* If non-resume request is pending, we can overtake it. */ 664 dev->power.request = retval ? RPM_REQ_NONE : RPM_REQ_RESUME; 665 return retval; 666 } else if (retval) { 667 return retval; 668 } 669 670 dev->power.request = RPM_REQ_RESUME; 671 dev->power.request_pending = true; 672 queue_work(pm_wq, &dev->power.work); 673 674 return retval; 675 } 676 677 /** 678 * pm_request_resume - Submit a resume request for given device. 679 * @dev: Device to resume. 680 */ 681 int pm_request_resume(struct device *dev) 682 { 683 unsigned long flags; 684 int retval; 685 686 spin_lock_irqsave(&dev->power.lock, flags); 687 retval = __pm_request_resume(dev); 688 spin_unlock_irqrestore(&dev->power.lock, flags); 689 690 return retval; 691 } 692 EXPORT_SYMBOL_GPL(pm_request_resume); 693 694 /** 695 * __pm_runtime_get - Reference count a device and wake it up, if necessary. 696 * @dev: Device to handle. 697 * @sync: If set and the device is suspended, resume it synchronously. 698 * 699 * Increment the usage count of the device and if it was zero previously, 700 * resume it or submit a resume request for it, depending on the value of @sync. 701 */ 702 int __pm_runtime_get(struct device *dev, bool sync) 703 { 704 int retval = 1; 705 706 if (atomic_add_return(1, &dev->power.usage_count) == 1) 707 retval = sync ? pm_runtime_resume(dev) : pm_request_resume(dev); 708 709 return retval; 710 } 711 EXPORT_SYMBOL_GPL(__pm_runtime_get); 712 713 /** 714 * __pm_runtime_put - Decrement the device's usage counter and notify its bus. 715 * @dev: Device to handle. 716 * @sync: If the device's bus type is to be notified, do that synchronously. 717 * 718 * Decrement the usage count of the device and if it reaches zero, carry out a 719 * synchronous idle notification or submit an idle notification request for it, 720 * depending on the value of @sync. 721 */ 722 int __pm_runtime_put(struct device *dev, bool sync) 723 { 724 int retval = 0; 725 726 if (atomic_dec_and_test(&dev->power.usage_count)) 727 retval = sync ? pm_runtime_idle(dev) : pm_request_idle(dev); 728 729 return retval; 730 } 731 EXPORT_SYMBOL_GPL(__pm_runtime_put); 732 733 /** 734 * __pm_runtime_set_status - Set run-time PM status of a device. 735 * @dev: Device to handle. 736 * @status: New run-time PM status of the device. 737 * 738 * If run-time PM of the device is disabled or its power.runtime_error field is 739 * different from zero, the status may be changed either to RPM_ACTIVE, or to 740 * RPM_SUSPENDED, as long as that reflects the actual state of the device. 741 * However, if the device has a parent and the parent is not active, and the 742 * parent's power.ignore_children flag is unset, the device's status cannot be 743 * set to RPM_ACTIVE, so -EBUSY is returned in that case. 744 * 745 * If successful, __pm_runtime_set_status() clears the power.runtime_error field 746 * and the device parent's counter of unsuspended children is modified to 747 * reflect the new status. If the new status is RPM_SUSPENDED, an idle 748 * notification request for the parent is submitted. 749 */ 750 int __pm_runtime_set_status(struct device *dev, unsigned int status) 751 { 752 struct device *parent = dev->parent; 753 unsigned long flags; 754 bool notify_parent = false; 755 int error = 0; 756 757 if (status != RPM_ACTIVE && status != RPM_SUSPENDED) 758 return -EINVAL; 759 760 spin_lock_irqsave(&dev->power.lock, flags); 761 762 if (!dev->power.runtime_error && !dev->power.disable_depth) { 763 error = -EAGAIN; 764 goto out; 765 } 766 767 if (dev->power.runtime_status == status) 768 goto out_set; 769 770 if (status == RPM_SUSPENDED) { 771 /* It always is possible to set the status to 'suspended'. */ 772 if (parent) { 773 atomic_add_unless(&parent->power.child_count, -1, 0); 774 notify_parent = !parent->power.ignore_children; 775 } 776 goto out_set; 777 } 778 779 if (parent) { 780 spin_lock_irq(&parent->power.lock); 781 782 /* 783 * It is invalid to put an active child under a parent that is 784 * not active, has run-time PM enabled and the 785 * 'power.ignore_children' flag unset. 786 */ 787 if (!parent->power.disable_depth 788 && !parent->power.ignore_children 789 && parent->power.runtime_status != RPM_ACTIVE) { 790 error = -EBUSY; 791 } else { 792 if (dev->power.runtime_status == RPM_SUSPENDED) 793 atomic_inc(&parent->power.child_count); 794 } 795 796 spin_unlock_irq(&parent->power.lock); 797 798 if (error) 799 goto out; 800 } 801 802 out_set: 803 dev->power.runtime_status = status; 804 dev->power.runtime_error = 0; 805 out: 806 spin_unlock_irqrestore(&dev->power.lock, flags); 807 808 if (notify_parent) 809 pm_request_idle(parent); 810 811 return error; 812 } 813 EXPORT_SYMBOL_GPL(__pm_runtime_set_status); 814 815 /** 816 * __pm_runtime_barrier - Cancel pending requests and wait for completions. 817 * @dev: Device to handle. 818 * 819 * Flush all pending requests for the device from pm_wq and wait for all 820 * run-time PM operations involving the device in progress to complete. 821 * 822 * Should be called under dev->power.lock with interrupts disabled. 823 */ 824 static void __pm_runtime_barrier(struct device *dev) 825 { 826 pm_runtime_deactivate_timer(dev); 827 828 if (dev->power.request_pending) { 829 dev->power.request = RPM_REQ_NONE; 830 spin_unlock_irq(&dev->power.lock); 831 832 cancel_work_sync(&dev->power.work); 833 834 spin_lock_irq(&dev->power.lock); 835 dev->power.request_pending = false; 836 } 837 838 if (dev->power.runtime_status == RPM_SUSPENDING 839 || dev->power.runtime_status == RPM_RESUMING 840 || dev->power.idle_notification) { 841 DEFINE_WAIT(wait); 842 843 /* Suspend, wake-up or idle notification in progress. */ 844 for (;;) { 845 prepare_to_wait(&dev->power.wait_queue, &wait, 846 TASK_UNINTERRUPTIBLE); 847 if (dev->power.runtime_status != RPM_SUSPENDING 848 && dev->power.runtime_status != RPM_RESUMING 849 && !dev->power.idle_notification) 850 break; 851 spin_unlock_irq(&dev->power.lock); 852 853 schedule(); 854 855 spin_lock_irq(&dev->power.lock); 856 } 857 finish_wait(&dev->power.wait_queue, &wait); 858 } 859 } 860 861 /** 862 * pm_runtime_barrier - Flush pending requests and wait for completions. 863 * @dev: Device to handle. 864 * 865 * Prevent the device from being suspended by incrementing its usage counter and 866 * if there's a pending resume request for the device, wake the device up. 867 * Next, make sure that all pending requests for the device have been flushed 868 * from pm_wq and wait for all run-time PM operations involving the device in 869 * progress to complete. 870 * 871 * Return value: 872 * 1, if there was a resume request pending and the device had to be woken up, 873 * 0, otherwise 874 */ 875 int pm_runtime_barrier(struct device *dev) 876 { 877 int retval = 0; 878 879 pm_runtime_get_noresume(dev); 880 spin_lock_irq(&dev->power.lock); 881 882 if (dev->power.request_pending 883 && dev->power.request == RPM_REQ_RESUME) { 884 __pm_runtime_resume(dev, false); 885 retval = 1; 886 } 887 888 __pm_runtime_barrier(dev); 889 890 spin_unlock_irq(&dev->power.lock); 891 pm_runtime_put_noidle(dev); 892 893 return retval; 894 } 895 EXPORT_SYMBOL_GPL(pm_runtime_barrier); 896 897 /** 898 * __pm_runtime_disable - Disable run-time PM of a device. 899 * @dev: Device to handle. 900 * @check_resume: If set, check if there's a resume request for the device. 901 * 902 * Increment power.disable_depth for the device and if was zero previously, 903 * cancel all pending run-time PM requests for the device and wait for all 904 * operations in progress to complete. The device can be either active or 905 * suspended after its run-time PM has been disabled. 906 * 907 * If @check_resume is set and there's a resume request pending when 908 * __pm_runtime_disable() is called and power.disable_depth is zero, the 909 * function will wake up the device before disabling its run-time PM. 910 */ 911 void __pm_runtime_disable(struct device *dev, bool check_resume) 912 { 913 spin_lock_irq(&dev->power.lock); 914 915 if (dev->power.disable_depth > 0) { 916 dev->power.disable_depth++; 917 goto out; 918 } 919 920 /* 921 * Wake up the device if there's a resume request pending, because that 922 * means there probably is some I/O to process and disabling run-time PM 923 * shouldn't prevent the device from processing the I/O. 924 */ 925 if (check_resume && dev->power.request_pending 926 && dev->power.request == RPM_REQ_RESUME) { 927 /* 928 * Prevent suspends and idle notifications from being carried 929 * out after we have woken up the device. 930 */ 931 pm_runtime_get_noresume(dev); 932 933 __pm_runtime_resume(dev, false); 934 935 pm_runtime_put_noidle(dev); 936 } 937 938 if (!dev->power.disable_depth++) 939 __pm_runtime_barrier(dev); 940 941 out: 942 spin_unlock_irq(&dev->power.lock); 943 } 944 EXPORT_SYMBOL_GPL(__pm_runtime_disable); 945 946 /** 947 * pm_runtime_enable - Enable run-time PM of a device. 948 * @dev: Device to handle. 949 */ 950 void pm_runtime_enable(struct device *dev) 951 { 952 unsigned long flags; 953 954 spin_lock_irqsave(&dev->power.lock, flags); 955 956 if (dev->power.disable_depth > 0) 957 dev->power.disable_depth--; 958 else 959 dev_warn(dev, "Unbalanced %s!\n", __func__); 960 961 spin_unlock_irqrestore(&dev->power.lock, flags); 962 } 963 EXPORT_SYMBOL_GPL(pm_runtime_enable); 964 965 /** 966 * pm_runtime_init - Initialize run-time PM fields in given device object. 967 * @dev: Device object to initialize. 968 */ 969 void pm_runtime_init(struct device *dev) 970 { 971 spin_lock_init(&dev->power.lock); 972 973 dev->power.runtime_status = RPM_SUSPENDED; 974 dev->power.idle_notification = false; 975 976 dev->power.disable_depth = 1; 977 atomic_set(&dev->power.usage_count, 0); 978 979 dev->power.runtime_error = 0; 980 981 atomic_set(&dev->power.child_count, 0); 982 pm_suspend_ignore_children(dev, false); 983 984 dev->power.request_pending = false; 985 dev->power.request = RPM_REQ_NONE; 986 dev->power.deferred_resume = false; 987 INIT_WORK(&dev->power.work, pm_runtime_work); 988 989 dev->power.timer_expires = 0; 990 setup_timer(&dev->power.suspend_timer, pm_suspend_timer_fn, 991 (unsigned long)dev); 992 993 init_waitqueue_head(&dev->power.wait_queue); 994 } 995 996 /** 997 * pm_runtime_remove - Prepare for removing a device from device hierarchy. 998 * @dev: Device object being removed from device hierarchy. 999 */ 1000 void pm_runtime_remove(struct device *dev) 1001 { 1002 __pm_runtime_disable(dev, false); 1003 1004 /* Change the status back to 'suspended' to match the initial status. */ 1005 if (dev->power.runtime_status == RPM_ACTIVE) 1006 pm_runtime_set_suspended(dev); 1007 } 1008