static int st_lsm6dsx_update_decimators(struct st_lsm6dsx_hw *hw) { struct st_lsm6dsx_sensor *sensor; u16 max_odr, min_odr, sip = 0; int err, i; u8 data; st_lsm6dsx_get_max_min_odr(hw, &max_odr, &min_odr); for (i = 0; i < ST_LSM6DSX_ID_MAX; i++) { sensor = iio_priv(hw->iio_devs[i]); /* update fifo decimators and sample in pattern */ if (hw->enable_mask & BIT(sensor->id)) { sensor->sip = sensor->odr / min_odr; sensor->decimator = max_odr / sensor->odr; data = st_lsm6dsx_get_decimator_val(sensor->decimator); } else { sensor->sip = 0; sensor->decimator = 0; data = 0; } err = st_lsm6dsx_write_with_mask(hw, ST_LSM6DSX_REG_FIFO_DEC_GXL_ADDR, sensor->decimator_mask, data); if (err < 0) return err; sip += sensor->sip; } hw->sip = sip; return 0; }
static int st_lsm6dsx_update_decimators(struct st_lsm6dsx_hw *hw) { u16 max_odr, min_odr, sip = 0, ts_sip = 0; const struct st_lsm6dsx_reg *ts_dec_reg; struct st_lsm6dsx_sensor *sensor; int err = 0, i; u8 data; st_lsm6dsx_get_max_min_odr(hw, &max_odr, &min_odr); for (i = 0; i < ST_LSM6DSX_ID_MAX; i++) { const struct st_lsm6dsx_reg *dec_reg; sensor = iio_priv(hw->iio_devs[i]); /* update fifo decimators and sample in pattern */ if (hw->enable_mask & BIT(sensor->id)) { sensor->sip = sensor->odr / min_odr; sensor->decimator = max_odr / sensor->odr; data = st_lsm6dsx_get_decimator_val(sensor->decimator); } else { sensor->sip = 0; sensor->decimator = 0; data = 0; } ts_sip = max_t(u16, ts_sip, sensor->sip); dec_reg = &hw->settings->decimator[sensor->id]; if (dec_reg->addr) { int val = ST_LSM6DSX_SHIFT_VAL(data, dec_reg->mask); err = regmap_update_bits(hw->regmap, dec_reg->addr, dec_reg->mask, val); if (err < 0) return err; } sip += sensor->sip; } hw->sip = sip + ts_sip; hw->ts_sip = ts_sip; /* * update hw ts decimator if necessary. Decimator for hw timestamp * is always 1 or 0 in order to have a ts sample for each data * sample in FIFO */ ts_dec_reg = &hw->settings->ts_settings.decimator; if (ts_dec_reg->addr) { int val, ts_dec = !!hw->ts_sip; val = ST_LSM6DSX_SHIFT_VAL(ts_dec, ts_dec_reg->mask); err = regmap_update_bits(hw->regmap, ts_dec_reg->addr, ts_dec_reg->mask, val); } return err; }
static int st_lsm6dsx_update_decimators(struct st_lsm6dsx_hw *hw) { struct st_lsm6dsx_sensor *sensor; u16 max_odr, min_odr, sip = 0; int err, i; u8 data; st_lsm6dsx_get_max_min_odr(hw, &max_odr, &min_odr); for (i = 0; i < ST_LSM6DSX_ID_MAX; i++) { const struct st_lsm6dsx_reg *dec_reg; sensor = iio_priv(hw->iio_devs[i]); /* update fifo decimators and sample in pattern */ if (hw->enable_mask & BIT(sensor->id)) { sensor->sip = sensor->odr / min_odr; sensor->decimator = max_odr / sensor->odr; data = st_lsm6dsx_get_decimator_val(sensor->decimator); } else { sensor->sip = 0; sensor->decimator = 0; data = 0; } dec_reg = &hw->settings->decimator[sensor->id]; if (dec_reg->addr) { int val = ST_LSM6DSX_SHIFT_VAL(data, dec_reg->mask); err = regmap_update_bits(hw->regmap, dec_reg->addr, dec_reg->mask, val); if (err < 0) return err; } sip += sensor->sip; } hw->sip = sip; return 0; }