diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-22 13:36:52 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-22 13:36:52 -0700 | 
| commit | 7100e505b76b4e2efd88b2459d1a932214e29f8a (patch) | |
| tree | a8eae8687dc1511c89463b1eb93c8349a7471ab3 /drivers/base/power/main.c | |
| parent | cb47c1831fa406c964468b259f2082c16cc3f757 (diff) | |
| parent | 75a4161a58dd157a2bd2dc8e9986e45b62ac46cf (diff) | |
| download | olio-linux-3.10-7100e505b76b4e2efd88b2459d1a932214e29f8a.tar.xz olio-linux-3.10-7100e505b76b4e2efd88b2459d1a932214e29f8a.zip  | |
Merge tag 'pm-for-3.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull power management updates from Rafael Wysocki:
 - ACPI conversion to PM handling based on struct dev_pm_ops.
 - Conversion of a number of platform drivers to PM handling based on
   struct dev_pm_ops and removal of empty legacy PM callbacks from a
   couple of PCI drivers.
 - Suspend-to-both for in-kernel hibernation from Bojan Smojver.
 - cpuidle fixes and cleanups from ShuoX Liu, Daniel Lezcano and Preeti
   Murthy.
 - cpufreq bug fixes from Jonghwa Lee and Stephen Boyd.
 - Suspend and hibernate fixes from Srivatsa Bhat and Colin Cross.
 - Generic PM domains framework updates.
 - RTC CMOS wakeup signaling update from Paul Fox.
 - sparse warnings fixes from Sachin Kamat.
 - Build warnings fixes for the generic PM domains framework and PM
   sysfs code.
 - sysfs switch for printing device suspend times from Sameer Nanda.
 - Documentation fix from Oskar Schirmer.
* tag 'pm-for-3.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (70 commits)
  cpufreq: Fix sysfs deadlock with concurrent hotplug/frequency switch
  EXYNOS: bugfix on retrieving old_index from freqs.old
  PM / Sleep: call early resume handlers when suspend_noirq fails
  PM / QoS: Use NULL pointer instead of plain integer in qos.c
  PM / QoS: Use NULL pointer instead of plain integer in pm_qos.h
  PM / Sleep: Require CAP_BLOCK_SUSPEND to use wake_lock/wake_unlock
  PM / Sleep: Add missing static storage class specifiers in main.c
  cpuilde / ACPI: remove time from acpi_processor_cx structure
  cpuidle / ACPI: remove usage from acpi_processor_cx structure
  cpuidle / ACPI : remove latency_ticks from acpi_processor_cx structure
  rtc-cmos: report wakeups from interrupt handler
  PM / Sleep: Fix build warning in sysfs.c for CONFIG_PM_SLEEP unset
  PM / Domains: Fix build warning for CONFIG_PM_RUNTIME unset
  olpc-xo15-sci: Use struct dev_pm_ops for power management
  PM / Domains: Replace plain integer with NULL pointer in domain.c file
  PM / Domains: Add missing static storage class specifier in domain.c file
  PM / crypto / ux500: Use struct dev_pm_ops for power management
  PM / IPMI: Remove empty legacy PCI PM callbacks
  tpm_nsc: Use struct dev_pm_ops for power management
  tpm_tis: Use struct dev_pm_ops for power management
  ...
Diffstat (limited to 'drivers/base/power/main.c')
| -rw-r--r-- | drivers/base/power/main.c | 26 | 
1 files changed, 18 insertions, 8 deletions
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index 9cb845e4933..0113adc310d 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c @@ -28,7 +28,7 @@  #include <linux/sched.h>  #include <linux/async.h>  #include <linux/suspend.h> - +#include <linux/cpuidle.h>  #include "../base.h"  #include "power.h" @@ -45,10 +45,10 @@ typedef int (*pm_callback_t)(struct device *);   */  LIST_HEAD(dpm_list); -LIST_HEAD(dpm_prepared_list); -LIST_HEAD(dpm_suspended_list); -LIST_HEAD(dpm_late_early_list); -LIST_HEAD(dpm_noirq_list); +static LIST_HEAD(dpm_prepared_list); +static LIST_HEAD(dpm_suspended_list); +static LIST_HEAD(dpm_late_early_list); +static LIST_HEAD(dpm_noirq_list);  struct suspend_stats suspend_stats;  static DEFINE_MUTEX(dpm_list_mtx); @@ -166,7 +166,7 @@ static ktime_t initcall_debug_start(struct device *dev)  {  	ktime_t calltime = ktime_set(0, 0); -	if (initcall_debug) { +	if (pm_print_times_enabled) {  		pr_info("calling  %s+ @ %i, parent: %s\n",  			dev_name(dev), task_pid_nr(current),  			dev->parent ? dev_name(dev->parent) : "none"); @@ -181,7 +181,7 @@ static void initcall_debug_report(struct device *dev, ktime_t calltime,  {  	ktime_t delta, rettime; -	if (initcall_debug) { +	if (pm_print_times_enabled) {  		rettime = ktime_get();  		delta = ktime_sub(rettime, calltime);  		pr_info("call %s+ returned %d after %Ld usecs\n", dev_name(dev), @@ -467,6 +467,7 @@ static void dpm_resume_noirq(pm_message_t state)  	mutex_unlock(&dpm_list_mtx);  	dpm_show_time(starttime, state, "noirq");  	resume_device_irqs(); +	cpuidle_resume();  }  /** @@ -867,6 +868,7 @@ static int dpm_suspend_noirq(pm_message_t state)  	ktime_t starttime = ktime_get();  	int error = 0; +	cpuidle_pause();  	suspend_device_irqs();  	mutex_lock(&dpm_list_mtx);  	while (!list_empty(&dpm_late_early_list)) { @@ -989,8 +991,16 @@ static int dpm_suspend_late(pm_message_t state)  int dpm_suspend_end(pm_message_t state)  {  	int error = dpm_suspend_late(state); +	if (error) +		return error; + +	error = dpm_suspend_noirq(state); +	if (error) { +		dpm_resume_early(state); +		return error; +	} -	return error ? : dpm_suspend_noirq(state); +	return 0;  }  EXPORT_SYMBOL_GPL(dpm_suspend_end);  |