diff mbox series

[3/6] dt-bindings: HID: i2c-hid: elan: add 'no-reset-on-power-off' property

Message ID 20240423134611.31979-4-johan+linaro@kernel.org
State Superseded
Headers show
Series HID/arm64: dts: qcom: sc8280xp-x13s: fix touchscreen power on | expand

Commit Message

Johan Hovold April 23, 2024, 1:46 p.m. UTC
When the power supply is shared with other peripherals the reset line
can be wired in such a way that it can remain deasserted regardless of
whether the supply is on or not.

This is important as it can be used to avoid holding the controller in
reset for extended periods of time when it remains powered, something
which can lead to increased power consumption. Leaving reset deasserted
also avoids leaking current through the reset circuitry pull-up
resistors.

Add a new 'no-reset-on-power-off' devicetree property which can be used
by the OS to determine when reset needs to be asserted on power down.

Note that this property can also be used when the supply cannot be
turned off by the OS at all.

Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
---
 Documentation/devicetree/bindings/input/elan,ekth6915.yaml | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Johan Hovold April 24, 2024, 7:34 a.m. UTC | #1
On Tue, Apr 23, 2024 at 06:29:44PM +0200, Krzysztof Kozlowski wrote:
> On 23/04/2024 15:46, Johan Hovold wrote:
> > When the power supply is shared with other peripherals the reset line
> > can be wired in such a way that it can remain deasserted regardless of
> > whether the supply is on or not.
> 
> To clarify: the reset line is still present and working in such case?

Yes.

> > This is important as it can be used to avoid holding the controller in
> > reset for extended periods of time when it remains powered, something
> > which can lead to increased power consumption. Leaving reset deasserted
> > also avoids leaking current through the reset circuitry pull-up
> > resistors.
> > 
> > Add a new 'no-reset-on-power-off' devicetree property which can be used
> > by the OS to determine when reset needs to be asserted on power down.
> > 
> > Note that this property can also be used when the supply cannot be
> > turned off by the OS at all.

> >    reset-gpios:
> >      description: Reset GPIO; not all touchscreens using eKTH6915 hook this up.
> >  
> > +  no-reset-on-power-off:
> 
> Missing vendor prefix. Unless you want to re-use existing property
> "keep-power-in-suspend", but the case here mentions power off, not suspend.

No, I left out the prefix on purpose as I mentioned in the cover letter.
There is nothing vendor specific about this property and I expect it to
be reused for other devices.

And "keep-power-in-suspend" is too specific and indeed looks like
instruction to the OS rather than hw description (more below), but
importantly it is not related to the problem here (which is about
reset, not power).
 
> Anyway, the property sounds like what the OS should be doing, which is
> not what we want. You basically instruct driver what to do. We want a
> described hardware configuration or hardware specifics.

Right, and this was why I at first rejected a property name like this in
favour of 'reset-pulled-to-supply' in my first draft. That name
obviously does not work as the 'supply' suffix is already claimed, but I
also realised that it doesn't really describe the hardware property that
allows the reset line to remain asserted.

The key feature in this hardware design is that the reset line will not
just be pulled to the supply voltage (what other voltage would it be
pulled to), but that it is also pulled to ground when the supply is
disabled.

Rather than trying to encode this in the property name, I settled on the
descriptive 'no-reset-on-power-off' after the seeing the prior art in
'goodix,no-reset-during-suspend' property. The latter is too specific
and encodes policy, but the former could still be considered hardware
description and would also apply to other designs which have the
property that the reset line should be left deasserted.

One such example is when the supply can not be disabled at all (e.g. the
Goodix case), but I can imagine there being more than one way to design
such reset circuits.

> Reset is pulled to something? What is exactly different in this hardware
> configuration comparing to other hardware setup (regular)?

The power supply is shared with other peripherals and the hardware
designers have made provisions so that the reset line can remain
deasserted regardless of the state of the supply in order to save power.
 
> > +    type: boolean
> > +    description:
> > +      Reset line is wired so that it can be left deasserted when the power
> > +      supply is off.

