mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Jakob Hauser <jahau@rocketmail.com>
To: Linus Walleij <linus.walleij@linaro.org>
Cc: Sebastian Reichel <sre@kernel.org>, Lee Jones <lee@kernel.org>,
	Liam Girdwood <lgirdwood@gmail.com>,
	Mark Brown <broonie@kernel.org>, Rob Herring <robh+dt@kernel.org>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	Beomho Seo <beomho.seo@samsung.com>,
	Chanwoo Choi <cw00.choi@samsung.com>,
	Stephan Gerhold <stephan@gerhold.net>,
	Raymond Hackley <raymondhackley@protonmail.com>,
	Pavel Machek <pavel@ucw.cz>, Axel Lin <axel.lin@ingics.com>,
	ChiYuan Huang <cy_huang@richtek.com>,
	linux-pm@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, phone-devel@vger.kernel.org,
	~postmarketos/upstreaming@lists.sr.ht
Subject: Re: [PATCH v2 9/9] dt-bindings: Add documentation for rt5033 mfd, regulator and charger
Date: Thu, 20 Apr 2023 23:16:26 +0200	[thread overview]
Message-ID: <662eeda8-8605-4124-75d3-9df6bd81bcb7@rocketmail.com> (raw)
In-Reply-To: <CACRpkdaRkJ-JVNqAOQLuOgDztDfUP7DBQU9QP7AMbnK=eN2HWQ@mail.gmail.com>

Hi Linus!

On 20.04.23 10:03, Linus Walleij wrote:
> On Thu, Apr 20, 2023 at 9:59 AM Linus Walleij <linus.walleij@linaro.org> wrote:
>>
>> Hi Jakob,
>>
>> thanks for your patch!
>>
>> The following caught my eye:
>>
>> On Sun, Apr 16, 2023 at 2:50 PM Jakob Hauser <jahau@rocketmail.com> wrote:
>>
>>> Add device tree binding documentation for rt5033 multifunction device, voltage
>>> regulator and battery charger.
>>>
>>> Cc: Beomho Seo <beomho.seo@samsung.com>
>>> Cc: Chanwoo Choi <cw00.choi@samsung.com>
>>> Signed-off-by: Jakob Hauser <jahau@rocketmail.com>
>>> ---
>>> The patch is based on linux-next (tag "next-20230413").
>> (...)
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/power/supply/richtek,rt5033-charger.yaml
>> (...)
>>> +  richtek,pre-microamp:
>>> +    description:
>>> +      Current of pre-charge mode. The pre-charge current levels are 350 mA to
>>> +      650 mA programmed by I2C per 100 mA.
>>> +    maxItems: 1
>>> +
>>> +  richtek,fast-microamp:
>>> +    description:
>>> +      Current of fast-charge mode. The fast-charge current levels are 700 mA
>>> +      to 2000 mA programmed by I2C per 100 mA.
>>> +    maxItems: 1
>>> +
>>> +  richtek,eoc-microamp:
>>> +    description:
>>> +      This property is end of charge current. Its level ranges from 150 mA to
>>> +      600 mA. Between 150 mA and 300 mA in 50 mA steps, between 300 mA and 600 mA
>>> +      in 100 mA steps.
>>> +    maxItems: 1
>>> +
>>> +  richtek,pre-threshold-microvolt:
>>> +    description:
>>> +      Voltage of pre-charge mode. If the battery voltage is below the pre-charge
>>> +      threshold voltage, the charger is in pre-charge mode with pre-charge current.
>>> +      Its levels are 2.3 V to 3.8 V programmed by I2C per 0.1 V.
>>> +    maxItems: 1
>>> +
>>> +  richtek,const-microvolt:
>>> +    description:
>>> +      Battery regulation voltage of constant voltage mode. This voltage levels from
>>> +      3.65 V to 4.4 V by I2C per 0.025 V.
>>> +    maxItems: 1
>>
>> These are very generic currents and voltages, and their usage is well known
>> and generic. So they should not be prefixed "richtek,".
>>
>> Use the properties already defined in
>> Documentation/devicetree/bindings/power/supply/battery.yaml
>> for these:
>>
>> precharge-current-microamp
>> constant-charge-current-max-microamp
>> charge-term-current-microamp
>> precharge-upper-limit-microvolt
>> constant-charge-voltage-max-microvolt
>>
>> Please double-check, I think those are the ones you need.
>>
>> Perhaps it is possible to just $ref these properties directly and add
>> the additional restrictions on top.
> 
> On second thought, these are really weird properties to have on the
> *charger* isn't it?
> 
> It is really *battery* restrictions.
> 
> A charger can charge many different batteries with different CC/CV
> settings.
> 
> I think your charger should contain a phandle to a battery and the battery
> node should contain these limits.
> 
>    monitored-battery:
>      $ref: /schemas/types.yaml#/definitions/phandle
>      description: phandle to battery node
> 
> Then you can just use the standard battery bindings for these properties
> on the battery.
> 
> See for example:
> Documentation/devicetree/bindings/power/supply/stericsson,ab8500-charger.yaml
> 
> There will be driver changes needed too, but this will be way cleaner.
> 
> Yours,
> Linus Walleij

