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

Commit ca078bae authored by Pavel Machek's avatar Pavel Machek Committed by Linus Torvalds
Browse files

[PATCH] swsusp: switch pm_message_t to struct



This adds type-checking to pm_message_t, so that people can't confuse it
with int or u32.  It also allows us to fix "disk yoyo" during suspend (disk
spinning down/up/down).

[We've tried that before; since that cpufreq problems were fixed and I've
tried make allyes config and fixed resulting damage.]

Signed-off-by: default avatarPavel Machek <pavel@suse.cz>
Signed-off-by: default avatarAlexander Nyberg <alexn@telia.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 829ca9a3
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -105,7 +105,7 @@ static int of_device_remove(struct device *dev)
	return 0;
	return 0;
}
}


static int of_device_suspend(struct device *dev, u32 state)
static int of_device_suspend(struct device *dev, pm_message_t state)
{
{
	struct of_device * of_dev = to_of_device(dev);
	struct of_device * of_dev = to_of_device(dev);
	struct of_platform_driver * drv = to_of_platform_driver(dev->driver);
	struct of_platform_driver * drv = to_of_platform_driver(dev->driver);
+4 −4
Original line number Original line Diff line number Diff line
@@ -26,11 +26,11 @@ int resume_device(struct device * dev)


	down(&dev->sem);
	down(&dev->sem);
	if (dev->power.pm_parent
	if (dev->power.pm_parent
			&& dev->power.pm_parent->power.power_state) {
			&& dev->power.pm_parent->power.power_state.event) {
		dev_err(dev, "PM: resume from %d, parent %s still %d\n",
		dev_err(dev, "PM: resume from %d, parent %s still %d\n",
			dev->power.power_state,
			dev->power.power_state.event,
			dev->power.pm_parent->bus_id,
			dev->power.pm_parent->bus_id,
			dev->power.pm_parent->power.power_state);
			dev->power.pm_parent->power.power_state.event);
	}
	}
	if (dev->bus && dev->bus->resume) {
	if (dev->bus && dev->bus->resume) {
		dev_dbg(dev,"resuming\n");
		dev_dbg(dev,"resuming\n");
@@ -54,7 +54,7 @@ void dpm_resume(void)
		list_add_tail(entry, &dpm_active);
		list_add_tail(entry, &dpm_active);


		up(&dpm_list_sem);
		up(&dpm_list_sem);
		if (!dev->power.prev_state)
		if (!dev->power.prev_state.event)
			resume_device(dev);
			resume_device(dev);
		down(&dpm_list_sem);
		down(&dpm_list_sem);
		put_device(dev);
		put_device(dev);
+4 −4
Original line number Original line Diff line number Diff line
@@ -13,10 +13,10 @@
static void runtime_resume(struct device * dev)
static void runtime_resume(struct device * dev)
{
{
	dev_dbg(dev, "resuming\n");
	dev_dbg(dev, "resuming\n");
	if (!dev->power.power_state)
	if (!dev->power.power_state.event)
		return;
		return;
	if (!resume_device(dev))
	if (!resume_device(dev))
		dev->power.power_state = 0;
		dev->power.power_state = PMSG_ON;
}
}




@@ -49,10 +49,10 @@ int dpm_runtime_suspend(struct device * dev, pm_message_t state)
	int error = 0;
	int error = 0;


	down(&dpm_sem);
	down(&dpm_sem);
	if (dev->power.power_state == state)
	if (dev->power.power_state.event == state.event)
		goto Done;
		goto Done;


	if (dev->power.power_state)
	if (dev->power.power_state.event)
		runtime_resume(dev);
		runtime_resume(dev);


	if (!(error = suspend_device(dev, state)))
	if (!(error = suspend_device(dev, state)))
+6 −6
Original line number Original line Diff line number Diff line
@@ -40,22 +40,22 @@ int suspend_device(struct device * dev, pm_message_t state)
	int error = 0;
	int error = 0;


	down(&dev->sem);
	down(&dev->sem);
	if (dev->power.power_state) {
	if (dev->power.power_state.event) {
		dev_dbg(dev, "PM: suspend %d-->%d\n",
		dev_dbg(dev, "PM: suspend %d-->%d\n",
			dev->power.power_state, state);
			dev->power.power_state.event, state.event);
	}
	}
	if (dev->power.pm_parent
	if (dev->power.pm_parent
			&& dev->power.pm_parent->power.power_state) {
			&& dev->power.pm_parent->power.power_state.event) {
		dev_err(dev,
		dev_err(dev,
			"PM: suspend %d->%d, parent %s already %d\n",
			"PM: suspend %d->%d, parent %s already %d\n",
			dev->power.power_state, state,
			dev->power.power_state.event, state.event,
			dev->power.pm_parent->bus_id,
			dev->power.pm_parent->bus_id,
			dev->power.pm_parent->power.power_state);
			dev->power.pm_parent->power.power_state.event);
	}
	}


	dev->power.prev_state = dev->power.power_state;
	dev->power.prev_state = dev->power.power_state;


	if (dev->bus && dev->bus->suspend && !dev->power.power_state) {
	if (dev->bus && dev->bus->suspend && !dev->power.power_state.event) {
		dev_dbg(dev, "suspending\n");
		dev_dbg(dev, "suspending\n");
		error = dev->bus->suspend(dev, state);
		error = dev->bus->suspend(dev, state);
	}
	}
+4 −4
Original line number Original line Diff line number Diff line
@@ -26,19 +26,19 @@


static ssize_t state_show(struct device * dev, struct device_attribute *attr, char * buf)
static ssize_t state_show(struct device * dev, struct device_attribute *attr, char * buf)
{
{
	return sprintf(buf, "%u\n", dev->power.power_state);
	return sprintf(buf, "%u\n", dev->power.power_state.event);
}
}


static ssize_t state_store(struct device * dev, struct device_attribute *attr, const char * buf, size_t n)
static ssize_t state_store(struct device * dev, struct device_attribute *attr, const char * buf, size_t n)
{
{
	u32 state;
	pm_message_t state;
	char * rest;
	char * rest;
	int error = 0;
	int error = 0;


	state = simple_strtoul(buf, &rest, 10);
	state.event = simple_strtoul(buf, &rest, 10);
	if (*rest)
	if (*rest)
		return -EINVAL;
		return -EINVAL;
	if (state)
	if (state.event)
		error = dpm_runtime_suspend(dev, state);
		error = dpm_runtime_suspend(dev, state);
	else
	else
		dpm_runtime_resume(dev);
		dpm_runtime_resume(dev);
Loading