Re: [PATCH] iio: adc: qcom-spmi-adc5-gen3: fix lock annotations on mutex helpers
From: Marco Elver
Date: Mon Oct 19 2026 - 18:17:13 EST
On Mon, 19 Oct 2026 at 01:45, Jonathan Cameron <jic23@xxxxxxxxxx> wrote:
>
> On Sun, 4 Oct 2026 11:42:56 +0300
> Andy Shevchenko <andriy.shevchenko@xxxxxxxxx> wrote:
>
> > On Sun, Oct 04, 2026 at 12:45:16AM +0300, Rupesh Majhi wrote:
> > > The __acquires() and __releases() on adc5_gen3_mutex_lock() and
> > > adc5_gen3_mutex_unlock() name adc, a local declared in the body. With
> > > context analysis enabled for this file, the build fails:
> > >
> > > error: use of undeclared identifier 'adc'
> > >
> > > The lock and unlock are split across these two helpers for the ADC_TM
> > > driver, so mark them __context_unsafe() instead.
> >
> > Doesn't sound right to me. The __acquires() and __releases() IIRC are sparse
> > annotations. If clang has something special, it needs to be addressed in
> > the compiler-clang.h, no?
> >
> It's in compiler-context-analysis.h and for now I believe is clang
> only. Reuses the older sparse definitions. I think the intent is to avoid
> churn.
>
> I currently have no idea if this is the right fix. The only users
> today are places where a lock is intentionally skipped.
>
> +CC Marco and Bart and putting back the patch content for context.
>
> > diff --git a/drivers/iio/adc/qcom-spmi-adc5-gen3.c b/drivers/iio/adc/qcom-spmi-adc5-gen3.c
> > index c68c6c5f6aca..6a3cabedf4e8 100644
> > --- a/drivers/iio/adc/qcom-spmi-adc5-gen3.c
> > +++ b/drivers/iio/adc/qcom-spmi-adc5-gen3.c
> > @@ -663,7 +663,7 @@ static int adc5_gen3_add_aux_tm_device(struct adc5_chip *adc)
> > }
> >
> > void adc5_gen3_mutex_lock(struct device *dev)
> > - __acquires(&adc->lock)
> > + __context_unsafe(/* returns with adc->lock held */)
> > {
> > struct iio_dev *indio_dev = dev_get_drvdata(dev->parent);
> > struct adc5_chip *adc = iio_priv(indio_dev);
> > @@ -673,7 +673,7 @@ void adc5_gen3_mutex_lock(struct device *dev)
> > EXPORT_SYMBOL_NS_GPL(adc5_gen3_mutex_lock, "QCOM_SPMI_ADC5_GEN3");
> >
> > void adc5_gen3_mutex_unlock(struct device *dev)
> > - __releases(&adc->lock)
> > + __context_unsafe(/* releases adc->lock */)
> > {
> > struct iio_dev *indio_dev = dev_get_drvdata(dev->parent);
> > struct adc5_chip *adc = iio_priv(indio_dev);
You could probably stick the whole
iio_priv(dev_get_drvdata(dev->parent)) expression into a helper
get_adc5_chip(...), and then
__acquires/__releases(&get_adc5_chip(dev)->lock) should work. But
that's only worth it if the declarations get the annotations, because
if only the definitions have the annotation, any calls outside this
particular TU ignore the annotations anyway, so __context_unsafe is
reasonable if you don't want to do a larger change.