Devicetree
 help / color / mirror / Atom feed
From: Jonathan Cameron <jic23@kernel.org>
To: Rodrigo Alencar <455.rodrigo.alencar@gmail.com>
Cc: Rodrigo Alencar via B4 Relay
	<devnull+rodrigo.alencar.analog.com@kernel.org>,
	rodrigo.alencar@analog.com,
	Michael Auchter <michael.auchter@ni.com>,
	linux@analog.com, linux-iio@vger.kernel.org,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-hardening@vger.kernel.org,
	Michael Hennerich <Michael.Hennerich@analog.com>,
	David Lechner <dlechner@baylibre.com>,
	Andy Shevchenko <andy@kernel.org>, Rob Herring <robh@kernel.org>,
	Krzysztof Kozlowski <krzk+dt@kernel.org>,
	Conor Dooley <conor+dt@kernel.org>,
	Philipp Zabel <p.zabel@pengutronix.de>,
	Kees Cook <kees@kernel.org>,
	"Gustavo A. R. Silva" <gustavoars@kernel.org>
Subject: Re: [PATCH 10/12] iio: dac: ad5686: add triggered buffer support
Date: Fri, 5 Jun 2026 15:09:51 +0100	[thread overview]
Message-ID: <20260605150951.1c793b76@jic23-huawei> (raw)
In-Reply-To: <i3wvatdosla3cszhhtizgoetcbknl56be3mpipzdxqx2jzvch2@l4hzeer5zoa7>

On Fri, 5 Jun 2026 12:34:31 +0100
Rodrigo Alencar <455.rodrigo.alencar@gmail.com> wrote:

> On 26/06/03 01:41PM, Jonathan Cameron wrote:
> > On Tue, 02 Jun 2026 17:33:57 +0100
> > Rodrigo Alencar via B4 Relay <devnull+rodrigo.alencar.analog.com@kernel.org> wrote:
> >   
> > > From: Rodrigo Alencar <rodrigo.alencar@analog.com>
> > > 
> > > Implement trigger handler by leveraging the LDAC gpio to update all DAC
> > > channels at once when it is available. Also, the multiple channel writes
> > > can be flushed at once with the sync() operation.  
> 
> ...
> 
> > > +static irqreturn_t ad5686_trigger_handler(int irq, void *p)
> > > +{
> > > +	struct iio_poll_func *pf = p;
> > > +	struct iio_dev *indio_dev = pf->indio_dev;
> > > +	struct iio_buffer *buffer = indio_dev->buffer;
> > > +	struct ad5686_state *st = iio_priv(indio_dev);
> > > +	u16 val[AD5686_MAX_CHANNELS] = { };
> > > +	int ret, ch, i = 0;
> > > +	bool async_update;
> > > +	u8 cmd;
> > > +
> > > +	ret = iio_pop_from_buffer(buffer, val);
> > > +	if (ret)
> > > +		goto out;
> > > +
> > > +	mutex_lock(&st->lock);
> > > +
> > > +	async_update = st->ldac_gpio && bitmap_weight(indio_dev->active_scan_mask,
> > > +						      iio_get_masklength(indio_dev)) > 1;
> > > +	if (async_update) {
> > > +		/* use ldac to update all channels simultaneously */
> > > +		cmd = AD5686_CMD_WRITE_INPUT_N;
> > > +		gpiod_set_value_cansleep(st->ldac_gpio, 0);
> > > +	} else {
> > > +		cmd = AD5686_CMD_WRITE_INPUT_N_UPDATE_N;
> > > +	}
> > > +
> > > +	iio_for_each_active_channel(indio_dev, ch) {
> > > +		ret = st->ops->write(st, cmd, indio_dev->channels[ch].address, val[i++]);
> > > +		if (ret)
> > > +			goto cleanup;
> > > +	}
> > > +
> > > +	if (st->ops->sync)
> > > +		ret = st->ops->sync(st); /* flush all pending transfers */
> > > +
> > > +cleanup:  
> 
> It turns out that this label is not really needed. When sync() op is available
> it must be called regardless of write failure, so the bus data can reset its
> state. Then moving "cleanup" up would just make it useless.
> 
> > > +	if (async_update)  
> > 
> > Error paths are always fun.  Do we care about setting ldac_gpio to 1 if
> > we failed to write the channel values?  That will set any that did successfully
> > update, but not all of them.  Note I'm not sure on the right answer for this.
> > There may not be one!  
> 
> I would not see a problem with that, as there is no much we can do with errors
> in a interrupt handler.
> 
> >   
> > > +		gpiod_set_value_cansleep(st->ldac_gpio, 1);
> > > +
> > > +	mutex_unlock(&st->lock);
> > > +out:
> > > +	iio_trigger_notify_done(indio_dev->trig);  
> > We get this pattern so often (though not always).  Feels like maybe
> > we should put some effort into a generic opt in solution for this.
> > 
> > A job for another day but options that come to mind.
> > 1) (hideous) a flag
> > 2) Maybe an alternative callback. thread_always_complete or
> >    something like that.  Pain to wire through all the calls though
> >    and injecting the necessary wrapper isn't great either.
> >    Implementation wise would be a case of popping in a wrapper function
> >    in iio_trigger_attach_poll() call to request_threaded_irq().
> > 3) Maybe a helper macro?  Bit ugly as we'd need one to generate
> >    the wrapper function and another to use the same name for
> >    the registration function.
> > 
> > Hmm. Those are all ugly (maybe 2 is ok ish).  Suggestions welcome!  
> 
> using a cleanup.h? with something like:
> 
> 	static inline void iio_trigger_always_done(struct iio_poll_func **ppf)
> 	{
> 		iio_trigger_notify_done((*ppf)->indio_dev->trig);
> 	}
> 
> 	static irqreturn_t ad5686_trigger_handler(int irq, void *p)
> 	{
> 		struct iio_poll_func *pf __cleanup(iio_trigger_always_done) = p;

That's not a nice pattern given the lack of any local constructing. The ownership
transfer isn't obvious as both p and pf are really same type (it's slightly
hidden by the void * nature of p) - ideally we'd want p to be unusable after
that transfer.  Could do something hideous like 
		struct iio_poll_func *pf __cleanup(iio_trigger_always_done) =
			__get_and_null(p, NULL);
