Skip to content

Commit 38f67d0

Browse files
Rubuschjic23
authored andcommitted
iio: accel: adxl367: fix setting odr for activity time update
Fix setting the odr value to update activity time based on frequency derrived by recent odr, and not by obsolete odr value. The [small] bug: When _adxl367_set_odr() is called with a new odr value, it first writes the new odr value to the hardware register ADXL367_REG_FILTER_CTL. Second, it calls _adxl367_set_act_time_ms(), which calls adxl367_time_ms_to_samples(). Here st->odr still holds the old odr value. This st->odr member is used to derrive a frequency value, which is applied to update ADXL367_REG_TIME_ACT. Hence, the idea is to update activity time, based on possibilities and power consumption by the current ODR rate. Finally, when the function calls return, again in _adxl367_set_odr() the new ODR is assigned to st->odr. The fix: When setting a new ODR value is set to ADXL367_REG_FILTER_CTL, also ADXL367_REG_TIME_ACT should probably be updated with a frequency based on the recent ODR value and not the old one. Changing the location of the assignment to st->odr fixes this. Fixes: cbab791 ("iio: accel: add ADXL367 driver") Signed-off-by: Lothar Rubusch <l.rubusch@gmail.com> Reviewed-by: Marcelo Schmitt <marcelo.schmitt1@gmail.com> Link: https://patch.msgid.link/20250309193515.2974-1-l.rubusch@gmail.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
1 parent 6d03811 commit 38f67d0

File tree

1 file changed

+3
-7
lines changed

1 file changed

+3
-7
lines changed

drivers/iio/accel/adxl367.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -601,18 +601,14 @@ static int _adxl367_set_odr(struct adxl367_state *st, enum adxl367_odr odr)
601601
if (ret)
602602
return ret;
603603

604+
st->odr = odr;
605+
604606
/* Activity timers depend on ODR */
605607
ret = _adxl367_set_act_time_ms(st, st->act_time_ms);
606608
if (ret)
607609
return ret;
608610

609-
ret = _adxl367_set_inact_time_ms(st, st->inact_time_ms);
610-
if (ret)
611-
return ret;
612-
613-
st->odr = odr;
614-
615-
return 0;
611+
return _adxl367_set_inact_time_ms(st, st->inact_time_ms);
616612
}
617613

618614
static int adxl367_set_odr(struct iio_dev *indio_dev, enum adxl367_odr odr)

0 commit comments

Comments
 (0)