Initial Contribution
msm-2.6.38: tag AU_LINUX_ANDROID_GINGERBREAD.02.03.04.00.142
Signed-off-by: Bryan Huntsman <bryanh@codeaurora.org>
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 0a5bea9..ff15497 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -41,7 +41,11 @@
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);
+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_SPINLOCK(cpufreq_driver_lock);
@@ -68,7 +72,7 @@
static DEFINE_PER_CPU(struct rw_semaphore, cpu_policy_rwsem);
#define lock_policy_rwsem(mode, cpu) \
-static int lock_policy_rwsem_##mode \
+int lock_policy_rwsem_##mode \
(int cpu) \
{ \
int policy_cpu = per_cpu(cpufreq_policy_cpu, cpu); \
@@ -93,7 +97,7 @@
up_read(&per_cpu(cpu_policy_rwsem, policy_cpu));
}
-static void unlock_policy_rwsem_write(int cpu)
+void unlock_policy_rwsem_write(int cpu)
{
int policy_cpu = per_cpu(cpufreq_policy_cpu, cpu);
BUG_ON(policy_cpu == -1);
@@ -688,12 +692,22 @@
#ifdef CONFIG_HOTPLUG_CPU
struct cpufreq_governor *gov;
- 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 min %d and max %d\n",
+ cpu, policy->min, policy->max);
#endif
for_each_cpu(j, policy->cpus) {
@@ -1043,8 +1057,12 @@
#ifdef CONFIG_SMP
#ifdef CONFIG_HOTPLUG_CPU
- strncpy(per_cpu(cpufreq_cpu_governor, cpu), data->governor->name,
+ strncpy(per_cpu(cpufreq_policy_save, cpu).gov, data->governor->name,
CPUFREQ_NAME_LEN);
+ per_cpu(cpufreq_policy_save, cpu).min = data->min;
+ per_cpu(cpufreq_policy_save, cpu).max = data->max;
+ pr_debug("Saving CPU%d policy min %d and max %d\n",
+ cpu, data->min, data->max);
#endif
/* if we have other CPUs still registered, we need to unlink them,
@@ -1068,8 +1086,12 @@
continue;
pr_debug("removing link for cpu %u\n", j);
#ifdef CONFIG_HOTPLUG_CPU
- strncpy(per_cpu(cpufreq_cpu_governor, j),
+ strncpy(per_cpu(cpufreq_policy_save, j).gov,
data->governor->name, CPUFREQ_NAME_LEN);
+ per_cpu(cpufreq_policy_save, j).min = data->min;
+ per_cpu(cpufreq_policy_save, j).max = data->max;
+ pr_debug("Saving CPU%d policy min %d and max %d\n",
+ j, data->min, data->max);
#endif
cpu_sys_dev = get_cpu_sysdev(j);
kobj = &cpu_sys_dev->kobj;
@@ -1555,8 +1577,11 @@
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");
+ if (!strcmp(per_cpu(cpufreq_policy_save, cpu).gov,
+ governor->name))
+ strcpy(per_cpu(cpufreq_policy_save, cpu).gov, "\0");
+ per_cpu(cpufreq_policy_save, cpu).min = 0;
+ per_cpu(cpufreq_policy_save, cpu).max = 0;
}
#endif