From: Jonathan Cameron <jic23@kernel.org>
To: Fabrizio Lamarque <fl.scratchpad@gmail.com>
Cc: "Krzysztof Kozlowski" <krzk@kernel.org>,
linux-iio@vger.kernel.org, "Nuno Sá" <noname.nuno@gmail.com>
Subject: Re: [PATCH 3/3] iio: adc: ad7192: Clarify binding documentation
Date: Mon, 1 May 2023 17:03:03 +0100 [thread overview]
Message-ID: <20230501170303.41a70477@jic23-huawei> (raw)
In-Reply-To: <CAPJMGm7+oYDJHt6SPAhJ8cHuE3VXWxx6XYF1T_8oKwQGo+iarA@mail.gmail.com>
On Wed, 26 Apr 2023 12:45:31 +0200
Fabrizio Lamarque <fl.scratchpad@gmail.com> wrote:
> On Sat, Apr 15, 2023 at 6:38 PM Jonathan Cameron <jic23@kernel.org> wrote:
> >
> > On Fri, 14 Apr 2023 12:42:08 +0200
> > Fabrizio Lamarque <fl.scratchpad@gmail.com> wrote:
> >
> > > On Fri, Apr 14, 2023 at 11:18 AM Krzysztof Kozlowski <krzk@kernel.org> wrote:
> > > >
> > > > On 13/04/2023 20:19, Fabrizio Lamarque wrote:
> > > > > On Thu, Apr 13, 2023 at 6:35 PM Krzysztof Kozlowski <krzk@kernel.org> wrote:
> > > > >>
> > > > >> On 13/04/2023 18:07, Fabrizio Lamarque wrote:
> > > > >>> On Thu, Apr 13, 2023 at 4:21 PM Krzysztof Kozlowski <krzk@kernel.org> wrote:
> > > > >>>>
> > > > >>>> On 13/04/2023 10:36, Fabrizio Lamarque wrote:
> > > > >>>
> > > > >>> Current documentation does not follow existing source code implementation.
> > > > >>
> > > > >> Bindings describe hardware, not current implementation.
> > > > >
> > > > >>> The driver has been originally designed to operate with the internal
> > > > >>> clock when clocks property is omitted.
> > > > >>
> > > > >> Not really a reason to do it. Reason could be - hardware does not always
> > > > >> need clock input.
> > > > >
> > > > > I hope the change in perspective will be enough. The external clock is
> > > > > mandatory for some applications.
> > > > > The internal clock might be required for others.
> > > >
> > > > I told you that reason you wrote is not enough and you answer "in
> > > > perspective will be enough". Wait, what? I don't understand it at all. I
> > > > gave you example reason. If you do not like it, find other reasons which
> > > > refer to the actual device, not to the specific implementation.
> >
> > Just leave it vague - we don't need to talk about specific apps. If someone
> > wired a clock, they probably want that clock an will describe it in their
> > DTS.
> >
> > An internal clock is available and may be used if no external clock is provided.
> >
> > > >
> > > > >>>
> > > > >>> I thought the reason is clear from patch 2, but, as Nuno Sá already
> > > > >>> suggested, I will describe the reasons in full again, each time I post
> > > > >>> a revised patch set, even if it is quite verbose.
> > > > >>
> > > > >> Your commit must answer to why you are doing it. What you are doing is
> > > > >> easily visible from the diff. Rephrase commit msg to explain it and add
> > > > >> proper rationale (hardware related, not driver).
> > > > >
> > > > > I am really just suggesting to align the documentation with the
> > > > > driver, since the driver operates the hardware as expected (after the
> > > > > two regressions fixes).
> > > >
> > > > Does it mean you are not going to answer to "why?"? I cannot accept such
> > > > commits. That's the basics of software development and versioning. It's
> > > > not even Linux kernel related...
> > > >
> > >
> > > I already wrote that the hardware clock might be generated internally
> > > and hence not required, but also that an external crystal/oscillator
> > > is suggested in the datasheet for better performance.
> > > There shall be a method to choose between the crystal, the external
> > > oscillator and the internal oscillator.
> > > This is what I was expecting to write on revised commit information,
> > > and this was the hopefully accepted "perspective change".
> > >
> > > I am really sorry but I do not understand what more I should say here.
> > > I appreciate your explanations and the fact you are taking your time
> > > to give directions to an obviously inexperienced developer, but my
> > > lack of understanding is perhaps related to what I called
> > > "perspective" on which comes first.
> > > If the above sentence is not enough, I will drop this last patch.
> > > I did not change the driver at all. The documentation is wrong (where
> > > it states the clocks property is mandatory) and it was missing
> > > information on how to choose between the clocks from the beginning.
> >
> > A simple statement that there is an internal clock that may be used if
> > no external clock is wired up should be sufficient. I don't think we
> > need to talk about precision of clocks etc vs cost of board built and
> > now that drives a design choice.
> >
> > >
> > > >
> > > > > Without this change, one should read the source code to understand
> > > > > which clock is used and when, which bindings have to be applied, and
> > > > > find that documentation mandates an (already) optional property.
> > > >
> > > > How is it related? I did not refer whether change is reasonable itself
> > > > or not. I said you commit msg is very poor and you must answer to "why".
> > > > Not to "what".
> > > >
> > > > (...)
> > > >
> > > > >
> > > > >>>
> > > > >>> I kindly ask you whether the entire (corrected) change on the
> > > > >>> documentation file only (without any change on the driver source code)
> > > > >>> could be accepted as a single patch.
> > > > >>
> > > > >> I don't understand the question. Each change should be one logical
> > > > >> change, but bindings are not related to the driver.
> > > > >
> > > > > The question came after this:
> > > > >
> > > > > On Thu, Apr 13, 2023 at 1:21 PM Nuno Sá <noname.nuno@gmail.com> wrote:
> > > > >>> I kindly ask you to confirm if, as per your suggestion, I should send
> > > > >>> a v3 patch series with the proper "fixes" tag and this last one
> > > > >>> changed as follows:
> > > > >>>
> > > > >>> - No changes on driver side (keep avdd-supply instead of vref-supply)
> > > > >>> - Indicate in bindings documentation that avdd-supply is vref instead
> > > > >>> (with the "Phandle to reference voltage regulator")
> > > > >>> - Add dependencies to yaml bindings
> > > > >>>
> > > > >> Yeps, but note that for the bindings patch you are making distinct changes (
> > > > >> adding missing properties and changing one) so someone might complain. But for
> > > > >> me, personally, they are simple enough that can go in one patch. Just properly
> > > > >> document it in the commit description.
> > > > >
> > > > > I really need to send a proper, complete and acceptable v3 patch set,
> > > > > or drop patch 3/3 from the set.
> > > > >
> > > > > Would you accept the change to adi,ad7192.yaml file alone with both
> > > > > the change in description of avdd-supply and the additional missing
> > > > > properties?
> > > >
> > > > Do you mean by this changing bindings without changing driver? Then
> > > > depends on the context. The driver must implement bindings, so you
> > > > should not send patches which break the implementation of interface.
> > > >
> > >
> > > Perhaps I failed to explain it from the beginning.
> > > I said "the documentation does not follow the driver" but I understand
> > > I should have seen it the other way round.
> >
> > No need to mention the driver at all for the DT binding patch.
> > You are documenting what could be wired. We shouldn't care for DT about
> > what he driver happens to implement today.
>
> Thank you once again for your corrections, suggestions and patience.
> I hope to be able to provide a formally corrected patch set. Before
> sending v3, would you please have a look at this and check if it
> correctly responds to your expectations or if there is still something
> to adjust?
> (in case it would be cleaner to send a v3 patch and wait for feedback
> instead, feel free to ask)
I tend to only get back to IIO discussions about once a week (this week
was particularly crazy as was at a conference all week) so if you are
fairly sure what I mean and want to move quickly I'd suggest just
sending a new version based on 'best guess'.
>
> The patch set will be then split in 5 total commits.
> - iio: adc: ad7192: Fix null ad7192_state pointer access
> - iio: adc: ad7192: Fix internal/external clock selection
> - iio: adc: ad7192: Use VRef instead of AVdd as reference voltage source
> - dt-bindings: iio: ad7192: Add mandatory reference voltage source
> - dt-bindings: iio: ad7192: Allow selection of clock modes
>
> Patches "iio: adc: ad7192: Use VRef instead of AVdd as reference
> voltage source" and "iio: adc: ad7192: Use VRef instead of AVdd as
> reference voltage source" and will be a fix against b581f748cce0
> ("staging: iio: adc: ad7192: move out of staging").
>
> First commit message on bindings will be:
>
> Add required reference voltage (VRef) supply regulator.
> AD7192 requires three independent voltage sources: DVdd, AVdd and VRef
> (on REFINx pin pairs).
>
> Some questions:
> - Is the FIxes tag referenced commit acceptable, or should it be
> explained? If so, what should I write?
Given commit says they are 'required' I think ti's obvious that adding them
is what you are fixing wrt to the earlier patch that didn't have them.
So I don't think you need to state more.
> - Is the commit message acceptable?
Looks good to me.
>
> >
> > >
> > > Actual documentation does not allow the use of the internal oscillator
> > > or the external crystal.
> > > By strictly following the documentation I could only use the external
> > > oscillator option (neither internal nor external crystal oscillator).
> > > The implementation already had in place more binding options than the
> > > documented ones, so I am not suggesting to break anything.
> > >
> > > >
> > > > > Is "Phandle to reference voltage regulator" as a description for
> > > > > avdd-supply acceptable on your side?
> > > >
> > > > Sorry, how is this related to our topic? Anyway, drop "phandle to",
> > > > because you should describe hardware, not syntax of DTS.
> > >
> > > Ok.
> > > - Is it acceptable to change the description of property
> > > "avdd-supply" from "AVdd voltage supply" to "VRef voltage supply"?
> > No.
> >
> > We have a slightly complex case of not wanting to break old drivers, but
> > the binding should be correct none the less.
> >
> > Binding wise:
> > * Leave avdd-supply alone.
> > * Add a new vref-supply entry and list it as required. This is the Binding
> > 'bug fix' and there should be an appropriate fixes tag.
> >
> > No need at all for the binding to describe some old buggy driver behaviour.
> >
> > Driver wise. - with comments on why we are doing this as we are papering
> > over a bug that will be seen if someone has a DT that worked with the old
> > code. That's fine as long as we document that we are doing it.
> >
> > * Always get vadd-supply (not optional) - we may get a dummy regulator.
> > That is fine here.
> > * Try to use vref-supply first as an optional supply.
> > * If that fails, then 'use' avdd as if it it were vref. with nice obvious
> > comment that this is happening an perhaps even a warning print
> > "Warning: Using avdd in place of vref. Likely an old DTS".
>
> Here is the change I am backporting and testing on my platform:
>
> Subject: [PATCH v3 3/5] iio: adc: ad7192: Use VRef instead of AVdd as
> reference voltage source
>
> Add missing vref-supply and fix avdd-supply used as if it were vref.
>
> AD7192 requires three independent voltage sources, digital supply (on
> pin DVdd), analog supply (on AVdd) and reference voltage (VRef on
> alternate pin pair REFIN1 or REFIN2).
>
> Emit a warning message when AVdd is used in place of VRef for backwards
> compatibility.
>
> Fixes: b581f748cce0 ("staging: iio: adc: ad7192: move out of staging")
> Signed-off-by: Fabrizio Lamarque <fl.scratchpad@gmail.com>
> ---
> drivers/iio/adc/ad7192.c | 22 +++++++++++++++++++++-
> 1 file changed, 21 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/iio/adc/ad7192.c b/drivers/iio/adc/ad7192.c
> index 5a9c8898f8af..4ac6843b7c23 100644
> --- a/drivers/iio/adc/ad7192.c
> +++ b/drivers/iio/adc/ad7192.c
> @@ -177,6 +177,7 @@ struct ad7192_chip_info {
> struct ad7192_state {
> const struct ad7192_chip_info *chip_info;
> struct regulator *avdd;
> + struct regulator *vref;
> struct clk *mclk;
> u16 int_vref_mv;
> u32 fclk;
> @@ -1014,11 +1015,30 @@ static int ad7192_probe(struct spi_device *spi)
> if (ret)
> return ret;
>
> + st->vref = devm_regulator_get_optional(&spi->dev, "vref");
> + if (!IS_ERR(st->vref)) {
You need to specifically handle only -ENODEV (I think - check what is
returned if get_optional doesn't get it because it's not supplied).
You might get a deferral that needs to be treated as an error (so we go
around again once the supply driver is bound). So add an
} else if (PTR_ERR(st->vref) != -ENODEV) {
return PTR_ERR(st->vref);
}
> + ret = regulator_enable(st->vref);
> + if (ret) {
> + dev_err(&spi->dev, "Failed to enable specified VRef supply\n");
return dev_err_probe() is fine for all calls in probe() as it's neater
and means we don't need to think if something could defer or not.
> + return ret;
> + }
> +
> + ret = devm_add_action_or_reset(&spi->dev, ad7192_reg_disable,
> st->vref);
> + if (ret)
> + return ret;
> + }
> +
> ret = devm_regulator_get_enable(&spi->dev, "dvdd");
> if (ret)
> return dev_err_probe(&spi->dev, ret, "Failed to enable
> specified DVdd supply\n");
>
> - ret = regulator_get_voltage(st->avdd);
> +
> + if (!IS_ERR(st->vref)) {
> + ret = regulator_get_voltage(st->vref);
> + } else {
> + dev_warn(&spi->dev, "Using AVdd in place of VRef. Likely an
> old DTS\n");
> + ret = regulator_get_voltage(st->avdd);
> + }
This bit is good.
> if (ret < 0) {
> dev_err(&spi->dev, "Device tree error, reference voltage undefined\n");
> return ret;
next prev parent reply other threads:[~2023-05-01 15:47 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-13 8:26 [PATCH v2 0/3] iio: adc: ad7192: Functional fixes Fabrizio Lamarque
2023-04-13 8:28 ` [PATCH v2 1/3] iio: adc: ad7192: Fix null pointer dereference on probe Fabrizio Lamarque
2023-04-13 8:33 ` [PATCH 2/3] iio: adc: ad7192: Fix internal/external clock selection Fabrizio Lamarque
2023-04-13 8:36 ` [PATCH 3/3] iio: adc: ad7192: Clarify binding documentation Fabrizio Lamarque
2023-04-13 10:15 ` Nuno Sá
2023-04-13 10:47 ` Fabrizio Lamarque
2023-04-13 11:23 ` Nuno Sá
2023-04-13 14:21 ` Krzysztof Kozlowski
2023-04-13 16:07 ` Fabrizio Lamarque
2023-04-13 16:35 ` Krzysztof Kozlowski
2023-04-13 18:19 ` Fabrizio Lamarque
2023-04-14 9:18 ` Krzysztof Kozlowski
2023-04-14 10:42 ` Fabrizio Lamarque
2023-04-15 16:38 ` Jonathan Cameron
2023-04-26 10:45 ` Fabrizio Lamarque
2023-05-01 16:03 ` Jonathan Cameron [this message]
2023-04-13 10:04 ` [PATCH 2/3] iio: adc: ad7192: Fix internal/external clock selection Nuno Sá
2023-04-15 16:39 ` Jonathan Cameron
2023-04-13 10:03 ` [PATCH v2 1/3] iio: adc: ad7192: Fix null pointer dereference on probe Nuno Sá
2023-04-15 16:41 ` Jonathan Cameron
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=20230501170303.41a70477@jic23-huawei \
--to=jic23@kernel.org \
--cc=fl.scratchpad@gmail.com \
--cc=krzk@kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=noname.nuno@gmail.com \
/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