These are interesting hints!

I was first a bit confused by the term "battery". I associated that term 
with the driver "rt5033-battery". But I think that thought was wrong. 
The driver "rt5033-battery" is just the fuel gauge.

Hardware-wise, the mfd (incl. charger) and fuel gauge are on different 
I2C lines. Therefore, the different drivers access different registers.

Charger registers:
https://github.com/torvalds/linux/blob/v6.3-rc7/include/linux/mfd/rt5033-private.h#L13-L23

Fuel gauge registers:
https://github.com/torvalds/linux/blob/v6.3-rc7/include/linux/mfd/rt5033-private.h#L215-L243

The things being set or read in those registers kind of determine which 
things are done in which driver.

The properties we talk about here are the settings for the charger. They 
tell the charger how it should behave. It makes sense to process those 
settings within the charger driver. The fuel gauge, on the other hand, 
returns information like actual voltage and percentage.

The only thing that seems not placed well is the "status" property like 
charging/discharging/not-charging/etc. At RT5033 this information is 
within the charger register. Userspace layer "UPower" expects this from 
the "battery" device. Patch 8 of this series v2 carries that property 
from the charger over to the fuel gauge. Though this is a bit of a 
quirk. And it creates dependencies between two drivers which actually 
would be independent from each other.

---------------------------------

Back to the topic. When we talk about "battery" here, it seems to me 
that it's about the representation in the devicetree.

Currently it is:

     pmic@34 {
         compatible = "richtek,rt5033";
         ....
         charger {
             compatible = "richtek,rt5033-charger";
             richtek,pre-microamp = <450000>;
             richtek,fast-microamp = <1000000>;
             richtek,eoc-microamp = <150000>;
             richtek,pre-threshold-microvolt = <3500000>;
             richtek,const-microvolt = <4350000>;
             extcon = <&muic>;
         };
     };

According to your remarks, the properties could be "outsourced" into a
battery node. (Btw. I have double-checked the property names.)

     battery: battery {
         compatible = "simple-battery";
         precharge-current-microamp = <450000>;
         constant-charge-current-max-microamp = <1000000>;
         charge-term-current-microamp = <150000>;
         precharge-upper-limit-microvolt = <3500000>;
         constant-charge-voltage-max-microvolt = <4350000>;
     };

     pmic@34 {
         compatible = "richtek,rt5033";
         ....
         charger {
             compatible = "richtek,rt5033-charger";
             monitored-battery = <&battery>;
             extcon = <&muic>;
         };
     };

Personally I would choose the current implementation for two reasons 
(possibly weak ones):

1) The original author of the driver and documentation is Beomho Seo. I 
tried to preserve the original structure as far as possible. This is 
probably rather a question of editing than a technical one.

2) At least in my mind it's still the setup for the charger. It sets up 
a the charging behavior of a certain consumer device. And the choice of 
their values is limited to the hardware of the charger. Accordingly the 
dt-bindings would say what the charger hardware is capable to do. 
Therefore I'd say it's reasonable to have those values in the charger 
node and use vendor properties.

