Re: [PATCH 2/4] reset: add GPIO-based reset controller

From: Krzysztof Kozlowski
Date: Thu Jan 04 2024 - 11:08:47 EST


On 04/01/2024 17:04, Sean Anderson wrote:
> On 1/4/24 03:57, Krzysztof Kozlowski wrote:
>> On 28/12/2023 17:05, Sean Anderson wrote:
>>> On 12/22/23 10:01, Krzysztof Kozlowski wrote:
>>>> Add simple driver to control GPIO-based resets using the reset
>>>> controller API for the cases when the GPIOs are shared and reset should
>>>> be coordinated. The driver is expected to be used by reset core
>>>> framework for ad-hoc reset controllers.
>>>
>>> How do we handle power sequencing? Often GPIOs need some pre/post delay in
>>> order to ensure proper power sequencing. For regular reset drivers, this is
>>> internal to the driver.
>>
>> It's not part of this patchset. Power sequencing is an old topic and
>> generic solutions were failing, rejected, did not solve the problems,
>> etc (choose your reason).
>>
>> Delays are device specific, so they go to drivers (depending on the
>> compatible). Complex power sequencing is way too much for simplified
>> reset-framework handling, so anyway it is expected you do it in your driver.
>
> Well, the reason to bring it up is twofold:
>
> - Traditionally, drivers expect the reset controller to handle all
> necessary delays. For example, reset-k210 includes a 10us delay
> between asserting and deasserting the reset. There's a similar thing
> in reset-imx7, and several other reset drivers.
> - We would need to add custom assert/deassert delays to every driver
> using this interface. These are not always added, since any given
> device may require delays which can be inferred from its compatible.
> However, an integrated system may require delays to be different from
> what any individual device requires.
>
>>>
>>> Maybe something like
>>>
>>> my-device {
>>> reset-gpios = <&gpio 555 GPIO_ACTIVE_LOW>;
>>> reset-gpios-post-deassert-us = <100>;
>>
>> Feel free to add it later. This patchset, and actually all patches
>> should, solves one problem while allowing you to extend it later.
>
> Yes, but we should try to avoid creating problems for ourselves in the
> future.
>
>> If there is a architectural problem in my approach not allowing you to
>> extend it later, then we should discuss it.
>
> Well, I brought up just such an architectural issue below...

Sorry, but where the issue? You did not present any arguments stating
that it is not possible to add your feature.

What is the problem to parse that property?

>
>>> };
>>>
>>> Of course, this is a bit ambiguous if you have multiple devices using the same
>>> GPIO with different delays.
>
> This is the most concerning one to me.
>
>>> Maybe we take the max? But the driver below seems
>>> to only have access to one device. Which I suppose begs the question: how do
>>> we know when it's safe to deassert the reset (e.g. we've gotten to the point
>>> where all devices using this reset gpio have gotten far enough to detect that
>>> they use it)?
>>
>> The driver (reset consumer) knows when it is safe or not. You must
>> implement proper reset handling in your driver.
>
> The driver has no idea whether it is safe or not. It just calls
> reset_assert/deassert at the appropriate time, and the reset
> framework/controller is supposed to coordinate things so e.g. the device
> doesn't get reset multiple times as multiple drivers all probe.


Sorry, then I don't get what you refer to. The driver calls deassert
when it is safe for it to do it, so the driver *knows*. Now, you claim
that driver does not know that... core also does not know, so no one knows.

Best regards,
Krzysztof