PM / OPP: fix the errors occurred during getting or setting voltage
authorFinley Xiao <finley.xiao@rock-chips.com>
Fri, 9 Dec 2016 03:34:03 +0000 (11:34 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Mon, 12 Dec 2016 04:59:44 +0000 (12:59 +0800)
Change-Id: Iae0695d780b7f8f75c6d49bde5ee09beb04e1d80
Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
drivers/base/power/opp/core.c

index cd17cd9eb50de5fa0640c1732da1332411a38273..eb42b8a297eb22d325b054b9c7984deb96b4fd9b 100644 (file)
@@ -737,6 +737,11 @@ int dev_pm_opp_check_initial_rate(struct device *dev, unsigned long *cur_freq)
 
        clk = opp_table->clk;
        reg = opp_table->regulator;
+       if (IS_ERR_OR_NULL(clk) || IS_ERR_OR_NULL(reg)) {
+               dev_err(dev, "clk or regulater is unavailable\n");
+               rcu_read_unlock();
+               return -EINVAL;
+       }
 
        old_freq = clk_get_rate(clk);
        *cur_freq = old_freq;
@@ -761,6 +766,10 @@ int dev_pm_opp_check_initial_rate(struct device *dev, unsigned long *cur_freq)
 
        target_freq = clk_round_rate(clk, target_freq);
        old_volt = regulator_get_voltage(reg);
+       if (old_volt <= 0) {
+               dev_err(dev, "failed to get volt %d\n", old_volt);
+               return -EINVAL;
+       }
 
        dev_dbg(dev, "%lu Hz %d uV --> %lu Hz %lu uV\n", old_freq, old_volt,
                target_freq, u_volt);