History

Merge branches 'pm-cpuidle' and 'pm-cpufreq'

* pm-cpuidle: cpuidle: Check for dev before deregistering it. intel_idle: Fixed C6 state on Avoton/Rangeley processors * pm-cpufreq: cpufreq: fix garbage kobjects on errors during suspend/resume cpufreq: suspend governors on system suspend/hibernate

Rafael J. Wysocki committed 12 years ago

Commit 7cdcec93 parents dc1ccc4 813e8e3 2167e235 files · +57 −6Browse files

Unified · Split

5 files
  1. drivers/base/power/main.c +3 −0
  2. drivers/cpufreq/cpufreq.c +43 −3
  3. drivers/cpuidle/cpuidle.c +1 −1
  4. drivers/idle/intel_idle.c +2 −2
  5. include/linux/cpufreq.h +8 −0
drivers/base/power/main.c+3−0
@@ -29,6 +29,7 @@ · 28 unmodified lines
29#include <linux/async.h>29#include <linux/async.h>
30#include <linux/suspend.h>30#include <linux/suspend.h>
31#include <trace/events/power.h>31#include <trace/events/power.h>
32#include <linux/cpufreq.h>
32#include <linux/cpuidle.h>33#include <linux/cpuidle.h>
33#include <linux/timer.h>34#include <linux/timer.h>
34 35
@@ -540,6 +541,7 @@ static void dpm_resume_noirq(pm_message_t state) · 505 unmodified lines
540 dpm_show_time(starttime, state, "noirq");541 dpm_show_time(starttime, state, "noirq");
541 resume_device_irqs();542 resume_device_irqs();
542 cpuidle_resume();543 cpuidle_resume();
544 cpufreq_resume();
543}545}
544 546
545/**547/**
@@ -955,6 +957,7 @@ static int dpm_suspend_noirq(pm_message_t state) · 409 unmodified lines
955 ktime_t starttime = ktime_get();957 ktime_t starttime = ktime_get();
956 int error = 0;958 int error = 0;
957 959
960 cpufreq_suspend();
958 cpuidle_pause();961 cpuidle_pause();
959 suspend_device_irqs();962 suspend_device_irqs();
960 mutex_lock(&dpm_list_mtx);963 mutex_lock(&dpm_list_mtx);
drivers/cpufreq/cpufreq.c+43−3
@@ -26,6 +26,7 @@ · 25 unmodified lines
26#include <linux/module.h>26#include <linux/module.h>
27#include <linux/mutex.h>27#include <linux/mutex.h>
28#include <linux/slab.h>28#include <linux/slab.h>
29#include <linux/suspend.h>
29#include <linux/syscore_ops.h>30#include <linux/syscore_ops.h>
30#include <linux/tick.h>31#include <linux/tick.h>
31#include <trace/events/power.h>32#include <trace/events/power.h>
@@ -47,6 +48,9 @@ static LIST_HEAD(cpufreq_policy_list); · 15 unmodified lines
47static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN], cpufreq_cpu_governor);48static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN], cpufreq_cpu_governor);
48#endif49#endif
49 50
51/* Flag to suspend/resume CPUFreq governors */
52static bool cpufreq_suspended;
53
50static inline bool has_target(void)54static inline bool has_target(void)
51{55{
52 return cpufreq_driver->target_index || cpufreq_driver->target;56 return cpufreq_driver->target_index || cpufreq_driver->target;
@@ -1462,6 +1466,41 @@ static struct subsys_interface cpufreq_interface = { · 1409 unmodified lines
1462 .remove_dev = cpufreq_remove_dev,1466 .remove_dev = cpufreq_remove_dev,
1463};1467};
1464 1468
1469void cpufreq_suspend(void)
1470{
1471 struct cpufreq_policy *policy;
1472
1473 if (!has_target())
1474 return;
1475
1476 pr_debug("%s: Suspending Governors\n", __func__);
1477
1478 list_for_each_entry(policy, &cpufreq_policy_list, policy_list)
1479 if (__cpufreq_governor(policy, CPUFREQ_GOV_STOP))
1480 pr_err("%s: Failed to stop governor for policy: %p\n",
1481 __func__, policy);
1482
1483 cpufreq_suspended = true;
1484}
1485
1486void cpufreq_resume(void)
1487{
1488 struct cpufreq_policy *policy;
1489
1490 if (!has_target())
1491 return;
1492
1493 pr_debug("%s: Resuming Governors\n", __func__);
1494
1495 cpufreq_suspended = false;
1496
1497 list_for_each_entry(policy, &cpufreq_policy_list, policy_list)
1498 if (__cpufreq_governor(policy, CPUFREQ_GOV_START)
1499 || __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS))
1500 pr_err("%s: Failed to start governor for policy: %p\n",
1501 __func__, policy);
1502}
1503
1465/**1504/**
1466 * cpufreq_bp_suspend - Prepare the boot CPU for system suspend.1505 * cpufreq_bp_suspend - Prepare the boot CPU for system suspend.
1467 *1506 *
@@ -1764,6 +1803,10 @@ static int __cpufreq_governor(struct cpufreq_policy *policy, · 296 unmodified lines
1764 struct cpufreq_governor *gov = NULL;1803 struct cpufreq_governor *gov = NULL;
1765#endif1804#endif
1766 1805
1806 /* Don't start any governor operations if we are entering suspend */
1807 if (cpufreq_suspended)
1808 return 0;
1809
1767 if (policy->governor->max_transition_latency &&1810 if (policy->governor->max_transition_latency &&
1768 policy->cpuinfo.transition_latency >1811 policy->cpuinfo.transition_latency >
1769 policy->governor->max_transition_latency) {1812 policy->governor->max_transition_latency) {
@@ -2076,9 +2119,6 @@ static int cpufreq_cpu_callback(struct notifier_block *nfb, · 306 unmodified lines
2076 dev = get_cpu_device(cpu);2119 dev = get_cpu_device(cpu);
2077 if (dev) {2120 if (dev) {
2078 2121
2079 if (action & CPU_TASKS_FROZEN)
2080 frozen = true;
2081
2082 switch (action & ~CPU_TASKS_FROZEN) {2122 switch (action & ~CPU_TASKS_FROZEN) {
2083 case CPU_ONLINE:2123 case CPU_ONLINE:
2084 __cpufreq_add_dev(dev, NULL, frozen);2124 __cpufreq_add_dev(dev, NULL, frozen);
drivers/cpuidle/cpuidle.c+1−1
@@ -400,7 +400,7 @@ EXPORT_SYMBOL_GPL(cpuidle_register_device); · 399 unmodified lines
400 */400 */
401void cpuidle_unregister_device(struct cpuidle_device *dev)401void cpuidle_unregister_device(struct cpuidle_device *dev)
402{402{
403 if (dev->registered == 0)403 if (!dev || dev->registered == 0)
404 return;404 return;
405 405
406 cpuidle_pause_and_lock();406 cpuidle_pause_and_lock();
drivers/idle/intel_idle.c+2−2
@@ -329,7 +329,7 @@ static struct cpuidle_state atom_cstates[] __initdata = { · 328 unmodified lines
329 {329 {
330 .enter = NULL }330 .enter = NULL }
331};331};
332static struct cpuidle_state avn_cstates[CPUIDLE_STATE_MAX] = {332static struct cpuidle_state avn_cstates[] __initdata = {
333 {333 {
334 .name = "C1-AVN",334 .name = "C1-AVN",
335 .desc = "MWAIT 0x00",335 .desc = "MWAIT 0x00",
@@ -340,7 +340,7 @@ static struct cpuidle_state avn_cstates[CPUIDLE_STATE_MAX] = { · 4 unmodified lines
340 {340 {
341 .name = "C6-AVN",341 .name = "C6-AVN",
342 .desc = "MWAIT 0x51",342 .desc = "MWAIT 0x51",
343 .flags = MWAIT2flg(0x58) | CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,343 .flags = MWAIT2flg(0x51) | CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
344 .exit_latency = 15,344 .exit_latency = 15,
345 .target_residency = 45,345 .target_residency = 45,
346 .enter = &intel_idle },346 .enter = &intel_idle },
include/linux/cpufreq.h+8−0
@@ -280,6 +280,14 @@ cpufreq_verify_within_cpu_limits(struct cpufreq_policy *policy) · 279 unmodified lines
280 policy->cpuinfo.max_freq);280 policy->cpuinfo.max_freq);
281}281}
282 282
283#ifdef CONFIG_CPU_FREQ
284void cpufreq_suspend(void);
285void cpufreq_resume(void);
286#else
287static inline void cpufreq_suspend(void) {}
288static inline void cpufreq_resume(void) {}
289#endif
290
283/*********************************************************************291/*********************************************************************
284 * CPUFREQ NOTIFIER INTERFACE *292 * CPUFREQ NOTIFIER INTERFACE *
285 *********************************************************************/293 *********************************************************************/

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t