I agree to you that actually the physical battery is determining how 
these values should be set. In the end, as far as I can see, it is a 
representation thing in the devicetree. At least in our case here.

Not sure how to proceed here. I would stick to the current 
implementation. If someone strongly prefers the "battery" representation 
style, I'm open to switch to this.

However, I'm not sure how the dt-bindings would look like in that case. 
Those battery properties would not be part of the RT5033 node, thus they 
basically would not be part of the RT5033 documentation. Again I think 
it makes sense to handle those properties within the charger node as 
"charger settings" properties.

Kind regards,
Jakob

  reply	other threads:[~2023-04-20 21:16 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <cover.1681646904.git.jahau.ref@rocketmail.com>
2023-04-16 12:44 ` [PATCH v2 0/9] Add RT5033 charger device driver Jakob Hauser
2023-04-16 12:44   ` [PATCH v2 1/9] mfd: rt5033: Drop rt5033-battery sub-device Jakob Hauser
2023-04-20  8:05     ` Linus Walleij
2023-04-16 12:44   ` [PATCH v2 2/9] mfd: rt5033: Fix chip revision readout Jakob Hauser
2023-04-16 12:44   ` [PATCH v2 3/9] mfd: rt5033: Fix STAT_MASK, HZ_MASK and AICR defines Jakob Hauser
2023-04-16 12:44   ` [PATCH v2 4/9] mfd: rt5033: Apply preparatory changes before adding rt5033-charger driver Jakob Hauser
2023-04-16 12:44   ` [PATCH v2 5/9] regulator: rt5033: Change regulator names to lowercase Jakob Hauser
2023-04-16 18:32     ` Krzysztof Kozlowski
2023-04-18 21:24       ` Jakob Hauser
2023-04-19  8:40         ` Krzysztof Kozlowski
2023-04-19 22:21           ` Jakob Hauser
2023-04-16 12:44   ` [PATCH v2 6/9] power: supply: rt5033_charger: Add RT5033 charger device driver Jakob Hauser
2023-04-23  1:22     ` kernel test robot
2023-04-23  9:55       ` Jakob Hauser
2023-04-16 12:44   ` [PATCH v2 7/9] power: supply: rt5033_charger: Add cable detection and USB OTG supply Jakob Hauser
2023-04-16 12:44   ` [PATCH v2 8/9] power: supply: rt5033_battery: Adopt status property from charger Jakob Hauser
2023-04-23  9:46     ` Jakob Hauser
2023-04-16 12:44   ` [PATCH v2 9/9] dt-bindings: Add documentation for rt5033 mfd, regulator and charger Jakob Hauser
2023-04-16 18:39     ` Krzysztof Kozlowski
2023-04-18 21:37       ` Jakob Hauser
2023-04-19  8:42         ` Krzysztof Kozlowski
2023-04-19 22:41           ` Jakob Hauser
2023-04-20  7:59     ` Linus Walleij
2023-04-20  8:03       ` Linus Walleij
2023-04-20 21:16         ` Jakob Hauser [this message]
2023-04-21  9:20           ` Linus Walleij
2023-04-21 22:15             ` Jakob Hauser
2023-04-16 18:29   ` [PATCH v2 0/9] Add RT5033 charger device driver Krzysztof Kozlowski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=662eeda8-8605-4124-75d3-9df6bd81bcb7@rocketmail.com \
    --to=jahau@rocketmail.com \
    --cc=axel.lin@ingics.com \
    --cc=beomho.seo@samsung.com \
    --cc=broonie@kernel.org \
    --cc=cw00.choi@samsung.com \
    --cc=cy_huang@richtek.com \
    --cc=devicetree@vger.kernel.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=lee@kernel.org \
    --cc=lgirdwood@gmail.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=pavel@ucw.cz \
    --cc=phone-devel@vger.kernel.org \
    --cc=raymondhackley@protonmail.com \
    --cc=robh+dt@kernel.org \
    --cc=sre@kernel.org \
    --cc=stephan@gerhold.net \
    --cc=~postmarketos/upstreaming@lists.sr.ht \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®