Merge back earlier 'pm-runtime' material for 3.19-rc1.
This commit is contained in:
Коммит
af261127e9
|
@ -233,6 +233,7 @@ config IA64_SGI_UV
|
||||||
config IA64_HP_SIM
|
config IA64_HP_SIM
|
||||||
bool "Ski-simulator"
|
bool "Ski-simulator"
|
||||||
select SWIOTLB
|
select SWIOTLB
|
||||||
|
depends on !PM_RUNTIME
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
|
|
@ -13,42 +13,39 @@
|
||||||
#include <trace/events/rpm.h>
|
#include <trace/events/rpm.h>
|
||||||
#include "power.h"
|
#include "power.h"
|
||||||
|
|
||||||
#define RPM_GET_CALLBACK(dev, cb) \
|
typedef int (*pm_callback_t)(struct device *);
|
||||||
({ \
|
|
||||||
int (*__rpm_cb)(struct device *__d); \
|
|
||||||
\
|
|
||||||
if (dev->pm_domain) \
|
|
||||||
__rpm_cb = dev->pm_domain->ops.cb; \
|
|
||||||
else if (dev->type && dev->type->pm) \
|
|
||||||
__rpm_cb = dev->type->pm->cb; \
|
|
||||||
else if (dev->class && dev->class->pm) \
|
|
||||||
__rpm_cb = dev->class->pm->cb; \
|
|
||||||
else if (dev->bus && dev->bus->pm) \
|
|
||||||
__rpm_cb = dev->bus->pm->cb; \
|
|
||||||
else \
|
|
||||||
__rpm_cb = NULL; \
|
|
||||||
\
|
|
||||||
if (!__rpm_cb && dev->driver && dev->driver->pm) \
|
|
||||||
__rpm_cb = dev->driver->pm->cb; \
|
|
||||||
\
|
|
||||||
__rpm_cb; \
|
|
||||||
})
|
|
||||||
|
|
||||||
static int (*rpm_get_suspend_cb(struct device *dev))(struct device *)
|
static pm_callback_t __rpm_get_callback(struct device *dev, size_t cb_offset)
|
||||||
{
|
{
|
||||||
return RPM_GET_CALLBACK(dev, runtime_suspend);
|
pm_callback_t cb;
|
||||||
|
const struct dev_pm_ops *ops;
|
||||||
|
|
||||||
|
if (dev->pm_domain)
|
||||||
|
ops = &dev->pm_domain->ops;
|
||||||
|
else if (dev->type && dev->type->pm)
|
||||||
|
ops = dev->type->pm;
|
||||||
|
else if (dev->class && dev->class->pm)
|
||||||
|
ops = dev->class->pm;
|
||||||
|
else if (dev->bus && dev->bus->pm)
|
||||||
|
ops = dev->bus->pm;
|
||||||
|
else
|
||||||
|
ops = NULL;
|
||||||
|
|
||||||
|
if (ops)
|
||||||
|
cb = *(pm_callback_t *)((void *)ops + cb_offset);
|
||||||
|
else
|
||||||
|
cb = NULL;
|
||||||
|
|
||||||
|
if (!cb && dev->driver && dev->driver->pm)
|
||||||
|
cb = *(pm_callback_t *)((void *)dev->driver->pm + cb_offset);
|
||||||
|
|
||||||
|
return cb;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int (*rpm_get_resume_cb(struct device *dev))(struct device *)
|
#define RPM_GET_CALLBACK(dev, callback) \
|
||||||
{
|
__rpm_get_callback(dev, offsetof(struct dev_pm_ops, callback))
|
||||||
return RPM_GET_CALLBACK(dev, runtime_resume);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_PM_RUNTIME
|
#ifdef CONFIG_PM_RUNTIME
|
||||||
static int (*rpm_get_idle_cb(struct device *dev))(struct device *)
|
|
||||||
{
|
|
||||||
return RPM_GET_CALLBACK(dev, runtime_idle);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int rpm_resume(struct device *dev, int rpmflags);
|
static int rpm_resume(struct device *dev, int rpmflags);
|
||||||
static int rpm_suspend(struct device *dev, int rpmflags);
|
static int rpm_suspend(struct device *dev, int rpmflags);
|
||||||
|
@ -347,7 +344,7 @@ static int rpm_idle(struct device *dev, int rpmflags)
|
||||||
|
|
||||||
dev->power.idle_notification = true;
|
dev->power.idle_notification = true;
|
||||||
|
|
||||||
callback = rpm_get_idle_cb(dev);
|
callback = RPM_GET_CALLBACK(dev, runtime_idle);
|
||||||
|
|
||||||
if (callback)
|
if (callback)
|
||||||
retval = __rpm_callback(callback, dev);
|
retval = __rpm_callback(callback, dev);
|
||||||
|
@ -517,7 +514,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)
|
||||||
|
|
||||||
__update_runtime_status(dev, RPM_SUSPENDING);
|
__update_runtime_status(dev, RPM_SUSPENDING);
|
||||||
|
|
||||||
callback = rpm_get_suspend_cb(dev);
|
callback = RPM_GET_CALLBACK(dev, runtime_suspend);
|
||||||
|
|
||||||
retval = rpm_callback(callback, dev);
|
retval = rpm_callback(callback, dev);
|
||||||
if (retval)
|
if (retval)
|
||||||
|
@ -737,7 +734,7 @@ static int rpm_resume(struct device *dev, int rpmflags)
|
||||||
|
|
||||||
__update_runtime_status(dev, RPM_RESUMING);
|
__update_runtime_status(dev, RPM_RESUMING);
|
||||||
|
|
||||||
callback = rpm_get_resume_cb(dev);
|
callback = RPM_GET_CALLBACK(dev, runtime_resume);
|
||||||
|
|
||||||
retval = rpm_callback(callback, dev);
|
retval = rpm_callback(callback, dev);
|
||||||
if (retval) {
|
if (retval) {
|
||||||
|
@ -1431,7 +1428,7 @@ int pm_runtime_force_suspend(struct device *dev)
|
||||||
if (pm_runtime_status_suspended(dev))
|
if (pm_runtime_status_suspended(dev))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
callback = rpm_get_suspend_cb(dev);
|
callback = RPM_GET_CALLBACK(dev, runtime_suspend);
|
||||||
|
|
||||||
if (!callback) {
|
if (!callback) {
|
||||||
ret = -ENOSYS;
|
ret = -ENOSYS;
|
||||||
|
@ -1467,7 +1464,7 @@ int pm_runtime_force_resume(struct device *dev)
|
||||||
int (*callback)(struct device *);
|
int (*callback)(struct device *);
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
callback = rpm_get_resume_cb(dev);
|
callback = RPM_GET_CALLBACK(dev, runtime_resume);
|
||||||
|
|
||||||
if (!callback) {
|
if (!callback) {
|
||||||
ret = -ENOSYS;
|
ret = -ENOSYS;
|
||||||
|
|
|
@ -94,6 +94,7 @@ config PM_STD_PARTITION
|
||||||
config PM_SLEEP
|
config PM_SLEEP
|
||||||
def_bool y
|
def_bool y
|
||||||
depends on SUSPEND || HIBERNATE_CALLBACKS
|
depends on SUSPEND || HIBERNATE_CALLBACKS
|
||||||
|
select PM_RUNTIME
|
||||||
|
|
||||||
config PM_SLEEP_SMP
|
config PM_SLEEP_SMP
|
||||||
def_bool y
|
def_bool y
|
||||||
|
@ -131,7 +132,6 @@ config PM_WAKELOCKS_GC
|
||||||
|
|
||||||
config PM_RUNTIME
|
config PM_RUNTIME
|
||||||
bool "Run-time PM core functionality"
|
bool "Run-time PM core functionality"
|
||||||
depends on !IA64_HP_SIM
|
|
||||||
---help---
|
---help---
|
||||||
Enable functionality allowing I/O devices to be put into energy-saving
|
Enable functionality allowing I/O devices to be put into energy-saving
|
||||||
(low power) states at run time (or autosuspended) after a specified
|
(low power) states at run time (or autosuspended) after a specified
|
||||||
|
|
Загрузка…
Ссылка в новой задаче