aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq/cpufreq-cpu0.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/cpufreq/cpufreq-cpu0.c')
-rw-r--r--drivers/cpufreq/cpufreq-cpu0.c32
1 files changed, 14 insertions, 18 deletions
diff --git a/drivers/cpufreq/cpufreq-cpu0.c b/drivers/cpufreq/cpufreq-cpu0.c
index 37d23a0f8c56..3ab8294eab04 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,
44{ 44{
45 struct cpufreq_freqs freqs; 45 struct cpufreq_freqs freqs;
46 struct opp *opp; 46 struct opp *opp;
47 unsigned long freq_Hz, volt = 0, volt_old = 0, tol = 0; 47 unsigned long volt = 0, volt_old = 0, tol = 0;
48 unsigned int index, cpu; 48 long freq_Hz;
49 unsigned int index;
49 int ret; 50 int ret;
50 51
51 ret = cpufreq_frequency_table_target(policy, freq_table, target_freq, 52 ret = cpufreq_frequency_table_target(policy, freq_table, target_freq,
@@ -65,10 +66,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
65 if (freqs.old == freqs.new) 66 if (freqs.old == freqs.new)
66 return 0; 67 return 0;
67 68
68 for_each_online_cpu(cpu) { 69 cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
69 freqs.cpu = cpu;
70 cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
71 }
72 70
73 if (cpu_reg) { 71 if (cpu_reg) {
74 rcu_read_lock(); 72 rcu_read_lock();
@@ -76,7 +74,9 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
76 if (IS_ERR(opp)) { 74 if (IS_ERR(opp)) {
77 rcu_read_unlock(); 75 rcu_read_unlock();
78 pr_err("failed to find OPP for %ld\n", freq_Hz); 76 pr_err("failed to find OPP for %ld\n", freq_Hz);
79 return PTR_ERR(opp); 77 freqs.new = freqs.old;
78 ret = PTR_ERR(opp);
79 goto post_notify;
80 } 80 }
81 volt = opp_get_voltage(opp); 81 volt = opp_get_voltage(opp);
82 rcu_read_unlock(); 82 rcu_read_unlock();
@@ -94,7 +94,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
94 if (ret) { 94 if (ret) {
95 pr_err("failed to scale voltage up: %d\n", ret); 95 pr_err("failed to scale voltage up: %d\n", ret);
96 freqs.new = freqs.old; 96 freqs.new = freqs.old;
97 return ret; 97 goto post_notify;
98 } 98 }
99 } 99 }
100 100
@@ -103,7 +103,8 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
103 pr_err("failed to set clock rate: %d\n", ret); 103 pr_err("failed to set clock rate: %d\n", ret);
104 if (cpu_reg) 104 if (cpu_reg)
105 regulator_set_voltage_tol(cpu_reg, volt_old, tol); 105 regulator_set_voltage_tol(cpu_reg, volt_old, tol);
106 return ret; 106 freqs.new = freqs.old;
107 goto post_notify;
107 } 108 }
108 109
109 /* scaling down? scale voltage after frequency */ 110 /* scaling down? scale voltage after frequency */
@@ -113,25 +114,19 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
113 pr_err("failed to scale voltage down: %d\n", ret); 114 pr_err("failed to scale voltage down: %d\n", ret);
114 clk_set_rate(cpu_clk, freqs.old * 1000); 115 clk_set_rate(cpu_clk, freqs.old * 1000);
115 freqs.new = freqs.old; 116 freqs.new = freqs.old;
116 return ret;
117 } 117 }
118 } 118 }
119 119
120 for_each_online_cpu(cpu) { 120post_notify:
121 freqs.cpu = cpu; 121 cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
122 cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
123 }
124 122
125 return 0; 123 return ret;
126} 124}
127 125
128static int cpu0_cpufreq_init(struct cpufreq_policy *policy) 126static int cpu0_cpufreq_init(struct cpufreq_policy *policy)
129{ 127{
130 int ret; 128 int ret;
131 129
132 if (policy->cpu != 0)
133 return -EINVAL;
134
135 ret = cpufreq_frequency_table_cpuinfo(policy, freq_table); 130 ret = cpufreq_frequency_table_cpuinfo(policy, freq_table);
136 if (ret) { 131 if (ret) {
137 pr_err("invalid frequency table: %d\n", ret); 132 pr_err("invalid frequency table: %d\n", ret);
@@ -262,6 +257,7 @@ static int cpu0_cpufreq_probe(struct platform_device *pdev)
262 } 257 }
263 258
264 of_node_put(np); 259 of_node_put(np);
260 of_node_put(parent);
265 return 0; 261 return 0;
266 262
267out_free_table: 263out_free_table: