Lines Matching +full:spi +full:- +full:crc

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Murata SCA3300 3-axis industrial accelerometer
13 #include <linux/spi/spi.h>
192 * struct sca3300_data - device data
193 * @spi: SPI device structure
197 * -SCA3300: 4 channel 16-bit data + 64-bit timestamp
198 * -SCL3300: 7 channel 16-bit data + 64-bit timestamp
203 struct spi_device *spi; member
257 u8 crc; in sca3300_transfer() local
260 .tx_buf = sca_data->txbuf, in sca3300_transfer()
261 .len = ARRAY_SIZE(sca_data->txbuf), in sca3300_transfer()
266 .rx_buf = sca_data->rxbuf, in sca3300_transfer()
267 .len = ARRAY_SIZE(sca_data->rxbuf), in sca3300_transfer()
272 /* inverted crc value as described in device data sheet */ in sca3300_transfer()
273 crc = ~crc8(sca3300_crc_table, &sca_data->txbuf[0], 3, CRC8_INIT_VALUE); in sca3300_transfer()
274 sca_data->txbuf[3] = crc; in sca3300_transfer()
276 ret = spi_sync_transfer(sca_data->spi, xfers, ARRAY_SIZE(xfers)); in sca3300_transfer()
278 dev_err(&sca_data->spi->dev, in sca3300_transfer()
280 return -EIO; in sca3300_transfer()
283 crc = ~crc8(sca3300_crc_table, &sca_data->rxbuf[0], 3, CRC8_INIT_VALUE); in sca3300_transfer()
284 if (sca_data->rxbuf[3] != crc) { in sca3300_transfer()
285 dev_err(&sca_data->spi->dev, "CRC checksum mismatch"); in sca3300_transfer()
286 return -EIO; in sca3300_transfer()
290 rs = sca_data->rxbuf[0] & SCA3300_MASK_RS_STATUS; in sca3300_transfer()
292 ret = -EINVAL; in sca3300_transfer()
294 *val = sign_extend32(get_unaligned_be16(&sca_data->rxbuf[1]), 15); in sca3300_transfer()
304 mutex_lock(&sca_data->lock); in sca3300_error_handler()
305 sca_data->txbuf[0] = SCA3300_REG_STATUS << 2; in sca3300_error_handler()
307 mutex_unlock(&sca_data->lock); in sca3300_error_handler()
312 if (ret != -EINVAL) { in sca3300_error_handler()
313 dev_err(&sca_data->spi->dev, in sca3300_error_handler()
318 dev_err(&sca_data->spi->dev, "device status: 0x%lx\n", in sca3300_error_handler()
328 mutex_lock(&sca_data->lock); in sca3300_read_reg()
329 sca_data->txbuf[0] = reg << 2; in sca3300_read_reg()
331 mutex_unlock(&sca_data->lock); in sca3300_read_reg()
332 if (ret != -EINVAL) in sca3300_read_reg()
343 mutex_lock(&sca_data->lock); in sca3300_write_reg()
345 sca_data->txbuf[0] = BIT(7) | (reg << 2); in sca3300_write_reg()
346 put_unaligned_be16(val, &sca_data->txbuf[1]); in sca3300_write_reg()
348 mutex_unlock(&sca_data->lock); in sca3300_write_reg()
349 if (ret != -EINVAL) in sca3300_write_reg()
357 if ((index < 0) || (index >= sca_data->chip->num_avail_modes)) in sca3300_set_op_mode()
358 return -EINVAL; in sca3300_set_op_mode()
361 sca_data->chip->avail_modes_table[index]); in sca3300_set_op_mode()
374 for (i = 0; i < sca_data->chip->num_avail_modes; i++) { in sca3300_get_op_mode()
375 if (sca_data->chip->avail_modes_table[i] == reg_val) in sca3300_get_op_mode()
378 if (i == sca_data->chip->num_avail_modes) in sca3300_get_op_mode()
379 return -EINVAL; in sca3300_get_op_mode()
387 const struct sca3300_chip_info *chip = data->chip; in sca3300_set_frequency()
394 return -EINVAL; in sca3300_set_frequency()
400 opmode_scale = (int *)chip->accel_scale[chip->accel_scale_map[index]]; in sca3300_set_frequency()
401 for (i = 0; i < chip->num_avail_modes; i++) { in sca3300_set_frequency()
402 new_scale = (int *)chip->accel_scale[chip->accel_scale_map[i]]; in sca3300_set_frequency()
403 if ((val == chip->freq_table[chip->freq_map[i]]) && in sca3300_set_frequency()
408 if (i == chip->num_avail_modes) in sca3300_set_frequency()
409 return -EINVAL; in sca3300_set_frequency()
424 if (chan->type != IIO_ACCEL) in sca3300_write_raw()
425 return -EINVAL; in sca3300_write_raw()
431 for (i = 0; i < data->chip->num_avail_modes; i++) { in sca3300_write_raw()
432 index = data->chip->accel_scale_map[i]; in sca3300_write_raw()
433 if ((val == data->chip->accel_scale[index][0]) && in sca3300_write_raw()
434 (val2 == data->chip->accel_scale[index][1])) in sca3300_write_raw()
437 return -EINVAL; in sca3300_write_raw()
441 return -EINVAL; in sca3300_write_raw()
455 ret = sca3300_read_reg(data, chan->address, val); in sca3300_read_raw()
463 switch (chan->type) { in sca3300_read_raw()
465 index = data->chip->incli_scale_map[index]; in sca3300_read_raw()
466 *val = data->chip->incli_scale[index][0]; in sca3300_read_raw()
467 *val2 = data->chip->incli_scale[index][1]; in sca3300_read_raw()
470 index = data->chip->accel_scale_map[index]; in sca3300_read_raw()
471 *val = data->chip->accel_scale[index][0]; in sca3300_read_raw()
472 *val2 = data->chip->accel_scale[index][1]; in sca3300_read_raw()
475 return -EINVAL; in sca3300_read_raw()
481 index = data->chip->freq_map[index]; in sca3300_read_raw()
482 *val = data->chip->freq_table[index]; in sca3300_read_raw()
485 return -EINVAL; in sca3300_read_raw()
492 struct iio_dev *indio_dev = pf->indio_dev; in sca3300_trigger_handler()
495 s16 *channels = (s16 *)data->buffer; in sca3300_trigger_handler()
497 for_each_set_bit(bit, indio_dev->active_scan_mask, in sca3300_trigger_handler()
498 indio_dev->masklength) { in sca3300_trigger_handler()
499 ret = sca3300_read_reg(data, indio_dev->channels[bit].address, &val); in sca3300_trigger_handler()
501 dev_err_ratelimited(&data->spi->dev, in sca3300_trigger_handler()
509 iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, in sca3300_trigger_handler()
512 iio_trigger_notify_done(indio_dev->trig); in sca3300_trigger_handler()
518 * sca3300_init - Device init sequence. See datasheet rev 2 section
519 * 4.2 Start-Up Sequence for details.
534 * Wait 1ms after SW-reset command. in sca3300_init()
549 dev_err(&sca_data->spi->dev, "unknown chip id %x\n", value); in sca3300_init()
550 return -ENODEV; in sca3300_init()
553 sca_data->chip = &sca3300_chip_tbl[i]; in sca3300_init()
555 if (sca_data->chip->angle_supported) { in sca3300_init()
574 return -EINVAL; in sca3300_debugfs_reg_access()
596 switch (chan->type) { in sca3300_read_avail()
598 *vals = (const int *)data->chip->incli_scale; in sca3300_read_avail()
599 *length = data->chip->num_incli_scales; in sca3300_read_avail()
603 *vals = (const int *)data->chip->accel_scale; in sca3300_read_avail()
604 *length = data->chip->num_accel_scales; in sca3300_read_avail()
608 return -EINVAL; in sca3300_read_avail()
611 *vals = (const int *)data->chip->freq_table; in sca3300_read_avail()
612 *length = data->chip->num_freqs; in sca3300_read_avail()
616 return -EINVAL; in sca3300_read_avail()
627 static int sca3300_probe(struct spi_device *spi) in sca3300_probe() argument
633 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*sca_data)); in sca3300_probe()
635 return -ENOMEM; in sca3300_probe()
638 mutex_init(&sca_data->lock); in sca3300_probe()
639 sca_data->spi = spi; in sca3300_probe()
643 indio_dev->info = &sca3300_info; in sca3300_probe()
647 dev_err(&spi->dev, "failed to init device, error: %d\n", ret); in sca3300_probe()
651 indio_dev->name = sca_data->chip->name; in sca3300_probe()
652 indio_dev->modes = INDIO_DIRECT_MODE; in sca3300_probe()
653 indio_dev->channels = sca_data->chip->channels; in sca3300_probe()
654 indio_dev->num_channels = sca_data->chip->num_channels; in sca3300_probe()
655 indio_dev->available_scan_masks = sca_data->chip->scan_masks; in sca3300_probe()
657 ret = devm_iio_triggered_buffer_setup(&spi->dev, indio_dev, in sca3300_probe()
661 dev_err(&spi->dev, in sca3300_probe()
666 ret = devm_iio_device_register(&spi->dev, indio_dev); in sca3300_probe()
668 dev_err(&spi->dev, "iio device register failed, error: %d\n", in sca3300_probe()
692 MODULE_DESCRIPTION("Murata SCA3300 SPI Accelerometer");