diff --git a/drivers/opp/of.c b/drivers/opp/of.c
index 605d68673f92..6b0725177ed7 100644
--- a/drivers/opp/of.c
+++ b/drivers/opp/of.c
@@ -587,6 +587,9 @@ static int opp_parse_supplies(struct dev_pm_opp *opp, struct device *dev,
 	struct property *prop = NULL;
 	char name[NAME_MAX];
 
+	if (unlikely(supplies == -1))
+		supplies = 1;
+
 	/* Search for "opp-microvolt-<name>" */
 	if (opp_table->prop_name) {
 		snprintf(name, sizeof(name), "opp-microvolt-%s",
@@ -598,55 +601,45 @@ static int opp_parse_supplies(struct dev_pm_opp *opp, struct device *dev,
 		/* Search for "opp-microvolt" */
 		sprintf(name, "opp-microvolt");
 		prop = of_find_property(opp->np, name, NULL);
+	}
 
-		/* Missing property isn't a problem, but an invalid entry is */
-		if (!prop) {
-			if (unlikely(supplies == -1)) {
-				/* Initialize regulator_count */
-				opp_table->regulator_count = 0;
-				return 0;
-			}
-
-			if (!supplies)
-				return 0;
-
-			dev_err(dev, "%s: opp-microvolt missing although OPP managing regulators\n",
-				__func__);
+	/* Missing property isn't a problem, but an invalid entry is */
+	if (prop) {
+		if (unlikely(!supplies)) {
+			dev_err(dev, "%s: opp-microvolt wasn't expected\n", __func__);
 			return -EINVAL;
 		}
-	}
-
-	if (unlikely(supplies == -1)) {
-		/* Initialize regulator_count */
-		supplies = opp_table->regulator_count = 1;
-	} else if (unlikely(!supplies)) {
-		dev_err(dev, "%s: opp-microvolt wasn't expected\n", __func__);
-		return -EINVAL;
-	}
 
-	vcount = of_property_count_u32_elems(opp->np, name);
-	if (vcount < 0) {
-		dev_err(dev, "%s: Invalid %s property (%d)\n",
-			__func__, name, vcount);
-		return vcount;
-	}
+		vcount = of_property_count_u32_elems(opp->np, name);
+		if (vcount < 0) {
+			dev_err(dev, "%s: Invalid %s property (%d)\n",
+				__func__, name, vcount);
+			return vcount;
+		}
 
-	/* There can be one or three elements per supply */
-	if (vcount != supplies && vcount != supplies * 3) {
-		dev_err(dev, "%s: Invalid number of elements in %s property (%d) with supplies (%d)\n",
-			__func__, name, vcount, supplies);
-		return -EINVAL;
-	}
+		/* There can be one or three elements per supply */
+		if (vcount != supplies && vcount != supplies * 3) {
+			dev_err(dev, "%s: Invalid number of elements in %s property (%d) with supplies (%d)\n",
+				__func__, name, vcount, supplies);
+			return -EINVAL;
+		}
 
-	microvolt = kmalloc_array(vcount, sizeof(*microvolt), GFP_KERNEL);
-	if (!microvolt)
-		return -ENOMEM;
+		microvolt = kmalloc_array(vcount, sizeof(*microvolt), GFP_KERNEL);
+		if (!microvolt)
+			return -ENOMEM;
 
-	ret = of_property_read_u32_array(opp->np, name, microvolt, vcount);
-	if (ret) {
-		dev_err(dev, "%s: error parsing %s: %d\n", __func__, name, ret);
-		ret = -EINVAL;
-		goto free_microvolt;
+		ret = of_property_read_u32_array(opp->np, name, microvolt, vcount);
+		if (ret) {
+			dev_err(dev, "%s: error parsing %s: %d\n", __func__, name, ret);
+			ret = -EINVAL;
+			goto free_microvolt;
+		}
+	} else {
+		if (unlikely(opp_table->regulator_count > 0))) {
+			dev_err(dev, "%s: opp-microvolt missing although OPP managing regulators\n",
+				__func__);
+			return -EINVAL;
+		}
 	}
 
 	/* Search for "opp-microamp-<name>" */
@@ -732,6 +725,9 @@ static int opp_parse_supplies(struct dev_pm_opp *opp, struct device *dev,
 		}
 	}
 
+	/* Initialize regulator_count */
+	opp_table->regulator_count = supplies;
+
 	for (i = 0, j = 0; i < supplies; i++) {
 		opp->supplies[i].u_volt = microvolt[j++];