where p is set NULL so it becomes dead but that is ugly and not what that
is for so I doubt it would be popular and so we'd end up with yet another
weird macro.  There is some precedence with take_fd() but the use of that
is complex and I think it is only used to grab ownership from a local CLASS()
defined cleanup.

So it would work, but I've actively argued against this style elsewhere
in the kernel so don't really want it in IIO either!

Key disadvantage is that it is yet another weird bit of cleanup.h stuff for
people to learn and we have enough of those already.

So indeed an option but I'm not really liking it.

Jonathan

> 		/* ... */
> 
> 		ret = iio_pop_from_buffer(buffer, val);
> 		if (ret)
> 			return IRQ_HANDLED;
> 
> 		/* ... */
> 
> 		return IRQ_HANDLED;
> 	}
> 
> >   
> > > +
> > > +	return IRQ_HANDLED;
> > > +}  
> 


  reply	other threads:[~2026-06-05 14:10 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-02 16:33 [PATCH 00/12] New features for the AD5686 IIO driver Rodrigo Alencar via B4 Relay
2026-06-02 16:33 ` [PATCH 01/12] dt-bindings: iio: dac: ad5696: add reset/ldac/gain gpio support Rodrigo Alencar via B4 Relay
2026-06-02 16:33 ` [PATCH 02/12] dt-bindings: iio: dac: ad5696: rework on power supplies Rodrigo Alencar via B4 Relay
2026-06-03 15:25   ` Conor Dooley
2026-06-02 16:33 ` [PATCH 03/12] dt-bindings: iio: dac: ad5686: add reset/ldac/gain gpio support Rodrigo Alencar via B4 Relay
2026-06-02 16:33 ` [PATCH 04/12] dt-bindings: iio: dac: ad5686: rework on power supplies Rodrigo Alencar via B4 Relay
2026-06-03 15:29   ` Conor Dooley
2026-06-02 16:33 ` [PATCH 05/12] iio: dac: ad5686: add support for missing " Rodrigo Alencar via B4 Relay
2026-06-02 19:02   ` Andy Shevchenko
2026-06-03 12:17     ` Rodrigo Alencar
2026-06-04  5:51       ` Andy Shevchenko
2026-06-02 16:33 ` [PATCH 06/12] iio: dac: ad5686: consume optional reset signal Rodrigo Alencar via B4 Relay
2026-06-02 19:03   ` Andy Shevchenko
2026-06-03  8:28   ` Nuno Sá
2026-06-03 12:08     ` Jonathan Cameron
2026-06-03 12:57       ` Philipp Zabel
2026-06-08  8:29       ` Nuno Sá
2026-06-02 16:33 ` [PATCH 07/12] iio: dac: ad5686: add ldac gpio Rodrigo Alencar via B4 Relay
2026-06-02 19:05   ` Andy Shevchenko
2026-06-02 16:33 ` [PATCH 08/12] iio: dac: ad5686: introduce sync operation Rodrigo Alencar via B4 Relay
2026-06-02 16:33 ` [PATCH 09/12] iio: dac: ad5686: implement new sync() op for the spi bus Rodrigo Alencar via B4 Relay
2026-06-02 19:14   ` Andy Shevchenko
2026-06-03 12:26     ` Rodrigo Alencar
2026-06-03 12:55       ` Jonathan Cameron
2026-06-04 19:51         ` Andy Shevchenko
2026-06-03 12:24   ` Jonathan Cameron
2026-06-02 16:33 ` [PATCH 10/12] iio: dac: ad5686: add triggered buffer support Rodrigo Alencar via B4 Relay
2026-06-02 19:18   ` Andy Shevchenko
2026-06-03 12:41   ` Jonathan Cameron
2026-06-05 11:34     ` Rodrigo Alencar
2026-06-05 14:09       ` Jonathan Cameron [this message]
2026-06-05 14:40         ` Rodrigo Alencar
2026-06-02 16:33 ` [PATCH 11/12] iio: dac: ad5686: write_raw: use guard(mutex)() Rodrigo Alencar via B4 Relay
2026-06-02 19:20   ` Andy Shevchenko
2026-06-02 16:33 ` [PATCH 12/12] iio: dac: ad5686: add gain control support Rodrigo Alencar via B4 Relay
2026-06-02 19:25   ` Andy Shevchenko

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=20260605150951.1c793b76@jic23-huawei \
    --to=jic23@kernel.org \
    --cc=455.rodrigo.alencar@gmail.com \
    --cc=Michael.Hennerich@analog.com \
    --cc=andy@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=devnull+rodrigo.alencar.analog.com@kernel.org \
    --cc=dlechner@baylibre.com \
    --cc=gustavoars@kernel.org \
    --cc=kees@kernel.org \
    --cc=krzk+dt@kernel.org \
    --cc=linux-hardening@vger.kernel.org \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@analog.com \
    --cc=michael.auchter@ni.com \
    --cc=p.zabel@pengutronix.de \
    --cc=robh@kernel.org \
    --cc=rodrigo.alencar@analog.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