linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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

  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).