Johan
Krzysztof Kozlowski April 25, 2024, 9:39 a.m. UTC | #2
On 24/04/2024 09:34, Johan Hovold wrote:
> On Tue, Apr 23, 2024 at 06:29:44PM +0200, Krzysztof Kozlowski wrote:
>> On 23/04/2024 15:46, Johan Hovold wrote:
>>> When the power supply is shared with other peripherals the reset line
>>> can be wired in such a way that it can remain deasserted regardless of
>>> whether the supply is on or not.
>>
>> To clarify: the reset line is still present and working in such case?
> 
> Yes.
> 
>>> This is important as it can be used to avoid holding the controller in
>>> reset for extended periods of time when it remains powered, something
>>> which can lead to increased power consumption. Leaving reset deasserted
>>> also avoids leaking current through the reset circuitry pull-up
>>> resistors.
>>>
>>> Add a new 'no-reset-on-power-off' devicetree property which can be used
>>> by the OS to determine when reset needs to be asserted on power down.
>>>
>>> Note that this property can also be used when the supply cannot be
>>> turned off by the OS at all.
> 
>>>    reset-gpios:
>>>      description: Reset GPIO; not all touchscreens using eKTH6915 hook this up.
>>>  
>>> +  no-reset-on-power-off:
>>
>> Missing vendor prefix. Unless you want to re-use existing property
>> "keep-power-in-suspend", but the case here mentions power off, not suspend.
> 
> No, I left out the prefix on purpose as I mentioned in the cover letter.
> There is nothing vendor specific about this property and I expect it to
> be reused for other devices.
> 
> And "keep-power-in-suspend" is too specific and indeed looks like
> instruction to the OS rather than hw description (more below), but
> importantly it is not related to the problem here (which is about
> reset, not power).
>  
>> Anyway, the property sounds like what the OS should be doing, which is
>> not what we want. You basically instruct driver what to do. We want a
>> described hardware configuration or hardware specifics.
> 
> Right, and this was why I at first rejected a property name like this in
> favour of 'reset-pulled-to-supply' in my first draft. That name
> obviously does not work as the 'supply' suffix is already claimed, but I
> also realised that it doesn't really describe the hardware property that
> allows the reset line to remain asserted.
> 
> The key feature in this hardware design is that the reset line will not
> just be pulled to the supply voltage (what other voltage would it be
> pulled to), but that it is also pulled to ground when the supply is
> disabled.

OK, if the property was specific to the hardware, then I would propose
something more hardware-related, e.g. "reset-supply-tied". However :


> Rather than trying to encode this in the property name, I settled on the
> descriptive 'no-reset-on-power-off' after the seeing the prior art in
> 'goodix,no-reset-during-suspend' property. The latter is too specific
> and encodes policy, but the former could still be considered hardware
> description and would also apply to other designs which have the
> property that the reset line should be left deasserted.
> 
> One such example is when the supply can not be disabled at all (e.g. the
> Goodix case), but I can imagine there being more than one way to design
> such reset circuits.

It seems it is common problem. LEDs have property
"retain-state-shutdown", to indicate that during system shutdown we
should not touch them (like power off). Would some variant be applicable
here? First, do we talk here about power off like system shutdown or
runtime PM, thus suspend?


Best regards,
Krzysztof
Johan Hovold May 2, 2024, 9:56 a.m. UTC | #3
Hi Krzysztof,

and sorry about the late reply. Got side-tracked.

On Thu, Apr 25, 2024 at 11:39:24AM +0200, Krzysztof Kozlowski wrote:
> On 24/04/2024 09:34, Johan Hovold wrote:
> > On Tue, Apr 23, 2024 at 06:29:44PM +0200, Krzysztof Kozlowski wrote:
> >> On 23/04/2024 15:46, Johan Hovold wrote:
> >>> When the power supply is shared with other peripherals the reset line
> >>> can be wired in such a way that it can remain deasserted regardless of
> >>> whether the supply is on or not.

> >>> This is important as it can be used to avoid holding the controller in
> >>> reset for extended periods of time when it remains powered, something
> >>> which can lead to increased power consumption. Leaving reset deasserted
> >>> also avoids leaking current through the reset circuitry pull-up
> >>> resistors.
> >>>
> >>> Add a new 'no-reset-on-power-off' devicetree property which can be used
> >>> by the OS to determine when reset needs to be asserted on power down.
> >>>
> >>> Note that this property can also be used when the supply cannot be
> >>> turned off by the OS at all.
> > 
> >>>    reset-gpios:
> >>>      description: Reset GPIO; not all touchscreens using eKTH6915 hook this up.
> >>>  
> >>> +  no-reset-on-power-off:
 
