pm_runtime.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /*
  2. * pm_runtime.h - Device run-time power management helper functions.
  3. *
  4. * Copyright (C) 2009 Rafael J. Wysocki <rjw@sisk.pl>
  5. *
  6. * This file is released under the GPLv2.
  7. */
  8. #ifndef _LINUX_PM_RUNTIME_H
  9. #define _LINUX_PM_RUNTIME_H
  10. #include <linux/device.h>
  11. #include <linux/pm.h>
  12. #ifdef CONFIG_PM_RUNTIME
  13. extern struct workqueue_struct *pm_wq;
  14. extern int pm_runtime_idle(struct device *dev);
  15. extern int pm_runtime_suspend(struct device *dev);
  16. extern int pm_runtime_resume(struct device *dev);
  17. extern int pm_request_idle(struct device *dev);
  18. extern int pm_schedule_suspend(struct device *dev, unsigned int delay);
  19. extern int pm_request_resume(struct device *dev);
  20. extern int __pm_runtime_get(struct device *dev, bool sync);
  21. extern int __pm_runtime_put(struct device *dev, bool sync);
  22. extern int __pm_runtime_set_status(struct device *dev, unsigned int status);
  23. extern int pm_runtime_barrier(struct device *dev);
  24. extern void pm_runtime_enable(struct device *dev);
  25. extern void __pm_runtime_disable(struct device *dev, bool check_resume);
  26. extern void pm_runtime_allow(struct device *dev);
  27. extern void pm_runtime_forbid(struct device *dev);
  28. extern int pm_generic_runtime_idle(struct device *dev);
  29. extern int pm_generic_runtime_suspend(struct device *dev);
  30. extern int pm_generic_runtime_resume(struct device *dev);
  31. static inline bool pm_children_suspended(struct device *dev)
  32. {
  33. return dev->power.ignore_children
  34. || !atomic_read(&dev->power.child_count);
  35. }
  36. static inline void pm_suspend_ignore_children(struct device *dev, bool enable)
  37. {
  38. dev->power.ignore_children = enable;
  39. }
  40. static inline void pm_runtime_get_noresume(struct device *dev)
  41. {
  42. atomic_inc(&dev->power.usage_count);
  43. }
  44. static inline void pm_runtime_put_noidle(struct device *dev)
  45. {
  46. atomic_add_unless(&dev->power.usage_count, -1, 0);
  47. }
  48. static inline bool device_run_wake(struct device *dev)
  49. {
  50. return dev->power.run_wake;
  51. }
  52. static inline void device_set_run_wake(struct device *dev, bool enable)
  53. {
  54. dev->power.run_wake = enable;
  55. }
  56. static inline bool pm_runtime_suspended(struct device *dev)
  57. {
  58. return dev->power.runtime_status == RPM_SUSPENDED;
  59. }
  60. #else /* !CONFIG_PM_RUNTIME */
  61. static inline int pm_runtime_idle(struct device *dev) { return -ENOSYS; }
  62. static inline int pm_runtime_suspend(struct device *dev) { return -ENOSYS; }
  63. static inline int pm_runtime_resume(struct device *dev) { return 0; }
  64. static inline int pm_request_idle(struct device *dev) { return -ENOSYS; }
  65. static inline int pm_schedule_suspend(struct device *dev, unsigned int delay)
  66. {
  67. return -ENOSYS;
  68. }
  69. static inline int pm_request_resume(struct device *dev) { return 0; }
  70. static inline int __pm_runtime_get(struct device *dev, bool sync) { return 1; }
  71. static inline int __pm_runtime_put(struct device *dev, bool sync) { return 0; }
  72. static inline int __pm_runtime_set_status(struct device *dev,
  73. unsigned int status) { return 0; }
  74. static inline int pm_runtime_barrier(struct device *dev) { return 0; }
  75. static inline void pm_runtime_enable(struct device *dev) {}
  76. static inline void __pm_runtime_disable(struct device *dev, bool c) {}
  77. static inline void pm_runtime_allow(struct device *dev) {}
  78. static inline void pm_runtime_forbid(struct device *dev) {}
  79. static inline bool pm_children_suspended(struct device *dev) { return false; }
  80. static inline void pm_suspend_ignore_children(struct device *dev, bool en) {}
  81. static inline void pm_runtime_get_noresume(struct device *dev) {}
  82. static inline void pm_runtime_put_noidle(struct device *dev) {}
  83. static inline bool device_run_wake(struct device *dev) { return false; }
  84. static inline void device_set_run_wake(struct device *dev, bool enable) {}
  85. static inline bool pm_runtime_suspended(struct device *dev) { return false; }
  86. static inline int pm_generic_runtime_idle(struct device *dev) { return 0; }
  87. static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; }
  88. static inline int pm_generic_runtime_resume(struct device *dev) { return 0; }
  89. #endif /* !CONFIG_PM_RUNTIME */
  90. static inline int pm_runtime_get(struct device *dev)
  91. {
  92. return __pm_runtime_get(dev, false);
  93. }
  94. static inline int pm_runtime_get_sync(struct device *dev)
  95. {
  96. return __pm_runtime_get(dev, true);
  97. }
  98. static inline int pm_runtime_put(struct device *dev)
  99. {
  100. return __pm_runtime_put(dev, false);
  101. }
  102. static inline int pm_runtime_put_sync(struct device *dev)
  103. {
  104. return __pm_runtime_put(dev, true);
  105. }
  106. static inline int pm_runtime_set_active(struct device *dev)
  107. {
  108. return __pm_runtime_set_status(dev, RPM_ACTIVE);
  109. }
  110. static inline void pm_runtime_set_suspended(struct device *dev)
  111. {
  112. __pm_runtime_set_status(dev, RPM_SUSPENDED);
  113. }
  114. static inline void pm_runtime_disable(struct device *dev)
  115. {
  116. __pm_runtime_disable(dev, true);
  117. }
  118. #endif