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 06/10] iio: adc: ad7476: Drop convstart chan_spec
Date: Fri, 8 Aug 2025 08:37:07 +0300 [thread overview]
Message-ID: <076b7f07-e755-4fe7-84b1-f3f495978008@gmail.com> (raw)
In-Reply-To: <ngcbj6p7vfakah5fqsxqjlmrcycpg5rxfrbh4s34fll2kb3zq2@eyesluawn5w2>
On 07/08/2025 16:10, Nuno Sá wrote:
> On Thu, Aug 07, 2025 at 01:41:31PM +0100, Nuno Sá wrote:
>> On Thu, Aug 07, 2025 at 12:34:52PM +0300, Matti Vaittinen wrote:
>>> The ad7476 driver defines separate chan_spec structures for operation
>>> with and without convstart GPIO. At quick glance this may seem as if the
>>> driver did provide more than 1 data-channel to users - one for the
>>> regular data, other for the data obtained with the convstart GPIO.
>>>
>>> The only difference between the 'convstart' and 'non convstart'
>>> -channels is presence / absence of the BIT(IIO_CHAN_INFO_RAW) in
>>> channel's flags.
>>>
>>> We can drop the convstart channel spec, and related convstart macro, by
>>> allocating a mutable per driver instance channel spec an adding the flag
>>> in probe if needed. This will simplify the driver with the cost of added
>>> memory consumption.
>>>
>>> Assuming there aren't systems with very many ADCs and very few
>>> resources, this tradeoff seems worth making.
>>>
>>> Simplify the driver by dropping the 'convstart' channel spec and
>>> allocating the chan spec for each driver instance.
>>
>> I do not agree with this one. Looking at the diff, code does not look
>> simpler to me...
>
> Ok, on a second thought I'm ok with this. It makes adding devices easier
> and (IIUC) for the one you're adding later we only have "convst_channel"
> channels.
Yes, that's right. The BD79105 requires the convstart.
> On comment though...
>
>>
>> - Nuno Sá
>>
>>>
>>> Signed-off-by: Matti Vaittinen <mazziesaccount@gmail.com>
>>>
>>> ---
>>> Revision history:
>>> v1 => v2:
>>> - New patch
>>>
>>> I considered squashing this change with the one limiting the chip_info
>>> scope. Having this as a separate change should help reverting if someone
>>> complains about the increased memory consumption though.
>>> ---
>>> drivers/iio/adc/ad7476.c | 31 ++++++++++++++++++-------------
>>> 1 file changed, 18 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/drivers/iio/adc/ad7476.c b/drivers/iio/adc/ad7476.c
>>> index e97742912b8e..a30eb016c11c 100644
>>> --- a/drivers/iio/adc/ad7476.c
>>> +++ b/drivers/iio/adc/ad7476.c
>>> @@ -29,8 +29,6 @@ struct ad7476_state;
>>> struct ad7476_chip_info {
>>> unsigned int int_vref_mv;
>>> struct iio_chan_spec channel[2];
>>> - /* channels used when convst gpio is defined */
>>> - struct iio_chan_spec convst_channel[2];
>>> void (*reset)(struct ad7476_state *);
>>> bool has_vref;
>>> bool has_vdrive;
>>> @@ -41,6 +39,7 @@ struct ad7476_state {
>>> struct gpio_desc *convst_gpio;
>>> struct spi_transfer xfer;
>>> struct spi_message msg;
>>> + struct iio_chan_spec channel[2];
>>> int scale_mv;
>>> /*
>>> * DMA (thus cache coherency maintenance) may require the
>>> @@ -153,24 +152,18 @@ static int ad7476_read_raw(struct iio_dev *indio_dev,
>>> #define AD7940_CHAN(bits) _AD7476_CHAN((bits), 15 - (bits), \
>>> BIT(IIO_CHAN_INFO_RAW))
>>> #define AD7091R_CHAN(bits) _AD7476_CHAN((bits), 16 - (bits), 0)
>>> -#define AD7091R_CONVST_CHAN(bits) _AD7476_CHAN((bits), 16 - (bits), \
>>> - BIT(IIO_CHAN_INFO_RAW))
>>> #define ADS786X_CHAN(bits) _AD7476_CHAN((bits), 12 - (bits), \
>>> BIT(IIO_CHAN_INFO_RAW))
>>>
>>> static const struct ad7476_chip_info ad7091_chip_info = {
>>> .channel[0] = AD7091R_CHAN(12),
>>> .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
>>> - .convst_channel[0] = AD7091R_CONVST_CHAN(12),
>>> - .convst_channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
>>> .reset = ad7091_reset,
>>> };
>>>
>>> static const struct ad7476_chip_info ad7091r_chip_info = {
>>> .channel[0] = AD7091R_CHAN(12),
>>> .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
>>> - .convst_channel[0] = AD7091R_CONVST_CHAN(12),
>>> - .convst_channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
>>> .int_vref_mv = 2500,
>>> .has_vref = true,
>>> .reset = ad7091_reset,
>>> @@ -282,7 +275,7 @@ static int ad7476_probe(struct spi_device *spi)
>>> const struct ad7476_chip_info *chip_info;
>>> struct ad7476_state *st;
>>> struct iio_dev *indio_dev;
>>> - int ret;
>>> + int ret, i;
>>>
>>> indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
>>> if (!indio_dev)
>>> @@ -332,16 +325,28 @@ static int ad7476_probe(struct spi_device *spi)
>>> if (IS_ERR(st->convst_gpio))
>>> return PTR_ERR(st->convst_gpio);
>>>
>>> + /*
>>> + * This will never realize. Unless someone changes the channel specs
>>> + * in this driver. And if someone does, without changing the loop
>>> + * below, then we'd better immediately produce a big fat error, before
>>> + * the change proceeds from that developer's table.
>>> + */
>>> + BUILD_BUG_ON(ARRAY_SIZE(st->channel) != ARRAY_SIZE(chip_info->channel));
>
> I guess it make sense but still looks too fancy for this :)
Nothing else but a developer's carefulness keeps the number of channels
"in sync" for these two structs. I was originally doing WARN_ON() - but
then I thought that it's be even better to catch this at build time.
Then I found the BUILD_BUG_ON(). I see Andy suggested static_assert()
instead - I've no idea why one is preferred over other though. Let's see
if I get educated by Andy :)
>
>>> + for (i = 0; i < ARRAY_SIZE(st->channel); i++) {
>>> + st->channel[i] = chip_info->channel[i];
>>> + if (st->convst_gpio)
>
> I would flip this an do:
> if (!st->convst_gpio)
> break;
To me this would just add an extra line of code, and more complex flow.
I would definitely agree if there were more operations to be done for
the 'convstart channels' - but since this is really just "if it's
convstart, then set a bit" - the
if (foo)
bar;
seems simpler than
if (!foo)
break;
bar;
>
>>> + st->channel[i].info_mask_separate |=
>>> + BIT(IIO_CHAN_INFO_RAW);
>
> __set_bit()...
Ok. Thanks.
Thanks for the review(s) Nuno!
Yours,
-- Matti
next prev parent reply other threads:[~2025-08-08 5:37 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 [this message]
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
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=076b7f07-e755-4fe7-84b1-f3f495978008@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).