diff options
Diffstat (limited to 'drivers/cpufreq/cpufreq.c')
-rw-r--r-- | drivers/cpufreq/cpufreq.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 7c48e7316d91..8412ce5f93a7 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -976,10 +976,14 @@ static int cpufreq_init_policy(struct cpufreq_policy *policy) | |||
976 | 976 | ||
977 | new_policy.governor = gov; | 977 | new_policy.governor = gov; |
978 | 978 | ||
979 | /* Use the default policy if its valid. */ | 979 | /* Use the default policy if there is no last_policy. */ |
980 | if (cpufreq_driver->setpolicy) | 980 | if (cpufreq_driver->setpolicy) { |
981 | cpufreq_parse_governor(gov->name, &new_policy.policy, NULL); | 981 | if (policy->last_policy) |
982 | 982 | new_policy.policy = policy->last_policy; | |
983 | else | ||
984 | cpufreq_parse_governor(gov->name, &new_policy.policy, | ||
985 | NULL); | ||
986 | } | ||
983 | /* set default policy */ | 987 | /* set default policy */ |
984 | return cpufreq_set_policy(policy, &new_policy); | 988 | return cpufreq_set_policy(policy, &new_policy); |
985 | } | 989 | } |
@@ -1330,6 +1334,8 @@ static void cpufreq_offline_prepare(unsigned int cpu) | |||
1330 | if (has_target()) | 1334 | if (has_target()) |
1331 | strncpy(policy->last_governor, policy->governor->name, | 1335 | strncpy(policy->last_governor, policy->governor->name, |
1332 | CPUFREQ_NAME_LEN); | 1336 | CPUFREQ_NAME_LEN); |
1337 | else | ||
1338 | policy->last_policy = policy->policy; | ||
1333 | } else if (cpu == policy->cpu) { | 1339 | } else if (cpu == policy->cpu) { |
1334 | /* Nominate new CPU */ | 1340 | /* Nominate new CPU */ |
1335 | policy->cpu = cpumask_any(policy->cpus); | 1341 | policy->cpu = cpumask_any(policy->cpus); |
@@ -1401,13 +1407,10 @@ static void cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif) | |||
1401 | } | 1407 | } |
1402 | 1408 | ||
1403 | cpumask_clear_cpu(cpu, policy->real_cpus); | 1409 | cpumask_clear_cpu(cpu, policy->real_cpus); |
1410 | remove_cpu_dev_symlink(policy, cpu); | ||
1404 | 1411 | ||
1405 | if (cpumask_empty(policy->real_cpus)) { | 1412 | if (cpumask_empty(policy->real_cpus)) |
1406 | cpufreq_policy_free(policy, true); | 1413 | cpufreq_policy_free(policy, true); |
1407 | return; | ||
1408 | } | ||
1409 | |||
1410 | remove_cpu_dev_symlink(policy, cpu); | ||
1411 | } | 1414 | } |
1412 | 1415 | ||
1413 | static void handle_update(struct work_struct *work) | 1416 | static void handle_update(struct work_struct *work) |