Lines Matching full:adc
3 * Analog Devices AD7944/85/86 PulSAR ADC family driver.
174 * is only one supported provider, namely the ADI PULSAR ADC HDL project,
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()
208 xfers[2].rx_buf = &adc->sample.raw; 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()
217 static int ad7944_4wire_mode_init_msg(struct device *dev, struct ad7944_adc *adc, in ad7944_4wire_mode_init_msg() argument
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()
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()
241 static int ad7944_chain_mode_init_msg(struct device *dev, struct ad7944_adc *adc, in ad7944_chain_mode_init_msg() argument
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()
259 if (!(adc->spi->mode & SPI_CS_HIGH)) 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()
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()
279 * a sample from the ADC. This is needed to be able to read at the maximum
284 struct ad7944_adc *adc, in ad7944_3wire_cs_mode_init_offload_msg() argument
287 struct spi_transfer *xfers = adc->offload_xfers; 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()
320 * @adc: The ADC device structure
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).
329 static int ad7944_convert_and_acquire(struct ad7944_adc *adc) in ad7944_convert_and_acquire() argument
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()
345 static int ad7944_single_conversion(struct ad7944_adc *adc, in ad7944_single_conversion() argument
351 ret = ad7944_convert_and_acquire(adc); in ad7944_single_conversion()
355 if (adc->spi_mode == AD7944_SPI_MODE_CHAIN) { 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()
362 *val = adc->sample.raw.u32; in ad7944_single_conversion()
364 *val = adc->sample.raw.u16; in ad7944_single_conversion()
380 struct ad7944_adc *adc = iio_priv(indio_dev); in ad7944_read_avail() local
384 *vals = adc->sample_freq_range; in ad7944_read_avail()
396 struct ad7944_adc *adc = iio_priv(indio_dev); in ad7944_read_raw() local
404 ret = ad7944_single_conversion(adc, chan, val); in ad7944_read_raw()
411 *val = adc->ref_mv; in ad7944_read_raw()
424 *val = adc->offload_trigger_hz; in ad7944_read_raw()
432 static int ad7944_set_sample_freq(struct ad7944_adc *adc, int val) in ad7944_set_sample_freq() argument
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()
455 struct ad7944_adc *adc = iio_priv(indio_dev); in ad7944_write_raw() local
459 if (val < 1 || val > adc->sample_freq_range[2]) in ad7944_write_raw()
462 return ad7944_set_sample_freq(adc, val); in ad7944_write_raw()
489 struct ad7944_adc *adc = iio_priv(indio_dev); in ad7944_offload_buffer_postenable() local
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()
510 struct ad7944_adc *adc = iio_priv(indio_dev); in ad7944_offload_buffer_predisable() local
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()
527 struct ad7944_adc *adc = iio_priv(indio_dev); in ad7944_trigger_handler() local
530 ret = ad7944_convert_and_acquire(adc); 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()
538 iio_push_to_buffers_with_timestamp(indio_dev, &adc->sample.raw, in ad7944_trigger_handler()
644 struct ad7944_adc *adc; in ad7944_probe() local
651 indio_dev = devm_iio_device_alloc(dev, sizeof(*adc)); in ad7944_probe()
655 adc = iio_priv(indio_dev); in ad7944_probe()
656 adc->spi = spi; 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()
673 adc->spi_mode = AD7944_SPI_MODE_DEFAULT; in ad7944_probe()
678 adc->spi_mode = ret; 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()
729 if (adc->cnv && adc->spi_mode != AD7944_SPI_MODE_DEFAULT) 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()
744 if (adc->spi_mode == AD7944_SPI_MODE_CHAIN && adc->always_turbo) 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()
770 &adc->chain_mode_buf, in ad7944_probe()
775 ret = ad7944_chain_mode_init_msg(dev, adc, &chain_chan[0], 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()
794 if (adc->spi_mode == AD7944_SPI_MODE_CHAIN) { in ad7944_probe()
812 if (adc->spi_mode != AD7944_SPI_MODE_SINGLE) 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()
826 ret = ad7944_set_sample_freq(adc, 2 * MEGA); in ad7944_probe()
832 adc->offload); in ad7944_probe()
850 ret = ad7944_3wire_cs_mode_init_offload_msg(dev, adc, in ad7944_probe()
887 MODULE_DESCRIPTION("Analog Devices AD7944 PulSAR ADC family driver");