> >> Anyway, the property sounds like what the OS should be doing, which is
> >> not what we want. You basically instruct driver what to do. We want a
> >> described hardware configuration or hardware specifics.
> > 
> > Right, and this was why I at first rejected a property name like this in
> > favour of 'reset-pulled-to-supply' in my first draft. That name
> > obviously does not work as the 'supply' suffix is already claimed, but I
> > also realised that it doesn't really describe the hardware property that
> > allows the reset line to remain asserted.
> > 
> > The key feature in this hardware design is that the reset line will not
> > just be pulled to the supply voltage (what other voltage would it be
> > pulled to), but that it is also pulled to ground when the supply is
> > disabled.
> 
> OK, if the property was specific to the hardware, then I would propose
> something more hardware-related, e.g. "reset-supply-tied". However :
> 
> > Rather than trying to encode this in the property name, I settled on the
> > descriptive 'no-reset-on-power-off' after the seeing the prior art in
> > 'goodix,no-reset-during-suspend' property. The latter is too specific
> > and encodes policy, but the former could still be considered hardware
> > description and would also apply to other designs which have the
> > property that the reset line should be left deasserted.
> > 
> > One such example is when the supply can not be disabled at all (e.g. the
> > Goodix case), but I can imagine there being more than one way to design
> > such reset circuits.
> 
> It seems it is common problem. LEDs have property
> "retain-state-shutdown", to indicate that during system shutdown we
> should not touch them (like power off). Would some variant be applicable
> here? First, do we talk here about power off like system shutdown or
> runtime PM, thus suspend?

A name like 'retain-state-shutdown' would also be too specific as what
I'm describing here is that the reset line should be (or can be) left
deasserted whenever the OS wants to power off the device.

That could be during suspend, but more generally whenever the OS
determines that the device does not need to be powered (e.g. when
closing a character device).

Johan
Linus Walleij May 3, 2024, 7:40 a.m. UTC | #4
Hi Johan,

thanks for your patch!

On Tue, Apr 23, 2024 at 3:46 PM Johan Hovold <johan+linaro@kernel.org> wrote:

> When the power supply is shared with other peripherals the reset line
> can be wired in such a way that it can remain deasserted regardless of
> whether the supply is on or not.
>
> This is important as it can be used to avoid holding the controller in
> reset for extended periods of time when it remains powered, something
> which can lead to increased power consumption. Leaving reset deasserted
> also avoids leaking current through the reset circuitry pull-up
> resistors.

So the reset line in this case is a GPIO as seen from the context above.

To me that means that the line should have the GPIO_OPEN_DRAIN flag
set in the device tree node for reset-gpios. As it has pull-up resistors,
setting the line to high impedance takes the device out of reset, and
thus it is effectively open drain.

> Add a new 'no-reset-on-power-off' devicetree property which can be used
> by the OS to determine when reset needs to be asserted on power down.

If the above holds true, the driver can then just check for the open drain flag
in the reset-gpios phandle, and if that is set, conclude that it should not
actively drive the line low in the poweroff state.

I'd like Krzysztof's input on this though, as he's been all over the reset
code recently and knows it better than me.

Yours,
Linus Walleij
Johan Hovold May 3, 2024, 8:47 a.m. UTC | #5
On Fri, May 03, 2024 at 09:40:43AM +0200, Linus Walleij wrote:

> On Tue, Apr 23, 2024 at 3:46 PM Johan Hovold <johan+linaro@kernel.org> wrote:
> 
> > When the power supply is shared with other peripherals the reset line
> > can be wired in such a way that it can remain deasserted regardless of
> > whether the supply is on or not.
> >
> > This is important as it can be used to avoid holding the controller in
> > reset for extended periods of time when it remains powered, something
> > which can lead to increased power consumption. Leaving reset deasserted
> > also avoids leaking current through the reset circuitry pull-up
> > resistors.
> 
> So the reset line in this case is a GPIO as seen from the context above.
> 
> To me that means that the line should have the GPIO_OPEN_DRAIN flag
> set in the device tree node for reset-gpios. As it has pull-up resistors,
> setting the line to high impedance takes the device out of reset, and
> thus it is effectively open drain.

If you look at the devicetree patch later in the series this is exactly
what is done.
 
