diff options
-rw-r--r-- | drivers/cpufreq/cpufreq.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 5a64f66d36e0..62bdb955ea56 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -947,6 +947,18 @@ static void cpufreq_policy_free(struct cpufreq_policy *policy) | |||
947 | kfree(policy); | 947 | kfree(policy); |
948 | } | 948 | } |
949 | 949 | ||
950 | static void update_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu) | ||
951 | { | ||
952 | policy->last_cpu = policy->cpu; | ||
953 | policy->cpu = cpu; | ||
954 | |||
955 | #ifdef CONFIG_CPU_FREQ_TABLE | ||
956 | cpufreq_frequency_table_update_policy_cpu(policy); | ||
957 | #endif | ||
958 | blocking_notifier_call_chain(&cpufreq_policy_notifier_list, | ||
959 | CPUFREQ_UPDATE_POLICY_CPU, policy); | ||
960 | } | ||
961 | |||
950 | static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif, | 962 | static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif, |
951 | bool frozen) | 963 | bool frozen) |
952 | { | 964 | { |
@@ -1000,7 +1012,18 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif, | |||
1000 | if (!policy) | 1012 | if (!policy) |
1001 | goto nomem_out; | 1013 | goto nomem_out; |
1002 | 1014 | ||
1003 | policy->cpu = cpu; | 1015 | |
1016 | /* | ||
1017 | * In the resume path, since we restore a saved policy, the assignment | ||
1018 | * to policy->cpu is like an update of the existing policy, rather than | ||
1019 | * the creation of a brand new one. So we need to perform this update | ||
1020 | * by invoking update_policy_cpu(). | ||
1021 | */ | ||
1022 | if (frozen && cpu != policy->cpu) | ||
1023 | update_policy_cpu(policy, cpu); | ||
1024 | else | ||
1025 | policy->cpu = cpu; | ||
1026 | |||
1004 | policy->governor = CPUFREQ_DEFAULT_GOVERNOR; | 1027 | policy->governor = CPUFREQ_DEFAULT_GOVERNOR; |
1005 | cpumask_copy(policy->cpus, cpumask_of(cpu)); | 1028 | cpumask_copy(policy->cpus, cpumask_of(cpu)); |
1006 | 1029 | ||
@@ -1092,18 +1115,6 @@ static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif) | |||
1092 | return __cpufreq_add_dev(dev, sif, false); | 1115 | return __cpufreq_add_dev(dev, sif, false); |
1093 | } | 1116 | } |
1094 | 1117 | ||
1095 | static void update_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu) | ||
1096 | { | ||
1097 | policy->last_cpu = policy->cpu; | ||
1098 | policy->cpu = cpu; | ||
1099 | |||
1100 | #ifdef CONFIG_CPU_FREQ_TABLE | ||
1101 | cpufreq_frequency_table_update_policy_cpu(policy); | ||
1102 | #endif | ||
1103 | blocking_notifier_call_chain(&cpufreq_policy_notifier_list, | ||
1104 | CPUFREQ_UPDATE_POLICY_CPU, policy); | ||
1105 | } | ||
1106 | |||
1107 | static int cpufreq_nominate_new_policy_cpu(struct cpufreq_policy *policy, | 1118 | static int cpufreq_nominate_new_policy_cpu(struct cpufreq_policy *policy, |
1108 | unsigned int old_cpu, bool frozen) | 1119 | unsigned int old_cpu, bool frozen) |
1109 | { | 1120 | { |