Merge tag 'v3.17-rc4' into sched/core, to prevent conflicts with upcoming patches...
[firefly-linux-kernel-4.4.55.git] / drivers / cpufreq / imx6q-cpufreq.c
index af366c21d4b4032e1471391e97ac800229d12733..c2d30765bf3d209618bc3b9049cff85f5d5c1745 100644 (file)
@@ -66,10 +66,12 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index)
 
        /* scaling up?  scale voltage before frequency */
        if (new_freq > old_freq) {
-               ret = regulator_set_voltage_tol(pu_reg, imx6_soc_volt[index], 0);
-               if (ret) {
-                       dev_err(cpu_dev, "failed to scale vddpu up: %d\n", ret);
-                       return ret;
+               if (!IS_ERR(pu_reg)) {
+                       ret = regulator_set_voltage_tol(pu_reg, imx6_soc_volt[index], 0);
+                       if (ret) {
+                               dev_err(cpu_dev, "failed to scale vddpu up: %d\n", ret);
+                               return ret;
+                       }
                }
                ret = regulator_set_voltage_tol(soc_reg, imx6_soc_volt[index], 0);
                if (ret) {
@@ -121,10 +123,12 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index)
                        dev_warn(cpu_dev, "failed to scale vddsoc down: %d\n", ret);
                        ret = 0;
                }
-               ret = regulator_set_voltage_tol(pu_reg, imx6_soc_volt[index], 0);
-               if (ret) {
-                       dev_warn(cpu_dev, "failed to scale vddpu down: %d\n", ret);
-                       ret = 0;
+               if (!IS_ERR(pu_reg)) {
+                       ret = regulator_set_voltage_tol(pu_reg, imx6_soc_volt[index], 0);
+                       if (ret) {
+                               dev_warn(cpu_dev, "failed to scale vddpu down: %d\n", ret);
+                               ret = 0;
+                       }
                }
        }
 
@@ -182,9 +186,9 @@ static int imx6q_cpufreq_probe(struct platform_device *pdev)
        }
 
        arm_reg = regulator_get(cpu_dev, "arm");
-       pu_reg = regulator_get(cpu_dev, "pu");
+       pu_reg = regulator_get_optional(cpu_dev, "pu");
        soc_reg = regulator_get(cpu_dev, "soc");
-       if (IS_ERR(arm_reg) || IS_ERR(pu_reg) || IS_ERR(soc_reg)) {
+       if (IS_ERR(arm_reg) || IS_ERR(soc_reg)) {
                dev_err(cpu_dev, "failed to get regulators\n");
                ret = -ENOENT;
                goto put_reg;
@@ -268,9 +272,11 @@ soc_opp_out:
        ret = regulator_set_voltage_time(soc_reg, imx6_soc_volt[0], imx6_soc_volt[num - 1]);
        if (ret > 0)
                transition_latency += ret * 1000;
-       ret = regulator_set_voltage_time(pu_reg, imx6_soc_volt[0], imx6_soc_volt[num - 1]);
-       if (ret > 0)
-               transition_latency += ret * 1000;
+       if (!IS_ERR(pu_reg)) {
+               ret = regulator_set_voltage_time(pu_reg, imx6_soc_volt[0], imx6_soc_volt[num - 1]);
+               if (ret > 0)
+                       transition_latency += ret * 1000;
+       }
 
        /*
         * OPP is maintained in order of increasing frequency, and
@@ -327,7 +333,8 @@ static int imx6q_cpufreq_remove(struct platform_device *pdev)
        cpufreq_unregister_driver(&imx6q_cpufreq_driver);
        dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table);
        regulator_put(arm_reg);
-       regulator_put(pu_reg);
+       if (!IS_ERR(pu_reg))
+               regulator_put(pu_reg);
        regulator_put(soc_reg);
        clk_put(arm_clk);
        clk_put(pll1_sys_clk);