15e928f77SRafael J. Wysocki /* 25e928f77SRafael J. Wysocki * pm_runtime.h - Device run-time power management helper functions. 35e928f77SRafael J. Wysocki * 45e928f77SRafael J. Wysocki * Copyright (C) 2009 Rafael J. Wysocki <[email protected]> 55e928f77SRafael J. Wysocki * 65e928f77SRafael J. Wysocki * This file is released under the GPLv2. 75e928f77SRafael J. Wysocki */ 85e928f77SRafael J. Wysocki 95e928f77SRafael J. Wysocki #ifndef _LINUX_PM_RUNTIME_H 105e928f77SRafael J. Wysocki #define _LINUX_PM_RUNTIME_H 115e928f77SRafael J. Wysocki 125e928f77SRafael J. Wysocki #include <linux/device.h> 135e928f77SRafael J. Wysocki #include <linux/pm.h> 145e928f77SRafael J. Wysocki 155e928f77SRafael J. Wysocki #ifdef CONFIG_PM_RUNTIME 165e928f77SRafael J. Wysocki 175e928f77SRafael J. Wysocki extern struct workqueue_struct *pm_wq; 185e928f77SRafael J. Wysocki 195e928f77SRafael J. Wysocki extern int pm_runtime_idle(struct device *dev); 205e928f77SRafael J. Wysocki extern int pm_runtime_suspend(struct device *dev); 215e928f77SRafael J. Wysocki extern int pm_runtime_resume(struct device *dev); 225e928f77SRafael J. Wysocki extern int pm_request_idle(struct device *dev); 235e928f77SRafael J. Wysocki extern int pm_schedule_suspend(struct device *dev, unsigned int delay); 245e928f77SRafael J. Wysocki extern int pm_request_resume(struct device *dev); 255e928f77SRafael J. Wysocki extern int __pm_runtime_get(struct device *dev, bool sync); 265e928f77SRafael J. Wysocki extern int __pm_runtime_put(struct device *dev, bool sync); 275e928f77SRafael J. Wysocki extern int __pm_runtime_set_status(struct device *dev, unsigned int status); 285e928f77SRafael J. Wysocki extern int pm_runtime_barrier(struct device *dev); 295e928f77SRafael J. Wysocki extern void pm_runtime_enable(struct device *dev); 305e928f77SRafael J. Wysocki extern void __pm_runtime_disable(struct device *dev, bool check_resume); 3153823639SRafael J. Wysocki extern void pm_runtime_allow(struct device *dev); 3253823639SRafael J. Wysocki extern void pm_runtime_forbid(struct device *dev); 335e928f77SRafael J. Wysocki 345e928f77SRafael J. Wysocki static inline bool pm_children_suspended(struct device *dev) 355e928f77SRafael J. Wysocki { 365e928f77SRafael J. Wysocki return dev->power.ignore_children 375e928f77SRafael J. Wysocki || !atomic_read(&dev->power.child_count); 385e928f77SRafael J. Wysocki } 395e928f77SRafael J. Wysocki 405e928f77SRafael J. Wysocki static inline void pm_suspend_ignore_children(struct device *dev, bool enable) 415e928f77SRafael J. Wysocki { 425e928f77SRafael J. Wysocki dev->power.ignore_children = enable; 435e928f77SRafael J. Wysocki } 445e928f77SRafael J. Wysocki 455e928f77SRafael J. Wysocki static inline void pm_runtime_get_noresume(struct device *dev) 465e928f77SRafael J. Wysocki { 475e928f77SRafael J. Wysocki atomic_inc(&dev->power.usage_count); 485e928f77SRafael J. Wysocki } 495e928f77SRafael J. Wysocki 505e928f77SRafael J. Wysocki static inline void pm_runtime_put_noidle(struct device *dev) 515e928f77SRafael J. Wysocki { 525e928f77SRafael J. Wysocki atomic_add_unless(&dev->power.usage_count, -1, 0); 535e928f77SRafael J. Wysocki } 545e928f77SRafael J. Wysocki 557a1a8eb5SRafael J. Wysocki static inline bool device_run_wake(struct device *dev) 567a1a8eb5SRafael J. Wysocki { 577a1a8eb5SRafael J. Wysocki return dev->power.run_wake; 587a1a8eb5SRafael J. Wysocki } 597a1a8eb5SRafael J. Wysocki 607a1a8eb5SRafael J. Wysocki static inline void device_set_run_wake(struct device *dev, bool enable) 617a1a8eb5SRafael J. Wysocki { 627a1a8eb5SRafael J. Wysocki dev->power.run_wake = enable; 637a1a8eb5SRafael J. Wysocki } 647a1a8eb5SRafael J. Wysocki 65*d690b2cdSRafael J. Wysocki static inline bool pm_runtime_suspended(struct device *dev) 66*d690b2cdSRafael J. Wysocki { 67*d690b2cdSRafael J. Wysocki return dev->power.runtime_status == RPM_SUSPENDED; 68*d690b2cdSRafael J. Wysocki } 69*d690b2cdSRafael J. Wysocki 705e928f77SRafael J. Wysocki #else /* !CONFIG_PM_RUNTIME */ 715e928f77SRafael J. Wysocki 725e928f77SRafael J. Wysocki static inline int pm_runtime_idle(struct device *dev) { return -ENOSYS; } 735e928f77SRafael J. Wysocki static inline int pm_runtime_suspend(struct device *dev) { return -ENOSYS; } 745e928f77SRafael J. Wysocki static inline int pm_runtime_resume(struct device *dev) { return 0; } 755e928f77SRafael J. Wysocki static inline int pm_request_idle(struct device *dev) { return -ENOSYS; } 765e928f77SRafael J. Wysocki static inline int pm_schedule_suspend(struct device *dev, unsigned int delay) 775e928f77SRafael J. Wysocki { 785e928f77SRafael J. Wysocki return -ENOSYS; 795e928f77SRafael J. Wysocki } 805e928f77SRafael J. Wysocki static inline int pm_request_resume(struct device *dev) { return 0; } 815e928f77SRafael J. Wysocki static inline int __pm_runtime_get(struct device *dev, bool sync) { return 1; } 825e928f77SRafael J. Wysocki static inline int __pm_runtime_put(struct device *dev, bool sync) { return 0; } 835e928f77SRafael J. Wysocki static inline int __pm_runtime_set_status(struct device *dev, 845e928f77SRafael J. Wysocki unsigned int status) { return 0; } 855e928f77SRafael J. Wysocki static inline int pm_runtime_barrier(struct device *dev) { return 0; } 865e928f77SRafael J. Wysocki static inline void pm_runtime_enable(struct device *dev) {} 875e928f77SRafael J. Wysocki static inline void __pm_runtime_disable(struct device *dev, bool c) {} 8853823639SRafael J. Wysocki static inline void pm_runtime_allow(struct device *dev) {} 8953823639SRafael J. Wysocki static inline void pm_runtime_forbid(struct device *dev) {} 905e928f77SRafael J. Wysocki 915e928f77SRafael J. Wysocki static inline bool pm_children_suspended(struct device *dev) { return false; } 925e928f77SRafael J. Wysocki static inline void pm_suspend_ignore_children(struct device *dev, bool en) {} 935e928f77SRafael J. Wysocki static inline void pm_runtime_get_noresume(struct device *dev) {} 945e928f77SRafael J. Wysocki static inline void pm_runtime_put_noidle(struct device *dev) {} 957a1a8eb5SRafael J. Wysocki static inline bool device_run_wake(struct device *dev) { return false; } 967a1a8eb5SRafael J. Wysocki static inline void device_set_run_wake(struct device *dev, bool enable) {} 97*d690b2cdSRafael J. Wysocki static inline bool pm_runtime_suspended(struct device *dev) { return false; } 985e928f77SRafael J. Wysocki 995e928f77SRafael J. Wysocki #endif /* !CONFIG_PM_RUNTIME */ 1005e928f77SRafael J. Wysocki 1015e928f77SRafael J. Wysocki static inline int pm_runtime_get(struct device *dev) 1025e928f77SRafael J. Wysocki { 1035e928f77SRafael J. Wysocki return __pm_runtime_get(dev, false); 1045e928f77SRafael J. Wysocki } 1055e928f77SRafael J. Wysocki 1065e928f77SRafael J. Wysocki static inline int pm_runtime_get_sync(struct device *dev) 1075e928f77SRafael J. Wysocki { 1085e928f77SRafael J. Wysocki return __pm_runtime_get(dev, true); 1095e928f77SRafael J. Wysocki } 1105e928f77SRafael J. Wysocki 1115e928f77SRafael J. Wysocki static inline int pm_runtime_put(struct device *dev) 1125e928f77SRafael J. Wysocki { 1135e928f77SRafael J. Wysocki return __pm_runtime_put(dev, false); 1145e928f77SRafael J. Wysocki } 1155e928f77SRafael J. Wysocki 1165e928f77SRafael J. Wysocki static inline int pm_runtime_put_sync(struct device *dev) 1175e928f77SRafael J. Wysocki { 1185e928f77SRafael J. Wysocki return __pm_runtime_put(dev, true); 1195e928f77SRafael J. Wysocki } 1205e928f77SRafael J. Wysocki 1215e928f77SRafael J. Wysocki static inline int pm_runtime_set_active(struct device *dev) 1225e928f77SRafael J. Wysocki { 1235e928f77SRafael J. Wysocki return __pm_runtime_set_status(dev, RPM_ACTIVE); 1245e928f77SRafael J. Wysocki } 1255e928f77SRafael J. Wysocki 1265e928f77SRafael J. Wysocki static inline void pm_runtime_set_suspended(struct device *dev) 1275e928f77SRafael J. Wysocki { 1285e928f77SRafael J. Wysocki __pm_runtime_set_status(dev, RPM_SUSPENDED); 1295e928f77SRafael J. Wysocki } 1305e928f77SRafael J. Wysocki 1315e928f77SRafael J. Wysocki static inline void pm_runtime_disable(struct device *dev) 1325e928f77SRafael J. Wysocki { 1335e928f77SRafael J. Wysocki __pm_runtime_disable(dev, true); 1345e928f77SRafael J. Wysocki } 1355e928f77SRafael J. Wysocki 1365e928f77SRafael J. Wysocki #endif 137