Merge branch 'work.lookup' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux-2.6-block.git] / drivers / opp / cpu.c
index 0c09107094350456162cd9573c37fa7f9f134df0..ab6d07e78945db8c4c77a8a480549125592c0a77 100644 (file)
@@ -108,7 +108,8 @@ void dev_pm_opp_free_cpufreq_table(struct device *dev,
 EXPORT_SYMBOL_GPL(dev_pm_opp_free_cpufreq_table);
 #endif /* CONFIG_CPU_FREQ */
 
-void _dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask, bool of)
+void _dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask,
+                                     int last_cpu)
 {
        struct device *cpu_dev;
        int cpu;
@@ -116,6 +117,9 @@ void _dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask, bool of)
        WARN_ON(cpumask_empty(cpumask));
 
        for_each_cpu(cpu, cpumask) {
+               if (cpu == last_cpu)
+                       break;
+
                cpu_dev = get_cpu_device(cpu);
                if (!cpu_dev) {
                        pr_err("%s: failed to get cpu%d device\n", __func__,
@@ -123,10 +127,7 @@ void _dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask, bool of)
                        continue;
                }
 
-               if (of)
-                       dev_pm_opp_of_remove_table(cpu_dev);
-               else
-                       dev_pm_opp_remove_table(cpu_dev);
+               _dev_pm_opp_find_and_remove_table(cpu_dev);
        }
 }
 
@@ -140,7 +141,7 @@ void _dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask, bool of)
  */
 void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask)
 {
-       _dev_pm_opp_cpumask_remove_table(cpumask, false);
+       _dev_pm_opp_cpumask_remove_table(cpumask, -1);
 }
 EXPORT_SYMBOL_GPL(dev_pm_opp_cpumask_remove_table);
 
@@ -222,8 +223,10 @@ int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
        cpumask_clear(cpumask);
 
        if (opp_table->shared_opp == OPP_TABLE_ACCESS_SHARED) {
+               mutex_lock(&opp_table->lock);
                list_for_each_entry(opp_dev, &opp_table->dev_list, node)
                        cpumask_set_cpu(opp_dev->dev->id, cpumask);
+               mutex_unlock(&opp_table->lock);
        } else {
                cpumask_set_cpu(cpu_dev->id, cpumask);
        }