mirror of
https://github.com/team-infusion-developers/android_kernel_samsung_msm8976.git
synced 2024-09-22 04:15:02 +00:00
cpufreq: Save and restore user min/max freq for hotplug
In addition to restoring the previous governor after hotplug, restore min/max frequency set in user_policy. This patch combines commit: 1) 026cf76c5a2b1b84cbe12b79800f97389abfd589 (android-msm-2.6.35) cpufreq: Save and restore min and max frequencies 2) 82a8db17421e475eb662ad83674d4f7a351bc55e (msm-3.4) cpufreq: Save user policy min/max instead of policy min/max during hotplug And refactors it to apply cleanly onto the 3.10 kernel. Change-Id: Id097132765a5487618ca020bae3cc9c9ea791072 Signed-off-by: Junjie Wu <junjiew@codeaurora.org>
This commit is contained in:
parent
def6c0248c
commit
aa3edab571
1 changed files with 29 additions and 6 deletions
|
@ -42,8 +42,15 @@
|
|||
static struct cpufreq_driver *cpufreq_driver;
|
||||
static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
/* This one keeps track of the previously set governor of a removed CPU */
|
||||
static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN], cpufreq_cpu_governor);
|
||||
/*
|
||||
* This one keeps track of the previously set governor and user-set
|
||||
* min/max freq of a removed CPU
|
||||
*/
|
||||
struct cpufreq_cpu_save_data {
|
||||
char gov[CPUFREQ_NAME_LEN];
|
||||
unsigned int max, min;
|
||||
};
|
||||
static DEFINE_PER_CPU(struct cpufreq_cpu_save_data, cpufreq_policy_save);
|
||||
#endif
|
||||
static DEFINE_RWLOCK(cpufreq_driver_lock);
|
||||
static DEFINE_MUTEX(cpufreq_governor_lock);
|
||||
|
@ -950,12 +957,22 @@ static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
|
|||
CPUFREQ_START, policy);
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
gov = __find_governor(per_cpu(cpufreq_cpu_governor, cpu));
|
||||
gov = __find_governor(per_cpu(cpufreq_policy_save, cpu).gov);
|
||||
if (gov) {
|
||||
policy->governor = gov;
|
||||
pr_debug("Restoring governor %s for cpu %d\n",
|
||||
policy->governor->name, cpu);
|
||||
}
|
||||
if (per_cpu(cpufreq_policy_save, cpu).min) {
|
||||
policy->min = per_cpu(cpufreq_policy_save, cpu).min;
|
||||
policy->user_policy.min = policy->min;
|
||||
}
|
||||
if (per_cpu(cpufreq_policy_save, cpu).max) {
|
||||
policy->max = per_cpu(cpufreq_policy_save, cpu).max;
|
||||
policy->user_policy.max = policy->max;
|
||||
}
|
||||
pr_debug("Restoring CPU%d user policy min %d and max %d\n", cpu,
|
||||
policy->min, policy->max);
|
||||
#endif
|
||||
|
||||
ret = cpufreq_add_dev_interface(cpu, policy, dev);
|
||||
|
@ -1042,8 +1059,12 @@ static int __cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif
|
|||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
if (!cpufreq_driver->setpolicy)
|
||||
strncpy(per_cpu(cpufreq_cpu_governor, cpu),
|
||||
strlcpy(per_cpu(cpufreq_policy_save, cpu).gov,
|
||||
data->governor->name, CPUFREQ_NAME_LEN);
|
||||
per_cpu(cpufreq_policy_save, cpu).min = data->user_policy.min;
|
||||
per_cpu(cpufreq_policy_save, cpu).max = data->user_policy.max;
|
||||
pr_debug("Saving CPU%d user policy min %d and max %d\n",
|
||||
cpu, data->user_policy.min, data->user_policy.max);
|
||||
#endif
|
||||
|
||||
WARN_ON(lock_policy_rwsem_write(cpu));
|
||||
|
@ -1644,6 +1665,7 @@ void cpufreq_unregister_governor(struct cpufreq_governor *governor)
|
|||
{
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
int cpu;
|
||||
struct cpufreq_cpu_save_data *saved_policy;
|
||||
#endif
|
||||
|
||||
if (!governor)
|
||||
|
@ -1656,8 +1678,9 @@ void cpufreq_unregister_governor(struct cpufreq_governor *governor)
|
|||
for_each_present_cpu(cpu) {
|
||||
if (cpu_online(cpu))
|
||||
continue;
|
||||
if (!strcmp(per_cpu(cpufreq_cpu_governor, cpu), governor->name))
|
||||
strcpy(per_cpu(cpufreq_cpu_governor, cpu), "\0");
|
||||
saved_policy = &per_cpu(cpufreq_policy_save, cpu);
|
||||
if (!strcmp(saved_policy->gov, governor->name))
|
||||
strlcpy(saved_policy->gov, "\0", CPUFREQ_NAME_LEN);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in a new issue