From 4533c285c2aedce6d4434d7b877066de3b1ecb33 Mon Sep 17 00:00:00 2001
From: Georgi Djakov <georgi.djakov@linaro.org>
Date: Thu, 25 Aug 2016 18:43:35 +0300
Subject: [PATCH 52/69] PM / OPP: Update the voltage tolerance when adjusting
 the OPP

When the voltage is adjusted, the voltage tolerance is not updated.
This can lead to situations where the voltage min value is greater
than the voltage max value. The final result is triggering a BUG()
in the regulator core.
Fix this by updating the voltage tolerance values too.

Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
---
 drivers/base/power/opp/core.c | 5 +++++
 1 file changed, 5 insertions(+)

--- a/drivers/base/power/opp/core.c
+++ b/drivers/base/power/opp/core.c
@@ -1566,6 +1566,7 @@ int dev_pm_opp_adjust_voltage(struct dev
 	struct opp_table *opp_table;
 	struct dev_pm_opp *new_opp, *tmp_opp, *opp = ERR_PTR(-ENODEV);
 	int r = 0;
+	unsigned long tol;
 
 	/* keep the node allocated */
 	new_opp = kmalloc(sizeof(*new_opp), GFP_KERNEL);
@@ -1602,6 +1603,10 @@ int dev_pm_opp_adjust_voltage(struct dev
 
 	/* plug in new node */
 	new_opp->u_volt = u_volt;
+	tol = u_volt * opp_table->voltage_tolerance_v1 / 100;
+	new_opp->u_volt = u_volt;
+	new_opp->u_volt_min = u_volt - tol;
+	new_opp->u_volt_max = u_volt + tol;
 
 	list_replace_rcu(&opp->node, &new_opp->node);
 	mutex_unlock(&opp_table_lock);
