···1313#include <trace/events/rpm.h>1414#include "power.h"15151616-#define RPM_GET_CALLBACK(dev, cb) \1717-({ \1818- int (*__rpm_cb)(struct device *__d); \1919- \2020- if (dev->pm_domain) \2121- __rpm_cb = dev->pm_domain->ops.cb; \2222- else if (dev->type && dev->type->pm) \2323- __rpm_cb = dev->type->pm->cb; \2424- else if (dev->class && dev->class->pm) \2525- __rpm_cb = dev->class->pm->cb; \2626- else if (dev->bus && dev->bus->pm) \2727- __rpm_cb = dev->bus->pm->cb; \2828- else \2929- __rpm_cb = NULL; \3030- \3131- if (!__rpm_cb && dev->driver && dev->driver->pm) \3232- __rpm_cb = dev->driver->pm->cb; \3333- \3434- __rpm_cb; \3535-})1616+typedef int (*pm_callback_t)(struct device *);36173737-static int (*rpm_get_suspend_cb(struct device *dev))(struct device *)1818+static pm_callback_t __rpm_get_callback(struct device *dev, size_t cb_offset)3819{3939- return RPM_GET_CALLBACK(dev, runtime_suspend);2020+ pm_callback_t cb;2121+ const struct dev_pm_ops *ops;2222+2323+ if (dev->pm_domain)2424+ ops = &dev->pm_domain->ops;2525+ else if (dev->type && dev->type->pm)2626+ ops = dev->type->pm;2727+ else if (dev->class && dev->class->pm)2828+ ops = dev->class->pm;2929+ else if (dev->bus && dev->bus->pm)3030+ ops = dev->bus->pm;3131+ else3232+ ops = NULL;3333+3434+ if (ops)3535+ cb = *(pm_callback_t *)((void *)ops + cb_offset);3636+ else3737+ cb = NULL;3838+3939+ if (!cb && dev->driver && dev->driver->pm)4040+ cb = *(pm_callback_t *)((void *)dev->driver->pm + cb_offset);4141+4242+ return cb;4043}41444242-static int (*rpm_get_resume_cb(struct device *dev))(struct device *)4343-{4444- return RPM_GET_CALLBACK(dev, runtime_resume);4545-}4545+#define RPM_GET_CALLBACK(dev, callback) \4646+ __rpm_get_callback(dev, offsetof(struct dev_pm_ops, callback))46474748#ifdef CONFIG_PM_RUNTIME4848-static int (*rpm_get_idle_cb(struct device *dev))(struct device *)4949-{5050- return RPM_GET_CALLBACK(dev, runtime_idle);5151-}52495350static int rpm_resume(struct device *dev, int rpmflags);5451static int rpm_suspend(struct device *dev, int rpmflags);···344347345348 dev->power.idle_notification = true;346349347347- callback = rpm_get_idle_cb(dev);350350+ callback = RPM_GET_CALLBACK(dev, runtime_idle);348351349352 if (callback)350353 retval = __rpm_callback(callback, dev);···514517515518 __update_runtime_status(dev, RPM_SUSPENDING);516519517517- callback = rpm_get_suspend_cb(dev);520520+ callback = RPM_GET_CALLBACK(dev, runtime_suspend);518521519522 retval = rpm_callback(callback, dev);520523 if (retval)···734737735738 __update_runtime_status(dev, RPM_RESUMING);736739737737- callback = rpm_get_resume_cb(dev);740740+ callback = RPM_GET_CALLBACK(dev, runtime_resume);738741739742 retval = rpm_callback(callback, dev);740743 if (retval) {···14281431 if (pm_runtime_status_suspended(dev))14291432 return 0;1430143314311431- callback = rpm_get_suspend_cb(dev);14341434+ callback = RPM_GET_CALLBACK(dev, runtime_suspend);1432143514331436 if (!callback) {14341437 ret = -ENOSYS;···14641467 int (*callback)(struct device *);14651468 int ret = 0;1466146914671467- callback = rpm_get_resume_cb(dev);14701470+ callback = RPM_GET_CALLBACK(dev, runtime_resume);1468147114691472 if (!callback) {14701473 ret = -ENOSYS;
+1-1
kernel/power/Kconfig
···9494config PM_SLEEP9595 def_bool y9696 depends on SUSPEND || HIBERNATE_CALLBACKS9797+ select PM_RUNTIME97989899config PM_SLEEP_SMP99100 def_bool y···132131133132config PM_RUNTIME134133 bool "Run-time PM core functionality"135135- depends on !IA64_HP_SIM136134 ---help---137135 Enable functionality allowing I/O devices to be put into energy-saving138136 (low power) states at run time (or autosuspended) after a specified