Lines Matching full:msa311

5  * MSA311 is a tri-axial, low-g accelerometer with I2C digital output for
10 * MSA311 is available in an ultra small (2mm x 2mm, height 0.95mm) LGA package
13 * This driver supports following MSA311 features:
328 .name = "msa311",
345 * struct msa311_priv - MSA311 internal private state
350 * @lock: Protects msa311 device state between setup and data access routines
352 * @chip_name: Chip name in the format "msa311-%02x" % partid
402 * msa311_get_odr() - Read Output Data Rate (ODR) value from MSA311 accel
403 * @msa311: MSA311 internal private state
406 * This function should be called under msa311->lock.
410 static int msa311_get_odr(struct msa311_priv *msa311, unsigned int *odr) in msa311_get_odr() argument
414 err = regmap_field_read(msa311->fields[F_ODR], odr); in msa311_get_odr()
430 * msa311_set_odr() - Setup Output Data Rate (ODR) value for MSA311 accel
431 * @msa311: MSA311 internal private state
434 * This function should be called under msa311->lock. Possible ODR values:
450 static int msa311_set_odr(struct msa311_priv *msa311, unsigned int odr) in msa311_set_odr() argument
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()
476 return regmap_field_write(msa311->fields[F_ODR], odr); in msa311_set_odr()
481 * @msa311: MSA311 internal private state
486 static int msa311_wait_for_next_data(struct msa311_priv *msa311) in msa311_wait_for_next_data() argument
489 struct device *dev = msa311->dev; in msa311_wait_for_next_data()
495 err = msa311_get_odr(msa311, &odr); in msa311_wait_for_next_data()
503 * After msa311 resuming is done, we need to wait for data in msa311_wait_for_next_data()
523 * msa311_set_pwr_mode() - Install certain MSA311 power mode
524 * @msa311: MSA311 internal private state
527 * This function should be called under msa311->lock.
531 static int msa311_set_pwr_mode(struct msa311_priv *msa311, unsigned int mode) in msa311_set_pwr_mode() argument
533 struct device *dev = msa311->dev; 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()
553 return msa311_wait_for_next_data(msa311); in msa311_set_pwr_mode()
559 * msa311_get_axis() - Read MSA311 accel data for certain IIO channel axis spec
560 * @msa311: MSA311 internal private state
564 * This function should be called under msa311->lock.
569 static int msa311_get_axis(struct msa311_priv *msa311, in msa311_get_axis() argument
573 struct device *dev = msa311->dev; in msa311_get_axis()
585 return regmap_bulk_read(msa311->regs, axis_reg, axis, sizeof(*axis)); in msa311_get_axis()
592 struct msa311_priv *msa311 = iio_priv(indio_dev); in msa311_read_raw_data() local
593 struct device *dev = msa311->dev; in msa311_read_raw_data()
607 mutex_lock(&msa311->lock); in msa311_read_raw_data()
608 err = msa311_get_axis(msa311, chan, &axis); in msa311_read_raw_data()
609 mutex_unlock(&msa311->lock); in msa311_read_raw_data()
634 struct msa311_priv *msa311 = iio_priv(indio_dev); in msa311_read_scale() local
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()
656 struct msa311_priv *msa311 = iio_priv(indio_dev); in msa311_read_samp_freq() local
657 struct device *dev = msa311->dev; in msa311_read_samp_freq()
661 mutex_lock(&msa311->lock); in msa311_read_samp_freq()
662 err = msa311_get_odr(msa311, &odr); in msa311_read_samp_freq()
663 mutex_unlock(&msa311->lock); in msa311_read_samp_freq()
722 struct msa311_priv *msa311 = iio_priv(indio_dev); in msa311_write_scale() local
723 struct device *dev = msa311->dev; 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()
756 struct msa311_priv *msa311 = iio_priv(indio_dev); in msa311_write_samp_freq() local
757 struct device *dev = msa311->dev; in msa311_write_samp_freq()
763 * enabled, because sometimes MSA311 chip returns outliers during in msa311_write_samp_freq()
780 mutex_lock(&msa311->lock); in msa311_write_samp_freq()
781 err = msa311_set_odr(msa311, odr); in msa311_write_samp_freq()
782 mutex_unlock(&msa311->lock); in msa311_write_samp_freq()
817 struct msa311_priv *msa311 = iio_priv(indio_dev); in msa311_debugfs_reg_access() local
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()
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()
849 struct msa311_priv *msa311 = iio_priv(indio_dev); in msa311_buffer_preenable() local
850 struct device *dev = msa311->dev; in msa311_buffer_preenable()
857 struct msa311_priv *msa311 = iio_priv(indio_dev); in msa311_buffer_postdisable() local
858 struct device *dev = msa311->dev; in msa311_buffer_postdisable()
869 struct msa311_priv *msa311 = iio_priv(indio_dev); in msa311_set_new_data_trig_state() local
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()
893 struct msa311_priv *msa311 = iio_priv(pf->indio_dev); in msa311_buffer_thread() local
896 struct device *dev = msa311->dev; in msa311_buffer_thread()
906 mutex_lock(&msa311->lock); in msa311_buffer_thread()
911 err = msa311_get_axis(msa311, chan, &axis); in msa311_buffer_thread()
913 mutex_unlock(&msa311->lock); in msa311_buffer_thread()
922 mutex_unlock(&msa311->lock); in msa311_buffer_thread()
935 struct msa311_priv *msa311 = iio_priv(p); in msa311_irq_thread() local
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()
980 static int msa311_check_partid(struct msa311_priv *msa311) in msa311_check_partid() argument
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()
1002 static int msa311_soft_reset(struct msa311_priv *msa311) in msa311_soft_reset() argument
1004 struct device *dev = msa311->dev; in msa311_soft_reset()
1007 err = regmap_write(msa311->regs, MSA311_SOFT_RESET_REG, in msa311_soft_reset()
1016 static int msa311_chip_init(struct msa311_priv *msa311) in msa311_chip_init() argument
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()
1048 err = msa311_set_odr(msa311, MSA311_ODR_125_HZ); in msa311_chip_init()
1056 static int msa311_setup_interrupts(struct msa311_priv *msa311) in msa311_setup_interrupts() argument
1058 struct device *dev = msa311->dev; 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()
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()
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()
1119 static int msa311_regmap_init(struct msa311_priv *msa311) in msa311_regmap_init() argument
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()
1146 static void msa311_powerdown(void *msa311) in msa311_powerdown() argument
1148 msa311_set_pwr_mode(msa311, MSA311_PWR_MODE_SUSPEND); in msa311_powerdown()
1154 struct msa311_priv *msa311; in msa311_probe() local
1158 indio_dev = devm_iio_device_alloc(dev, sizeof(*msa311)); in msa311_probe()
1163 msa311 = iio_priv(indio_dev); in msa311_probe()
1164 msa311->dev = dev; in msa311_probe()
1167 err = msa311_regmap_init(msa311); in msa311_probe()
1171 mutex_init(&msa311->lock); in msa311_probe()
1177 err = msa311_check_partid(msa311); in msa311_probe()
1181 err = msa311_soft_reset(msa311); in msa311_probe()
1185 err = msa311_set_pwr_mode(msa311, MSA311_PWR_MODE_NORMAL); in msa311_probe()
1193 * MSA311 should be in SUSPEND mode in the two cases: in msa311_probe()
1200 err = devm_add_action_or_reset(dev, msa311_powerdown, msa311); in msa311_probe()
1216 err = msa311_chip_init(msa311); in msa311_probe()
1223 indio_dev->name = msa311->chip_name; in msa311_probe()
1234 err = msa311_setup_interrupts(msa311); in msa311_probe()
1251 struct msa311_priv *msa311 = iio_priv(indio_dev); in msa311_runtime_suspend() local
1254 mutex_lock(&msa311->lock); in msa311_runtime_suspend()
1255 err = msa311_set_pwr_mode(msa311, MSA311_PWR_MODE_SUSPEND); in msa311_runtime_suspend()
1256 mutex_unlock(&msa311->lock); in msa311_runtime_suspend()
1267 struct msa311_priv *msa311 = iio_priv(indio_dev); in msa311_runtime_resume() local
1270 mutex_lock(&msa311->lock); in msa311_runtime_resume()
1271 err = msa311_set_pwr_mode(msa311, MSA311_PWR_MODE_NORMAL); in msa311_runtime_resume()
1272 mutex_unlock(&msa311->lock); in msa311_runtime_resume()
1284 { .name = "msa311" },
1290 { .compatible = "memsensing,msa311" },
1297 .name = "msa311",
1307 MODULE_DESCRIPTION("MEMSensing MSA311 3-axis accelerometer driver");