Re: [PATCH v1 04/12] iio: accel: adxl345: reorganize irq handler
From: Jonathan Cameron
Date: Sat Feb 01 2025 - 11:43:52 EST
On Tue, 28 Jan 2025 12:00:52 +0000
Lothar Rubusch <l.rubusch@xxxxxxxxx> wrote:
> Reorganize the IRQ handler. Move the overrun handling to the bottom.
> Overrun leads to reset the interrupt register. This also happens at
> evaluation of a particular interrupt event. So, actually it makes more
> sense to evaluate the event if possible, and only fall back to pure
> overrun handling as a last resort. Further simplify fetching the
> interrupt status function. Both is in preparation to build interrupt
Both are preparatory steps to build
> handling up for the handling of different detected events, implemented
> in follow up patches.
>
> Signed-off-by: Lothar Rubusch <l.rubusch@xxxxxxxxx>
> ---
> drivers/iio/accel/adxl345_core.c | 23 ++++++++---------------
> 1 file changed, 8 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/iio/accel/adxl345_core.c b/drivers/iio/accel/adxl345_core.c
> index 8fbf0a43746f..7ee50a0b23ea 100644
> --- a/drivers/iio/accel/adxl345_core.c
> +++ b/drivers/iio/accel/adxl345_core.c
> @@ -491,16 +491,9 @@ static const struct iio_buffer_setup_ops adxl345_buffer_ops = {
> .predisable = adxl345_buffer_predisable,
> };
>
> -static int adxl345_get_status(struct adxl345_state *st)
> +static int adxl345_get_status(struct adxl345_state *st, unsigned int *int_stat)
> {
> - int ret;
> - unsigned int regval;
> -
> - ret = regmap_read(st->regmap, ADXL345_REG_INT_SOURCE, ®val);
> - if (ret < 0)
> - return ret;
> -
> - return FIELD_GET(ADXL345_REG_INT_SOURCE_MSK, regval);
Maybe worth commenting in the patch description that this is the whole register
anyway. Makes it obvious why this isn't a functional change.
Also delete that MSK value as it is rather pointless!
> + return regmap_read(st->regmap, ADXL345_REG_INT_SOURCE, int_stat);
> }
>
> static int adxl345_fifo_push(struct iio_dev *indio_dev,
> @@ -536,14 +529,10 @@ static irqreturn_t adxl345_irq_handler(int irq, void *p)
> int int_stat;
> int samples;
>
> - int_stat = adxl345_get_status(st);
> - if (int_stat <= 0)
> + if (adxl345_get_status(st, &int_stat))
> return IRQ_NONE;
>
> - if (int_stat & ADXL345_INT_OVERRUN)
> - goto err;
> -
> - if (int_stat & ADXL345_INT_WATERMARK) {
> + if (FIELD_GET(ADXL345_INT_WATERMARK, int_stat)) {
> samples = adxl345_get_samples(st);
> if (samples < 0)
> goto err;
> @@ -551,6 +540,10 @@ static irqreturn_t adxl345_irq_handler(int irq, void *p)
> if (adxl345_fifo_push(indio_dev, samples) < 0)
> goto err;
> }
> +
> + if (FIELD_GET(ADXL345_INT_OVERRUN, int_stat))
> + goto err;
> +
> return IRQ_HANDLED;
>
> err: