diff mbox series

[1/2] opp: ti-opp-supply: Dynamically update u_volt_min

Message ID 1541565263-8296-2-git-send-email-j-keerthy@ti.com (mailing list archive)
State Not Applicable, archived
Headers show
Series opp: ti-opp-supply: Fixes | expand

Commit Message

J, KEERTHY Nov. 7, 2018, 4:34 a.m. UTC
The voltage range (min, max) provided in the device tree is from
the data manual and is pretty big, catering to a wide range of devices.
On a i2c read/write failure the regulator_set_voltage_triplet function
falls back to set voltage between min and max. The min value from Device
Tree can be lesser than the optimal value and in that case that can lead
to a hang or crash. Hence set the u_volt_min dynamically to the optimal
voltage value.

Fixes: 9a835fa6e47 ("PM / OPP: Add ti-opp-supply driver")
Signed-off-by: Keerthy <j-keerthy@ti.com>
---
 drivers/opp/ti-opp-supply.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Viresh Kumar Nov. 8, 2018, 5:54 a.m. UTC | #1
On 07-11-18, 10:04, Keerthy wrote:
> The voltage range (min, max) provided in the device tree is from
> the data manual and is pretty big, catering to a wide range of devices.
> On a i2c read/write failure the regulator_set_voltage_triplet function
> falls back to set voltage between min and max. The min value from Device
> Tree can be lesser than the optimal value and in that case that can lead
> to a hang or crash. Hence set the u_volt_min dynamically to the optimal
> voltage value.

And why shouldn't we fix the DT for this ?
J, KEERTHY Nov. 12, 2018, 3:15 a.m. UTC | #2
On 11/8/2018 11:24 AM, Viresh Kumar wrote:
> On 07-11-18, 10:04, Keerthy wrote:
>> The voltage range (min, max) provided in the device tree is from
>> the data manual and is pretty big, catering to a wide range of devices.
>> On a i2c read/write failure the regulator_set_voltage_triplet function
>> falls back to set voltage between min and max. The min value from Device
>> Tree can be lesser than the optimal value and in that case that can lead
>> to a hang or crash. Hence set the u_volt_min dynamically to the optimal
>> voltage value.
> 
> And why shouldn't we fix the DT for this ?

The DT voltages do not cater to the broad range of devices. In some 
particular cases the DT min voltage is slightly lower the voltage at 
which the device cannot sustain a particular frequency in which case the 
device just silently hangs. So best thing to do is to actually read the 
device specific voltages dynamically which will guarantee a particular 
device sustaining a particular frequency at the optimal voltage.

>
Dave Gerlach Nov. 12, 2018, 10:05 p.m. UTC | #3
On 11/11/2018 09:15 PM, J, KEERTHY wrote:
> 
> 
> On 11/8/2018 11:24 AM, Viresh Kumar wrote:
>> On 07-11-18, 10:04, Keerthy wrote:
>>> The voltage range (min, max) provided in the device tree is from
>>> the data manual and is pretty big, catering to a wide range of devices.
>>> On a i2c read/write failure the regulator_set_voltage_triplet function
>>> falls back to set voltage between min and max. The min value from Device
>>> Tree can be lesser than the optimal value and in that case that can lead
>>> to a hang or crash. Hence set the u_volt_min dynamically to the optimal
>>> voltage value.
>>
>> And why shouldn't we fix the DT for this ?
> 
> The DT voltages do not cater to the broad range of devices. In some 
> particular cases the DT min voltage is slightly lower the voltage at 
> which the device cannot sustain a particular frequency in which case the 
> device just silently hangs. So best thing to do is to actually read the 
> device specific voltages dynamically which will guarantee a particular 
> device sustaining a particular frequency at the optimal voltage.
> 

Acked-by: Dave Gerlach <d-gerlach@ti.com>

>>
diff mbox series

Patch

diff --git a/drivers/opp/ti-opp-supply.c b/drivers/opp/ti-opp-supply.c
index 9e5a9a3..29e08a4 100644
--- a/drivers/opp/ti-opp-supply.c
+++ b/drivers/opp/ti-opp-supply.c
@@ -290,6 +290,9 @@  static int ti_opp_supply_set_opp(struct dev_pm_set_opp_data *data)
 	vdd_uv = _get_optimal_vdd_voltage(dev, &opp_data,
 					  new_supply_vbb->u_volt);
 
+	if (new_supply_vdd->u_volt_min < vdd_uv)
+		new_supply_vdd->u_volt_min = vdd_uv;
+
 	/* Scaling up? Scale voltage before frequency */
 	if (freq > old_freq) {
 		ret = _opp_set_voltage(dev, new_supply_vdd, vdd_uv, vdd_reg,