From: Matti Vaittinen <mazziesaccount@gmail.com>
To: "Nuno Sá" <noname.nuno@gmail.com>
Cc: "Matti Vaittinen" <matti.vaittinen@fi.rohmeurope.com>,
"Lars-Peter Clausen" <lars@metafoo.de>,
"Michael Hennerich" <Michael.Hennerich@analog.com>,
"Jonathan Cameron" <jic23@kernel.org>,
"David Lechner" <dlechner@baylibre.com>,
"Nuno Sá" <nuno.sa@analog.com>,
"Andy Shevchenko" <andy@kernel.org>,
"Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Liam Girdwood" <lgirdwood@gmail.com>,
"Mark Brown" <broonie@kernel.org>,
linux-iio@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 09/10] iio: adc: ad7476: Support ROHM BD79105
Date: Fri, 8 Aug 2025 09:11:03 +0300 [thread overview]
Message-ID: <2a678156-8e0b-4fa9-a940-f368cfac8f7a@gmail.com> (raw)
In-Reply-To: <stmpyitqnjst2l26xdlkfqdedczpnxhoydges7xumtl5e46pof@cyidmsvdtdnj>
On 07/08/2025 16:01, Nuno Sá wrote:
> On Thu, Aug 07, 2025 at 12:35:25PM +0300, Matti Vaittinen wrote:
>> The ROHM BD79105 is a simple 16-bit ADC accessible via SPI*.
>>
>> The BD79105 has a CONVSTART pin, which must be set high to start the ADC
>> conversion. Unlike with the ad7091 and ad7091r which also have a
>> CONVSTART pin, the BD79105 requires that the pin must remain high also
>> for the duration of the SPI access.
>>
>> (*) Couple of words about the SPI. The BD79105 has pins named as
>> CONVSTART, SCLK, DIN and DOUT. For the curious reader, DIN is not SPI
>> ISO.
>>
>> DIN is a signal which can be used as a chip-select. When DIN is pulled
>> low, the ADC will output the completed measurement via DOUT as SCLK is
>> clocked. According to the data-sheet, the DIN can also be used for
>> daisy-chaining multiple ADCs. Furthermore, DOUT can be used also for a
>> 'data-ready' -IRQ. These modes aren't supported by this driver.
>>
>> Support reading ADC scale and data from the BD79105 using SPI, when DIN
>> is used as a chip-select.
>>
>> Signed-off-by: Matti Vaittinen <mazziesaccount@gmail.com>
>> ---
>> Revision history:
>> v1 => v2:
>> - Fix the conversion delay for the BD79105
>> - Drop unnecessary GPIO check from the convstart disable
>> - Drop unintended whitespace change
>> - Fix spelling
>> ---
>
> IIUC, for this chip the CONV GPIO is actually mandatory no?
Yes. You're right.
> If so, we
> should likely fail probe in case there's no GPIO. And we could also change> the dt bindings accordingly.
I did change the dt-binding (patch 8/10):
+ # Devices with a convstart GPIO where it is not optional
+ - if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - rohm,bd79105
+ then:
+ required:
+ - adi,conversion-start-gpios
+
I didn't want to complicate the probe with extra checks for the GPIO
based on the IC-type. But I am having second thoughts - maybe it is the
right thing to do as you say :) Thanks!
> Some more comments inline...
>> drivers/iio/adc/ad7476.c | 35 +++++++++++++++++++++++++++++++++++
>> 1 file changed, 35 insertions(+)
>>
>> diff --git a/drivers/iio/adc/ad7476.c b/drivers/iio/adc/ad7476.c
>> index 8914861802be..aa8a522633eb 100644
>> --- a/drivers/iio/adc/ad7476.c
>> +++ b/drivers/iio/adc/ad7476.c
>> @@ -31,6 +31,7 @@ struct ad7476_chip_info {
>> struct iio_chan_spec channel[2];
>> void (*reset)(struct ad7476_state *);
>> void (*conversion_pre_op)(struct ad7476_state *st);
>> + void (*conversion_post_op)(struct ad7476_state *st);
>> bool has_vref;
>> bool has_vdrive;
>> };
>> @@ -39,6 +40,7 @@ struct ad7476_state {
>> struct spi_device *spi;
>> struct gpio_desc *convst_gpio;
>> void (*conversion_pre_op)(struct ad7476_state *st);
>> + void (*conversion_post_op)(struct ad7476_state *st);
>
> Pointer duplication again :)
>
>> struct spi_transfer xfer;
>> struct spi_message msg;
>> struct iio_chan_spec channel[2];
>> @@ -63,6 +65,21 @@ static void ad7091_convst(struct ad7476_state *st)
>> udelay(1); /* Conversion time: 650 ns max */
>> }
>>
>> +static void bd79105_convst_disable(struct ad7476_state *st)
>> +{
>> + gpiod_set_value(st->convst_gpio, 0);
>> +}
>> +
>> +static void bd79105_convst_enable(struct ad7476_state *st)
>> +{
>> + if (!st->convst_gpio)
>> + return;
>
> I think the pattern for optional GPIOs is to just call
> gpiod_set_value_*() and the lib handles NULL pointers. Also the above is
> not coeherent with bd79105_convst_disable().
I definitely don't want to do *delay() if there is no reason. Haven't
checked the code lately, but I suppose the ndelay() is a busy-wait,
blocking _everything_ on the core it is executed.
I dropped the check from the _disable() variant since it doesn't call
the delay().
But now that you (and Andy) have commented on these checks...
(even though I don't really think these checks are THAT bad. It's almost
as if there were some reviewer's "unconditionally comment this"-list
where NULL check for the GPIO API's was written ;) These check's are
quick and very clear, and they avoid a blocking busy-wait)
...I see two other options. One is adding the check in probe as you
suggest. This check will however be substantially more complicated code
than this NULL check here, because it needs to be performed only for the
ICs which _require_ the convstart. Good thing is that it will error-out
early and clearly, whereas current solution will just lead bogus values
to be read if convstart is not correctly populated.
Other option would be making the conversion_*_op to return an error. I
would still keep the NULL check but the bd79105_convst_enable() could
error out. Delay would be avoided, user would get the error notification
and bd79105_convst_disable() wouldn't get called.
TLDR; I will see how the "check in probe" you suggested plays out. Then
I can omit these checks here :)
>
>> +
>> + gpiod_set_value(st->convst_gpio, 1);
>
> gpiod_set_value_cansleep()? I do see the driver is calling the same API
> in other places but I do not see a reason for it... So, precursor patch?
Ah. Great catch. *kicking himself*. I should've noticed...
Thanks!
Yours,
-- Matti
next prev parent reply other threads:[~2025-08-08 6:11 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-07 9:33 [PATCH v2 00/10] Support ROHM BD79105 ADC Matti Vaittinen
2025-08-07 9:33 ` [PATCH v2 01/10] iio: adc: ad7476: Simplify chip type detection Matti Vaittinen
2025-08-07 9:34 ` [PATCH v2 02/10] iio: adc: ad7476: Simplify scale handling Matti Vaittinen
2025-08-07 9:34 ` [PATCH v2 03/10] iio: adc: ad7476: Use mV for internal reference Matti Vaittinen
2025-08-07 12:31 ` Nuno Sá
2025-08-07 9:34 ` [PATCH v2 04/10] iio: adc: ad7476: Use correct channel for bit info Matti Vaittinen
2025-08-07 12:36 ` Nuno Sá
2025-08-07 9:34 ` [PATCH v2 05/10] iio: adc: ad7476: Limit the scope of the chip_info Matti Vaittinen
2025-08-07 21:12 ` Andy Shevchenko
2025-08-08 5:22 ` Matti Vaittinen
2025-08-07 9:34 ` [PATCH v2 06/10] iio: adc: ad7476: Drop convstart chan_spec Matti Vaittinen
2025-08-07 12:41 ` Nuno Sá
2025-08-07 13:10 ` Nuno Sá
2025-08-08 5:37 ` Matti Vaittinen
2025-08-08 9:00 ` Nuno Sá
2025-08-08 9:09 ` Matti Vaittinen
2025-08-08 14:17 ` Nuno Sá
2025-08-07 21:16 ` Andy Shevchenko
2025-08-08 5:38 ` Matti Vaittinen
2025-08-08 12:52 ` Andy Shevchenko
2025-08-08 13:29 ` Matti Vaittinen
2025-08-08 13:58 ` Andy Shevchenko
2025-08-07 9:35 ` [PATCH v2 07/10] iio: adc: ad7476: Conditionally call convstart Matti Vaittinen
2025-08-07 12:47 ` Nuno Sá
2025-08-08 5:43 ` Matti Vaittinen
2025-08-08 9:04 ` Nuno Sá
2025-08-07 9:35 ` [PATCH v2 08/10] dt-bindings: iio: adc: ad7476: Add ROHM bd79105 Matti Vaittinen
2025-08-07 9:35 ` [PATCH v2 09/10] iio: adc: ad7476: Support ROHM BD79105 Matti Vaittinen
2025-08-07 13:01 ` Nuno Sá
2025-08-08 6:11 ` Matti Vaittinen [this message]
2025-08-08 8:54 ` Nuno Sá
2025-08-08 9:01 ` Matti Vaittinen
2025-08-07 21:28 ` Andy Shevchenko
2025-08-08 6:18 ` Matti Vaittinen
2025-08-07 9:35 ` [PATCH v2 10/10] MAINTAINERS: A driver for simple 1-channel SPI ADCs Matti Vaittinen
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=2a678156-8e0b-4fa9-a940-f368cfac8f7a@gmail.com \
--to=mazziesaccount@gmail.com \
--cc=Michael.Hennerich@analog.com \
--cc=andy@kernel.org \
--cc=broonie@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dlechner@baylibre.com \
--cc=jic23@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=lars@metafoo.de \
--cc=lgirdwood@gmail.com \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=matti.vaittinen@fi.rohmeurope.com \
--cc=noname.nuno@gmail.com \
--cc=nuno.sa@analog.com \
--cc=robh@kernel.org \
/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;
as well as URLs for NNTP newsgroup(s).