diff options
author | Viresh Kumar <viresh.kumar@linaro.org> | 2014-03-03 22:00:27 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-03-06 09:04:12 -0500 |
commit | e28867eab7c0a60cddf0cb59f9f6cbbd9561425d (patch) | |
tree | 1391897d0eefb9464ec762538f8f7307079192f1 | |
parent | 2f0aea9363609433b38ab13f0f86f38372668c68 (diff) |
cpufreq: Implement cpufreq_generic_suspend()
Multiple platforms need to set CPUs to a particular frequency before
suspending the system, so provide a common infrastructure for them.
Those platforms only need to point their ->suspend callback pointers
to the generic routine.
Tested-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
[rjw: Changelog]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r-- | drivers/cpufreq/cpufreq.c | 26 | ||||
-rw-r--r-- | include/linux/cpufreq.h | 3 |
2 files changed, 29 insertions, 0 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 289a407a9207..61dd72b8c143 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -1567,6 +1567,32 @@ static struct subsys_interface cpufreq_interface = { | |||
1567 | .remove_dev = cpufreq_remove_dev, | 1567 | .remove_dev = cpufreq_remove_dev, |
1568 | }; | 1568 | }; |
1569 | 1569 | ||
1570 | /* | ||
1571 | * In case platform wants some specific frequency to be configured | ||
1572 | * during suspend.. | ||
1573 | */ | ||
1574 | int cpufreq_generic_suspend(struct cpufreq_policy *policy) | ||
1575 | { | ||
1576 | int ret; | ||
1577 | |||
1578 | if (!policy->suspend_freq) { | ||
1579 | pr_err("%s: suspend_freq can't be zero\n", __func__); | ||
1580 | return -EINVAL; | ||
1581 | } | ||
1582 | |||
1583 | pr_debug("%s: Setting suspend-freq: %u\n", __func__, | ||
1584 | policy->suspend_freq); | ||
1585 | |||
1586 | ret = __cpufreq_driver_target(policy, policy->suspend_freq, | ||
1587 | CPUFREQ_RELATION_H); | ||
1588 | if (ret) | ||
1589 | pr_err("%s: unable to set suspend-freq: %u. err: %d\n", | ||
1590 | __func__, policy->suspend_freq, ret); | ||
1591 | |||
1592 | return ret; | ||
1593 | } | ||
1594 | EXPORT_SYMBOL(cpufreq_generic_suspend); | ||
1595 | |||
1570 | /** | 1596 | /** |
1571 | * cpufreq_suspend() - Suspend CPUFreq governors | 1597 | * cpufreq_suspend() - Suspend CPUFreq governors |
1572 | * | 1598 | * |
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 94ed907c6999..325bab04271b 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h | |||
@@ -74,6 +74,8 @@ struct cpufreq_policy { | |||
74 | unsigned int max; /* in kHz */ | 74 | unsigned int max; /* in kHz */ |
75 | unsigned int cur; /* in kHz, only needed if cpufreq | 75 | unsigned int cur; /* in kHz, only needed if cpufreq |
76 | * governors are used */ | 76 | * governors are used */ |
77 | unsigned int suspend_freq; /* freq to set during suspend */ | ||
78 | |||
77 | unsigned int policy; /* see above */ | 79 | unsigned int policy; /* see above */ |
78 | struct cpufreq_governor *governor; /* see below */ | 80 | struct cpufreq_governor *governor; /* see below */ |
79 | void *governor_data; | 81 | void *governor_data; |
@@ -299,6 +301,7 @@ cpufreq_verify_within_cpu_limits(struct cpufreq_policy *policy) | |||
299 | #ifdef CONFIG_CPU_FREQ | 301 | #ifdef CONFIG_CPU_FREQ |
300 | void cpufreq_suspend(void); | 302 | void cpufreq_suspend(void); |
301 | void cpufreq_resume(void); | 303 | void cpufreq_resume(void); |
304 | int cpufreq_generic_suspend(struct cpufreq_policy *policy); | ||
302 | #else | 305 | #else |
303 | static inline void cpufreq_suspend(void) {} | 306 | static inline void cpufreq_suspend(void) {} |
304 | static inline void cpufreq_resume(void) {} | 307 | static inline void cpufreq_resume(void) {} |