Lines Matching +full:timeout +full:- +full:tap +full:- +full:ms
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
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
215 * Axis data is 12-bit signed value, so
340 GENMASK(_field->msb, _field->lsb); \
344 * struct msa311_priv - MSA311 internal private state
351 * @chip_name: Chip name in the format "msa311-%02x" % partid
401 * msa311_get_odr() - Read Output Data Rate (ODR) value from MSA311 accel
405 * This function should be called under msa311->lock.
407 * Return: 0 on success, -ERRNO in other failures
413 err = regmap_field_read(msa311->fields[F_ODR], odr); in msa311_get_odr()
419 * ODR can be equal to 1010-1111 for 1000Hz, but function returns 1010 in msa311_get_odr()
429 * msa311_set_odr() - Setup Output Data Rate (ODR) value for MSA311 accel
433 * This function should be called under msa311->lock. Possible ODR values:
434 * - 1Hz (not available in normal mode)
435 * - 1.95Hz (not available in normal mode)
436 * - 3.9Hz
437 * - 7.81Hz
438 * - 15.63Hz
439 * - 31.25Hz
440 * - 62.5Hz
441 * - 125Hz
442 * - 250Hz
443 * - 500Hz
444 * - 1000Hz
446 * Return: 0 on success, -EINVAL for bad ODR value in the certain power mode,
447 * -ERRNO in other failures
451 struct device *dev = msa311->dev; in msa311_set_odr()
456 err = regmap_field_read(msa311->fields[F_PWR_MODE], &pwr_mode); in msa311_set_odr()
472 return -EINVAL; in msa311_set_odr()
475 return regmap_field_write(msa311->fields[F_ODR], odr); in msa311_set_odr()
479 * msa311_wait_for_next_data() - Wait next accel data available after resume
482 * Return: 0 on success, -EINTR if msleep() was interrupted,
483 * -ERRNO in other failures
488 struct device *dev = msa311->dev; in msa311_wait_for_next_data()
504 * A certain timeout is calculated based on the current ODR value. in msa311_wait_for_next_data()
505 * If requested timeout isn't so long (let's assume 20ms), in msa311_wait_for_next_data()
516 return -EINTR; in msa311_wait_for_next_data()
522 * msa311_set_pwr_mode() - Install certain MSA311 power mode
526 * This function should be called under msa311->lock.
528 * Return: 0 on success, -ERRNO on failure
532 struct device *dev = msa311->dev; in msa311_set_pwr_mode()
537 return -EINVAL; in msa311_set_pwr_mode()
541 err = regmap_field_read(msa311->fields[F_PWR_MODE], &prev_mode); in msa311_set_pwr_mode()
545 err = regmap_field_write(msa311->fields[F_PWR_MODE], mode); in msa311_set_pwr_mode()
558 * msa311_get_axis() - Read MSA311 accel data for certain IIO channel axis spec
563 * This function should be called under msa311->lock.
565 * Return: 0 on success, -EINVAL for unknown IIO channel specification,
566 * -ERRNO in other failures
572 struct device *dev = msa311->dev; in msa311_get_axis()
575 if (chan->scan_index < MSA311_SI_X || chan->scan_index > MSA311_SI_Z) { in msa311_get_axis()
577 chan->scan_index); in msa311_get_axis()
578 return -EINVAL; in msa311_get_axis()
582 axis_reg = MSA311_ACC_X_REG + (chan->scan_index << 1); in msa311_get_axis()
584 return regmap_bulk_read(msa311->regs, axis_reg, axis, sizeof(*axis)); in msa311_get_axis()
592 struct device *dev = msa311->dev; in msa311_read_raw_data()
606 mutex_lock(&msa311->lock); in msa311_read_raw_data()
608 mutex_unlock(&msa311->lock); in msa311_read_raw_data()
617 chan->datasheet_name, ERR_PTR(err)); in msa311_read_raw_data()
625 *val = sign_extend32(le16_to_cpu(axis) >> chan->scan_type.shift, in msa311_read_raw_data()
626 chan->scan_type.realbits - 1); in msa311_read_raw_data()
634 struct device *dev = msa311->dev; in msa311_read_scale()
638 mutex_lock(&msa311->lock); in msa311_read_scale()
639 err = regmap_field_read(msa311->fields[F_FS], &fs); in msa311_read_scale()
640 mutex_unlock(&msa311->lock); in msa311_read_scale()
656 struct device *dev = msa311->dev; in msa311_read_samp_freq()
660 mutex_lock(&msa311->lock); in msa311_read_samp_freq()
662 mutex_unlock(&msa311->lock); in msa311_read_samp_freq()
690 return -EINVAL; in msa311_read_raw()
715 return -EINVAL; in msa311_read_avail()
722 struct device *dev = msa311->dev; in msa311_write_scale()
734 err = -EINVAL; in msa311_write_scale()
738 mutex_lock(&msa311->lock); in msa311_write_scale()
739 err = regmap_field_write(msa311->fields[F_FS], fs); in msa311_write_scale()
740 mutex_unlock(&msa311->lock); in msa311_write_scale()
756 struct device *dev = msa311->dev; in msa311_write_samp_freq()
775 err = -EINVAL; in msa311_write_samp_freq()
779 mutex_lock(&msa311->lock); in msa311_write_samp_freq()
781 mutex_unlock(&msa311->lock); in msa311_write_samp_freq()
808 return -EINVAL; in msa311_write_raw()
817 struct device *dev = msa311->dev; in msa311_debugfs_reg_access()
820 if (reg > regmap_get_max_register(msa311->regs)) in msa311_debugfs_reg_access()
821 return -EINVAL; in msa311_debugfs_reg_access()
827 mutex_lock(&msa311->lock); in msa311_debugfs_reg_access()
830 err = regmap_read(msa311->regs, reg, readval); in msa311_debugfs_reg_access()
832 err = regmap_write(msa311->regs, reg, writeval); in msa311_debugfs_reg_access()
834 mutex_unlock(&msa311->lock); in msa311_debugfs_reg_access()
849 struct device *dev = msa311->dev; in msa311_buffer_preenable()
857 struct device *dev = msa311->dev; in msa311_buffer_postdisable()
869 struct device *dev = msa311->dev; in msa311_set_new_data_trig_state()
872 mutex_lock(&msa311->lock); in msa311_set_new_data_trig_state()
873 err = regmap_field_write(msa311->fields[F_NEW_DATA_INT_EN], state); in msa311_set_new_data_trig_state()
874 mutex_unlock(&msa311->lock); in msa311_set_new_data_trig_state()
886 return iio_trigger_get_drvdata(trig) == indio_dev ? 0 : -EINVAL; in msa311_validate_device()
892 struct msa311_priv *msa311 = iio_priv(pf->indio_dev); in msa311_buffer_thread()
893 struct iio_dev *indio_dev = pf->indio_dev; in msa311_buffer_thread()
895 struct device *dev = msa311->dev; in msa311_buffer_thread()
905 mutex_lock(&msa311->lock); in msa311_buffer_thread()
907 for_each_set_bit(bit, indio_dev->active_scan_mask, in msa311_buffer_thread()
908 indio_dev->masklength) { 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_update_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()
1307 MODULE_DESCRIPTION("MEMSensing MSA311 3-axis accelerometer driver");