Re: [PATCH 2/2] iio: imu: st_lsm6dsx: Decouple sensor ODR from FIFO batch data rate

Francesco Lavra
2025-10-10T18:44:54Z

[-- Attachment #1: Type: text/plain, Size: 2217 bytes --]

On Fri, 2025-10-10 at 17:55 +0300, Andy Shevchenko wrote:
> On Thu, Oct 9, 2025 at 8:36 PM Francesco Lavra <flavra@baylibre.com>
> wrote:
> >
> > The rate at which accelerometer or gyroscope sensor samples are fed
> > to the hardware FIFO (batch data rate, or BDR) does not have to
> > coincide with the sensor sampling frequency (output data rate, or
> > ODR); the only requirement is for the BDR to not be greater than
> > the ODR. Having a BDR lower than the ODR is useful in cases where
> > an application requires a high sampling rate for accurate detection
> > of motion events (e.g. wakeup events), but wants to read sensor
> > sample values from the device buffer at a lower data rate.
> > To support the above use case, add a sampling_frequency sysfs
> > attribute to the buffer directory of st_lsm6dsx IIO devices, which
> > controls the BDR for a given sensor independently from the "main"
> > sampling_frequency attribute (which controls the ODR); introduce a
> > new `bdr` field in struct st_lsm6dsx_sensor to keep track of the
> > current BDR value, and use this field instead of the `odr` field in
> > the code that deals with the FIFO data rate. In the sensor hub
> > driver, make the bdr value always mirror the odr value, since there
> > is no separate configuration setting to control the BDR for data
> > produced by the sensor hub functionality.
>
> ...
>
> > -               *max_odr = max_t(u32, *max_odr, sensor->odr);
> > -               *min_odr = min_t(u32, *min_odr, sensor->odr);
> > +               *max_odr = max_t(u32, *max_odr, sensor->bdr);
> > +               *min_odr = min_t(u32, *min_odr, sensor->bdr);
>
> Can we get rid of '_t' parts at some point? Or IOW what is the good
> justification for typed macros here?

I think they are not justified here, I will get take this opportunity to
get rid of them.

> ...
>
> > +       ret = iio_str_to_fixpoint(buf, 100, &integer, &fract);
> > +       if (ret)
> > +               return ret;
> > +       bdr = integer * 1000 + fract;
>
> MILLI?

If you mean replacing fract with milli, will do.

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 659 bytes --]