Lines Matching +full:pseudo +full:- +full:differential

1 // SPDX-License-Identifier: GPL-2.0-only
26 #include <linux/iio/buffer-dmaengine.h>
40 /* datasheet calls this "4-wire mode" */
42 /* datasheet calls this "3-wire mode" (not related to SPI_3WIRE!) */
48 /* maps adi,spi-mode property value to enum */
67 /* Chip-specific timing specifications. */
73 /* Indicates TURBO is hard-wired to be always enabled. */
118 * AD7944_DEFINE_CHIP_INFO - Define a chip info structure for a specific chip
123 * @_diff: Whether the chip is true differential or not
134 .differential = _diff, \
151 .differential = _diff, \
170 * - There is no soft timestamp since everything is done in hardware.
171 * - There is a sampling frequency attribute added. This controls the SPI
173 * - The storagebits value depends on the SPI offload provider. Currently there
175 * which always uses 32-bit words for data values, even for <= 16-bit ADCs.
179 /* pseudo-differential with ground sense */
182 /* fully differential */
188 unsigned int t_conv_ns = adc->always_turbo ? adc->timing_spec->turbo_conv_ns in ad7944_3wire_cs_mode_init_msg()
189 : adc->timing_spec->conv_ns; in ad7944_3wire_cs_mode_init_msg()
190 struct spi_transfer *xfers = adc->xfers; in ad7944_3wire_cs_mode_init_msg()
208 xfers[2].rx_buf = &adc->sample.raw; in ad7944_3wire_cs_mode_init_msg()
209 xfers[2].len = AD7944_SPI_BYTES(chan->scan_type); in ad7944_3wire_cs_mode_init_msg()
210 xfers[2].bits_per_word = chan->scan_type.realbits; in ad7944_3wire_cs_mode_init_msg()
212 spi_message_init_with_transfers(&adc->msg, xfers, 3); in ad7944_3wire_cs_mode_init_msg()
214 return devm_spi_optimize_message(dev, adc->spi, &adc->msg); in ad7944_3wire_cs_mode_init_msg()
220 unsigned int t_conv_ns = adc->always_turbo ? adc->timing_spec->turbo_conv_ns in ad7944_4wire_mode_init_msg()
221 : adc->timing_spec->conv_ns; in ad7944_4wire_mode_init_msg()
222 struct spi_transfer *xfers = adc->xfers; in ad7944_4wire_mode_init_msg()
232 xfers[1].rx_buf = &adc->sample.raw; in ad7944_4wire_mode_init_msg()
233 xfers[1].len = AD7944_SPI_BYTES(chan->scan_type); in ad7944_4wire_mode_init_msg()
234 xfers[1].bits_per_word = chan->scan_type.realbits; in ad7944_4wire_mode_init_msg()
236 spi_message_init_with_transfers(&adc->msg, xfers, 2); in ad7944_4wire_mode_init_msg()
238 return devm_spi_optimize_message(dev, adc->spi, &adc->msg); in ad7944_4wire_mode_init_msg()
245 struct spi_transfer *xfers = adc->xfers; in ad7944_chain_mode_init_msg()
251 if (adc->spi->mode & SPI_CPOL) in ad7944_chain_mode_init_msg()
252 return dev_err_probe(dev, -EINVAL, in ad7944_chain_mode_init_msg()
259 if (!(adc->spi->mode & SPI_CS_HIGH)) in ad7944_chain_mode_init_msg()
260 return dev_err_probe(dev, -EINVAL, in ad7944_chain_mode_init_msg()
264 xfers[0].delay.value = adc->timing_spec->conv_ns; in ad7944_chain_mode_init_msg()
267 xfers[1].rx_buf = adc->chain_mode_buf; in ad7944_chain_mode_init_msg()
268 xfers[1].len = AD7944_SPI_BYTES(chan->scan_type) * n_chain_dev; in ad7944_chain_mode_init_msg()
269 xfers[1].bits_per_word = chan->scan_type.realbits; in ad7944_chain_mode_init_msg()
271 spi_message_init_with_transfers(&adc->msg, xfers, 2); in ad7944_chain_mode_init_msg()
273 return devm_spi_optimize_message(dev, adc->spi, &adc->msg); in ad7944_chain_mode_init_msg()
287 struct spi_transfer *xfers = adc->offload_xfers; in ad7944_3wire_cs_mode_init_offload_msg()
303 xfers[1].len = AD7944_SPI_BYTES(chan->scan_type); in ad7944_3wire_cs_mode_init_offload_msg()
304 xfers[1].bits_per_word = chan->scan_type.realbits; in ad7944_3wire_cs_mode_init_offload_msg()
306 spi_message_init_with_transfers(&adc->offload_msg, xfers, in ad7944_3wire_cs_mode_init_offload_msg()
307 ARRAY_SIZE(adc->offload_xfers)); in ad7944_3wire_cs_mode_init_offload_msg()
309 adc->offload_msg.offload = adc->offload; in ad7944_3wire_cs_mode_init_offload_msg()
311 ret = devm_spi_optimize_message(dev, adc->spi, &adc->offload_msg); in ad7944_3wire_cs_mode_init_offload_msg()
319 * ad7944_convert_and_acquire - Perform a single conversion and acquisition
324 * pre-optimized adc->msg.
326 * Upon successful return adc->sample.raw will contain the conversion result
327 * (or adc->chain_mode_buf if the device is using chain mode).
334 * In 4-wire mode, the CNV line is held high for the entire conversion in ad7944_convert_and_acquire()
335 * and acquisition process. In other modes adc->cnv is NULL and is in ad7944_convert_and_acquire()
338 gpiod_set_value_cansleep(adc->cnv, 1); in ad7944_convert_and_acquire()
339 ret = spi_sync(adc->spi, &adc->msg); in ad7944_convert_and_acquire()
340 gpiod_set_value_cansleep(adc->cnv, 0); in ad7944_convert_and_acquire()
355 if (adc->spi_mode == AD7944_SPI_MODE_CHAIN) { in ad7944_single_conversion()
356 if (chan->scan_type.realbits > 16) in ad7944_single_conversion()
357 *val = ((u32 *)adc->chain_mode_buf)[chan->scan_index]; in ad7944_single_conversion()
359 *val = ((u16 *)adc->chain_mode_buf)[chan->scan_index]; in ad7944_single_conversion()
361 if (chan->scan_type.realbits > 16) in ad7944_single_conversion()
362 *val = adc->sample.raw.u32; in ad7944_single_conversion()
364 *val = adc->sample.raw.u16; in ad7944_single_conversion()
367 if (chan->scan_type.sign == 's') in ad7944_single_conversion()
368 *val = sign_extend32(*val, chan->scan_type.realbits - 1); in ad7944_single_conversion()
370 *val &= GENMASK(chan->scan_type.realbits - 1, 0); in ad7944_single_conversion()
384 *vals = adc->sample_freq_range; in ad7944_read_avail()
388 return -EINVAL; in ad7944_read_avail()
402 return -EBUSY; in ad7944_read_raw()
409 switch (chan->type) { in ad7944_read_raw()
411 *val = adc->ref_mv; in ad7944_read_raw()
413 if (chan->scan_type.sign == 's') in ad7944_read_raw()
414 *val2 = chan->scan_type.realbits - 1; in ad7944_read_raw()
416 *val2 = chan->scan_type.realbits; in ad7944_read_raw()
420 return -EINVAL; in ad7944_read_raw()
424 *val = adc->offload_trigger_hz; in ad7944_read_raw()
428 return -EINVAL; in ad7944_read_raw()
442 ret = spi_offload_trigger_validate(adc->offload_trigger, &config); in ad7944_set_sample_freq()
446 adc->offload_trigger_hz = config.periodic.frequency_hz; in ad7944_set_sample_freq()
459 if (val < 1 || val > adc->sample_freq_range[2]) in ad7944_write_raw()
460 return -EINVAL; in ad7944_write_raw()
464 return -EINVAL; in ad7944_write_raw()
493 .frequency_hz = adc->offload_trigger_hz, in ad7944_offload_buffer_postenable()
498 gpiod_set_value_cansleep(adc->turbo, 1); in ad7944_offload_buffer_postenable()
500 ret = spi_offload_trigger_enable(adc->offload, adc->offload_trigger, in ad7944_offload_buffer_postenable()
503 gpiod_set_value_cansleep(adc->turbo, 0); in ad7944_offload_buffer_postenable()
512 spi_offload_trigger_disable(adc->offload, adc->offload_trigger); in ad7944_offload_buffer_predisable()
513 gpiod_set_value_cansleep(adc->turbo, 0); in ad7944_offload_buffer_predisable()
526 struct iio_dev *indio_dev = pf->indio_dev; in ad7944_trigger_handler()
534 if (adc->spi_mode == AD7944_SPI_MODE_CHAIN) in ad7944_trigger_handler()
535 iio_push_to_buffers_with_timestamp(indio_dev, adc->chain_mode_buf, in ad7944_trigger_handler()
536 pf->timestamp); in ad7944_trigger_handler()
538 iio_push_to_buffers_with_timestamp(indio_dev, &adc->sample.raw, in ad7944_trigger_handler()
539 pf->timestamp); in ad7944_trigger_handler()
542 iio_trigger_notify_done(indio_dev->trig); in ad7944_trigger_handler()
548 * ad7944_chain_mode_alloc - allocate and initialize channel specs and buffers
549 * for daisy-chained devices
576 return -ENOMEM; in ad7944_chain_mode_alloc()
581 if (chan_template[0].differential) { in ad7944_chain_mode_alloc()
603 return -ENOMEM; in ad7944_chain_mode_alloc()
612 return dev_err_probe(dev, -EINVAL, in ad7944_chain_mode_alloc()
617 return -ENOMEM; in ad7944_chain_mode_alloc()
623 scan_masks[0] = GENMASK(n_chain_dev - 1, 0); in ad7944_chain_mode_alloc()
642 struct device *dev = &spi->dev; in ad7944_probe()
653 return -ENOMEM; in ad7944_probe()
656 adc->spi = spi; in ad7944_probe()
660 return dev_err_probe(dev, -EINVAL, "no chip info\n"); in ad7944_probe()
662 adc->timing_spec = chip_info->timing_spec; in ad7944_probe()
664 adc->sample_freq_range[0] = 1; /* min */ in ad7944_probe()
665 adc->sample_freq_range[1] = 1; /* step */ in ad7944_probe()
666 adc->sample_freq_range[2] = chip_info->max_sample_rate_hz; /* max */ in ad7944_probe()
668 ret = device_property_match_property_string(dev, "adi,spi-mode", in ad7944_probe()
671 /* absence of adi,spi-mode property means default mode */ in ad7944_probe()
672 if (ret == -EINVAL) in ad7944_probe()
673 adc->spi_mode = AD7944_SPI_MODE_DEFAULT; in ad7944_probe()
676 "getting adi,spi-mode property failed\n"); in ad7944_probe()
678 adc->spi_mode = ret; in ad7944_probe()
684 if (!spi_is_bpw_supported(spi, chip_info->channels[0].scan_type.realbits)) in ad7944_probe()
685 return dev_err_probe(dev, -EINVAL, in ad7944_probe()
687 chip_info->channels[0].scan_type.realbits); in ad7944_probe()
698 * - internal reference: neither REF or REFIN is connected in ad7944_probe()
699 * - internal reference with external buffer: REF not connected, REFIN in ad7944_probe()
701 * - external reference: REF is connected, REFIN is not connected in ad7944_probe()
705 if (ret < 0 && ret != -ENODEV) in ad7944_probe()
708 ref_mv = ret == -ENODEV ? 0 : ret / 1000; in ad7944_probe()
711 if (ret < 0 && ret != -ENODEV) in ad7944_probe()
714 have_refin = ret != -ENODEV; in ad7944_probe()
717 return dev_err_probe(dev, -EINVAL, in ad7944_probe()
720 adc->ref_mv = ref_mv ?: AD7944_INTERNAL_REF_MV; in ad7944_probe()
722 adc->cnv = devm_gpiod_get_optional(dev, "cnv", GPIOD_OUT_LOW); in ad7944_probe()
723 if (IS_ERR(adc->cnv)) in ad7944_probe()
724 return dev_err_probe(dev, PTR_ERR(adc->cnv), in ad7944_probe()
727 if (!adc->cnv && adc->spi_mode == AD7944_SPI_MODE_DEFAULT) in ad7944_probe()
728 return dev_err_probe(&spi->dev, -EINVAL, "CNV GPIO is required\n"); in ad7944_probe()
729 if (adc->cnv && adc->spi_mode != AD7944_SPI_MODE_DEFAULT) in ad7944_probe()
730 return dev_err_probe(&spi->dev, -EINVAL, in ad7944_probe()
733 adc->turbo = devm_gpiod_get_optional(dev, "turbo", GPIOD_OUT_LOW); in ad7944_probe()
734 if (IS_ERR(adc->turbo)) in ad7944_probe()
735 return dev_err_probe(dev, PTR_ERR(adc->turbo), in ad7944_probe()
738 adc->always_turbo = device_property_present(dev, "adi,always-turbo"); in ad7944_probe()
740 if (adc->turbo && adc->always_turbo) in ad7944_probe()
741 return dev_err_probe(dev, -EINVAL, in ad7944_probe()
742 "cannot have both turbo-gpios and adi,always-turbo\n"); in ad7944_probe()
744 if (adc->spi_mode == AD7944_SPI_MODE_CHAIN && adc->always_turbo) in ad7944_probe()
745 return dev_err_probe(dev, -EINVAL, in ad7944_probe()
748 switch (adc->spi_mode) { in ad7944_probe()
750 ret = ad7944_4wire_mode_init_msg(dev, adc, &chip_info->channels[0]); in ad7944_probe()
756 ret = ad7944_3wire_cs_mode_init_msg(dev, adc, &chip_info->channels[0]); in ad7944_probe()
762 ret = device_property_read_u32(dev, "#daisy-chained-devices", in ad7944_probe()
766 "failed to get #daisy-chained-devices\n"); in ad7944_probe()
768 ret = ad7944_chain_mode_alloc(dev, chip_info->channels, in ad7944_probe()
770 &adc->chain_mode_buf, in ad7944_probe()
783 indio_dev->name = chip_info->name; in ad7944_probe()
784 indio_dev->modes = INDIO_DIRECT_MODE; in ad7944_probe()
785 indio_dev->info = &ad7944_iio_info; in ad7944_probe()
787 adc->offload = devm_spi_offload_get(dev, spi, &ad7944_offload_config); in ad7944_probe()
788 ret = PTR_ERR_OR_ZERO(adc->offload); in ad7944_probe()
789 if (ret && ret != -ENODEV) in ad7944_probe()
793 if (ret == -ENODEV) { in ad7944_probe()
794 if (adc->spi_mode == AD7944_SPI_MODE_CHAIN) { in ad7944_probe()
795 indio_dev->available_scan_masks = chain_scan_masks; in ad7944_probe()
796 indio_dev->channels = chain_chan; in ad7944_probe()
797 indio_dev->num_channels = n_chain_dev + 1; in ad7944_probe()
799 indio_dev->channels = chip_info->channels; in ad7944_probe()
800 indio_dev->num_channels = ARRAY_SIZE(chip_info->channels); in ad7944_probe()
812 if (adc->spi_mode != AD7944_SPI_MODE_SINGLE) in ad7944_probe()
813 return dev_err_probe(dev, -EINVAL, in ad7944_probe()
816 indio_dev->setup_ops = &ad7944_offload_buffer_setup_ops; in ad7944_probe()
817 indio_dev->channels = chip_info->offload_channels; in ad7944_probe()
818 indio_dev->num_channels = ARRAY_SIZE(chip_info->offload_channels); in ad7944_probe()
820 adc->offload_trigger = devm_spi_offload_trigger_get(dev, in ad7944_probe()
821 adc->offload, SPI_OFFLOAD_TRIGGER_PERIODIC); in ad7944_probe()
822 if (IS_ERR(adc->offload_trigger)) in ad7944_probe()
823 return dev_err_probe(dev, PTR_ERR(adc->offload_trigger), in ad7944_probe()
832 adc->offload); in ad7944_probe()
839 * buffer layout is the same as what is hard-coded in in ad7944_probe()
841 * is the pulsar_adc project which always uses 32-bit word in ad7944_probe()
851 &chip_info->offload_channels[0]); in ad7944_probe()