aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-06-12 16:14:19 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-06-12 16:14:19 -0400
commit19c1940feab777bb037c665a09f495d08a6c4e6c (patch)
tree68d4de31f30c9d69a1f1ea080b8a69ce61e1ead5 /drivers/base
parent7c574cf6aeb75920ba4d3af937bb1b3c42785ac4 (diff)
parentd715a226b0b3dae48865d05e8c36175a8f75a809 (diff)
Merge tag 'pm+acpi-3.16-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull more ACPI and power management updates from Rafael Wysocki: "These are fixups on top of the previous PM+ACPI pull request, regression fixes (ACPI hotplug, cpufreq ppc-corenet), other bug fixes (ACPI reset, cpufreq), new PM trace points for system suspend profiling and a copyright notice update. Specifics: - I didn't remember correctly that the Hans de Goede's ACPI video patches actually didn't flip the video.use_native_backlight default, although we had discussed that and decided to do that. Since I said we would do that in the previous PM+ACPI pull request, make that change for real now. - ACPI bus check notifications for PCI host bridges don't cause the bus below the host bridge to be checked for changes as they should because of a mistake in the ACPI-based PCI hotplug (ACPIPHP) subsystem that forgets to add hotplug contexts to PCI host bridge ACPI device objects. Create hotplug contexts for PCI host bridges too as appropriate. - Revert recent cpufreq commit related to the big.LITTLE cpufreq driver that breaks arm64 builds. - Fix for a regression in the ppc-corenet cpufreq driver introduced during the 3.15 cycle and causing the driver to use the remainder from do_div instead of the quotient. From Ed Swarthout. - Resets triggered by panic activate a BUG_ON() in vmalloc.c on systems where the ACPI reset register is located in memory address space. Fix from Randy Wright. - Fix for a problem with cpufreq governors that decisions made by them may be suboptimal due to the fact that deferrable timers are used by them for CPU load sampling. From Srivatsa S Bhat. - Fix for a problem with the Tegra cpufreq driver where the CPU frequency is temporarily switched to a "stable" level that is different from both the initial and target frequencies during transitions which causes udelay() to expire earlier than it should sometimes. From Viresh Kumar. - New trace points and rework of some existing trace points for system suspend/resume profiling from Todd Brandt. - Assorted cpufreq fixes and cleanups from Stratos Karafotis and Viresh Kumar. - Copyright notice update for suspend-and-cpuhotplug.txt from Srivatsa S Bhat" * tag 'pm+acpi-3.16-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: ACPI / hotplug / PCI: Add hotplug contexts to PCI host bridges PM / sleep: trace events for device PM callbacks cpufreq: cpufreq-cpu0: remove dependency on THERMAL and REGULATOR cpufreq: tegra: update comment for clarity cpufreq: intel_pstate: Remove duplicate CPU ID check cpufreq: Mark CPU0 driver with CPUFREQ_NEED_INITIAL_FREQ_CHECK flag PM / Documentation: Update copyright in suspend-and-cpuhotplug.txt cpufreq: governor: remove copy_prev_load from 'struct cpu_dbs_common_info' cpufreq: governor: Be friendly towards latency-sensitive bursty workloads PM / sleep: trace events for suspend/resume cpufreq: ppc-corenet-cpu-freq: do_div use quotient Revert "cpufreq: Enable big.LITTLE cpufreq driver on arm64" cpufreq: Tegra: implement intermediate frequency callbacks cpufreq: add support for intermediate (stable) frequencies ACPI / video: Change the default for video.use_native_backlight to 1 ACPI: Fix bug when ACPI reset register is implemented in system memory
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/power/main.c30
-rw-r--r--drivers/base/syscore.c5
2 files changed, 31 insertions, 4 deletions
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
index 343ffad59377..bf412961a934 100644
--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -214,9 +214,6 @@ static void initcall_debug_report(struct device *dev, ktime_t calltime,
214 pr_info("call %s+ returned %d after %Ld usecs\n", dev_name(dev), 214 pr_info("call %s+ returned %d after %Ld usecs\n", dev_name(dev),
215 error, (unsigned long long)nsecs >> 10); 215 error, (unsigned long long)nsecs >> 10);
216 } 216 }
217
218 trace_device_pm_report_time(dev, info, nsecs, pm_verb(state.event),
219 error);
220} 217}
221 218
222/** 219/**
@@ -387,7 +384,9 @@ static int dpm_run_callback(pm_callback_t cb, struct device *dev,
387 calltime = initcall_debug_start(dev); 384 calltime = initcall_debug_start(dev);
388 385
389 pm_dev_dbg(dev, state, info); 386 pm_dev_dbg(dev, state, info);
387 trace_device_pm_callback_start(dev, info, state.event);
390 error = cb(dev); 388 error = cb(dev);
389 trace_device_pm_callback_end(dev, error);
391 suspend_report_result(cb, error); 390 suspend_report_result(cb, error);
392 391
393 initcall_debug_report(dev, calltime, error, state, info); 392 initcall_debug_report(dev, calltime, error, state, info);
@@ -545,6 +544,7 @@ static void dpm_resume_noirq(pm_message_t state)
545 struct device *dev; 544 struct device *dev;
546 ktime_t starttime = ktime_get(); 545 ktime_t starttime = ktime_get();
547 546
547 trace_suspend_resume(TPS("dpm_resume_noirq"), state.event, true);
548 mutex_lock(&dpm_list_mtx); 548 mutex_lock(&dpm_list_mtx);
549 pm_transition = state; 549 pm_transition = state;
550 550
@@ -587,6 +587,7 @@ static void dpm_resume_noirq(pm_message_t state)
587 dpm_show_time(starttime, state, "noirq"); 587 dpm_show_time(starttime, state, "noirq");
588 resume_device_irqs(); 588 resume_device_irqs();
589 cpuidle_resume(); 589 cpuidle_resume();
590 trace_suspend_resume(TPS("dpm_resume_noirq"), state.event, false);
590} 591}
591 592
592/** 593/**
@@ -664,6 +665,7 @@ static void dpm_resume_early(pm_message_t state)
664 struct device *dev; 665 struct device *dev;
665 ktime_t starttime = ktime_get(); 666 ktime_t starttime = ktime_get();
666 667
668 trace_suspend_resume(TPS("dpm_resume_early"), state.event, true);
667 mutex_lock(&dpm_list_mtx); 669 mutex_lock(&dpm_list_mtx);
668 pm_transition = state; 670 pm_transition = state;
669 671
@@ -703,6 +705,7 @@ static void dpm_resume_early(pm_message_t state)
703 mutex_unlock(&dpm_list_mtx); 705 mutex_unlock(&dpm_list_mtx);
704 async_synchronize_full(); 706 async_synchronize_full();
705 dpm_show_time(starttime, state, "early"); 707 dpm_show_time(starttime, state, "early");
708 trace_suspend_resume(TPS("dpm_resume_early"), state.event, false);
706} 709}
707 710
708/** 711/**
@@ -834,6 +837,7 @@ void dpm_resume(pm_message_t state)
834 struct device *dev; 837 struct device *dev;
835 ktime_t starttime = ktime_get(); 838 ktime_t starttime = ktime_get();
836 839
840 trace_suspend_resume(TPS("dpm_resume"), state.event, true);
837 might_sleep(); 841 might_sleep();
838 842
839 mutex_lock(&dpm_list_mtx); 843 mutex_lock(&dpm_list_mtx);
@@ -875,6 +879,7 @@ void dpm_resume(pm_message_t state)
875 dpm_show_time(starttime, state, NULL); 879 dpm_show_time(starttime, state, NULL);
876 880
877 cpufreq_resume(); 881 cpufreq_resume();
882 trace_suspend_resume(TPS("dpm_resume"), state.event, false);
878} 883}
879 884
880/** 885/**
@@ -913,7 +918,9 @@ static void device_complete(struct device *dev, pm_message_t state)
913 918
914 if (callback) { 919 if (callback) {
915 pm_dev_dbg(dev, state, info); 920 pm_dev_dbg(dev, state, info);
921 trace_device_pm_callback_start(dev, info, state.event);
916 callback(dev); 922 callback(dev);
923 trace_device_pm_callback_end(dev, 0);
917 } 924 }
918 925
919 device_unlock(dev); 926 device_unlock(dev);
@@ -932,6 +939,7 @@ void dpm_complete(pm_message_t state)
932{ 939{
933 struct list_head list; 940 struct list_head list;
934 941
942 trace_suspend_resume(TPS("dpm_complete"), state.event, true);
935 might_sleep(); 943 might_sleep();
936 944
937 INIT_LIST_HEAD(&list); 945 INIT_LIST_HEAD(&list);
@@ -951,6 +959,7 @@ void dpm_complete(pm_message_t state)
951 } 959 }
952 list_splice(&list, &dpm_list); 960 list_splice(&list, &dpm_list);
953 mutex_unlock(&dpm_list_mtx); 961 mutex_unlock(&dpm_list_mtx);
962 trace_suspend_resume(TPS("dpm_complete"), state.event, false);
954} 963}
955 964
956/** 965/**
@@ -1086,6 +1095,7 @@ static int dpm_suspend_noirq(pm_message_t state)
1086 ktime_t starttime = ktime_get(); 1095 ktime_t starttime = ktime_get();
1087 int error = 0; 1096 int error = 0;
1088 1097
1098 trace_suspend_resume(TPS("dpm_suspend_noirq"), state.event, true);
1089 cpuidle_pause(); 1099 cpuidle_pause();
1090 suspend_device_irqs(); 1100 suspend_device_irqs();
1091 mutex_lock(&dpm_list_mtx); 1101 mutex_lock(&dpm_list_mtx);
@@ -1126,6 +1136,7 @@ static int dpm_suspend_noirq(pm_message_t state)
1126 } else { 1136 } else {
1127 dpm_show_time(starttime, state, "noirq"); 1137 dpm_show_time(starttime, state, "noirq");
1128 } 1138 }
1139 trace_suspend_resume(TPS("dpm_suspend_noirq"), state.event, false);
1129 return error; 1140 return error;
1130} 1141}
1131 1142
@@ -1222,6 +1233,7 @@ static int dpm_suspend_late(pm_message_t state)
1222 ktime_t starttime = ktime_get(); 1233 ktime_t starttime = ktime_get();
1223 int error = 0; 1234 int error = 0;
1224 1235
1236 trace_suspend_resume(TPS("dpm_suspend_late"), state.event, true);
1225 mutex_lock(&dpm_list_mtx); 1237 mutex_lock(&dpm_list_mtx);
1226 pm_transition = state; 1238 pm_transition = state;
1227 async_error = 0; 1239 async_error = 0;
@@ -1257,6 +1269,7 @@ static int dpm_suspend_late(pm_message_t state)
1257 } else { 1269 } else {
1258 dpm_show_time(starttime, state, "late"); 1270 dpm_show_time(starttime, state, "late");
1259 } 1271 }
1272 trace_suspend_resume(TPS("dpm_suspend_late"), state.event, false);
1260 return error; 1273 return error;
1261} 1274}
1262 1275
@@ -1295,7 +1308,9 @@ static int legacy_suspend(struct device *dev, pm_message_t state,
1295 1308
1296 calltime = initcall_debug_start(dev); 1309 calltime = initcall_debug_start(dev);
1297 1310
1311 trace_device_pm_callback_start(dev, info, state.event);
1298 error = cb(dev, state); 1312 error = cb(dev, state);
1313 trace_device_pm_callback_end(dev, error);
1299 suspend_report_result(cb, error); 1314 suspend_report_result(cb, error);
1300 1315
1301 initcall_debug_report(dev, calltime, error, state, info); 1316 initcall_debug_report(dev, calltime, error, state, info);
@@ -1461,6 +1476,7 @@ int dpm_suspend(pm_message_t state)
1461 ktime_t starttime = ktime_get(); 1476 ktime_t starttime = ktime_get();
1462 int error = 0; 1477 int error = 0;
1463 1478
1479 trace_suspend_resume(TPS("dpm_suspend"), state.event, true);
1464 might_sleep(); 1480 might_sleep();
1465 1481
1466 cpufreq_suspend(); 1482 cpufreq_suspend();
@@ -1498,6 +1514,7 @@ int dpm_suspend(pm_message_t state)
1498 dpm_save_failed_step(SUSPEND_SUSPEND); 1514 dpm_save_failed_step(SUSPEND_SUSPEND);
1499 } else 1515 } else
1500 dpm_show_time(starttime, state, NULL); 1516 dpm_show_time(starttime, state, NULL);
1517 trace_suspend_resume(TPS("dpm_suspend"), state.event, false);
1501 return error; 1518 return error;
1502} 1519}
1503 1520
@@ -1549,8 +1566,11 @@ static int device_prepare(struct device *dev, pm_message_t state)
1549 callback = dev->driver->pm->prepare; 1566 callback = dev->driver->pm->prepare;
1550 } 1567 }
1551 1568
1552 if (callback) 1569 if (callback) {
1570 trace_device_pm_callback_start(dev, info, state.event);
1553 ret = callback(dev); 1571 ret = callback(dev);
1572 trace_device_pm_callback_end(dev, ret);
1573 }
1554 1574
1555 device_unlock(dev); 1575 device_unlock(dev);
1556 1576
@@ -1582,6 +1602,7 @@ int dpm_prepare(pm_message_t state)
1582{ 1602{
1583 int error = 0; 1603 int error = 0;
1584 1604
1605 trace_suspend_resume(TPS("dpm_prepare"), state.event, true);
1585 might_sleep(); 1606 might_sleep();
1586 1607
1587 mutex_lock(&dpm_list_mtx); 1608 mutex_lock(&dpm_list_mtx);
@@ -1612,6 +1633,7 @@ int dpm_prepare(pm_message_t state)
1612 put_device(dev); 1633 put_device(dev);
1613 } 1634 }
1614 mutex_unlock(&dpm_list_mtx); 1635 mutex_unlock(&dpm_list_mtx);
1636 trace_suspend_resume(TPS("dpm_prepare"), state.event, false);
1615 return error; 1637 return error;
1616} 1638}
1617 1639
diff --git a/drivers/base/syscore.c b/drivers/base/syscore.c
index e8d11b6630ee..dbb8350ea8dc 100644
--- a/drivers/base/syscore.c
+++ b/drivers/base/syscore.c
@@ -10,6 +10,7 @@
10#include <linux/mutex.h> 10#include <linux/mutex.h>
11#include <linux/module.h> 11#include <linux/module.h>
12#include <linux/interrupt.h> 12#include <linux/interrupt.h>
13#include <trace/events/power.h>
13 14
14static LIST_HEAD(syscore_ops_list); 15static LIST_HEAD(syscore_ops_list);
15static DEFINE_MUTEX(syscore_ops_lock); 16static DEFINE_MUTEX(syscore_ops_lock);
@@ -49,6 +50,7 @@ int syscore_suspend(void)
49 struct syscore_ops *ops; 50 struct syscore_ops *ops;
50 int ret = 0; 51 int ret = 0;
51 52
53 trace_suspend_resume(TPS("syscore_suspend"), 0, true);
52 pr_debug("Checking wakeup interrupts\n"); 54 pr_debug("Checking wakeup interrupts\n");
53 55
54 /* Return error code if there are any wakeup interrupts pending. */ 56 /* Return error code if there are any wakeup interrupts pending. */
@@ -70,6 +72,7 @@ int syscore_suspend(void)
70 "Interrupts enabled after %pF\n", ops->suspend); 72 "Interrupts enabled after %pF\n", ops->suspend);
71 } 73 }
72 74
75 trace_suspend_resume(TPS("syscore_suspend"), 0, false);
73 return 0; 76 return 0;
74 77
75 err_out: 78 err_out:
@@ -92,6 +95,7 @@ void syscore_resume(void)
92{ 95{
93 struct syscore_ops *ops; 96 struct syscore_ops *ops;
94 97
98 trace_suspend_resume(TPS("syscore_resume"), 0, true);
95 WARN_ONCE(!irqs_disabled(), 99 WARN_ONCE(!irqs_disabled(),
96 "Interrupts enabled before system core resume.\n"); 100 "Interrupts enabled before system core resume.\n");
97 101
@@ -103,6 +107,7 @@ void syscore_resume(void)
103 WARN_ONCE(!irqs_disabled(), 107 WARN_ONCE(!irqs_disabled(),
104 "Interrupts enabled after %pF\n", ops->resume); 108 "Interrupts enabled after %pF\n", ops->resume);
105 } 109 }
110 trace_suspend_resume(TPS("syscore_resume"), 0, false);
106} 111}
107EXPORT_SYMBOL_GPL(syscore_resume); 112EXPORT_SYMBOL_GPL(syscore_resume);
108#endif /* CONFIG_PM_SLEEP */ 113#endif /* CONFIG_PM_SLEEP */