Lines Matching +full:oversampling +full:- +full:ratio
1 // SPDX-License-Identifier: GPL-2.0-only
8 * - Support for power management
9 * - Support events and interrupts
10 * - Create channel for step count
11 * - Create channel for sensor time
37 * The G-range selection may be one of 2g, 4g, 8, or 16g. The scale may
204 return &data->orientation; in bma400_accel_get_mount_matrix()
266 return -EINVAL; in usec_to_tapreg_raw()
277 ret = regmap_read(data->regmap, BMA400_TAP_CONFIG1, ®_val); in in_accel_gesture_tap_maxtomin_time_show()
302 return -EINVAL; in in_accel_gesture_tap_maxtomin_time_store()
304 ret = regmap_update_bits(data->regmap, BMA400_TAP_CONFIG1, in in_accel_gesture_tap_maxtomin_time_store()
380 .scan_index = -1, /* No buffer support */ \
405 .scan_index = -1, /* No buffer support */
421 if (data->power_mode == POWER_MODE_SLEEP) in bma400_get_temp_reg()
422 return -EBUSY; in bma400_get_temp_reg()
424 ret = regmap_read(data->regmap, BMA400_TEMP_DATA_REG, &raw_temp); in bma400_get_temp_reg()
446 if (data->power_mode == POWER_MODE_SLEEP) in bma400_get_accel_reg()
447 return -EBUSY; in bma400_get_accel_reg()
449 switch (chan->channel2) { in bma400_get_accel_reg()
460 dev_err(data->dev, "invalid axis channel modifier\n"); in bma400_get_accel_reg()
461 return -EINVAL; in bma400_get_accel_reg()
465 ret = regmap_bulk_read(data->regmap, lsb_reg, &raw_accel, in bma400_get_accel_reg()
477 *val = BMA400_ACC_ODR_MAX_HZ >> (BMA400_ACC_ODR_MAX_RAW - raw); in bma400_output_data_rate_from_raw()
490 switch (data->power_mode) { in bma400_get_accel_output_data_rate()
493 * Runs at a fixed rate in low-power mode. See section 4.3 in bma400_get_accel_output_data_rate()
497 &data->sample_freq.hz, in bma400_get_accel_output_data_rate()
498 &data->sample_freq.uhz); in bma400_get_accel_output_data_rate()
505 ret = regmap_read(data->regmap, BMA400_ACC_CONFIG1_REG, &val); in bma400_get_accel_output_data_rate()
512 ret = -EINVAL; in bma400_get_accel_output_data_rate()
516 bma400_output_data_rate_from_raw(odr, &data->sample_freq.hz, in bma400_get_accel_output_data_rate()
517 &data->sample_freq.uhz); in bma400_get_accel_output_data_rate()
520 data->sample_freq.hz = 0; in bma400_get_accel_output_data_rate()
521 data->sample_freq.uhz = 0; in bma400_get_accel_output_data_rate()
528 data->sample_freq.hz = -1; in bma400_get_accel_output_data_rate()
529 data->sample_freq.uhz = -1; in bma400_get_accel_output_data_rate()
543 return -EINVAL; in bma400_set_accel_output_data_rate()
549 return -EINVAL; in bma400_set_accel_output_data_rate()
555 return -EINVAL; in bma400_set_accel_output_data_rate()
558 ret = regmap_read(data->regmap, BMA400_ACC_CONFIG1_REG, &val); in bma400_set_accel_output_data_rate()
565 ret = regmap_write(data->regmap, BMA400_ACC_CONFIG1_REG, odr); in bma400_set_accel_output_data_rate()
569 bma400_output_data_rate_from_raw(idx, &data->sample_freq.hz, in bma400_set_accel_output_data_rate()
570 &data->sample_freq.uhz); in bma400_set_accel_output_data_rate()
581 * The oversampling ratio is stored in a different register in bma400_get_accel_oversampling_ratio()
582 * based on the power-mode. In normal mode the OSR is stored in bma400_get_accel_oversampling_ratio()
583 * in ACC_CONFIG1. In low-power mode it is stored in in bma400_get_accel_oversampling_ratio()
586 switch (data->power_mode) { in bma400_get_accel_oversampling_ratio()
588 ret = regmap_read(data->regmap, BMA400_ACC_CONFIG0_REG, &val); in bma400_get_accel_oversampling_ratio()
590 data->oversampling_ratio = -1; in bma400_get_accel_oversampling_ratio()
596 data->oversampling_ratio = osr; in bma400_get_accel_oversampling_ratio()
599 ret = regmap_read(data->regmap, BMA400_ACC_CONFIG1_REG, &val); in bma400_get_accel_oversampling_ratio()
601 data->oversampling_ratio = -1; in bma400_get_accel_oversampling_ratio()
607 data->oversampling_ratio = osr; in bma400_get_accel_oversampling_ratio()
610 data->oversampling_ratio = 0; in bma400_get_accel_oversampling_ratio()
613 data->oversampling_ratio = -1; in bma400_get_accel_oversampling_ratio()
614 return -EINVAL; in bma400_get_accel_oversampling_ratio()
625 return -EINVAL; in bma400_set_accel_oversampling_ratio()
628 * The oversampling ratio is stored in a different register in bma400_set_accel_oversampling_ratio()
629 * based on the power-mode. in bma400_set_accel_oversampling_ratio()
631 switch (data->power_mode) { in bma400_set_accel_oversampling_ratio()
633 ret = regmap_read(data->regmap, BMA400_ACC_CONFIG0_REG, in bma400_set_accel_oversampling_ratio()
638 ret = regmap_write(data->regmap, BMA400_ACC_CONFIG0_REG, in bma400_set_accel_oversampling_ratio()
642 dev_err(data->dev, "Failed to write out OSR\n"); in bma400_set_accel_oversampling_ratio()
646 data->oversampling_ratio = val; in bma400_set_accel_oversampling_ratio()
649 ret = regmap_read(data->regmap, BMA400_ACC_CONFIG1_REG, in bma400_set_accel_oversampling_ratio()
654 ret = regmap_write(data->regmap, BMA400_ACC_CONFIG1_REG, in bma400_set_accel_oversampling_ratio()
658 dev_err(data->dev, "Failed to write out OSR\n"); in bma400_set_accel_oversampling_ratio()
662 data->oversampling_ratio = val; in bma400_set_accel_oversampling_ratio()
665 return -EINVAL; in bma400_set_accel_oversampling_ratio()
676 return -EINVAL; in bma400_accel_scale_to_raw()
682 return -EINVAL; in bma400_accel_scale_to_raw()
693 ret = regmap_read(data->regmap, BMA400_ACC_CONFIG1_REG, &val); in bma400_get_accel_scale()
699 return -EINVAL; in bma400_get_accel_scale()
701 data->scale = BMA400_SCALE_MIN << raw_scale; in bma400_get_accel_scale()
712 ret = regmap_read(data->regmap, BMA400_ACC_CONFIG1_REG, &acc_config); in bma400_set_accel_scale()
720 ret = regmap_write(data->regmap, BMA400_ACC_CONFIG1_REG, in bma400_set_accel_scale()
726 data->scale = val; in bma400_set_accel_scale()
735 ret = regmap_read(data->regmap, BMA400_STATUS_REG, &val); in bma400_get_power_mode()
737 dev_err(data->dev, "Failed to read status register\n"); in bma400_get_power_mode()
741 data->power_mode = (val >> 1) & BMA400_TWO_BITS_MASK; in bma400_get_power_mode()
751 ret = regmap_read(data->regmap, BMA400_ACC_CONFIG0_REG, &val); in bma400_set_power_mode()
755 if (data->power_mode == mode) in bma400_set_power_mode()
759 return -EINVAL; in bma400_set_power_mode()
761 /* Preserve the low-power oversample ratio etc */ in bma400_set_power_mode()
762 ret = regmap_write(data->regmap, BMA400_ACC_CONFIG0_REG, in bma400_set_power_mode()
765 dev_err(data->dev, "Failed to write to power-mode\n"); in bma400_set_power_mode()
769 data->power_mode = mode; in bma400_set_power_mode()
773 * power-mode. in bma400_set_power_mode()
784 if (data->steps_enabled == val) in bma400_enable_steps()
787 ret = regmap_update_bits(data->regmap, BMA400_INT_CONFIG1_REG, in bma400_enable_steps()
792 data->steps_enabled = val; in bma400_enable_steps()
803 return -ENOMEM; in bma400_get_steps_reg()
805 ret = regmap_bulk_read(data->regmap, BMA400_STEP_CNT0_REG, in bma400_get_steps_reg()
839 mutex_lock(&data->mutex); in bma400_power_disable()
841 mutex_unlock(&data->mutex); in bma400_power_disable()
843 dev_warn(data->dev, "Failed to put device into sleep mode (%pe)\n", in bma400_power_disable()
867 ret = devm_regulator_bulk_get_enable(data->dev, in bma400_init()
871 return dev_err_probe(data->dev, ret, "Failed to get regulators\n"); in bma400_init()
874 ret = regmap_read(data->regmap, BMA400_CHIP_ID_REG, &val); in bma400_init()
876 dev_err(data->dev, "Failed to read chip id register\n"); in bma400_init()
881 dev_err(data->dev, "Chip ID mismatch\n"); in bma400_init()
882 return -ENODEV; in bma400_init()
887 dev_err(data->dev, "Failed to get the initial power-mode\n"); in bma400_init()
891 if (data->power_mode != POWER_MODE_NORMAL) { in bma400_init()
894 dev_err(data->dev, "Failed to wake up the device\n"); in bma400_init()
904 ret = devm_add_action_or_reset(data->dev, bma400_power_disable, data); in bma400_init()
923 ret = regmap_write(data->regmap, BMA400_INT_IO_CTRL_REG, 0x06); in bma400_init()
932 return regmap_write(data->regmap, BMA400_ACC_CONFIG2_REG, 0x00); in bma400_init()
945 switch (chan->type) { in bma400_read_raw()
947 mutex_lock(&data->mutex); in bma400_read_raw()
949 mutex_unlock(&data->mutex); in bma400_read_raw()
954 ret = regmap_read(data->regmap, BMA400_STEP_STAT_REG, in bma400_read_raw()
963 if (chan->channel2 == bma400_act_to_mod(activity)) in bma400_read_raw()
969 return -EINVAL; in bma400_read_raw()
972 mutex_lock(&data->mutex); in bma400_read_raw()
974 mutex_unlock(&data->mutex); in bma400_read_raw()
977 switch (chan->type) { in bma400_read_raw()
979 if (data->sample_freq.hz < 0) in bma400_read_raw()
980 return -EINVAL; in bma400_read_raw()
982 *val = data->sample_freq.hz; in bma400_read_raw()
983 *val2 = data->sample_freq.uhz; in bma400_read_raw()
994 return -EINVAL; in bma400_read_raw()
998 *val2 = data->scale; in bma400_read_raw()
1002 * TODO: We could avoid this logic and returning -EINVAL here if in bma400_read_raw()
1003 * we set both the low-power and normal mode OSR registers when in bma400_read_raw()
1006 if (data->oversampling_ratio < 0) in bma400_read_raw()
1007 return -EINVAL; in bma400_read_raw()
1009 *val = data->oversampling_ratio; in bma400_read_raw()
1012 *val = data->steps_enabled; in bma400_read_raw()
1015 return -EINVAL; in bma400_read_raw()
1041 return -EINVAL; in bma400_read_avail()
1056 * register and a fixed value in low-power mode. in bma400_write_raw()
1058 if (chan->type != IIO_ACCEL) in bma400_write_raw()
1059 return -EINVAL; in bma400_write_raw()
1061 mutex_lock(&data->mutex); in bma400_write_raw()
1063 mutex_unlock(&data->mutex); in bma400_write_raw()
1068 return -EINVAL; in bma400_write_raw()
1070 mutex_lock(&data->mutex); in bma400_write_raw()
1072 mutex_unlock(&data->mutex); in bma400_write_raw()
1075 mutex_lock(&data->mutex); in bma400_write_raw()
1077 mutex_unlock(&data->mutex); in bma400_write_raw()
1080 mutex_lock(&data->mutex); in bma400_write_raw()
1082 mutex_unlock(&data->mutex); in bma400_write_raw()
1085 return -EINVAL; in bma400_write_raw()
1103 return -EINVAL; in bma400_write_raw_get_fmt()
1114 switch (chan->type) { in bma400_read_event_config()
1119 data->generic_event_en); in bma400_read_event_config()
1122 data->generic_event_en); in bma400_read_event_config()
1125 data->tap_event_en_bitmask); in bma400_read_event_config()
1128 data->tap_event_en_bitmask); in bma400_read_event_config()
1130 return -EINVAL; in bma400_read_event_config()
1133 return data->step_event_en; in bma400_read_event_config()
1135 return data->activity_event_en; in bma400_read_event_config()
1137 return -EINVAL; in bma400_read_event_config()
1149 ret = regmap_update_bits(data->regmap, BMA400_INT12_MAP_REG, in bma400_steps_event_enable()
1155 data->step_event_en = state; in bma400_steps_event_enable()
1182 return -EINVAL; in bma400_activity_event_en()
1186 ret = regmap_write(data->regmap, reg, 0xF8); in bma400_activity_event_en()
1191 ret = regmap_write(data->regmap, reg + BMA400_GEN_CONFIG1_OFF, value); in bma400_activity_event_en()
1196 ret = regmap_write(data->regmap, reg + BMA400_GEN_CONFIG2_OFF, 0x0A); in bma400_activity_event_en()
1201 ret = regmap_write(data->regmap, reg + BMA400_GEN_CONFIG31_OFF, 0x0F); in bma400_activity_event_en()
1205 ret = regmap_update_bits(data->regmap, BMA400_INT1_MAP_REG, msk, in bma400_activity_event_en()
1210 ret = regmap_update_bits(data->regmap, BMA400_INT_CONFIG0_REG, msk, in bma400_activity_event_en()
1215 set_mask_bits(&data->generic_event_en, msk, field_value); in bma400_activity_event_en()
1227 * See table in section 4.3 "Power modes - performance modes" of in bma400_tap_event_en()
1230 if (data->power_mode != POWER_MODE_NORMAL) in bma400_tap_event_en()
1231 return -EINVAL; in bma400_tap_event_en()
1237 if (data->sample_freq.hz != 200 && state) { in bma400_tap_event_en()
1238 dev_err(data->dev, "Invalid data rate for tap interrupts.\n"); in bma400_tap_event_en()
1239 return -EINVAL; in bma400_tap_event_en()
1242 ret = regmap_update_bits(data->regmap, BMA400_INT12_MAP_REG, in bma400_tap_event_en()
1260 return -EINVAL; in bma400_tap_event_en()
1263 ret = regmap_update_bits(data->regmap, BMA400_INT_CONFIG1_REG, mask, in bma400_tap_event_en()
1268 set_mask_bits(&data->tap_event_en_bitmask, mask, field_value); in bma400_tap_event_en()
1277 ret = regmap_write(data->regmap, BMA400_INT_CONFIG0_REG, 0); in bma400_disable_adv_interrupt()
1281 ret = regmap_write(data->regmap, BMA400_INT_CONFIG1_REG, 0); in bma400_disable_adv_interrupt()
1285 data->tap_event_en_bitmask = 0; in bma400_disable_adv_interrupt()
1286 data->generic_event_en = 0; in bma400_disable_adv_interrupt()
1287 data->step_event_en = false; in bma400_disable_adv_interrupt()
1288 data->activity_event_en = false; in bma400_disable_adv_interrupt()
1301 switch (chan->type) { in bma400_write_event_config()
1305 mutex_lock(&data->mutex); in bma400_write_event_config()
1307 mutex_unlock(&data->mutex); in bma400_write_event_config()
1310 mutex_lock(&data->mutex); in bma400_write_event_config()
1312 mutex_unlock(&data->mutex); in bma400_write_event_config()
1315 return -EINVAL; in bma400_write_event_config()
1318 mutex_lock(&data->mutex); in bma400_write_event_config()
1320 mutex_unlock(&data->mutex); in bma400_write_event_config()
1323 mutex_lock(&data->mutex); in bma400_write_event_config()
1324 if (!data->step_event_en) { in bma400_write_event_config()
1327 mutex_unlock(&data->mutex); in bma400_write_event_config()
1331 data->activity_event_en = state; in bma400_write_event_config()
1332 mutex_unlock(&data->mutex); in bma400_write_event_config()
1335 return -EINVAL; in bma400_write_event_config()
1347 return -EINVAL; in get_gen_config_reg()
1361 if (chan->type != IIO_ACCEL) in bma400_read_event_value()
1362 return -EINVAL; in bma400_read_event_value()
1368 return -EINVAL; in bma400_read_event_value()
1373 ret = regmap_read(data->regmap, in bma400_read_event_value()
1380 mutex_lock(&data->mutex); in bma400_read_event_value()
1381 ret = regmap_bulk_read(data->regmap, in bma400_read_event_value()
1383 &data->duration, in bma400_read_event_value()
1384 sizeof(data->duration)); in bma400_read_event_value()
1386 mutex_unlock(&data->mutex); in bma400_read_event_value()
1389 *val = be16_to_cpu(data->duration); in bma400_read_event_value()
1390 mutex_unlock(&data->mutex); in bma400_read_event_value()
1393 ret = regmap_read(data->regmap, reg, val); in bma400_read_event_value()
1399 return -EINVAL; in bma400_read_event_value()
1404 ret = regmap_read(data->regmap, BMA400_TAP_CONFIG, in bma400_read_event_value()
1412 ret = regmap_read(data->regmap, BMA400_TAP_CONFIG1, in bma400_read_event_value()
1422 ret = regmap_read(data->regmap, BMA400_TAP_CONFIG1, in bma400_read_event_value()
1432 return -EINVAL; in bma400_read_event_value()
1435 return -EINVAL; in bma400_read_event_value()
1449 if (chan->type != IIO_ACCEL) in bma400_write_event_value()
1450 return -EINVAL; in bma400_write_event_value()
1456 return -EINVAL; in bma400_write_event_value()
1461 return -EINVAL; in bma400_write_event_value()
1463 return regmap_write(data->regmap, in bma400_write_event_value()
1468 return -EINVAL; in bma400_write_event_value()
1470 mutex_lock(&data->mutex); in bma400_write_event_value()
1471 put_unaligned_be16(val, &data->duration); in bma400_write_event_value()
1472 ret = regmap_bulk_write(data->regmap, in bma400_write_event_value()
1474 &data->duration, in bma400_write_event_value()
1475 sizeof(data->duration)); in bma400_write_event_value()
1476 mutex_unlock(&data->mutex); in bma400_write_event_value()
1480 return -EINVAL; in bma400_write_event_value()
1482 return regmap_update_bits(data->regmap, reg, in bma400_write_event_value()
1487 return -EINVAL; in bma400_write_event_value()
1493 return -EINVAL; in bma400_write_event_value()
1495 return regmap_update_bits(data->regmap, in bma400_write_event_value()
1503 return -EINVAL; in bma400_write_event_value()
1505 return regmap_update_bits(data->regmap, in bma400_write_event_value()
1513 return -EINVAL; in bma400_write_event_value()
1515 return regmap_update_bits(data->regmap, in bma400_write_event_value()
1521 return -EINVAL; in bma400_write_event_value()
1524 return -EINVAL; in bma400_write_event_value()
1535 ret = regmap_update_bits(data->regmap, BMA400_INT_CONFIG0_REG, in bma400_data_rdy_trigger_set_state()
1541 return regmap_update_bits(data->regmap, BMA400_INT1_MAP_REG, in bma400_data_rdy_trigger_set_state()
1573 struct iio_dev *indio_dev = pf->indio_dev; in bma400_trigger_handler()
1577 /* Lock to protect the data->buffer */ in bma400_trigger_handler()
1578 mutex_lock(&data->mutex); in bma400_trigger_handler()
1581 ret = regmap_bulk_read(data->regmap, BMA400_X_AXIS_LSB_REG, in bma400_trigger_handler()
1582 &data->buffer.buff, sizeof(data->buffer.buff)); in bma400_trigger_handler()
1586 if (test_bit(BMA400_TEMP, indio_dev->active_scan_mask)) { in bma400_trigger_handler()
1587 ret = regmap_read(data->regmap, BMA400_TEMP_DATA_REG, &temp); in bma400_trigger_handler()
1591 data->buffer.temperature = temp; in bma400_trigger_handler()
1594 iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer, in bma400_trigger_handler()
1597 mutex_unlock(&data->mutex); in bma400_trigger_handler()
1598 iio_trigger_notify_done(indio_dev->trig); in bma400_trigger_handler()
1602 mutex_unlock(&data->mutex); in bma400_trigger_handler()
1614 /* Lock to protect the data->status */ in bma400_interrupt()
1615 mutex_lock(&data->mutex); in bma400_interrupt()
1616 ret = regmap_bulk_read(data->regmap, BMA400_INT_STAT0_REG, in bma400_interrupt()
1617 &data->status, in bma400_interrupt()
1618 sizeof(data->status)); in bma400_interrupt()
1623 if (ret || !data->status) in bma400_interrupt()
1630 if (FIELD_GET(BMA400_INT_ENG_OVRUN_MSK, le16_to_cpu(data->status))) { in bma400_interrupt()
1632 dev_err(data->dev, "Interrupt engine overrun\n"); in bma400_interrupt()
1636 if (FIELD_GET(BMA400_INT_S_TAP_MSK, le16_to_cpu(data->status))) in bma400_interrupt()
1644 if (FIELD_GET(BMA400_INT_D_TAP_MSK, le16_to_cpu(data->status))) in bma400_interrupt()
1652 if (FIELD_GET(BMA400_INT_GEN1_MSK, le16_to_cpu(data->status))) in bma400_interrupt()
1655 if (FIELD_GET(BMA400_INT_GEN2_MSK, le16_to_cpu(data->status))) in bma400_interrupt()
1666 if (FIELD_GET(BMA400_STEP_STAT_MASK, le16_to_cpu(data->status))) { in bma400_interrupt()
1673 if (data->activity_event_en) { in bma400_interrupt()
1674 ret = regmap_read(data->regmap, BMA400_STEP_STAT_REG, in bma400_interrupt()
1688 if (FIELD_GET(BMA400_INT_DRDY_MSK, le16_to_cpu(data->status))) { in bma400_interrupt()
1689 mutex_unlock(&data->mutex); in bma400_interrupt()
1690 iio_trigger_poll_nested(data->trig); in bma400_interrupt()
1694 mutex_unlock(&data->mutex); in bma400_interrupt()
1698 mutex_unlock(&data->mutex); in bma400_interrupt()
1711 return -ENOMEM; in bma400_probe()
1714 data->regmap = regmap; in bma400_probe()
1715 data->dev = dev; in bma400_probe()
1721 ret = iio_read_mount_matrix(dev, &data->orientation); in bma400_probe()
1725 mutex_init(&data->mutex); in bma400_probe()
1726 indio_dev->name = name; in bma400_probe()
1727 indio_dev->info = &bma400_info; in bma400_probe()
1728 indio_dev->channels = bma400_channels; in bma400_probe()
1729 indio_dev->num_channels = ARRAY_SIZE(bma400_channels); in bma400_probe()
1730 indio_dev->available_scan_masks = bma400_avail_scan_masks; in bma400_probe()
1731 indio_dev->modes = INDIO_DIRECT_MODE; in bma400_probe()
1734 data->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", in bma400_probe()
1735 indio_dev->name, in bma400_probe()
1737 if (!data->trig) in bma400_probe()
1738 return -ENOMEM; in bma400_probe()
1740 data->trig->ops = &bma400_trigger_ops; in bma400_probe()
1741 iio_trigger_set_drvdata(data->trig, indio_dev); in bma400_probe()
1743 ret = devm_iio_trigger_register(data->dev, data->trig); in bma400_probe()
1745 return dev_err_probe(data->dev, ret, in bma400_probe()
1748 indio_dev->trig = iio_trigger_get(data->trig); in bma400_probe()
1752 indio_dev->name, indio_dev); in bma400_probe()
1754 return dev_err_probe(data->dev, ret, in bma400_probe()
1761 return dev_err_probe(data->dev, ret, in bma400_probe()