diff options
Diffstat (limited to 'drivers/cpufreq/cpufreq.c')
| -rw-r--r-- | drivers/cpufreq/cpufreq.c | 25 |
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 | } |
| 1933 | EXPORT_SYMBOL(cpufreq_update_policy); | 1934 | EXPORT_SYMBOL(cpufreq_update_policy); |
| 1934 | 1935 | ||
| 1935 | static int __cpuinit cpufreq_cpu_callback(struct notifier_block *nfb, | 1936 | static 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 | } |
