Lines Matching +full:scan +full:- +full:delay
1 // SPDX-License-Identifier: GPL-2.0+
25 #include <linux/iio/buffer-dmaengine.h>
57 .shift = (_offl ? 0 : _storage_bits - _real_bits), \
95 .shift = (_offl ? 0 : _storage_bits - _real_bits), \
122 /* maps adi,sdi-pin property value to enum */
167 /* AD7946, AD7686, AD7688, AD7988-5, AD7693 */
191 /* AD7988-1 */
475 .dev_name = "ad7988-1",
483 .dev_name = "ad7988-5",
527 } scan __aligned(IIO_DMA_MINALIGN);
543 if (chan->scan_type.sign == 's') in ad4000_fill_scale_tbl()
544 scale_bits = chan->scan_type.realbits - 1; in ad4000_fill_scale_tbl()
546 scale_bits = chan->scan_type.realbits; in ad4000_fill_scale_tbl()
554 val = mult_frac(st->vref_mv, MICRO, st->gain_milli); in ad4000_fill_scale_tbl()
561 st->scale_tbl[0][0] = tmp0; /* Integer part */ in ad4000_fill_scale_tbl()
562 st->scale_tbl[0][1] = abs(tmp1); /* Fractional part */ in ad4000_fill_scale_tbl()
565 st->scale_tbl[1][0] = tmp0; in ad4000_fill_scale_tbl()
568 if (chan->differential) in ad4000_fill_scale_tbl()
569 st->scale_tbl[1][1] = DIV_ROUND_CLOSEST(abs(tmp1) * 4, 5); in ad4000_fill_scale_tbl()
571 st->scale_tbl[1][1] = DIV_ROUND_CLOSEST(abs(tmp1) * 9, 10); in ad4000_fill_scale_tbl()
576 st->tx_buf[0] = AD4000_WRITE_COMMAND; in ad4000_write_reg()
577 st->tx_buf[1] = val; in ad4000_write_reg()
578 return spi_write(st->spi, st->tx_buf, ARRAY_SIZE(st->tx_buf)); in ad4000_write_reg()
584 .tx_buf = st->tx_buf, in ad4000_read_reg()
585 .rx_buf = st->rx_buf, in ad4000_read_reg()
590 st->tx_buf[0] = AD4000_READ_COMMAND; in ad4000_read_reg()
591 ret = spi_sync_transfer(st->spi, &t, 1); in ad4000_read_reg()
595 *val = st->rx_buf[1]; in ad4000_read_reg()
609 ret = spi_offload_trigger_validate(st->offload_trigger, &config); in ad4000_set_sampling_freq()
613 st->offload_trigger_hz = config.periodic.frequency_hz; in ad4000_set_sampling_freq()
623 * In 4-wire mode, the CNV line is held high for the entire conversion in ad4000_convert_and_acquire()
628 gpiod_set_value_cansleep(st->cnv_gpio, 1); in ad4000_convert_and_acquire()
629 ret = spi_sync(st->spi, &st->msg); in ad4000_convert_and_acquire()
630 gpiod_set_value_cansleep(st->cnv_gpio, 0); in ad4000_convert_and_acquire()
646 if (chan->scan_type.endianness == IIO_BE) { in ad4000_single_conversion()
647 if (chan->scan_type.realbits > 16) in ad4000_single_conversion()
648 sample = be32_to_cpu(st->scan.data.sample_buf32_be); in ad4000_single_conversion()
650 sample = be16_to_cpu(st->scan.data.sample_buf16_be); in ad4000_single_conversion()
652 if (chan->scan_type.realbits > 16) in ad4000_single_conversion()
653 sample = st->scan.data.sample_buf32; in ad4000_single_conversion()
655 sample = st->scan.data.sample_buf16; in ad4000_single_conversion()
658 sample >>= chan->scan_type.shift; in ad4000_single_conversion()
660 if (chan->scan_type.sign == 's') in ad4000_single_conversion()
661 *val = sign_extend32(sample, chan->scan_type.realbits - 1); in ad4000_single_conversion()
678 return -EBUSY; in ad4000_read_raw()
684 *val = st->scale_tbl[st->span_comp][0]; in ad4000_read_raw()
685 *val2 = st->scale_tbl[st->span_comp][1]; in ad4000_read_raw()
689 if (st->span_comp) in ad4000_read_raw()
690 *val = mult_frac(st->vref_mv, 1, 10); in ad4000_read_raw()
694 *val = st->offload_trigger_hz; in ad4000_read_raw()
697 return -EINVAL; in ad4000_read_raw()
710 *vals = (int *)st->scale_tbl; in ad4000_read_avail()
715 return -EINVAL; in ad4000_read_avail()
739 guard(mutex)(&st->lock); in __ad4000_write_raw()
745 span_comp_en = val2 == st->scale_tbl[1][1]; in __ad4000_write_raw()
753 st->span_comp = span_comp_en; in __ad4000_write_raw()
767 return -EBUSY; in ad4000_write_raw()
772 if (val < 1 || val > st->max_rate_hz) in ad4000_write_raw()
773 return -EINVAL; in ad4000_write_raw()
776 return -EBUSY; in ad4000_write_raw()
781 return -EINVAL; in ad4000_write_raw()
788 struct iio_dev *indio_dev = pf->indio_dev; in ad4000_trigger_handler()
796 iio_push_to_buffers_with_ts(indio_dev, &st->scan, sizeof(st->scan), in ad4000_trigger_handler()
797 pf->timestamp); in ad4000_trigger_handler()
800 iio_trigger_notify_done(indio_dev->trig); in ad4000_trigger_handler()
827 .frequency_hz = st->offload_trigger_hz, in ad4000_offload_buffer_postenable()
831 return spi_offload_trigger_enable(st->offload, st->offload_trigger, in ad4000_offload_buffer_postenable()
839 spi_offload_trigger_disable(st->offload, st->offload_trigger); in ad4000_offload_buffer_predisable()
852 struct spi_device *spi = st->spi; in ad4000_spi_offload_setup()
853 struct device *dev = &spi->dev; in ad4000_spi_offload_setup()
857 st->offload_trigger = devm_spi_offload_trigger_get(dev, st->offload, in ad4000_spi_offload_setup()
859 if (IS_ERR(st->offload_trigger)) in ad4000_spi_offload_setup()
860 return dev_err_probe(dev, PTR_ERR(st->offload_trigger), in ad4000_spi_offload_setup()
863 ret = ad4000_set_sampling_freq(st, st->max_rate_hz); in ad4000_spi_offload_setup()
868 rx_dma = devm_spi_offload_rx_stream_request_dma_chan(dev, st->offload); in ad4000_spi_offload_setup()
883 * connections should be in "3-wire" mode, selected either when the adi,sdi-pin
888 * SPI offload trigger. Because the ADC output has a one sample latency (delay)
889 * when the device is wired in "3-wire" mode and only one transfer per sample is
893 * SCLK cycles. Also, a delay is added to make sure we meet the minimum quiet
897 * transfers use larger word sizes that get stored in 'in-memory wordsizes' that
905 struct spi_transfer *xfer = &st->offload_xfer; in ad4000_prepare_offload_message()
907 xfer->bits_per_word = chan->scan_type.realbits; in ad4000_prepare_offload_message()
908 xfer->len = chan->scan_type.realbits > 16 ? 4 : 2; in ad4000_prepare_offload_message()
909 xfer->delay.value = st->time_spec->t_quiet2_ns; in ad4000_prepare_offload_message()
910 xfer->delay.unit = SPI_DELAY_UNIT_NSECS; in ad4000_prepare_offload_message()
911 xfer->offload_flags = SPI_OFFLOAD_XFER_RX_STREAM; in ad4000_prepare_offload_message()
913 spi_message_init_with_transfers(&st->offload_msg, xfer, 1); in ad4000_prepare_offload_message()
914 st->offload_msg.offload = st->offload; in ad4000_prepare_offload_message()
916 return devm_spi_optimize_message(&st->spi->dev, st->spi, &st->offload_msg); in ad4000_prepare_offload_message()
921 * in "3-wire" mode, selected when the adi,sdi-pin device tree property is
928 * active low), the ADC readings would have a latency (delay) of one read.
938 struct spi_transfer *xfers = st->xfers; in ad4000_prepare_3wire_mode_message()
941 xfers[0].cs_change_delay.value = st->time_spec->t_conv_ns; in ad4000_prepare_3wire_mode_message()
944 xfers[1].rx_buf = &st->scan.data; in ad4000_prepare_3wire_mode_message()
945 xfers[1].len = chan->scan_type.realbits > 16 ? 4 : 2; in ad4000_prepare_3wire_mode_message()
950 * single-shot reads too. Thus, sample data can be correctly handled in in ad4000_prepare_3wire_mode_message()
953 if (chan->scan_type.endianness != IIO_BE) in ad4000_prepare_3wire_mode_message()
954 xfers[1].bits_per_word = chan->scan_type.realbits; in ad4000_prepare_3wire_mode_message()
955 xfers[1].delay.value = st->time_spec->t_quiet2_ns; in ad4000_prepare_3wire_mode_message()
956 xfers[1].delay.unit = SPI_DELAY_UNIT_NSECS; in ad4000_prepare_3wire_mode_message()
958 spi_message_init_with_transfers(&st->msg, st->xfers, 2); in ad4000_prepare_3wire_mode_message()
960 return devm_spi_optimize_message(&st->spi->dev, st->spi, &st->msg); in ad4000_prepare_3wire_mode_message()
965 * in "4-wire" mode, selected when the adi,sdi-pin device tree property is
973 struct spi_transfer *xfers = st->xfers; in ad4000_prepare_4wire_mode_message()
976 * Dummy transfer to cause enough delay between CNV going high and SDI in ad4000_prepare_4wire_mode_message()
980 xfers[0].delay.value = st->time_spec->t_conv_ns; in ad4000_prepare_4wire_mode_message()
981 xfers[0].delay.unit = SPI_DELAY_UNIT_NSECS; in ad4000_prepare_4wire_mode_message()
983 xfers[1].rx_buf = &st->scan.data; in ad4000_prepare_4wire_mode_message()
984 xfers[1].len = BITS_TO_BYTES(chan->scan_type.storagebits); in ad4000_prepare_4wire_mode_message()
986 spi_message_init_with_transfers(&st->msg, st->xfers, 2); in ad4000_prepare_4wire_mode_message()
988 return devm_spi_optimize_message(&st->spi->dev, st->spi, &st->msg); in ad4000_prepare_4wire_mode_message()
995 if (device_property_present(&st->spi->dev, "adi,high-z-input")) in ad4000_config()
998 if (st->using_offload) in ad4000_config()
1007 struct device *dev = &spi->dev; in ad4000_probe()
1014 return -ENOMEM; in ad4000_probe()
1018 return -EINVAL; in ad4000_probe()
1021 st->spi = spi; in ad4000_probe()
1022 st->time_spec = chip->time_spec; in ad4000_probe()
1023 st->max_rate_hz = chip->max_rate_hz; in ad4000_probe()
1034 st->vref_mv = ret / 1000; in ad4000_probe()
1036 st->cnv_gpio = devm_gpiod_get_optional(dev, "cnv", GPIOD_OUT_HIGH); in ad4000_probe()
1037 if (IS_ERR(st->cnv_gpio)) in ad4000_probe()
1038 return dev_err_probe(dev, PTR_ERR(st->cnv_gpio), in ad4000_probe()
1041 st->offload = devm_spi_offload_get(dev, spi, &ad4000_offload_config); in ad4000_probe()
1042 ret = PTR_ERR_OR_ZERO(st->offload); in ad4000_probe()
1043 if (ret && ret != -ENODEV) in ad4000_probe()
1046 st->using_offload = !IS_ERR(st->offload); in ad4000_probe()
1047 if (st->using_offload) { in ad4000_probe()
1048 indio_dev->setup_ops = &ad4000_offload_buffer_setup_ops; in ad4000_probe()
1061 ret = device_property_match_property_string(dev, "adi,sdi-pin", in ad4000_probe()
1064 if (ret < 0 && ret != -EINVAL) in ad4000_probe()
1066 "getting adi,sdi-pin property failed\n"); in ad4000_probe()
1069 st->sdi_pin = ret == -EINVAL ? AD4000_SDI_MOSI : ret; in ad4000_probe()
1070 switch (st->sdi_pin) { in ad4000_probe()
1072 indio_dev->info = &ad4000_reg_access_info; in ad4000_probe()
1075 * In "3-wire mode", the ADC SDI line must be kept high when in ad4000_probe()
1079 spi->mode |= SPI_MOSI_IDLE_HIGH; in ad4000_probe()
1084 if (st->using_offload) { in ad4000_probe()
1085 indio_dev->channels = &chip->reg_access_offload_chan_spec; in ad4000_probe()
1086 indio_dev->num_channels = 1; in ad4000_probe()
1087 ret = ad4000_prepare_offload_message(st, indio_dev->channels); in ad4000_probe()
1092 indio_dev->channels = chip->reg_access_chan_spec; in ad4000_probe()
1093 indio_dev->num_channels = ARRAY_SIZE(chip->reg_access_chan_spec); in ad4000_probe()
1097 * Call ad4000_prepare_3wire_mode_message() so single-shot read in ad4000_probe()
1100 ret = ad4000_prepare_3wire_mode_message(st, &indio_dev->channels[0]); in ad4000_probe()
1111 if (st->using_offload) { in ad4000_probe()
1112 indio_dev->info = &ad4000_offload_info; in ad4000_probe()
1113 indio_dev->channels = &chip->offload_chan_spec; in ad4000_probe()
1114 indio_dev->num_channels = 1; in ad4000_probe()
1116 ret = ad4000_prepare_offload_message(st, indio_dev->channels); in ad4000_probe()
1121 indio_dev->info = &ad4000_info; in ad4000_probe()
1122 indio_dev->channels = chip->chan_spec; in ad4000_probe()
1123 indio_dev->num_channels = ARRAY_SIZE(chip->chan_spec); in ad4000_probe()
1126 ret = ad4000_prepare_3wire_mode_message(st, &indio_dev->channels[0]); in ad4000_probe()
1133 if (st->using_offload) in ad4000_probe()
1134 return dev_err_probe(dev, -EPROTONOSUPPORT, in ad4000_probe()
1135 "Unsupported sdi-pin + offload config\n"); in ad4000_probe()
1136 indio_dev->info = &ad4000_info; in ad4000_probe()
1137 indio_dev->channels = chip->chan_spec; in ad4000_probe()
1138 indio_dev->num_channels = ARRAY_SIZE(chip->chan_spec); in ad4000_probe()
1139 ret = ad4000_prepare_4wire_mode_message(st, &indio_dev->channels[0]); in ad4000_probe()
1146 return dev_err_probe(dev, -EPROTONOSUPPORT, in ad4000_probe()
1150 return dev_err_probe(dev, -EINVAL, "Unrecognized connection mode\n"); in ad4000_probe()
1153 indio_dev->name = chip->dev_name; in ad4000_probe()
1155 ret = devm_mutex_init(dev, &st->lock); in ad4000_probe()
1159 st->gain_milli = 1000; in ad4000_probe()
1160 if (chip->has_hardware_gain) { in ad4000_probe()
1161 ret = device_property_read_u16(dev, "adi,gain-milli", in ad4000_probe()
1162 &st->gain_milli); in ad4000_probe()
1165 gain_idx = find_closest(st->gain_milli, ad4000_gains, in ad4000_probe()
1167 st->gain_milli = ad4000_gains[gain_idx]; in ad4000_probe()
1174 ad4000_fill_scale_tbl(st, &indio_dev->channels[0]); in ad4000_probe()
1209 { "ad7988-1", (kernel_ulong_t)&ad7988_1_chip_info },
1210 { "ad7988-5", (kernel_ulong_t)&ad7988_5_chip_info },
1245 { .compatible = "adi,ad7988-1", .data = &ad7988_1_chip_info },
1246 { .compatible = "adi,ad7988-5", .data = &ad7988_5_chip_info },