diff options
Diffstat (limited to 'drivers/cpufreq/cpufreq-cpu0.c')
| -rw-r--r-- | drivers/cpufreq/cpufreq-cpu0.c | 32 | 
1 files changed, 14 insertions, 18 deletions
diff --git a/drivers/cpufreq/cpufreq-cpu0.c b/drivers/cpufreq/cpufreq-cpu0.c index 37d23a0f8c5..3ab8294eab0 100644 --- a/drivers/cpufreq/cpufreq-cpu0.c +++ b/drivers/cpufreq/cpufreq-cpu0.c @@ -44,8 +44,9 @@ static int cpu0_set_target(struct cpufreq_policy *policy,  {  	struct cpufreq_freqs freqs;  	struct opp *opp; -	unsigned long freq_Hz, volt = 0, volt_old = 0, tol = 0; -	unsigned int index, cpu; +	unsigned long volt = 0, volt_old = 0, tol = 0; +	long freq_Hz; +	unsigned int index;  	int ret;  	ret = cpufreq_frequency_table_target(policy, freq_table, target_freq, @@ -65,10 +66,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy,  	if (freqs.old == freqs.new)  		return 0; -	for_each_online_cpu(cpu) { -		freqs.cpu = cpu; -		cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); -	} +	cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);  	if (cpu_reg) {  		rcu_read_lock(); @@ -76,7 +74,9 @@ static int cpu0_set_target(struct cpufreq_policy *policy,  		if (IS_ERR(opp)) {  			rcu_read_unlock();  			pr_err("failed to find OPP for %ld\n", freq_Hz); -			return PTR_ERR(opp); +			freqs.new = freqs.old; +			ret = PTR_ERR(opp); +			goto post_notify;  		}  		volt = opp_get_voltage(opp);  		rcu_read_unlock(); @@ -94,7 +94,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy,  		if (ret) {  			pr_err("failed to scale voltage up: %d\n", ret);  			freqs.new = freqs.old; -			return ret; +			goto post_notify;  		}  	} @@ -103,7 +103,8 @@ static int cpu0_set_target(struct cpufreq_policy *policy,  		pr_err("failed to set clock rate: %d\n", ret);  		if (cpu_reg)  			regulator_set_voltage_tol(cpu_reg, volt_old, tol); -		return ret; +		freqs.new = freqs.old; +		goto post_notify;  	}  	/* scaling down?  scale voltage after frequency */ @@ -113,25 +114,19 @@ static int cpu0_set_target(struct cpufreq_policy *policy,  			pr_err("failed to scale voltage down: %d\n", ret);  			clk_set_rate(cpu_clk, freqs.old * 1000);  			freqs.new = freqs.old; -			return ret;  		}  	} -	for_each_online_cpu(cpu) { -		freqs.cpu = cpu; -		cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); -	} +post_notify: +	cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE); -	return 0; +	return ret;  }  static int cpu0_cpufreq_init(struct cpufreq_policy *policy)  {  	int ret; -	if (policy->cpu != 0) -		return -EINVAL; -  	ret = cpufreq_frequency_table_cpuinfo(policy, freq_table);  	if (ret) {  		pr_err("invalid frequency table: %d\n", ret); @@ -262,6 +257,7 @@ static int cpu0_cpufreq_probe(struct platform_device *pdev)  	}  	of_node_put(np); +	of_node_put(parent);  	return 0;  out_free_table:  |