generic_ops.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. /*
  2. * drivers/base/power/generic_ops.c - Generic PM callbacks for subsystems
  3. *
  4. * Copyright (c) 2010 Rafael J. Wysocki <rjw@sisk.pl>, Novell Inc.
  5. *
  6. * This file is released under the GPLv2.
  7. */
  8. #include <linux/pm.h>
  9. #include <linux/pm_runtime.h>
  10. #include <linux/export.h>
  11. #ifdef CONFIG_PM
  12. /**
  13. * pm_generic_runtime_suspend - Generic runtime suspend callback for subsystems.
  14. * @dev: Device to suspend.
  15. *
  16. * If PM operations are defined for the @dev's driver and they include
  17. * ->runtime_suspend(), execute it and return its error code. Otherwise,
  18. * return 0.
  19. */
  20. int pm_generic_runtime_suspend(struct device *dev)
  21. {
  22. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  23. int ret;
  24. ret = pm && pm->runtime_suspend ? pm->runtime_suspend(dev) : 0;
  25. return ret;
  26. }
  27. EXPORT_SYMBOL_GPL(pm_generic_runtime_suspend);
  28. /**
  29. * pm_generic_runtime_resume - Generic runtime resume callback for subsystems.
  30. * @dev: Device to resume.
  31. *
  32. * If PM operations are defined for the @dev's driver and they include
  33. * ->runtime_resume(), execute it and return its error code. Otherwise,
  34. * return 0.
  35. */
  36. int pm_generic_runtime_resume(struct device *dev)
  37. {
  38. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  39. int ret;
  40. ret = pm && pm->runtime_resume ? pm->runtime_resume(dev) : 0;
  41. return ret;
  42. }
  43. EXPORT_SYMBOL_GPL(pm_generic_runtime_resume);
  44. #endif /* CONFIG_PM */
  45. #ifdef CONFIG_PM_SLEEP
  46. /**
  47. * pm_generic_prepare - Generic routine preparing a device for power transition.
  48. * @dev: Device to prepare.
  49. *
  50. * Prepare a device for a system-wide power transition.
  51. */
  52. int pm_generic_prepare(struct device *dev)
  53. {
  54. struct device_driver *drv = dev->driver;
  55. int ret = 0;
  56. if (drv && drv->pm && drv->pm->prepare)
  57. ret = drv->pm->prepare(dev);
  58. return ret;
  59. }
  60. /**
  61. * pm_generic_suspend_noirq - Generic suspend_noirq callback for subsystems.
  62. * @dev: Device to suspend.
  63. */
  64. int pm_generic_suspend_noirq(struct device *dev)
  65. {
  66. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  67. return pm && pm->suspend_noirq ? pm->suspend_noirq(dev) : 0;
  68. }
  69. EXPORT_SYMBOL_GPL(pm_generic_suspend_noirq);
  70. /**
  71. * pm_generic_suspend_late - Generic suspend_late callback for subsystems.
  72. * @dev: Device to suspend.
  73. */
  74. int pm_generic_suspend_late(struct device *dev)
  75. {
  76. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  77. return pm && pm->suspend_late ? pm->suspend_late(dev) : 0;
  78. }
  79. EXPORT_SYMBOL_GPL(pm_generic_suspend_late);
  80. /**
  81. * pm_generic_suspend - Generic suspend callback for subsystems.
  82. * @dev: Device to suspend.
  83. */
  84. int pm_generic_suspend(struct device *dev)
  85. {
  86. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  87. return pm && pm->suspend ? pm->suspend(dev) : 0;
  88. }
  89. EXPORT_SYMBOL_GPL(pm_generic_suspend);
  90. /**
  91. * pm_generic_freeze_noirq - Generic freeze_noirq callback for subsystems.
  92. * @dev: Device to freeze.
  93. */
  94. int pm_generic_freeze_noirq(struct device *dev)
  95. {
  96. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  97. return pm && pm->freeze_noirq ? pm->freeze_noirq(dev) : 0;
  98. }
  99. EXPORT_SYMBOL_GPL(pm_generic_freeze_noirq);
  100. /**
  101. * pm_generic_freeze_late - Generic freeze_late callback for subsystems.
  102. * @dev: Device to freeze.
  103. */
  104. int pm_generic_freeze_late(struct device *dev)
  105. {
  106. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  107. return pm && pm->freeze_late ? pm->freeze_late(dev) : 0;
  108. }
  109. EXPORT_SYMBOL_GPL(pm_generic_freeze_late);
  110. /**
  111. * pm_generic_freeze - Generic freeze callback for subsystems.
  112. * @dev: Device to freeze.
  113. */
  114. int pm_generic_freeze(struct device *dev)
  115. {
  116. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  117. return pm && pm->freeze ? pm->freeze(dev) : 0;
  118. }
  119. EXPORT_SYMBOL_GPL(pm_generic_freeze);
  120. /**
  121. * pm_generic_poweroff_noirq - Generic poweroff_noirq callback for subsystems.
  122. * @dev: Device to handle.
  123. */
  124. int pm_generic_poweroff_noirq(struct device *dev)
  125. {
  126. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  127. return pm && pm->poweroff_noirq ? pm->poweroff_noirq(dev) : 0;
  128. }
  129. EXPORT_SYMBOL_GPL(pm_generic_poweroff_noirq);
  130. /**
  131. * pm_generic_poweroff_late - Generic poweroff_late callback for subsystems.
  132. * @dev: Device to handle.
  133. */
  134. int pm_generic_poweroff_late(struct device *dev)
  135. {
  136. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  137. return pm && pm->poweroff_late ? pm->poweroff_late(dev) : 0;
  138. }
  139. EXPORT_SYMBOL_GPL(pm_generic_poweroff_late);
  140. /**
  141. * pm_generic_poweroff - Generic poweroff callback for subsystems.
  142. * @dev: Device to handle.
  143. */
  144. int pm_generic_poweroff(struct device *dev)
  145. {
  146. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  147. return pm && pm->poweroff ? pm->poweroff(dev) : 0;
  148. }
  149. EXPORT_SYMBOL_GPL(pm_generic_poweroff);
  150. /**
  151. * pm_generic_thaw_noirq - Generic thaw_noirq callback for subsystems.
  152. * @dev: Device to thaw.
  153. */
  154. int pm_generic_thaw_noirq(struct device *dev)
  155. {
  156. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  157. return pm && pm->thaw_noirq ? pm->thaw_noirq(dev) : 0;
  158. }
  159. EXPORT_SYMBOL_GPL(pm_generic_thaw_noirq);
  160. /**
  161. * pm_generic_thaw_early - Generic thaw_early callback for subsystems.
  162. * @dev: Device to thaw.
  163. */
  164. int pm_generic_thaw_early(struct device *dev)
  165. {
  166. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  167. return pm && pm->thaw_early ? pm->thaw_early(dev) : 0;
  168. }
  169. EXPORT_SYMBOL_GPL(pm_generic_thaw_early);
  170. /**
  171. * pm_generic_thaw - Generic thaw callback for subsystems.
  172. * @dev: Device to thaw.
  173. */
  174. int pm_generic_thaw(struct device *dev)
  175. {
  176. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  177. return pm && pm->thaw ? pm->thaw(dev) : 0;
  178. }
  179. EXPORT_SYMBOL_GPL(pm_generic_thaw);
  180. /**
  181. * pm_generic_resume_noirq - Generic resume_noirq callback for subsystems.
  182. * @dev: Device to resume.
  183. */
  184. int pm_generic_resume_noirq(struct device *dev)
  185. {
  186. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  187. return pm && pm->resume_noirq ? pm->resume_noirq(dev) : 0;
  188. }
  189. EXPORT_SYMBOL_GPL(pm_generic_resume_noirq);
  190. /**
  191. * pm_generic_resume_early - Generic resume_early callback for subsystems.
  192. * @dev: Device to resume.
  193. */
  194. int pm_generic_resume_early(struct device *dev)
  195. {
  196. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  197. return pm && pm->resume_early ? pm->resume_early(dev) : 0;
  198. }
  199. EXPORT_SYMBOL_GPL(pm_generic_resume_early);
  200. /**
  201. * pm_generic_resume - Generic resume callback for subsystems.
  202. * @dev: Device to resume.
  203. */
  204. int pm_generic_resume(struct device *dev)
  205. {
  206. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  207. return pm && pm->resume ? pm->resume(dev) : 0;
  208. }
  209. EXPORT_SYMBOL_GPL(pm_generic_resume);
  210. /**
  211. * pm_generic_restore_noirq - Generic restore_noirq callback for subsystems.
  212. * @dev: Device to restore.
  213. */
  214. int pm_generic_restore_noirq(struct device *dev)
  215. {
  216. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  217. return pm && pm->restore_noirq ? pm->restore_noirq(dev) : 0;
  218. }
  219. EXPORT_SYMBOL_GPL(pm_generic_restore_noirq);
  220. /**
  221. * pm_generic_restore_early - Generic restore_early callback for subsystems.
  222. * @dev: Device to resume.
  223. */
  224. int pm_generic_restore_early(struct device *dev)
  225. {
  226. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  227. return pm && pm->restore_early ? pm->restore_early(dev) : 0;
  228. }
  229. EXPORT_SYMBOL_GPL(pm_generic_restore_early);
  230. /**
  231. * pm_generic_restore - Generic restore callback for subsystems.
  232. * @dev: Device to restore.
  233. */
  234. int pm_generic_restore(struct device *dev)
  235. {
  236. const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
  237. return pm && pm->restore ? pm->restore(dev) : 0;
  238. }
  239. EXPORT_SYMBOL_GPL(pm_generic_restore);
  240. /**
  241. * pm_generic_complete - Generic routine completing a device power transition.
  242. * @dev: Device to handle.
  243. *
  244. * Complete a device power transition during a system-wide power transition.
  245. */
  246. void pm_generic_complete(struct device *dev)
  247. {
  248. struct device_driver *drv = dev->driver;
  249. if (drv && drv->pm && drv->pm->complete)
  250. drv->pm->complete(dev);
  251. }
  252. #endif /* CONFIG_PM_SLEEP */