aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq/cpufreq.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/cpufreq/cpufreq.c')
-rw-r--r--drivers/cpufreq/cpufreq.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 0937b8d6c2a4..f0a5e2b0eb8a 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -1177,14 +1177,11 @@ static int __cpufreq_remove_dev(struct device *dev,
1177 __func__, cpu_dev->id, cpu); 1177 __func__, cpu_dev->id, cpu);
1178 } 1178 }
1179 1179
1180 if ((cpus == 1) && (cpufreq_driver->target))
1181 __cpufreq_governor(data, CPUFREQ_GOV_POLICY_EXIT);
1182
1183 pr_debug("%s: removing link, cpu: %d\n", __func__, cpu);
1184 cpufreq_cpu_put(data);
1185
1186 /* If cpu is last user of policy, free policy */ 1180 /* If cpu is last user of policy, free policy */
1187 if (cpus == 1) { 1181 if (cpus == 1) {
1182 if (cpufreq_driver->target)
1183 __cpufreq_governor(data, CPUFREQ_GOV_POLICY_EXIT);
1184
1188 lock_policy_rwsem_read(cpu); 1185 lock_policy_rwsem_read(cpu);
1189 kobj = &data->kobj; 1186 kobj = &data->kobj;
1190 cmp = &data->kobj_unregister; 1187 cmp = &data->kobj_unregister;
@@ -1205,9 +1202,13 @@ static int __cpufreq_remove_dev(struct device *dev,
1205 free_cpumask_var(data->related_cpus); 1202 free_cpumask_var(data->related_cpus);
1206 free_cpumask_var(data->cpus); 1203 free_cpumask_var(data->cpus);
1207 kfree(data); 1204 kfree(data);
1208 } else if (cpufreq_driver->target) { 1205 } else {
1209 __cpufreq_governor(data, CPUFREQ_GOV_START); 1206 pr_debug("%s: removing link, cpu: %d\n", __func__, cpu);
1210 __cpufreq_governor(data, CPUFREQ_GOV_LIMITS); 1207 cpufreq_cpu_put(data);
1208 if (cpufreq_driver->target) {
1209 __cpufreq_governor(data, CPUFREQ_GOV_START);
1210 __cpufreq_governor(data, CPUFREQ_GOV_LIMITS);
1211 }
1211 } 1212 }
1212 1213
1213 per_cpu(cpufreq_policy_cpu, cpu) = -1; 1214 per_cpu(cpufreq_policy_cpu, cpu) = -1;
@@ -1932,7 +1933,7 @@ no_policy:
1932} 1933}
1933EXPORT_SYMBOL(cpufreq_update_policy); 1934EXPORT_SYMBOL(cpufreq_update_policy);
1934 1935
1935static int __cpuinit cpufreq_cpu_callback(struct notifier_block *nfb, 1936static int cpufreq_cpu_callback(struct notifier_block *nfb,
1936 unsigned long action, void *hcpu) 1937 unsigned long action, void *hcpu)
1937{ 1938{
1938 unsigned int cpu = (unsigned long)hcpu; 1939 unsigned int cpu = (unsigned long)hcpu;
@@ -1942,13 +1943,15 @@ static int __cpuinit cpufreq_cpu_callback(struct notifier_block *nfb,
1942 if (dev) { 1943 if (dev) {
1943 switch (action) { 1944 switch (action) {
1944 case CPU_ONLINE: 1945 case CPU_ONLINE:
1946 case CPU_ONLINE_FROZEN:
1945 cpufreq_add_dev(dev, NULL); 1947 cpufreq_add_dev(dev, NULL);
1946 break; 1948 break;
1947 case CPU_DOWN_PREPARE: 1949 case CPU_DOWN_PREPARE:
1948 case CPU_UP_CANCELED_FROZEN: 1950 case CPU_DOWN_PREPARE_FROZEN:
1949 __cpufreq_remove_dev(dev, NULL); 1951 __cpufreq_remove_dev(dev, NULL);
1950 break; 1952 break;
1951 case CPU_DOWN_FAILED: 1953 case CPU_DOWN_FAILED:
1954 case CPU_DOWN_FAILED_FROZEN:
1952 cpufreq_add_dev(dev, NULL); 1955 cpufreq_add_dev(dev, NULL);
1953 break; 1956 break;
1954 } 1957 }