diff options
-rw-r--r-- | drivers/cpufreq/imx6q-cpufreq.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/drivers/cpufreq/imx6q-cpufreq.c b/drivers/cpufreq/imx6q-cpufreq.c index af366c21d4b4..c2d30765bf3d 100644 --- a/drivers/cpufreq/imx6q-cpufreq.c +++ b/drivers/cpufreq/imx6q-cpufreq.c | |||
@@ -66,10 +66,12 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index) | |||
66 | 66 | ||
67 | /* scaling up? scale voltage before frequency */ | 67 | /* scaling up? scale voltage before frequency */ |
68 | if (new_freq > old_freq) { | 68 | if (new_freq > old_freq) { |
69 | ret = regulator_set_voltage_tol(pu_reg, imx6_soc_volt[index], 0); | 69 | if (!IS_ERR(pu_reg)) { |
70 | if (ret) { | 70 | ret = regulator_set_voltage_tol(pu_reg, imx6_soc_volt[index], 0); |
71 | dev_err(cpu_dev, "failed to scale vddpu up: %d\n", ret); | 71 | if (ret) { |
72 | return ret; | 72 | dev_err(cpu_dev, "failed to scale vddpu up: %d\n", ret); |
73 | return ret; | ||
74 | } | ||
73 | } | 75 | } |
74 | ret = regulator_set_voltage_tol(soc_reg, imx6_soc_volt[index], 0); | 76 | ret = regulator_set_voltage_tol(soc_reg, imx6_soc_volt[index], 0); |
75 | if (ret) { | 77 | if (ret) { |
@@ -121,10 +123,12 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index) | |||
121 | dev_warn(cpu_dev, "failed to scale vddsoc down: %d\n", ret); | 123 | dev_warn(cpu_dev, "failed to scale vddsoc down: %d\n", ret); |
122 | ret = 0; | 124 | ret = 0; |
123 | } | 125 | } |
124 | ret = regulator_set_voltage_tol(pu_reg, imx6_soc_volt[index], 0); | 126 | if (!IS_ERR(pu_reg)) { |
125 | if (ret) { | 127 | ret = regulator_set_voltage_tol(pu_reg, imx6_soc_volt[index], 0); |
126 | dev_warn(cpu_dev, "failed to scale vddpu down: %d\n", ret); | 128 | if (ret) { |
127 | ret = 0; | 129 | dev_warn(cpu_dev, "failed to scale vddpu down: %d\n", ret); |
130 | ret = 0; | ||
131 | } | ||
128 | } | 132 | } |
129 | } | 133 | } |
130 | 134 | ||
@@ -182,9 +186,9 @@ static int imx6q_cpufreq_probe(struct platform_device *pdev) | |||
182 | } | 186 | } |
183 | 187 | ||
184 | arm_reg = regulator_get(cpu_dev, "arm"); | 188 | arm_reg = regulator_get(cpu_dev, "arm"); |
185 | pu_reg = regulator_get(cpu_dev, "pu"); | 189 | pu_reg = regulator_get_optional(cpu_dev, "pu"); |
186 | soc_reg = regulator_get(cpu_dev, "soc"); | 190 | soc_reg = regulator_get(cpu_dev, "soc"); |
187 | if (IS_ERR(arm_reg) || IS_ERR(pu_reg) || IS_ERR(soc_reg)) { | 191 | if (IS_ERR(arm_reg) || IS_ERR(soc_reg)) { |
188 | dev_err(cpu_dev, "failed to get regulators\n"); | 192 | dev_err(cpu_dev, "failed to get regulators\n"); |
189 | ret = -ENOENT; | 193 | ret = -ENOENT; |
190 | goto put_reg; | 194 | goto put_reg; |
@@ -268,9 +272,11 @@ soc_opp_out: | |||
268 | ret = regulator_set_voltage_time(soc_reg, imx6_soc_volt[0], imx6_soc_volt[num - 1]); | 272 | ret = regulator_set_voltage_time(soc_reg, imx6_soc_volt[0], imx6_soc_volt[num - 1]); |
269 | if (ret > 0) | 273 | if (ret > 0) |
270 | transition_latency += ret * 1000; | 274 | transition_latency += ret * 1000; |
271 | ret = regulator_set_voltage_time(pu_reg, imx6_soc_volt[0], imx6_soc_volt[num - 1]); | 275 | if (!IS_ERR(pu_reg)) { |
272 | if (ret > 0) | 276 | ret = regulator_set_voltage_time(pu_reg, imx6_soc_volt[0], imx6_soc_volt[num - 1]); |
273 | transition_latency += ret * 1000; | 277 | if (ret > 0) |
278 | transition_latency += ret * 1000; | ||
279 | } | ||
274 | 280 | ||
275 | /* | 281 | /* |
276 | * OPP is maintained in order of increasing frequency, and | 282 | * OPP is maintained in order of increasing frequency, and |
@@ -327,7 +333,8 @@ static int imx6q_cpufreq_remove(struct platform_device *pdev) | |||
327 | cpufreq_unregister_driver(&imx6q_cpufreq_driver); | 333 | cpufreq_unregister_driver(&imx6q_cpufreq_driver); |
328 | dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table); | 334 | dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table); |
329 | regulator_put(arm_reg); | 335 | regulator_put(arm_reg); |
330 | regulator_put(pu_reg); | 336 | if (!IS_ERR(pu_reg)) |
337 | regulator_put(pu_reg); | ||
331 | regulator_put(soc_reg); | 338 | regulator_put(soc_reg); |
332 | clk_put(arm_clk); | 339 | clk_put(arm_clk); |
333 | clk_put(pll1_sys_clk); | 340 | clk_put(pll1_sys_clk); |