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 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) { | 120 | post_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 | ||
128 | static int cpu0_cpufreq_init(struct cpufreq_policy *policy) | 126 | static 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 | ||
267 | out_free_table: | 263 | out_free_table: |