RE: [PATCH 7/7] iio:adc:ad_sigma_delta: Use IRQF_NO_AUTOEN rather than request and disable

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: Jonathan Cameron [mailto:jic23@xxxxxxxxxx]
> Sent: Tuesday, April 6, 2021 2:52 AM
> To: Song Bao Hua (Barry Song) <song.bao.hua@xxxxxxxxxxxxx>
> Cc: linux-iio@xxxxxxxxxxxxxxx; Jonathan Cameron <jonathan.cameron@xxxxxxxxxx>;
> Lars-Peter Clausen <lars@xxxxxxxxxx>; Alexandru Ardelean
> <ardeleanalex@xxxxxxxxx>; tiantao (H) <tiantao6@xxxxxxxxxxxxx>
> Subject: Re: [PATCH 7/7] iio:adc:ad_sigma_delta: Use IRQF_NO_AUTOEN rather than
> request and disable
> 
> On Fri, 2 Apr 2021 20:30:17 +0000
> "Song Bao Hua (Barry Song)" <song.bao.hua@xxxxxxxxxxxxx> wrote:
> 
> > > -----Original Message-----
> > > From: Jonathan Cameron [mailto:jic23@xxxxxxxxxx]
> > > Sent: Saturday, April 3, 2021 7:46 AM
> > > To: linux-iio@xxxxxxxxxxxxxxx
> > > Cc: Song Bao Hua (Barry Song) <song.bao.hua@xxxxxxxxxxxxx>; Jonathan Cameron
> > > <jonathan.cameron@xxxxxxxxxx>; Lars-Peter Clausen <lars@xxxxxxxxxx>;
> > > Alexandru Ardelean <ardeleanalex@xxxxxxxxx>
> > > Subject: [PATCH 7/7] iio:adc:ad_sigma_delta: Use IRQF_NO_AUTOEN rather than
> > > request and disable
> > >
> > > From: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx>
> > >
> > > These devices are not able to mask the signal used as a data ready
> > > interrupt.  As such they previously requested the irq then immediately
> > > disabled it.  Now we can avoid the potential of a spurious interrupt
> > > by avoiding the irq being auto enabled in the first place.
> > >
> > > I'm not sure how this code could have been called with the irq already
> > > disabled, so I believe the conditional would always have been true and
> > > have removed it.
> > >
> >
> > If irq_dis is true, it seems the original code assumed interrupt was
> > open. Now the code is moving to disable-irq for true irq_dis. For
> > false irq_dis, this patch has no side effect so looks correct.
> Hi Barry,
> 
> As far as I can tell (and I looked closely :), at the point where
> ad_sd_probe_trigger() can be called, irq_dis is always false,
> so the original check is misleading by implying
> otherwise.

I didn't realize that. Thanks for clarification.

> 
> Taken in isolation of what is visible in this patch I'd agree
> the change you suggest makes sense, but I'd also like to clean
> up the wrong impression the original check was giving.  It is
> also worth noting that ad_sigma_delta.h lists irq_dis as a
> private member of the structure that should only be used in the
> library (reducing chances of any drivers in future doing something
> odd with it).
> 

Yes. It makes sense.

> The other checks on irq_dis look suspicious as well, but removing
> those would rather spread the scope of this patch.
> 
> As Lars has given an Reviewed-by and this is his code, I'm going
> to press ahead with this as it stands.
> 
> Applied to the togreg branch of iio.git and pushed out as testing
> for the autobuilders to see if we missed anything.
> 
> Thanks,
> 
> Jonathan
> 
> >
> > A safer way might be as below?
> >
> > if(!sigma_delta->irq_dis)
> > 	irq_flags = sigma_delta->info->irq_flags | IRQF_NO_AUTOEN;
> >
> > request_irq(irq_flags);
> >
> > sigma_delta->irq_dis =  true;
> >
> > > Signed-off-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx>
> > > Cc: Lars-Peter Clausen <lars@xxxxxxxxxx>
> > > Cc: Alexandru Ardelean <ardeleanalex@xxxxxxxxx>
> > > ---
> > >  drivers/iio/adc/ad_sigma_delta.c | 7 ++-----
> > >  1 file changed, 2 insertions(+), 5 deletions(-)
> > >
> > > diff --git a/drivers/iio/adc/ad_sigma_delta.c
> > > b/drivers/iio/adc/ad_sigma_delta.c
> > > index 9289812c0a94..e777ec718973 100644
> > > --- a/drivers/iio/adc/ad_sigma_delta.c
> > > +++ b/drivers/iio/adc/ad_sigma_delta.c
> > > @@ -485,18 +485,15 @@ static int ad_sd_probe_trigger(struct iio_dev
> *indio_dev)
> > >  	sigma_delta->trig->ops = &ad_sd_trigger_ops;
> > >  	init_completion(&sigma_delta->completion);
> > >
> > > +	sigma_delta->irq_dis = true;
> > >  	ret = request_irq(sigma_delta->spi->irq,
> > >  			  ad_sd_data_rdy_trig_poll,
> > > -			  sigma_delta->info->irq_flags,
> > > +			  sigma_delta->info->irq_flags | IRQF_NO_AUTOEN,
> > >  			  indio_dev->name,
> > >  			  sigma_delta);
> > >  	if (ret)
> > >  		goto error_free_trig;
> > >
> > > -	if (!sigma_delta->irq_dis) {
> > > -		sigma_delta->irq_dis = true;
> > > -		disable_irq_nosync(sigma_delta->spi->irq);
> > > -	}
> > >  	iio_trigger_set_drvdata(sigma_delta->trig, sigma_delta);
> > >
> > >  	ret = iio_trigger_register(sigma_delta->trig);
> > > --
> > > 2.31.1
> >

Thanks
Barry



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux