Lines Matching +full:rates +full:- +full:ru

1 // SPDX-License-Identifier: GPL-2.0
3 * MEMSensing digital 3-Axis accelerometer
5 * MSA311 is a tri-axial, low-g accelerometer with I2C digital output for
6 * sensitivity consumer applications. It has dynamic user-selectable full
7 * scales range of +-2g/+-4g/+-8g/+-16g and allows acceleration measurements
8 * with output data rates from 1Hz to 1000Hz.
11 * and is guaranteed to operate over -40C to +85C.
14 * - IIO interface
15 * - Different power modes: NORMAL, SUSPEND
16 * - ODR (Output Data Rate) selection
17 * - Scale selection
18 * - IIO triggered buffer
19 * - NEW_DATA interrupt + trigger
22 * - Motion Events: ACTIVE, TAP, ORIENT, FREEFALL
23 * - Low Power mode
27 * Author: Dmitry Rokosov <ddrokosov@sberdevices.ru>
216 * Axis data is 12-bit signed value, so
341 GENMASK(_field->msb, _field->lsb); \
345 * struct msa311_priv - MSA311 internal private state
352 * @chip_name: Chip name in the format "msa311-%02x" % partid
402 * msa311_get_odr() - Read Output Data Rate (ODR) value from MSA311 accel
406 * This function should be called under msa311->lock.
408 * Return: 0 on success, -ERRNO in other failures
414 err = regmap_field_read(msa311->fields[F_ODR], odr); in msa311_get_odr()
420 * ODR can be equal to 1010-1111 for 1000Hz, but function returns 1010 in msa311_get_odr()
430 * msa311_set_odr() - Setup Output Data Rate (ODR) value for MSA311 accel
434 * This function should be called under msa311->lock. Possible ODR values:
435 * - 1Hz (not available in normal mode)
436 * - 1.95Hz (not available in normal mode)
437 * - 3.9Hz
438 * - 7.81Hz
439 * - 15.63Hz
440 * - 31.25Hz
441 * - 62.5Hz
442 * - 125Hz
443 * - 250Hz
444 * - 500Hz
445 * - 1000Hz
447 * Return: 0 on success, -EINVAL for bad ODR value in the certain power mode,
448 * -ERRNO in other failures
452 struct device *dev = msa311->dev; in msa311_set_odr()
457 err = regmap_field_read(msa311->fields[F_PWR_MODE], &pwr_mode); in msa311_set_odr()
473 return -EINVAL; in msa311_set_odr()
476 return regmap_field_write(msa311->fields[F_ODR], odr); in msa311_set_odr()
480 * msa311_wait_for_next_data() - Wait next accel data available after resume
483 * Return: 0 on success, -EINTR if msleep() was interrupted,
484 * -ERRNO in other failures
489 struct device *dev = msa311->dev; in msa311_wait_for_next_data()
517 return -EINTR; in msa311_wait_for_next_data()
523 * msa311_set_pwr_mode() - Install certain MSA311 power mode
527 * This function should be called under msa311->lock.
529 * Return: 0 on success, -ERRNO on failure
533 struct device *dev = msa311->dev; in msa311_set_pwr_mode()
538 return -EINVAL; in msa311_set_pwr_mode()
542 err = regmap_field_read(msa311->fields[F_PWR_MODE], &prev_mode); in msa311_set_pwr_mode()
546 err = regmap_field_write(msa311->fields[F_PWR_MODE], mode); in msa311_set_pwr_mode()
559 * msa311_get_axis() - Read MSA311 accel data for certain IIO channel axis spec
564 * This function should be called under msa311->lock.
566 * Return: 0 on success, -EINVAL for unknown IIO channel specification,
567 * -ERRNO in other failures
573 struct device *dev = msa311->dev; in msa311_get_axis()
576 if (chan->scan_index < MSA311_SI_X || chan->scan_index > MSA311_SI_Z) { in msa311_get_axis()
578 chan->scan_index); in msa311_get_axis()
579 return -EINVAL; in msa311_get_axis()
583 axis_reg = MSA311_ACC_X_REG + (chan->scan_index << 1); in msa311_get_axis()
585 return regmap_bulk_read(msa311->regs, axis_reg, axis, sizeof(*axis)); in msa311_get_axis()
593 struct device *dev = msa311->dev; in msa311_read_raw_data()
607 mutex_lock(&msa311->lock); in msa311_read_raw_data()
609 mutex_unlock(&msa311->lock); in msa311_read_raw_data()
618 chan->datasheet_name, ERR_PTR(err)); in msa311_read_raw_data()
626 *val = sign_extend32(le16_to_cpu(axis) >> chan->scan_type.shift, in msa311_read_raw_data()
627 chan->scan_type.realbits - 1); in msa311_read_raw_data()
635 struct device *dev = msa311->dev; in msa311_read_scale()
639 mutex_lock(&msa311->lock); in msa311_read_scale()
640 err = regmap_field_read(msa311->fields[F_FS], &fs); in msa311_read_scale()
641 mutex_unlock(&msa311->lock); in msa311_read_scale()
657 struct device *dev = msa311->dev; in msa311_read_samp_freq()
661 mutex_lock(&msa311->lock); in msa311_read_samp_freq()
663 mutex_unlock(&msa311->lock); in msa311_read_samp_freq()
691 return -EINVAL; in msa311_read_raw()
716 return -EINVAL; in msa311_read_avail()
723 struct device *dev = msa311->dev; in msa311_write_scale()
735 err = -EINVAL; in msa311_write_scale()
739 mutex_lock(&msa311->lock); in msa311_write_scale()
740 err = regmap_field_write(msa311->fields[F_FS], fs); in msa311_write_scale()
741 mutex_unlock(&msa311->lock); in msa311_write_scale()
757 struct device *dev = msa311->dev; in msa311_write_samp_freq()
776 err = -EINVAL; in msa311_write_samp_freq()
780 mutex_lock(&msa311->lock); in msa311_write_samp_freq()
782 mutex_unlock(&msa311->lock); in msa311_write_samp_freq()
809 return -EINVAL; in msa311_write_raw()
818 struct device *dev = msa311->dev; in msa311_debugfs_reg_access()
821 if (reg > regmap_get_max_register(msa311->regs)) in msa311_debugfs_reg_access()
822 return -EINVAL; in msa311_debugfs_reg_access()
828 mutex_lock(&msa311->lock); in msa311_debugfs_reg_access()
831 err = regmap_read(msa311->regs, reg, readval); in msa311_debugfs_reg_access()
833 err = regmap_write(msa311->regs, reg, writeval); in msa311_debugfs_reg_access()
835 mutex_unlock(&msa311->lock); in msa311_debugfs_reg_access()
850 struct device *dev = msa311->dev; in msa311_buffer_preenable()
858 struct device *dev = msa311->dev; in msa311_buffer_postdisable()
870 struct device *dev = msa311->dev; in msa311_set_new_data_trig_state()
873 mutex_lock(&msa311->lock); in msa311_set_new_data_trig_state()
874 err = regmap_field_write(msa311->fields[F_NEW_DATA_INT_EN], state); in msa311_set_new_data_trig_state()
875 mutex_unlock(&msa311->lock); in msa311_set_new_data_trig_state()
887 return iio_trigger_get_drvdata(trig) == indio_dev ? 0 : -EINVAL; in msa311_validate_device()
893 struct msa311_priv *msa311 = iio_priv(pf->indio_dev); in msa311_buffer_thread()
894 struct iio_dev *indio_dev = pf->indio_dev; in msa311_buffer_thread()
896 struct device *dev = msa311->dev; in msa311_buffer_thread()
906 mutex_lock(&msa311->lock); in msa311_buffer_thread()
913 mutex_unlock(&msa311->lock); in msa311_buffer_thread()
915 chan->datasheet_name, ERR_PTR(err)); in msa311_buffer_thread()
922 mutex_unlock(&msa311->lock); in msa311_buffer_thread()
928 iio_trigger_notify_done(indio_dev->trig); in msa311_buffer_thread()
937 struct device *dev = msa311->dev; in msa311_irq_thread()
940 mutex_lock(&msa311->lock); in msa311_irq_thread()
947 err = regmap_field_read(msa311->fields[F_NEW_DATA_INT_EN], in msa311_irq_thread()
950 mutex_unlock(&msa311->lock); in msa311_irq_thread()
958 iio_trigger_poll_nested(msa311->new_data_trig); in msa311_irq_thread()
982 struct device *dev = msa311->dev; in msa311_check_partid()
986 err = regmap_read(msa311->regs, MSA311_PARTID_REG, &partid); in msa311_check_partid()
994 msa311->chip_name = devm_kasprintf(dev, GFP_KERNEL, in msa311_check_partid()
995 "msa311-%02x", partid); in msa311_check_partid()
996 if (!msa311->chip_name) in msa311_check_partid()
997 return dev_err_probe(dev, -ENOMEM, "can't alloc chip name\n"); in msa311_check_partid()
1004 struct device *dev = msa311->dev; in msa311_soft_reset()
1007 err = regmap_write(msa311->regs, MSA311_SOFT_RESET_REG, in msa311_soft_reset()
1018 struct device *dev = msa311->dev; in msa311_chip_init()
1022 err = regmap_write(msa311->regs, MSA311_RANGE_REG, MSA311_FS_16G); in msa311_chip_init()
1027 err = regmap_bulk_write(msa311->regs, MSA311_INT_SET_0_REG, in msa311_chip_init()
1034 err = regmap_bulk_write(msa311->regs, MSA311_INT_MAP_0_REG, in msa311_chip_init()
1041 err = regmap_clear_bits(msa311->regs, MSA311_ODR_REG, in msa311_chip_init()
1058 struct device *dev = msa311->dev; in msa311_setup_interrupts()
1065 if (i2c->irq <= 0) in msa311_setup_interrupts()
1068 err = devm_request_threaded_irq(&i2c->dev, i2c->irq, NULL, in msa311_setup_interrupts()
1070 msa311->chip_name, indio_dev); in msa311_setup_interrupts()
1074 trig = devm_iio_trigger_alloc(dev, "%s-new-data", msa311->chip_name); in msa311_setup_interrupts()
1076 return dev_err_probe(dev, -ENOMEM, in msa311_setup_interrupts()
1079 msa311->new_data_trig = trig; in msa311_setup_interrupts()
1080 msa311->new_data_trig->ops = &msa311_new_data_trig_ops; in msa311_setup_interrupts()
1081 iio_trigger_set_drvdata(msa311->new_data_trig, indio_dev); in msa311_setup_interrupts()
1083 err = devm_iio_trigger_register(dev, msa311->new_data_trig); in msa311_setup_interrupts()
1088 err = regmap_field_write(msa311->fields[F_INT1_OD], in msa311_setup_interrupts()
1092 "can't enable push-pull interrupt\n"); in msa311_setup_interrupts()
1094 err = regmap_field_write(msa311->fields[F_INT1_LVL], in msa311_setup_interrupts()
1100 err = regmap_field_write(msa311->fields[F_LATCH_INT], in msa311_setup_interrupts()
1106 err = regmap_field_write(msa311->fields[F_RESET_INT], 1); in msa311_setup_interrupts()
1111 err = regmap_field_write(msa311->fields[F_INT1_NEW_DATA], 1); in msa311_setup_interrupts()
1121 struct regmap_field **fields = msa311->fields; in msa311_regmap_init()
1122 struct device *dev = msa311->dev; in msa311_regmap_init()
1132 msa311->regs = regmap; in msa311_regmap_init()
1136 msa311->regs, in msa311_regmap_init()
1138 if (IS_ERR(msa311->fields[i])) in msa311_regmap_init()
1139 return dev_err_probe(dev, PTR_ERR(msa311->fields[i]), in msa311_regmap_init()
1153 struct device *dev = &i2c->dev; in msa311_probe()
1160 return dev_err_probe(dev, -ENOMEM, in msa311_probe()
1164 msa311->dev = dev; in msa311_probe()
1171 mutex_init(&msa311->lock); in msa311_probe()
1220 indio_dev->modes = INDIO_DIRECT_MODE; in msa311_probe()
1221 indio_dev->channels = msa311_channels; in msa311_probe()
1222 indio_dev->num_channels = ARRAY_SIZE(msa311_channels); in msa311_probe()
1223 indio_dev->name = msa311->chip_name; in msa311_probe()
1224 indio_dev->info = &msa311_info; in msa311_probe()
1254 mutex_lock(&msa311->lock); in msa311_runtime_suspend()
1256 mutex_unlock(&msa311->lock); in msa311_runtime_suspend()
1270 mutex_lock(&msa311->lock); in msa311_runtime_resume()
1272 mutex_unlock(&msa311->lock); in msa311_runtime_resume()
1306 MODULE_AUTHOR("Dmitry Rokosov <ddrokosov@sberdevices.ru>");
1307 MODULE_DESCRIPTION("MEMSensing MSA311 3-axis accelerometer driver");