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 12:09:21 +0300 [thread overview]
Message-ID: <62dbfa31-002b-4008-9273-01b161a72cac@gmail.com> (raw)
In-Reply-To: <t54tty4xbcsozeouoqmytdw6saedgoxbemnr2azbiv2f4h2wta@rf4fnooawrgs>
On 08/08/2025 12:00, Nuno Sá wrote:
> On Fri, Aug 08, 2025 at 08:37:07AM +0300, Matti Vaittinen wrote:
>> 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;
>
> Yes but in this particular case, you likely would not need to do any
> line break afterward because of indentation. Logically it also makes
> sense because st->convst_gpio is a device property (not a channel one).
> So it makes no sense to check it for all channels (I know we only have two
> channels). So if you prefer, you could even do:
>
> if (st->convst_gpio) {
> for (...)
> __set_bit(...);
> }
>
> which also would make more sense to me.
I considered this option, but I need to populate all the channels in
st->channel with the template data from chip_info->channel anyways.
Hence I want to loop through the channels also when the st->convst_gpio
is not there :)
>
> Up to you now :)
Well, I already sent the v3. (Sorry, I should've waited a bit more but
wanted to get it out before the weekend). I kept the same logic as in
v2. You can still suggest improvements there!
Yours,
-- Matti
next prev parent reply other threads:[~2025-08-08 9:09 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 [this message]
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=62dbfa31-002b-4008-9273-01b161a72cac@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).