Re: [PATCH v2 1/2] iio: adc: qcom-spmi-adc5-gen3: Share SDAM0 IRQ with ADC_TM auxiliary driver

From: Jonathan Cameron

Date: Thu Jun 04 2026 - 06:47:35 EST


On Wed, 3 Jun 2026 02:35:20 +0300
Andy Shevchenko <andriy.shevchenko@xxxxxxxxx> wrote:

> On Tue, May 26, 2026 at 04:26:09PM +0530, Jishnu Prakash wrote:
> > The SDAM0 IRQ can be triggered for both EOC (end of conversion) events for
> > immediate ADC reads done in this driver and for threshold violation events,
> > based on ADC_TM thresholds configured from the auxiliary ADC_TM driver on
> > TM channels on the first SDAM.
> >
> > At present, this interrupt is handled only in the ISR in the main ADC driver.
> > When the ISR is triggered for an ADC_TM event, this driver notifies the ADC_TM
> > driver by calling a notifier callback exposed from it for this purpose.
> >
> > To simplify the interrupt handling in both drivers, share the interrupt between
> > the drivers. With this, ADC_TM interrupts on SDAM0 will be handled directly in
> > the ADC_TM driver, so remove the notifier callback and all TM interrupt
> > handling in the main ADC ISR.
>
> ...
>
> > + /*
> > + * This interrupt is shared with the ADC_TM auxiliary driver, which
> > + * is threaded and uses IRQF_ONESHOT. Since shared interrupts need
> > + * to agree on IRQF_ONESHOT configuration and there is a kernel
> > + * warning for using IRQF_ONESHOT with non-threaded interrupts,
> > + * make this also a threaded IRQ.
> > + */
> > +
> > + ret = devm_request_threaded_irq(dev, adc->dev_data.base[ADC5_GEN3_VADC_SDAM].irq,
> > + NULL, adc5_gen3_isr, IRQF_ONESHOT | IRQF_SHARED,
> > + adc->dev_data.base[ADC5_GEN3_VADC_SDAM].irq_name,
> > + adc);
> > if (ret)
> > return dev_err_probe(dev, ret,
> > "Failed to request SDAM%d irq\n",
>
> Also add a patch to drop this duplicate message.
>

There is another thread going on this. It might not be duplicate
if -EPROBE_DEFER is returned. The message won't be printed but it
will be logged for helping debug deferred probe reasons.

So maybe we have been a little too energetic in removing these.

static void __dev_probe_failed(const struct device *dev, int err, bool fatal,
const char *fmt, va_list vargsp)
{
struct va_format vaf;
va_list vargs;

/*
* On x86_64 and possibly on other architectures, va_list is actually a
* size-1 array containing a structure. As a result, function parameter
* vargsp decays from T[1] to T*, and &vargsp has type T** rather than
* T(*)[1], which is expected by its assignment to vaf.va below.
*
* One standard way to solve this mess is by creating a copy in a local
* variable of type va_list and then using a pointer to that local copy
* instead, which is the approach employed here.
*/
va_copy(vargs, vargsp);

vaf.fmt = fmt;
vaf.va = &vargs;

switch (err) {
case -EPROBE_DEFER:
device_set_deferred_probe_reason(dev, &vaf);
//this call.
dev_dbg(dev, "error %pe: %pV", ERR_PTR(err), &vaf);
break;

case -ENOMEM:
/* Don't print anything on -ENOMEM, there's already enough output */
break;

default:
/* Log fatal final failures as errors, otherwise produce warnings */
if (fatal)
dev_err(dev, "error %pe: %pV", ERR_PTR(err), &vaf);
else
dev_warn(dev, "error %pe: %pV", ERR_PTR(err), &vaf);
break;
}

va_end(vargs);
}

Jonathan