> > Add a new 'no-reset-on-power-off' devicetree property which can be used
> > by the OS to determine when reset needs to be asserted on power down.
> 
> If the above holds true, the driver can then just check for the open drain flag
> in the reset-gpios phandle, and if that is set, conclude that it should not
> actively drive the line low in the poweroff state.

That is an alternative I considered but rejected as just knowing that
the gpio is open-drain is not necessarily sufficient, for example, if
the reset line is pulled to always-on rail while power to the device can
be cut.

Perhaps no one would ever construct hardware like that, but it does not
seem like the hardware property I'm trying to encode necessarily follows
from having an open-drain reset line.

And then the OS should probably not make assumptions like that either,
especially since getting it wrong can potentially lead to damaged
hardware.

Johan
Krzysztof Kozlowski May 3, 2024, 9:11 a.m. UTC | #6
On 02/05/2024 11:56, Johan Hovold wrote:
> Hi Krzysztof,
> 
> and sorry about the late reply. Got side-tracked.
> 
> On Thu, Apr 25, 2024 at 11:39:24AM +0200, Krzysztof Kozlowski wrote:
>> On 24/04/2024 09:34, Johan Hovold wrote:
>>> On Tue, Apr 23, 2024 at 06:29:44PM +0200, Krzysztof Kozlowski wrote:
>>>> On 23/04/2024 15:46, Johan Hovold wrote:
>>>>> When the power supply is shared with other peripherals the reset line
>>>>> can be wired in such a way that it can remain deasserted regardless of
>>>>> whether the supply is on or not.
> 
>>>>> This is important as it can be used to avoid holding the controller in
>>>>> reset for extended periods of time when it remains powered, something
>>>>> which can lead to increased power consumption. Leaving reset deasserted
>>>>> also avoids leaking current through the reset circuitry pull-up
>>>>> resistors.
>>>>>
>>>>> Add a new 'no-reset-on-power-off' devicetree property which can be used
>>>>> by the OS to determine when reset needs to be asserted on power down.
>>>>>
>>>>> Note that this property can also be used when the supply cannot be
>>>>> turned off by the OS at all.
>>>
>>>>>    reset-gpios:
>>>>>      description: Reset GPIO; not all touchscreens using eKTH6915 hook this up.
>>>>>  
>>>>> +  no-reset-on-power-off:
>  
>>>> Anyway, the property sounds like what the OS should be doing, which is
>>>> not what we want. You basically instruct driver what to do. We want a
>>>> described hardware configuration or hardware specifics.
>>>
>>> Right, and this was why I at first rejected a property name like this in
>>> favour of 'reset-pulled-to-supply' in my first draft. That name
>>> obviously does not work as the 'supply' suffix is already claimed, but I
>>> also realised that it doesn't really describe the hardware property that
>>> allows the reset line to remain asserted.
>>>
>>> The key feature in this hardware design is that the reset line will not
>>> just be pulled to the supply voltage (what other voltage would it be
>>> pulled to), but that it is also pulled to ground when the supply is
>>> disabled.
>>
>> OK, if the property was specific to the hardware, then I would propose
>> something more hardware-related, e.g. "reset-supply-tied". However :
>>
>>> Rather than trying to encode this in the property name, I settled on the
>>> descriptive 'no-reset-on-power-off' after the seeing the prior art in
>>> 'goodix,no-reset-during-suspend' property. The latter is too specific
>>> and encodes policy, but the former could still be considered hardware
>>> description and would also apply to other designs which have the
>>> property that the reset line should be left deasserted.
>>>
>>> One such example is when the supply can not be disabled at all (e.g. the
>>> Goodix case), but I can imagine there being more than one way to design
>>> such reset circuits.
>>
>> It seems it is common problem. LEDs have property
>> "retain-state-shutdown", to indicate that during system shutdown we
>> should not touch them (like power off). Would some variant be applicable
>> here? First, do we talk here about power off like system shutdown or
>> runtime PM, thus suspend?
> 
> A name like 'retain-state-shutdown' would also be too specific as what
> I'm describing here is that the reset line should be (or can be) left
> deasserted whenever the OS wants to power off the device.

I don't think it is more specific than yours. It is actually more
generic. First, shutdown=poweroff, so that part is the same.
retain-state means keep things enabled, asserted, deasserted, etc, so
multiple cases. Your wording is specific - only one state is kept during
power off: reset deassert.

