Hi,

On 10/26/2016 07:48 PM, Ian Arkver wrote:
> On 26/10/16 15:07, Todor Tomov wrote:
>> Hi,
>>
>> On 10/26/2016 03:48 PM, Ian Arkver wrote:
>>> [snip]
>>>>>>>>> +static int ov5645_regulators_enable(struct ov5645 *ov5645)
>>>>>>>>> +{
>>>>>>>>> +    int ret;
>>>>>>>>> +
>>>>>>>>> +    ret = regulator_enable(ov5645->io_regulator);
>>>>>>>>> +    if (ret < 0) {
>>>>>>>>> +        dev_err(ov5645->dev, "set io voltage failed\n");
>>>>>>>>> +        return ret;
>>>>>>>>> +    }
>>>>>>>>> +
>>>>>>>>> +    ret = regulator_enable(ov5645->core_regulator);
>>>>>>>>> +    if (ret) {
>>>>>>>>> +        dev_err(ov5645->dev, "set core voltage failed\n");
>>>>>>>>> +        goto err_disable_io;
>>>>>>>>> +    }
>>>>>>>>> +
>>>>>>>>> +    ret = regulator_enable(ov5645->analog_regulator);
>>>>>>>>> +    if (ret) {
>>>>>>>>> +        dev_err(ov5645->dev, "set analog voltage failed\n");
>>>>>>>>> +        goto err_disable_core;
>>>>>>>>> +    }
>>>>>>>> How about using the regulator bulk API ? This would simplify the enable
>>>>>>>> and disable functions.
>>>>>>> The driver must enable the regulators in this order. I can see in the
>>>>>>> implementation of the bulk api that they are enabled again in order
>>>>>>> but I don't see stated anywhere that it is guaranteed to follow the
>>>>>>> same order in future. I'd prefer to keep it explicit as it is now.
>>>>>> I believe it should be an API guarantee, otherwise many drivers using 
>>>>>> the bulk
>>>>>> API would break. Mark, could you please comment on that ?
>>>>> Ok, let's wait for a response from Mark.
>>> I don't have the OV5645 datasheet, but I do have the OV5640 and OV5647 
>>> datasheets. Both of these show that AVDD should come up before DVDD where 
>>> DVDD is externally supplied, although the minimum delay between them is 
>>> 0ms. Both datasheets also imply that this requirement is only to allow host 
>>> SCCB access on a shared I2C bus while the device is powering up. They imply 
>>> that if one waits 20ms after power on then SCCB will be fine without this 
>>> sequencing. Your code includes an msleep(20);
>> There is also requirement that DOVDD should become stable before AVDD (in 
>> both cases -
>> external or internal DVDD).
>>
>> Aren't these requirements needed to allow I2C access to another device on 
>> the same I2C bus even during these 20ms?
> Well, it's a really obscure corner case where these rails are actually 
> switched and the rise times are all available to the regulator framework (so 
> that there's a difference between three distinct calls to regulator_enable 
> and one call to the ASYNC_DOMAIN driven bulk enable) and the I2C bus is 
> shared with another device that is being accessed at the same time as the 
> sensor is enabled and the sensor breaks that access.
> 
> Having said that, really obscure corner cases are what lurk around and catch 
> you unawares years in the future, so maybe three calls is necessary here. 
> However, I think analog should be enabled before core - check with your 
> datasheet if you have the correct one.

Yes, analog (AVDD) should be enabled before core (DVDD);
and I/O (DOVDD) should be enabled before analog.

I also don't think that the benefit of using the bulk API (like shorter and
simpler code) is worth against the possibility of introducing a potential
problem (even if it is that rare).

But in any case, thank you for reviewing my code!

> 
> Regards,
> Ian
> 
>>
>>> Further, the reference schematic for the OV5647 shows three separate LDOs 
>>> with no sequencing between them.
>>>
>>> I've no comment on whether the bulk regulator API needs a "keep sequencing" 
>>> flag or somesuch, but I don't think this device will drive that requirement.
>>>
>>> Regards,
>>> Ian
>>>
>> Best regards,
>> Todor
>>
> 

-- 
Best regards,
Todor Tomov
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to