|
|
|
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
|
|
|
|
@@ -1664,6 +1664,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);
|
|
|
|
@@ -1700,6 +1701,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);
|