Best regards,
Krzysztof
Johan Hovold May 3, 2024, 9:25 a.m. UTC | #7
On Fri, May 03, 2024 at 11:11:16AM +0200, Krzysztof Kozlowski wrote:
> On 02/05/2024 11:56, Johan Hovold wrote:
> > On Thu, Apr 25, 2024 at 11:39:24AM +0200, Krzysztof Kozlowski wrote:

> >> It seems it is common problem. LEDs have property
> >> "retain-state-shutdown", to indicate that during system shutdown we
> >> should not touch them (like power off). Would some variant be applicable
> >> here? First, do we talk here about power off like system shutdown or
> >> runtime PM, thus suspend?
> > 
> > A name like 'retain-state-shutdown' would also be too specific as what
> > I'm describing here is that the reset line should be (or can be) left
> > deasserted whenever the OS wants to power off the device.
> 
> I don't think it is more specific than yours. It is actually more
> generic. First, shutdown=poweroff, so that part is the same.

My point is that 'shutdown' is a specific OS concept (i.e. turning the
whole system off), while powering off a *device* can be done for a
number of reasons including closing a character device, suspend and
system-wide shutdown.

The policy decision of when to power off a device is left up to kernel
(e.g. if a device needs to be kept on as it is currently configured as a
wakeup device).

Johan
Linus Walleij May 6, 2024, 6:29 a.m. UTC | #8
On Fri, May 3, 2024 at 10:47 AM Johan Hovold <johan@kernel.org> wrote:

> > If the above holds true, the driver can then just check for the open drain flag
> > in the reset-gpios phandle, and if that is set, conclude that it should not
> > actively drive the line low in the poweroff state.
>
> That is an alternative I considered but rejected as just knowing that
> the gpio is open-drain is not necessarily sufficient, for example, if
> the reset line is pulled to always-on rail while power to the device can
> be cut.
>
> Perhaps no one would ever construct hardware like that, but it does not
> seem like the hardware property I'm trying to encode necessarily follows
> from having an open-drain reset line.
>
> And then the OS should probably not make assumptions like that either,
> especially since getting it wrong can potentially lead to damaged
> hardware.

OK it's a fair point.

I was worried about over-specification of behaviour, as that always
leads to contradictions.

+  no-reset-on-power-off:
+    type: boolean
+    description:
+      Reset line is wired so that it can be left deasserted when the power
+      supply is off.

To be nitpicky: *should* be left deasserted rather than *can* be left
deasserted, right? If the behaviour is desirable but not strictly
required.

Yours,
Linus Walleij
Johan Hovold May 7, 2024, 2:30 p.m. UTC | #9
On Mon, May 06, 2024 at 08:29:40AM +0200, Linus Walleij wrote:

> +  no-reset-on-power-off:
> +    type: boolean
> +    description:
> +      Reset line is wired so that it can be left deasserted when the power
> +      supply is off.
> 
> To be nitpicky: *should* be left deasserted rather than *can* be left
> deasserted, right? If the behaviour is desirable but not strictly
> required.

I considered that too, but settled on the above description as it is
pure hardware description and leaving the decision to act on it up to
the OS (e.g. if support is implemented).

On the other hand, the "should" is already implied by the property name
so perhaps there's no reason not to include it also in the description:

+  no-reset-on-power-off:
+    type: boolean
+    description:
+      Reset line is wired so that it can (and should) be left
+      deasserted when the power supply is off.

And "should" (unlike "shall") still leaves room for an OS to ignore it
at the cost of increased power consumption.

Johan
diff mbox series

Patch

diff --git a/Documentation/devicetree/bindings/input/elan,ekth6915.yaml b/Documentation/devicetree/bindings/input/elan,ekth6915.yaml
index c3a6f901ff45..3d20673f10b2 100644
--- a/Documentation/devicetree/bindings/input/elan,ekth6915.yaml
+++ b/Documentation/devicetree/bindings/input/elan,ekth6915.yaml
@@ -37,6 +37,12 @@  properties:
   reset-gpios:
     description: Reset GPIO; not all touchscreens using eKTH6915 hook this up.
 
+  no-reset-on-power-off:
+    type: boolean
+    description:
+      Reset line is wired so that it can be left deasserted when the power
+      supply is off.
+
   vcc33-supply:
     description: The 3.3V supply to the touchscreen.