Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit af261127 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

Merge back earlier 'pm-runtime' material for 3.19-rc1.

parents 5d01410f b2b49ccb
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -233,6 +233,7 @@ config IA64_SGI_UV
config IA64_HP_SIM
	bool "Ski-simulator"
	select SWIOTLB
	depends on !PM_RUNTIME

endchoice

+33 −36
Original line number Diff line number Diff line
@@ -13,42 +13,39 @@
#include <trace/events/rpm.h>
#include "power.h"

#define RPM_GET_CALLBACK(dev, cb)				\
({								\
	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 *)
{
	return RPM_GET_CALLBACK(dev, runtime_suspend);
}
typedef int (*pm_callback_t)(struct device *);

static int (*rpm_get_resume_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_resume);
	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;
}

#define RPM_GET_CALLBACK(dev, callback) \
		__rpm_get_callback(dev, offsetof(struct dev_pm_ops, callback))

#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_suspend(struct device *dev, int rpmflags);
@@ -347,7 +344,7 @@ static int rpm_idle(struct device *dev, int rpmflags)

	dev->power.idle_notification = true;

	callback = rpm_get_idle_cb(dev);
	callback = RPM_GET_CALLBACK(dev, runtime_idle);

	if (callback)
		retval = __rpm_callback(callback, dev);
@@ -517,7 +514,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)

	__update_runtime_status(dev, RPM_SUSPENDING);

	callback = rpm_get_suspend_cb(dev);
	callback = RPM_GET_CALLBACK(dev, runtime_suspend);

	retval = rpm_callback(callback, dev);
	if (retval)
@@ -737,7 +734,7 @@ static int rpm_resume(struct device *dev, int rpmflags)

	__update_runtime_status(dev, RPM_RESUMING);

	callback = rpm_get_resume_cb(dev);
	callback = RPM_GET_CALLBACK(dev, runtime_resume);

	retval = rpm_callback(callback, dev);
	if (retval) {
@@ -1431,7 +1428,7 @@ int pm_runtime_force_suspend(struct device *dev)
	if (pm_runtime_status_suspended(dev))
		return 0;

	callback = rpm_get_suspend_cb(dev);
	callback = RPM_GET_CALLBACK(dev, runtime_suspend);

	if (!callback) {
		ret = -ENOSYS;
@@ -1467,7 +1464,7 @@ int pm_runtime_force_resume(struct device *dev)
	int (*callback)(struct device *);
	int ret = 0;

	callback = rpm_get_resume_cb(dev);
	callback = RPM_GET_CALLBACK(dev, runtime_resume);

	if (!callback) {
		ret = -ENOSYS;
+1 −1
Original line number Diff line number Diff line
@@ -94,6 +94,7 @@ config PM_STD_PARTITION
config PM_SLEEP
	def_bool y
	depends on SUSPEND || HIBERNATE_CALLBACKS
	select PM_RUNTIME

config PM_SLEEP_SMP
	def_bool y
@@ -131,7 +132,6 @@ config PM_WAKELOCKS_GC

config PM_RUNTIME
	bool "Run-time PM core functionality"
	depends on !IA64_HP_SIM
	---help---
	  Enable functionality allowing I/O devices to be put into energy-saving
	  (low power) states at run time (or autosuspended) after a specified