From 4533c285c2aedce6d4434d7b877066de3b1ecb33 Mon Sep 17 00:00:00 2001 From: Georgi Djakov 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 --- 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 @@ -1652,6 +1652,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); @@ -1688,6 +1689,10 @@ int dev_pm_opp_adjust_voltage(struct dev /* plug in new node */ new_opp->supplies[0].u_volt = u_volt; + tol = u_volt * opp_table->voltage_tolerance_v1 / 100; + new_opp->supplies[0].u_volt = u_volt; + new_opp->supplies[0].u_volt_min = u_volt - tol; + new_opp->supplies[0].u_volt_max = u_volt + tol; list_replace(&opp->node, &new_opp->node); mutex_unlock(&opp_table_lock);