diff options
| -rw-r--r-- | drivers/cpufreq/cpufreq.c | 37 | ||||
| -rw-r--r-- | drivers/cpufreq/intel_pstate.c | 5 | ||||
| -rw-r--r-- | drivers/cpuidle/cpuidle-calxeda.c | 2 |
3 files changed, 29 insertions, 15 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 16d7b4ac94be..8d19f7c06010 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
| @@ -839,9 +839,6 @@ static void cpufreq_init_policy(struct cpufreq_policy *policy) | |||
| 839 | 839 | ||
| 840 | /* set default policy */ | 840 | /* set default policy */ |
| 841 | ret = cpufreq_set_policy(policy, &new_policy); | 841 | ret = cpufreq_set_policy(policy, &new_policy); |
| 842 | policy->user_policy.policy = policy->policy; | ||
| 843 | policy->user_policy.governor = policy->governor; | ||
| 844 | |||
| 845 | if (ret) { | 842 | if (ret) { |
| 846 | pr_debug("setting policy failed\n"); | 843 | pr_debug("setting policy failed\n"); |
| 847 | if (cpufreq_driver->exit) | 844 | if (cpufreq_driver->exit) |
| @@ -1016,15 +1013,17 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif, | |||
| 1016 | read_unlock_irqrestore(&cpufreq_driver_lock, flags); | 1013 | read_unlock_irqrestore(&cpufreq_driver_lock, flags); |
| 1017 | #endif | 1014 | #endif |
| 1018 | 1015 | ||
| 1019 | if (frozen) | 1016 | /* |
| 1020 | /* Restore the saved policy when doing light-weight init */ | 1017 | * Restore the saved policy when doing light-weight init and fall back |
| 1021 | policy = cpufreq_policy_restore(cpu); | 1018 | * to the full init if that fails. |
| 1022 | else | 1019 | */ |
| 1020 | policy = frozen ? cpufreq_policy_restore(cpu) : NULL; | ||
| 1021 | if (!policy) { | ||
| 1022 | frozen = false; | ||
| 1023 | policy = cpufreq_policy_alloc(); | 1023 | policy = cpufreq_policy_alloc(); |
| 1024 | 1024 | if (!policy) | |
| 1025 | if (!policy) | 1025 | goto nomem_out; |
| 1026 | goto nomem_out; | 1026 | } |
| 1027 | |||
| 1028 | 1027 | ||
| 1029 | /* | 1028 | /* |
| 1030 | * In the resume path, since we restore a saved policy, the assignment | 1029 | * In the resume path, since we restore a saved policy, the assignment |
| @@ -1069,8 +1068,10 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif, | |||
| 1069 | */ | 1068 | */ |
| 1070 | cpumask_and(policy->cpus, policy->cpus, cpu_online_mask); | 1069 | cpumask_and(policy->cpus, policy->cpus, cpu_online_mask); |
| 1071 | 1070 | ||
| 1072 | policy->user_policy.min = policy->min; | 1071 | if (!frozen) { |
| 1073 | policy->user_policy.max = policy->max; | 1072 | policy->user_policy.min = policy->min; |
| 1073 | policy->user_policy.max = policy->max; | ||
| 1074 | } | ||
| 1074 | 1075 | ||
| 1075 | blocking_notifier_call_chain(&cpufreq_policy_notifier_list, | 1076 | blocking_notifier_call_chain(&cpufreq_policy_notifier_list, |
| 1076 | CPUFREQ_START, policy); | 1077 | CPUFREQ_START, policy); |
| @@ -1101,6 +1102,11 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif, | |||
| 1101 | 1102 | ||
| 1102 | cpufreq_init_policy(policy); | 1103 | cpufreq_init_policy(policy); |
| 1103 | 1104 | ||
| 1105 | if (!frozen) { | ||
| 1106 | policy->user_policy.policy = policy->policy; | ||
| 1107 | policy->user_policy.governor = policy->governor; | ||
| 1108 | } | ||
| 1109 | |||
| 1104 | kobject_uevent(&policy->kobj, KOBJ_ADD); | 1110 | kobject_uevent(&policy->kobj, KOBJ_ADD); |
| 1105 | up_read(&cpufreq_rwsem); | 1111 | up_read(&cpufreq_rwsem); |
| 1106 | 1112 | ||
| @@ -1118,8 +1124,11 @@ err_get_freq: | |||
| 1118 | if (cpufreq_driver->exit) | 1124 | if (cpufreq_driver->exit) |
| 1119 | cpufreq_driver->exit(policy); | 1125 | cpufreq_driver->exit(policy); |
| 1120 | err_set_policy_cpu: | 1126 | err_set_policy_cpu: |
| 1121 | if (frozen) | 1127 | if (frozen) { |
| 1128 | /* Do not leave stale fallback data behind. */ | ||
| 1129 | per_cpu(cpufreq_cpu_data_fallback, cpu) = NULL; | ||
| 1122 | cpufreq_policy_put_kobj(policy); | 1130 | cpufreq_policy_put_kobj(policy); |
| 1131 | } | ||
| 1123 | cpufreq_policy_free(policy); | 1132 | cpufreq_policy_free(policy); |
| 1124 | 1133 | ||
| 1125 | nomem_out: | 1134 | nomem_out: |
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index 5f1cbae36961..f9d561e198ab 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c | |||
| @@ -614,6 +614,11 @@ static int intel_pstate_init_cpu(unsigned int cpunum) | |||
| 614 | cpu = all_cpu_data[cpunum]; | 614 | cpu = all_cpu_data[cpunum]; |
| 615 | 615 | ||
| 616 | intel_pstate_get_cpu_pstates(cpu); | 616 | intel_pstate_get_cpu_pstates(cpu); |
| 617 | if (!cpu->pstate.current_pstate) { | ||
| 618 | all_cpu_data[cpunum] = NULL; | ||
| 619 | kfree(cpu); | ||
| 620 | return -ENODATA; | ||
| 621 | } | ||
| 617 | 622 | ||
| 618 | cpu->cpu = cpunum; | 623 | cpu->cpu = cpunum; |
| 619 | 624 | ||
diff --git a/drivers/cpuidle/cpuidle-calxeda.c b/drivers/cpuidle/cpuidle-calxeda.c index 36795639df0d..6e51114057d0 100644 --- a/drivers/cpuidle/cpuidle-calxeda.c +++ b/drivers/cpuidle/cpuidle-calxeda.c | |||
| @@ -65,7 +65,7 @@ static struct cpuidle_driver calxeda_idle_driver = { | |||
| 65 | .state_count = 2, | 65 | .state_count = 2, |
| 66 | }; | 66 | }; |
| 67 | 67 | ||
| 68 | static int __init calxeda_cpuidle_probe(struct platform_device *pdev) | 68 | static int calxeda_cpuidle_probe(struct platform_device *pdev) |
| 69 | { | 69 | { |
| 70 | return cpuidle_register(&calxeda_idle_driver, NULL); | 70 | return cpuidle_register(&calxeda_idle_driver, NULL); |
| 71 | } | 71 | } |
