diff options
Diffstat (limited to 'drivers/opp/cpu.c')
| -rw-r--r-- | drivers/opp/cpu.c | 15 | 
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/opp/cpu.c b/drivers/opp/cpu.c index 0c0910709435..ab6d07e78945 100644 --- a/drivers/opp/cpu.c +++ b/drivers/opp/cpu.c @@ -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);  	}  | 
