Lines Matching +full:wake +full:- +full:on +full:- +full:motion
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
403 * msa311_get_odr() - Read Output Data Rate (ODR) value from MSA311 accel
407 * This function should be called under msa311->lock.
409 * Return: 0 on success, -ERRNO in other failures
415 err = regmap_field_read(msa311->fields[F_ODR], odr); in msa311_get_odr()
420 * Filter the same 1000Hz ODR register values based on datasheet info. in msa311_get_odr()
421 * ODR can be equal to 1010-1111 for 1000Hz, but function returns 1010 in msa311_get_odr()
431 * msa311_set_odr() - Setup Output Data Rate (ODR) value for MSA311 accel
435 * This function should be called under msa311->lock. Possible ODR values:
436 * - 1Hz (not available in normal mode)
437 * - 1.95Hz (not available in normal mode)
438 * - 3.9Hz
439 * - 7.81Hz
440 * - 15.63Hz
441 * - 31.25Hz
442 * - 62.5Hz
443 * - 125Hz
444 * - 250Hz
445 * - 500Hz
446 * - 1000Hz
448 * Return: 0 on success, -EINVAL for bad ODR value in the certain power mode,
449 * -ERRNO in other failures
453 struct device *dev = msa311->dev; in msa311_set_odr()
458 err = regmap_field_read(msa311->fields[F_PWR_MODE], &pwr_mode); in msa311_set_odr()
474 return -EINVAL; in msa311_set_odr()
477 return regmap_field_write(msa311->fields[F_ODR], odr); in msa311_set_odr()
481 * msa311_wait_for_next_data() - Wait next accel data available after resume
484 * Return: 0 on success, -EINTR if msleep() was interrupted,
485 * -ERRNO in other failures
490 struct device *dev = msa311->dev; in msa311_wait_for_next_data()
506 * A certain timeout is calculated based on the current ODR value. in msa311_wait_for_next_data()
518 return -EINTR; in msa311_wait_for_next_data()
524 * msa311_set_pwr_mode() - Install certain MSA311 power mode
528 * This function should be called under msa311->lock.
530 * Return: 0 on success, -ERRNO on failure
534 struct device *dev = msa311->dev; in msa311_set_pwr_mode()
539 return -EINVAL; in msa311_set_pwr_mode()
543 err = regmap_field_read(msa311->fields[F_PWR_MODE], &prev_mode); in msa311_set_pwr_mode()
547 err = regmap_field_write(msa311->fields[F_PWR_MODE], mode); in msa311_set_pwr_mode()
551 /* Wait actual data if we wake up */ in msa311_set_pwr_mode()
560 * msa311_get_axis() - Read MSA311 accel data for certain IIO channel axis spec
565 * This function should be called under msa311->lock.
567 * Return: 0 on success, -EINVAL for unknown IIO channel specification,
568 * -ERRNO in other failures
574 struct device *dev = msa311->dev; in msa311_get_axis()
577 if (chan->scan_index < MSA311_SI_X || chan->scan_index > MSA311_SI_Z) { in msa311_get_axis()
579 chan->scan_index); in msa311_get_axis()
580 return -EINVAL; in msa311_get_axis()
584 axis_reg = MSA311_ACC_X_REG + (chan->scan_index << 1); in msa311_get_axis()
586 return regmap_bulk_read(msa311->regs, axis_reg, axis, sizeof(*axis)); in msa311_get_axis()
594 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()
773 err = -EINVAL; in msa311_write_samp_freq()
777 mutex_lock(&msa311->lock); in msa311_write_samp_freq()
779 mutex_unlock(&msa311->lock); in msa311_write_samp_freq()
806 return -EINVAL; in msa311_write_raw()
815 struct device *dev = msa311->dev; in msa311_debugfs_reg_access()
818 if (reg > regmap_get_max_register(msa311->regs)) in msa311_debugfs_reg_access()
819 return -EINVAL; in msa311_debugfs_reg_access()
825 mutex_lock(&msa311->lock); in msa311_debugfs_reg_access()
828 err = regmap_read(msa311->regs, reg, readval); in msa311_debugfs_reg_access()
830 err = regmap_write(msa311->regs, reg, writeval); in msa311_debugfs_reg_access()
832 mutex_unlock(&msa311->lock); in msa311_debugfs_reg_access()
847 struct device *dev = msa311->dev; in msa311_buffer_preenable()
855 struct device *dev = msa311->dev; in msa311_buffer_postdisable()
867 struct device *dev = msa311->dev; in msa311_set_new_data_trig_state()
870 mutex_lock(&msa311->lock); in msa311_set_new_data_trig_state()
871 err = regmap_field_write(msa311->fields[F_NEW_DATA_INT_EN], state); in msa311_set_new_data_trig_state()
872 mutex_unlock(&msa311->lock); in msa311_set_new_data_trig_state()
884 return iio_trigger_get_drvdata(trig) == indio_dev ? 0 : -EINVAL; in msa311_validate_device()
890 struct msa311_priv *msa311 = iio_priv(pf->indio_dev); in msa311_buffer_thread()
891 struct iio_dev *indio_dev = pf->indio_dev; in msa311_buffer_thread()
893 struct device *dev = msa311->dev; in msa311_buffer_thread()
903 mutex_lock(&msa311->lock); in msa311_buffer_thread()
905 for_each_set_bit(bit, indio_dev->active_scan_mask, in msa311_buffer_thread()
906 indio_dev->masklength) { in msa311_buffer_thread()
911 mutex_unlock(&msa311->lock); in msa311_buffer_thread()
913 chan->datasheet_name, ERR_PTR(err)); in msa311_buffer_thread()
920 mutex_unlock(&msa311->lock); in msa311_buffer_thread()
926 iio_trigger_notify_done(indio_dev->trig); in msa311_buffer_thread()
935 struct device *dev = msa311->dev; in msa311_irq_thread()
938 mutex_lock(&msa311->lock); in msa311_irq_thread()
941 * We do not check NEW_DATA int status, because based on the in msa311_irq_thread()
945 err = regmap_field_read(msa311->fields[F_NEW_DATA_INT_EN], in msa311_irq_thread()
948 mutex_unlock(&msa311->lock); in msa311_irq_thread()
956 iio_trigger_poll_chained(msa311->new_data_trig); in msa311_irq_thread()
980 struct device *dev = msa311->dev; in msa311_check_partid()
984 err = regmap_read(msa311->regs, MSA311_PARTID_REG, &partid); in msa311_check_partid()
992 msa311->chip_name = devm_kasprintf(dev, GFP_KERNEL, in msa311_check_partid()
993 "msa311-%02x", partid); in msa311_check_partid()
994 if (!msa311->chip_name) in msa311_check_partid()
995 return dev_err_probe(dev, -ENOMEM, "can't alloc chip name\n"); in msa311_check_partid()
1002 struct device *dev = msa311->dev; in msa311_soft_reset()
1005 err = regmap_write(msa311->regs, MSA311_SOFT_RESET_REG, in msa311_soft_reset()
1016 struct device *dev = msa311->dev; in msa311_chip_init()
1020 err = regmap_write(msa311->regs, MSA311_RANGE_REG, MSA311_FS_16G); in msa311_chip_init()
1025 err = regmap_bulk_write(msa311->regs, MSA311_INT_SET_0_REG, in msa311_chip_init()
1032 err = regmap_bulk_write(msa311->regs, MSA311_INT_MAP_0_REG, in msa311_chip_init()
1039 err = regmap_update_bits(msa311->regs, MSA311_ODR_REG, in msa311_chip_init()
1056 struct device *dev = msa311->dev; in msa311_setup_interrupts()
1063 if (i2c->irq <= 0) in msa311_setup_interrupts()
1066 err = devm_request_threaded_irq(&i2c->dev, i2c->irq, NULL, in msa311_setup_interrupts()
1068 msa311->chip_name, indio_dev); in msa311_setup_interrupts()
1072 trig = devm_iio_trigger_alloc(dev, "%s-new-data", msa311->chip_name); in msa311_setup_interrupts()
1074 return dev_err_probe(dev, -ENOMEM, in msa311_setup_interrupts()
1077 msa311->new_data_trig = trig; in msa311_setup_interrupts()
1078 msa311->new_data_trig->ops = &msa311_new_data_trig_ops; in msa311_setup_interrupts()
1079 iio_trigger_set_drvdata(msa311->new_data_trig, indio_dev); in msa311_setup_interrupts()
1081 err = devm_iio_trigger_register(dev, msa311->new_data_trig); in msa311_setup_interrupts()
1086 err = regmap_field_write(msa311->fields[F_INT1_OD], in msa311_setup_interrupts()
1090 "can't enable push-pull interrupt\n"); in msa311_setup_interrupts()
1092 err = regmap_field_write(msa311->fields[F_INT1_LVL], in msa311_setup_interrupts()
1098 err = regmap_field_write(msa311->fields[F_LATCH_INT], in msa311_setup_interrupts()
1104 err = regmap_field_write(msa311->fields[F_RESET_INT], 1); in msa311_setup_interrupts()
1109 err = regmap_field_write(msa311->fields[F_INT1_NEW_DATA], 1); in msa311_setup_interrupts()
1119 struct regmap_field **fields = msa311->fields; in msa311_regmap_init()
1120 struct device *dev = msa311->dev; in msa311_regmap_init()
1130 msa311->regs = regmap; in msa311_regmap_init()
1134 msa311->regs, in msa311_regmap_init()
1136 if (IS_ERR(msa311->fields[i])) in msa311_regmap_init()
1137 return dev_err_probe(dev, PTR_ERR(msa311->fields[i]), in msa311_regmap_init()
1156 struct device *dev = &i2c->dev; in msa311_probe()
1163 return dev_err_probe(dev, -ENOMEM, in msa311_probe()
1167 msa311->dev = dev; in msa311_probe()
1174 mutex_init(&msa311->lock); in msa311_probe()
1176 msa311->vdd = devm_regulator_get(dev, "vdd"); in msa311_probe()
1177 if (IS_ERR(msa311->vdd)) in msa311_probe()
1178 return dev_err_probe(dev, PTR_ERR(msa311->vdd), in msa311_probe()
1181 err = regulator_enable(msa311->vdd); in msa311_probe()
1185 err = devm_add_action_or_reset(dev, msa311_vdd_disable, msa311->vdd); in msa311_probe()
1200 return dev_err_probe(dev, err, "failed to power on device\n"); in msa311_probe()
1233 indio_dev->modes = INDIO_DIRECT_MODE; in msa311_probe()
1234 indio_dev->channels = msa311_channels; in msa311_probe()
1235 indio_dev->num_channels = ARRAY_SIZE(msa311_channels); in msa311_probe()
1236 indio_dev->name = msa311->chip_name; in msa311_probe()
1237 indio_dev->info = &msa311_info; in msa311_probe()
1267 mutex_lock(&msa311->lock); in msa311_runtime_suspend()
1269 mutex_unlock(&msa311->lock); in msa311_runtime_suspend()
1283 mutex_lock(&msa311->lock); in msa311_runtime_resume()
1285 mutex_unlock(&msa311->lock); in msa311_runtime_resume()
1287 dev_err(dev, "failed to power on device (%pe)\n", in msa311_runtime_resume()
1320 MODULE_DESCRIPTION("MEMSensing MSA311 3-axis accelerometer driver");