On 7/2/20 4:28 PM, Patrice CHOTARD wrote:
> Hi Patrick
> 
> On 6/12/20 10:40 AM, Patrick Delaunay wrote:
>> From: Fabrice Gasnier <fabrice.gasn...@st.com>
>>
>> There maybe an overshoot:
>> - when disabling, then re-enabling vrefbuf too quickly
>> - or upon platform reset as external capacitor maybe slow
>>   discharging (VREFBUF is HiZ at reset by default).
>> VREFBUF is used by ADC/DAC on some boards. An overshoot on the reference
>> voltage make the conversions inaccurate for a short period of time. So:
>> - Don't put the VREFBUF in HiZ when disabling, to force an active
>>   discharge.
>> - Enforce a 1ms OFF/ON delay, also upon reset
>>
>> Penalty is a 1ms delay is applied (even for a cold boot), when enabling
>> VREFBUF.
>>
>> Fixes: 93cf0ae7758d ("power: regulator: Add support for stm32-vrefbuf")
>>
>> Signed-off-by: Fabrice Gasnier <fabrice.gasn...@st.com>
>> Signed-off-by: Patrick Delaunay <patrick.delau...@st.com>
>> ---
>>
>>  drivers/power/regulator/stm32-vrefbuf.c | 16 ++++++++++++++--
>>  1 file changed, 14 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/power/regulator/stm32-vrefbuf.c 
>> b/drivers/power/regulator/stm32-vrefbuf.c
>> index 250773514f..92136961c2 100644
>> --- a/drivers/power/regulator/stm32-vrefbuf.c
>> +++ b/drivers/power/regulator/stm32-vrefbuf.c
>> @@ -43,8 +43,20 @@ static int stm32_vrefbuf_set_enable(struct udevice *dev, 
>> bool enable)
>>      u32 val;
>>      int ret;
>>  
>> -    clrsetbits_le32(priv->base + STM32_VREFBUF_CSR, STM32_HIZ | STM32_ENVR,
>> -                    enable ? STM32_ENVR : STM32_HIZ);
>> +    if (enable && !(readl(priv->base + STM32_VREFBUF_CSR) & STM32_ENVR)) {
>> +            /*
>> +             * There maybe an overshoot:
>> +             * - when disabling, then re-enabling vrefbuf too quickly
>> +             * - or upon platform reset as external capacitor maybe slow
>> +             *   discharging (VREFBUF is HiZ at reset by default).
>> +             * So force active discharge (HiZ=0) for 1ms before enabling.
>> +             */
>> +            clrbits_le32(priv->base + STM32_VREFBUF_CSR, STM32_HIZ);
>> +            udelay(1000);
>> +    }
>> +
>> +    clrsetbits_le32(priv->base + STM32_VREFBUF_CSR, STM32_ENVR,
>> +                    enable ? STM32_ENVR : 0);
>>      if (!enable)
>>              return 0;
>>  
> 
> Reviewed-by: Patrice Chotard <patrice.chot...@st.com>

Reviewed-by: Jaehoon Chung <jh80.ch...@samsung.com>

> 
> Thanks
> 

Reply via email to