Lines Matching +full:adc +full:- +full:channels
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Analog Devices AD7944/85/86 PulSAR ADC family driver.
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. */
110 const struct iio_chan_spec channels[2]; member
118 * AD7944_DEFINE_CHIP_INFO - Define a chip info structure for a specific chip
130 .channels = { \
169 * Notes on the offload channels:
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
174 * is only one supported provider, namely the ADI PULSAR ADC HDL project,
175 * which always uses 32-bit words for data values, even for <= 16-bit ADCs.
179 /* pseudo-differential with ground sense */
185 static int ad7944_3wire_cs_mode_init_msg(struct device *dev, struct ad7944_adc *adc, in ad7944_3wire_cs_mode_init_msg() argument
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()
196 xfers[0].bits_per_word = chan->scan_type.realbits; in ad7944_3wire_cs_mode_init_msg()
211 xfers[1].bits_per_word = chan->scan_type.realbits; in ad7944_3wire_cs_mode_init_msg()
214 xfers[2].rx_buf = &adc->sample.raw; in ad7944_3wire_cs_mode_init_msg()
215 xfers[2].len = AD7944_SPI_BYTES(chan->scan_type); in ad7944_3wire_cs_mode_init_msg()
216 xfers[2].bits_per_word = chan->scan_type.realbits; in ad7944_3wire_cs_mode_init_msg()
218 spi_message_init_with_transfers(&adc->msg, xfers, 3); in ad7944_3wire_cs_mode_init_msg()
220 return devm_spi_optimize_message(dev, adc->spi, &adc->msg); in ad7944_3wire_cs_mode_init_msg()
223 static int ad7944_4wire_mode_init_msg(struct device *dev, struct ad7944_adc *adc, in ad7944_4wire_mode_init_msg() argument
226 unsigned int t_conv_ns = adc->always_turbo ? adc->timing_spec->turbo_conv_ns in ad7944_4wire_mode_init_msg()
227 : adc->timing_spec->conv_ns; in ad7944_4wire_mode_init_msg()
228 struct spi_transfer *xfers = adc->xfers; in ad7944_4wire_mode_init_msg()
234 xfers[0].bits_per_word = chan->scan_type.realbits; in ad7944_4wire_mode_init_msg()
243 xfers[1].rx_buf = &adc->sample.raw; in ad7944_4wire_mode_init_msg()
244 xfers[1].len = AD7944_SPI_BYTES(chan->scan_type); in ad7944_4wire_mode_init_msg()
245 xfers[1].bits_per_word = chan->scan_type.realbits; in ad7944_4wire_mode_init_msg()
247 spi_message_init_with_transfers(&adc->msg, xfers, 2); in ad7944_4wire_mode_init_msg()
249 return devm_spi_optimize_message(dev, adc->spi, &adc->msg); in ad7944_4wire_mode_init_msg()
252 static int ad7944_chain_mode_init_msg(struct device *dev, struct ad7944_adc *adc, in ad7944_chain_mode_init_msg() argument
256 struct spi_transfer *xfers = adc->xfers; in ad7944_chain_mode_init_msg()
262 if (adc->spi->mode & SPI_CPOL) in ad7944_chain_mode_init_msg()
263 return dev_err_probe(dev, -EINVAL, in ad7944_chain_mode_init_msg()
270 if (!(adc->spi->mode & SPI_CS_HIGH)) in ad7944_chain_mode_init_msg()
271 return dev_err_probe(dev, -EINVAL, in ad7944_chain_mode_init_msg()
275 xfers[0].delay.value = adc->timing_spec->conv_ns; in ad7944_chain_mode_init_msg()
278 xfers[1].rx_buf = adc->chain_mode_buf; in ad7944_chain_mode_init_msg()
279 xfers[1].len = AD7944_SPI_BYTES(chan->scan_type) * n_chain_dev; in ad7944_chain_mode_init_msg()
280 xfers[1].bits_per_word = chan->scan_type.realbits; in ad7944_chain_mode_init_msg()
282 spi_message_init_with_transfers(&adc->msg, xfers, 2); in ad7944_chain_mode_init_msg()
284 return devm_spi_optimize_message(dev, adc->spi, &adc->msg); in ad7944_chain_mode_init_msg()
290 * a sample from the ADC. This is needed to be able to read at the maximum
295 struct ad7944_adc *adc, in ad7944_3wire_cs_mode_init_offload_msg() argument
298 struct spi_transfer *xfers = adc->offload_xfers; in ad7944_3wire_cs_mode_init_offload_msg()
314 xfers[1].len = AD7944_SPI_BYTES(chan->scan_type); in ad7944_3wire_cs_mode_init_offload_msg()
315 xfers[1].bits_per_word = chan->scan_type.realbits; in ad7944_3wire_cs_mode_init_offload_msg()
317 spi_message_init_with_transfers(&adc->offload_msg, xfers, in ad7944_3wire_cs_mode_init_offload_msg()
318 ARRAY_SIZE(adc->offload_xfers)); in ad7944_3wire_cs_mode_init_offload_msg()
320 adc->offload_msg.offload = adc->offload; in ad7944_3wire_cs_mode_init_offload_msg()
322 ret = devm_spi_optimize_message(dev, adc->spi, &adc->offload_msg); in ad7944_3wire_cs_mode_init_offload_msg()
330 * ad7944_convert_and_acquire - Perform a single conversion and acquisition
331 * @adc: The ADC device structure
335 * pre-optimized adc->msg.
337 * Upon successful return adc->sample.raw will contain the conversion result
338 * (or adc->chain_mode_buf if the device is using chain mode).
340 static int ad7944_convert_and_acquire(struct ad7944_adc *adc) in ad7944_convert_and_acquire() argument
345 * In 4-wire mode, the CNV line is held high for the entire conversion in ad7944_convert_and_acquire()
346 * and acquisition process. In other modes adc->cnv is NULL and is in ad7944_convert_and_acquire()
349 gpiod_set_value_cansleep(adc->cnv, 1); in ad7944_convert_and_acquire()
350 ret = spi_sync(adc->spi, &adc->msg); in ad7944_convert_and_acquire()
351 gpiod_set_value_cansleep(adc->cnv, 0); in ad7944_convert_and_acquire()
356 static int ad7944_single_conversion(struct ad7944_adc *adc, in ad7944_single_conversion() argument
362 ret = ad7944_convert_and_acquire(adc); in ad7944_single_conversion()
366 if (adc->spi_mode == AD7944_SPI_MODE_CHAIN) { in ad7944_single_conversion()
367 if (chan->scan_type.realbits > 16) in ad7944_single_conversion()
368 *val = ((u32 *)adc->chain_mode_buf)[chan->scan_index]; in ad7944_single_conversion()
370 *val = ((u16 *)adc->chain_mode_buf)[chan->scan_index]; in ad7944_single_conversion()
372 if (chan->scan_type.realbits > 16) in ad7944_single_conversion()
373 *val = adc->sample.raw.u32; in ad7944_single_conversion()
375 *val = adc->sample.raw.u16; in ad7944_single_conversion()
378 if (chan->scan_type.sign == 's') in ad7944_single_conversion()
379 *val = sign_extend32(*val, chan->scan_type.realbits - 1); in ad7944_single_conversion()
389 struct ad7944_adc *adc = iio_priv(indio_dev); in ad7944_read_avail() local
393 *vals = adc->sample_freq_range; in ad7944_read_avail()
397 return -EINVAL; in ad7944_read_avail()
405 struct ad7944_adc *adc = iio_priv(indio_dev); in ad7944_read_raw() local
411 return -EBUSY; in ad7944_read_raw()
413 ret = ad7944_single_conversion(adc, chan, val); in ad7944_read_raw()
418 switch (chan->type) { in ad7944_read_raw()
420 *val = adc->ref_mv; in ad7944_read_raw()
422 if (chan->scan_type.sign == 's') in ad7944_read_raw()
423 *val2 = chan->scan_type.realbits - 1; in ad7944_read_raw()
425 *val2 = chan->scan_type.realbits; in ad7944_read_raw()
429 return -EINVAL; in ad7944_read_raw()
433 *val = adc->offload_trigger_hz; in ad7944_read_raw()
437 return -EINVAL; in ad7944_read_raw()
441 static int ad7944_set_sample_freq(struct ad7944_adc *adc, int val) in ad7944_set_sample_freq() argument
451 ret = spi_offload_trigger_validate(adc->offload_trigger, &config); in ad7944_set_sample_freq()
455 adc->offload_trigger_hz = config.periodic.frequency_hz; in ad7944_set_sample_freq()
464 struct ad7944_adc *adc = iio_priv(indio_dev); in ad7944_write_raw() local
468 if (val < 1 || val > adc->sample_freq_range[2]) in ad7944_write_raw()
469 return -EINVAL; in ad7944_write_raw()
471 return ad7944_set_sample_freq(adc, val); in ad7944_write_raw()
473 return -EINVAL; in ad7944_write_raw()
498 struct ad7944_adc *adc = iio_priv(indio_dev); in ad7944_offload_buffer_postenable() local
502 .frequency_hz = adc->offload_trigger_hz, in ad7944_offload_buffer_postenable()
507 gpiod_set_value_cansleep(adc->turbo, 1); in ad7944_offload_buffer_postenable()
509 ret = spi_offload_trigger_enable(adc->offload, adc->offload_trigger, in ad7944_offload_buffer_postenable()
512 gpiod_set_value_cansleep(adc->turbo, 0); in ad7944_offload_buffer_postenable()
519 struct ad7944_adc *adc = iio_priv(indio_dev); in ad7944_offload_buffer_predisable() local
521 spi_offload_trigger_disable(adc->offload, adc->offload_trigger); in ad7944_offload_buffer_predisable()
522 gpiod_set_value_cansleep(adc->turbo, 0); in ad7944_offload_buffer_predisable()
535 struct iio_dev *indio_dev = pf->indio_dev; in ad7944_trigger_handler()
536 struct ad7944_adc *adc = iio_priv(indio_dev); in ad7944_trigger_handler() local
539 ret = ad7944_convert_and_acquire(adc); in ad7944_trigger_handler()
543 if (adc->spi_mode == AD7944_SPI_MODE_CHAIN) in ad7944_trigger_handler()
544 iio_push_to_buffers_with_timestamp(indio_dev, adc->chain_mode_buf, in ad7944_trigger_handler()
545 pf->timestamp); in ad7944_trigger_handler()
547 iio_push_to_buffers_with_timestamp(indio_dev, &adc->sample.raw, in ad7944_trigger_handler()
548 pf->timestamp); in ad7944_trigger_handler()
551 iio_trigger_notify_done(indio_dev->trig); in ad7944_trigger_handler()
557 * ad7944_chain_mode_alloc - allocate and initialize channel specs and buffers
558 * for daisy-chained devices
560 * @chan_template: The channel template for the devices (array of 2 channels
585 return -ENOMEM; in ad7944_chain_mode_alloc()
612 return -ENOMEM; in ad7944_chain_mode_alloc()
621 return dev_err_probe(dev, -EINVAL, in ad7944_chain_mode_alloc()
626 return -ENOMEM; in ad7944_chain_mode_alloc()
632 scan_masks[0] = GENMASK(n_chain_dev - 1, 0); in ad7944_chain_mode_alloc()
651 struct device *dev = &spi->dev; in ad7944_probe()
653 struct ad7944_adc *adc; in ad7944_probe() local
660 indio_dev = devm_iio_device_alloc(dev, sizeof(*adc)); in ad7944_probe()
662 return -ENOMEM; in ad7944_probe()
664 adc = iio_priv(indio_dev); in ad7944_probe()
665 adc->spi = spi; in ad7944_probe()
669 return dev_err_probe(dev, -EINVAL, "no chip info\n"); in ad7944_probe()
671 adc->timing_spec = chip_info->timing_spec; in ad7944_probe()
673 adc->sample_freq_range[0] = 1; /* min */ in ad7944_probe()
674 adc->sample_freq_range[1] = 1; /* step */ in ad7944_probe()
675 adc->sample_freq_range[2] = chip_info->max_sample_rate_hz; /* max */ in ad7944_probe()
677 ret = device_property_match_property_string(dev, "adi,spi-mode", in ad7944_probe()
680 /* absence of adi,spi-mode property means default mode */ in ad7944_probe()
681 if (ret == -EINVAL) in ad7944_probe()
682 adc->spi_mode = AD7944_SPI_MODE_DEFAULT; in ad7944_probe()
685 "getting adi,spi-mode property failed\n"); in ad7944_probe()
687 adc->spi_mode = ret; in ad7944_probe()
693 if (!spi_is_bpw_supported(spi, chip_info->channels[0].scan_type.realbits)) in ad7944_probe()
694 return dev_err_probe(dev, -EINVAL, in ad7944_probe()
696 chip_info->channels[0].scan_type.realbits); in ad7944_probe()
707 * - internal reference: neither REF or REFIN is connected in ad7944_probe()
708 * - internal reference with external buffer: REF not connected, REFIN in ad7944_probe()
710 * - external reference: REF is connected, REFIN is not connected in ad7944_probe()
714 if (ret < 0 && ret != -ENODEV) in ad7944_probe()
717 ref_mv = ret == -ENODEV ? 0 : ret / 1000; in ad7944_probe()
720 if (ret < 0 && ret != -ENODEV) in ad7944_probe()
723 have_refin = ret != -ENODEV; in ad7944_probe()
726 return dev_err_probe(dev, -EINVAL, in ad7944_probe()
729 adc->ref_mv = ref_mv ?: AD7944_INTERNAL_REF_MV; in ad7944_probe()
731 adc->cnv = devm_gpiod_get_optional(dev, "cnv", GPIOD_OUT_LOW); in ad7944_probe()
732 if (IS_ERR(adc->cnv)) in ad7944_probe()
733 return dev_err_probe(dev, PTR_ERR(adc->cnv), in ad7944_probe()
736 if (!adc->cnv && adc->spi_mode == AD7944_SPI_MODE_DEFAULT) in ad7944_probe()
737 return dev_err_probe(&spi->dev, -EINVAL, "CNV GPIO is required\n"); in ad7944_probe()
738 if (adc->cnv && adc->spi_mode != AD7944_SPI_MODE_DEFAULT) in ad7944_probe()
739 return dev_err_probe(&spi->dev, -EINVAL, in ad7944_probe()
742 adc->turbo = devm_gpiod_get_optional(dev, "turbo", GPIOD_OUT_LOW); in ad7944_probe()
743 if (IS_ERR(adc->turbo)) in ad7944_probe()
744 return dev_err_probe(dev, PTR_ERR(adc->turbo), in ad7944_probe()
747 adc->always_turbo = device_property_present(dev, "adi,always-turbo"); in ad7944_probe()
749 if (adc->turbo && adc->always_turbo) in ad7944_probe()
750 return dev_err_probe(dev, -EINVAL, in ad7944_probe()
751 "cannot have both turbo-gpios and adi,always-turbo\n"); in ad7944_probe()
753 if (adc->spi_mode == AD7944_SPI_MODE_CHAIN && adc->always_turbo) in ad7944_probe()
754 return dev_err_probe(dev, -EINVAL, in ad7944_probe()
757 switch (adc->spi_mode) { in ad7944_probe()
759 ret = ad7944_4wire_mode_init_msg(dev, adc, &chip_info->channels[0]); in ad7944_probe()
765 ret = ad7944_3wire_cs_mode_init_msg(dev, adc, &chip_info->channels[0]); in ad7944_probe()
771 ret = device_property_read_u32(dev, "#daisy-chained-devices", in ad7944_probe()
775 "failed to get #daisy-chained-devices\n"); in ad7944_probe()
777 ret = ad7944_chain_mode_alloc(dev, chip_info->channels, in ad7944_probe()
779 &adc->chain_mode_buf, in ad7944_probe()
784 ret = ad7944_chain_mode_init_msg(dev, adc, &chain_chan[0], in ad7944_probe()
792 indio_dev->name = chip_info->name; in ad7944_probe()
793 indio_dev->modes = INDIO_DIRECT_MODE; in ad7944_probe()
794 indio_dev->info = &ad7944_iio_info; in ad7944_probe()
796 adc->offload = devm_spi_offload_get(dev, spi, &ad7944_offload_config); in ad7944_probe()
797 ret = PTR_ERR_OR_ZERO(adc->offload); in ad7944_probe()
798 if (ret && ret != -ENODEV) in ad7944_probe()
802 if (ret == -ENODEV) { in ad7944_probe()
803 if (adc->spi_mode == AD7944_SPI_MODE_CHAIN) { in ad7944_probe()
804 indio_dev->available_scan_masks = chain_scan_masks; in ad7944_probe()
805 indio_dev->channels = chain_chan; in ad7944_probe()
806 indio_dev->num_channels = n_chain_dev + 1; in ad7944_probe()
808 indio_dev->channels = chip_info->channels; in ad7944_probe()
809 indio_dev->num_channels = ARRAY_SIZE(chip_info->channels); in ad7944_probe()
821 if (adc->spi_mode != AD7944_SPI_MODE_SINGLE) in ad7944_probe()
822 return dev_err_probe(dev, -EINVAL, in ad7944_probe()
825 indio_dev->setup_ops = &ad7944_offload_buffer_setup_ops; in ad7944_probe()
826 indio_dev->channels = chip_info->offload_channels; in ad7944_probe()
827 indio_dev->num_channels = ARRAY_SIZE(chip_info->offload_channels); in ad7944_probe()
829 adc->offload_trigger = devm_spi_offload_trigger_get(dev, in ad7944_probe()
830 adc->offload, SPI_OFFLOAD_TRIGGER_PERIODIC); in ad7944_probe()
831 if (IS_ERR(adc->offload_trigger)) in ad7944_probe()
832 return dev_err_probe(dev, PTR_ERR(adc->offload_trigger), in ad7944_probe()
835 ret = ad7944_set_sample_freq(adc, 2 * MEGA); in ad7944_probe()
841 adc->offload); in ad7944_probe()
848 * buffer layout is the same as what is hard-coded in in ad7944_probe()
850 * is the pulsar_adc project which always uses 32-bit word in ad7944_probe()
859 ret = ad7944_3wire_cs_mode_init_offload_msg(dev, adc, in ad7944_probe()
860 &chip_info->offload_channels[0]); in ad7944_probe()
896 MODULE_DESCRIPTION("Analog Devices AD7944 PulSAR ADC family driver");