aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq/imx6q-cpufreq.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/cpufreq/imx6q-cpufreq.c')
-rw-r--r--drivers/cpufreq/imx6q-cpufreq.c54
1 files changed, 39 insertions, 15 deletions
diff --git a/drivers/cpufreq/imx6q-cpufreq.c b/drivers/cpufreq/imx6q-cpufreq.c
index e27fca86fe4f..af366c21d4b4 100644
--- a/drivers/cpufreq/imx6q-cpufreq.c
+++ b/drivers/cpufreq/imx6q-cpufreq.c
@@ -9,7 +9,6 @@
9#include <linux/clk.h> 9#include <linux/clk.h>
10#include <linux/cpu.h> 10#include <linux/cpu.h>
11#include <linux/cpufreq.h> 11#include <linux/cpufreq.h>
12#include <linux/delay.h>
13#include <linux/err.h> 12#include <linux/err.h>
14#include <linux/module.h> 13#include <linux/module.h>
15#include <linux/of.h> 14#include <linux/of.h>
@@ -170,25 +169,25 @@ static int imx6q_cpufreq_probe(struct platform_device *pdev)
170 return -ENOENT; 169 return -ENOENT;
171 } 170 }
172 171
173 arm_clk = devm_clk_get(cpu_dev, "arm"); 172 arm_clk = clk_get(cpu_dev, "arm");
174 pll1_sys_clk = devm_clk_get(cpu_dev, "pll1_sys"); 173 pll1_sys_clk = clk_get(cpu_dev, "pll1_sys");
175 pll1_sw_clk = devm_clk_get(cpu_dev, "pll1_sw"); 174 pll1_sw_clk = clk_get(cpu_dev, "pll1_sw");
176 step_clk = devm_clk_get(cpu_dev, "step"); 175 step_clk = clk_get(cpu_dev, "step");
177 pll2_pfd2_396m_clk = devm_clk_get(cpu_dev, "pll2_pfd2_396m"); 176 pll2_pfd2_396m_clk = clk_get(cpu_dev, "pll2_pfd2_396m");
178 if (IS_ERR(arm_clk) || IS_ERR(pll1_sys_clk) || IS_ERR(pll1_sw_clk) || 177 if (IS_ERR(arm_clk) || IS_ERR(pll1_sys_clk) || IS_ERR(pll1_sw_clk) ||
179 IS_ERR(step_clk) || IS_ERR(pll2_pfd2_396m_clk)) { 178 IS_ERR(step_clk) || IS_ERR(pll2_pfd2_396m_clk)) {
180 dev_err(cpu_dev, "failed to get clocks\n"); 179 dev_err(cpu_dev, "failed to get clocks\n");
181 ret = -ENOENT; 180 ret = -ENOENT;
182 goto put_node; 181 goto put_clk;
183 } 182 }
184 183
185 arm_reg = devm_regulator_get(cpu_dev, "arm"); 184 arm_reg = regulator_get(cpu_dev, "arm");
186 pu_reg = devm_regulator_get(cpu_dev, "pu"); 185 pu_reg = regulator_get(cpu_dev, "pu");
187 soc_reg = devm_regulator_get(cpu_dev, "soc"); 186 soc_reg = regulator_get(cpu_dev, "soc");
188 if (IS_ERR(arm_reg) || IS_ERR(pu_reg) || IS_ERR(soc_reg)) { 187 if (IS_ERR(arm_reg) || IS_ERR(pu_reg) || IS_ERR(soc_reg)) {
189 dev_err(cpu_dev, "failed to get regulators\n"); 188 dev_err(cpu_dev, "failed to get regulators\n");
190 ret = -ENOENT; 189 ret = -ENOENT;
191 goto put_node; 190 goto put_reg;
192 } 191 }
193 192
194 /* 193 /*
@@ -201,21 +200,21 @@ static int imx6q_cpufreq_probe(struct platform_device *pdev)
201 ret = of_init_opp_table(cpu_dev); 200 ret = of_init_opp_table(cpu_dev);
202 if (ret < 0) { 201 if (ret < 0) {
203 dev_err(cpu_dev, "failed to init OPP table: %d\n", ret); 202 dev_err(cpu_dev, "failed to init OPP table: %d\n", ret);
204 goto put_node; 203 goto put_reg;
205 } 204 }
206 205
207 num = dev_pm_opp_get_opp_count(cpu_dev); 206 num = dev_pm_opp_get_opp_count(cpu_dev);
208 if (num < 0) { 207 if (num < 0) {
209 ret = num; 208 ret = num;
210 dev_err(cpu_dev, "no OPP table is found: %d\n", ret); 209 dev_err(cpu_dev, "no OPP table is found: %d\n", ret);
211 goto put_node; 210 goto put_reg;
212 } 211 }
213 } 212 }
214 213
215 ret = dev_pm_opp_init_cpufreq_table(cpu_dev, &freq_table); 214 ret = dev_pm_opp_init_cpufreq_table(cpu_dev, &freq_table);
216 if (ret) { 215 if (ret) {
217 dev_err(cpu_dev, "failed to init cpufreq table: %d\n", ret); 216 dev_err(cpu_dev, "failed to init cpufreq table: %d\n", ret);
218 goto put_node; 217 goto put_reg;
219 } 218 }
220 219
221 /* Make imx6_soc_volt array's size same as arm opp number */ 220 /* Make imx6_soc_volt array's size same as arm opp number */
@@ -301,7 +300,24 @@ soc_opp_out:
301 300
302free_freq_table: 301free_freq_table:
303 dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table); 302 dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table);
304put_node: 303put_reg:
304 if (!IS_ERR(arm_reg))
305 regulator_put(arm_reg);
306 if (!IS_ERR(pu_reg))
307 regulator_put(pu_reg);
308 if (!IS_ERR(soc_reg))
309 regulator_put(soc_reg);
310put_clk:
311 if (!IS_ERR(arm_clk))
312 clk_put(arm_clk);
313 if (!IS_ERR(pll1_sys_clk))
314 clk_put(pll1_sys_clk);
315 if (!IS_ERR(pll1_sw_clk))
316 clk_put(pll1_sw_clk);
317 if (!IS_ERR(step_clk))
318 clk_put(step_clk);
319 if (!IS_ERR(pll2_pfd2_396m_clk))
320 clk_put(pll2_pfd2_396m_clk);
305 of_node_put(np); 321 of_node_put(np);
306 return ret; 322 return ret;
307} 323}
@@ -310,6 +326,14 @@ static int imx6q_cpufreq_remove(struct platform_device *pdev)
310{ 326{
311 cpufreq_unregister_driver(&imx6q_cpufreq_driver); 327 cpufreq_unregister_driver(&imx6q_cpufreq_driver);
312 dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table); 328 dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table);
329 regulator_put(arm_reg);
330 regulator_put(pu_reg);
331 regulator_put(soc_reg);
332 clk_put(arm_clk);
333 clk_put(pll1_sys_clk);
334 clk_put(pll1_sw_clk);
335 clk_put(step_clk);
336 clk_put(pll2_pfd2_396m_clk);
313 337
314 return 0; 338 return 0;
315} 339}