diff options
Diffstat (limited to 'drivers/cpufreq/imx6q-cpufreq.c')
-rw-r--r-- | drivers/cpufreq/imx6q-cpufreq.c | 54 |
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 | ||
302 | free_freq_table: | 301 | free_freq_table: |
303 | dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table); | 302 | dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table); |
304 | put_node: | 303 | put_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); | ||
310 | put_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 | } |