diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index f092588..eee22b7 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -656,14 +656,14 @@ static int suspend_set_state(struct regulator_dev *rdev,
 	struct regulator_state *rstate)
 {
 	int ret = 0;
+	struct regulator_ops *ops = rdev->desc->ops;
 
 	/* If we have no suspend mode configration don't set anything;
 	 * only warn if the driver implements set_suspend_voltage or
 	 * set_suspend_mode callback.
 	 */
 	if (!rstate->enabled && !rstate->disabled) {
-		if (rdev->desc->ops->set_suspend_voltage ||
-		    rdev->desc->ops->set_suspend_mode)
+		if (ops->set_suspend_voltage || ops->set_suspend_mode)
 			rdev_warn(rdev, "No configuration\n");
 		return 0;
 	}
@@ -673,28 +673,35 @@ static int suspend_set_state(struct regulator_dev *rdev,
 		return -EINVAL;
 	}
 
-	if (rstate->enabled && rdev->desc->ops->set_suspend_enable)
-		ret = rdev->desc->ops->set_suspend_enable(rdev);
-	else if (rstate->disabled && rdev->desc->ops->set_suspend_disable)
-		ret = rdev->desc->ops->set_suspend_disable(rdev);
-	else /* OK if set_suspend_enable or set_suspend_disable is NULL */
+	if (rstate->enabled && ops->set_suspend_enable) {
+		ret = ops->set_suspend_enable(rdev);
+		if (ret < 0) {
+			rdev_err(rdev, "failed to enabled\n");
+			return ret;
+		}
+		rdev->suspend_flag = SUSPEND_ENABLED;
+	} else if (rstate->disabled && ops->set_suspend_disable) {
+		ret = ops->set_suspend_disable(rdev);
+		if (ret < 0) {
+			rdev_err(rdev, "failed to disabled\n");
+			return ret;
+		}
+		rdev->suspend_flag = SUSPEND_DISABLED;
+	} else {
+		/* OK if set_suspend_enable or set_suspend_disable is NULL */
 		ret = 0;
-
-	if (ret < 0) {
-		rdev_err(rdev, "failed to enabled/disable\n");
-		return ret;
 	}
 
-	if (rdev->desc->ops->set_suspend_voltage && rstate->uV > 0) {
-		ret = rdev->desc->ops->set_suspend_voltage(rdev, rstate->uV);
+	if (ops->set_suspend_voltage && rstate->uV > 0) {
+		ret = ops->set_suspend_voltage(rdev, rstate->uV);
 		if (ret < 0) {
 			rdev_err(rdev, "failed to set voltage\n");
 			return ret;
 		}
 	}
 
-	if (rdev->desc->ops->set_suspend_mode && rstate->mode > 0) {
-		ret = rdev->desc->ops->set_suspend_mode(rdev, rstate->mode);
+	if (ops->set_suspend_mode && rstate->mode > 0) {
+		ret = ops->set_suspend_mode(rdev, rstate->mode);
 		if (ret < 0) {
 			rdev_err(rdev, "failed to set mode\n");
 			return ret;
@@ -3390,31 +3397,20 @@ EXPORT_SYMBOL_GPL(regulator_suspend_prepare);
 int regulator_suspend_finish(void)
 {
 	struct regulator_dev *rdev;
-	int ret = 0, error;
+	int ret = 0;
 
 	mutex_lock(&regulator_list_mutex);
 	list_for_each_entry(rdev, &regulator_list, list) {
 		struct regulator_ops *ops = rdev->desc->ops;
 
 		mutex_lock(&rdev->mutex);
-		if ((rdev->use_count > 0  || rdev->constraints->always_on) &&
-				ops->enable) {
-			error = ops->enable(rdev);
-			if (error)
-				ret = error;
-		} else {
-			if (!has_full_constraints)
-				goto unlock;
-			if (!ops->disable)
-				goto unlock;
-			if (!_regulator_is_enabled(rdev))
-				goto unlock;
-
-			error = ops->disable(rdev);
-			if (error)
-				ret = error;
+		if ((rdev->suspend_flag == SUSPEND_DISABLED) && ops->enable) {
+			ret = ops->enable(rdev);
+		} else if ((rdev->suspend_flag == SUSPEND_ENABLED) &&
+					ops->disable) {
+				ret = ops->disable(rdev);
 		}
-unlock:
+		rdev->suspend_flag = SUSPEND_NONE;
 		mutex_unlock(&rdev->mutex);
 	}
 	mutex_unlock(&regulator_list_mutex);
diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h
index bac4c87..d545417 100644
--- a/include/linux/regulator/driver.h
+++ b/include/linux/regulator/driver.h
@@ -155,6 +155,15 @@ enum regulator_type {
 	REGULATOR_CURRENT,
 };
 
+/*
+ * Regulator can disable, enable or do nothing during suspend
+ */
+enum regulator_suspend_flag {
+	SUSPEND_NONE,
+	SUSPEND_ENABLED,
+	SUSPEND_DISABLED,
+};
+
 /**
  * struct regulator_desc - Static regulator descriptor
  *
@@ -253,6 +262,7 @@ struct regulator_dev {
 	int exclusive;
 	u32 use_count;
 	u32 open_count;
+	enum regulator_suspend_flag suspend_flag;
 
 	/* lists we belong to */
 	struct list_head list; /* list of all regulators */
