Lines Matching +full:axi +full:- +full:adc
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Analog Devices AD9467 SPI ADC driver
5 * Copyright 2012-2020 Analog Devices Inc.
25 #include <linux/iio/adc/adi-axi-adc.h>
28 * ADI High-Speed ADC common spi interface registers
29 * See Application-Note AN-877:
30 * https://www.analog.com/media/en/technical-documentation/application-notes/AN-877.pdf
81 * Analog Devices AD9265 16-Bit, 125/105/80 MSPS ADC
89 * Analog Devices AD9434 12-Bit, 370/500 MSPS ADC
97 * Analog Devices AD9467 16-Bit, 200/250 MSPS ADC
164 struct spi_device *spi = st->spi; in ad9467_reg_access()
168 guard(mutex)(&st->lock); in ad9467_reg_access()
203 const struct adi_axi_adc_chip_info *info = conv->chip_info; in __ad9467_get_scale()
204 const struct iio_chan_spec *chan = &info->channels[0]; in __ad9467_get_scale()
207 tmp = (info->scale_table[index][0] * 1000000ULL) >> in __ad9467_get_scale()
208 chan->scan_type.realbits; in __ad9467_get_scale()
278 const struct adi_axi_adc_chip_info *info = conv->chip_info; in ad9467_get_scale()
284 ret = ad9467_spi_read(st->spi, AN877_ADC_REG_VREF); in ad9467_get_scale()
288 vref_val = ret & info1->vref_mask; in ad9467_get_scale()
290 for (i = 0; i < info->num_scales; i++) { in ad9467_get_scale()
291 if (vref_val == info->scale_table[i][1]) in ad9467_get_scale()
295 if (i == info->num_scales) in ad9467_get_scale()
296 return -ERANGE; in ad9467_get_scale()
305 const struct adi_axi_adc_chip_info *info = conv->chip_info; in ad9467_set_scale()
312 return -EINVAL; in ad9467_set_scale()
314 for (i = 0; i < info->num_scales; i++) { in ad9467_set_scale()
319 guard(mutex)(&st->lock); in ad9467_set_scale()
320 ret = ad9467_spi_write(st->spi, AN877_ADC_REG_VREF, in ad9467_set_scale()
321 info->scale_table[i][1]); in ad9467_set_scale()
325 return ad9467_spi_write(st->spi, AN877_ADC_REG_TRANSFER, in ad9467_set_scale()
329 return -EINVAL; in ad9467_set_scale()
342 *val = clk_get_rate(st->clk); in ad9467_read_raw()
346 return -EINVAL; in ad9467_read_raw()
354 const struct adi_axi_adc_chip_info *info = conv->chip_info; in ad9467_write_raw()
362 r_clk = clk_round_rate(st->clk, val); in ad9467_write_raw()
363 if (r_clk < 0 || r_clk > info->max_rate) { in ad9467_write_raw()
364 dev_warn(&st->spi->dev, in ad9467_write_raw()
365 "Error setting ADC sample rate %ld", r_clk); in ad9467_write_raw()
366 return -EINVAL; in ad9467_write_raw()
369 return clk_set_rate(st->clk, r_clk); in ad9467_write_raw()
371 return -EINVAL; in ad9467_write_raw()
380 const struct adi_axi_adc_chip_info *info = conv->chip_info; in ad9467_read_avail()
385 *vals = (const int *)st->scales; in ad9467_read_avail()
388 *length = info->num_scales * 2; in ad9467_read_avail()
391 return -EINVAL; in ad9467_read_avail()
409 const struct adi_axi_adc_chip_info *info = conv->chip_info; in ad9467_scale_fill()
413 st->scales = devm_kmalloc_array(&st->spi->dev, info->num_scales, in ad9467_scale_fill()
414 sizeof(*st->scales), GFP_KERNEL); in ad9467_scale_fill()
415 if (!st->scales) in ad9467_scale_fill()
416 return -ENOMEM; in ad9467_scale_fill()
418 for (i = 0; i < info->num_scales; i++) { in ad9467_scale_fill()
420 st->scales[i][0] = val1; in ad9467_scale_fill()
421 st->scales[i][1] = val2; in ad9467_scale_fill()
431 return ad9467_outputmode_set(st->spi, st->output_mode); in ad9467_preenable_setup()
457 info = of_device_get_match_data(&spi->dev); in ad9467_probe()
459 info = (void *)spi_get_device_id(spi)->driver_data; in ad9467_probe()
461 return -ENODEV; in ad9467_probe()
463 conv = devm_adi_axi_adc_conv_register(&spi->dev, sizeof(*st)); in ad9467_probe()
468 st->spi = spi; in ad9467_probe()
470 st->clk = devm_clk_get_enabled(&spi->dev, "adc-clk"); in ad9467_probe()
471 if (IS_ERR(st->clk)) in ad9467_probe()
472 return PTR_ERR(st->clk); in ad9467_probe()
474 st->pwrdown_gpio = devm_gpiod_get_optional(&spi->dev, "powerdown", in ad9467_probe()
476 if (IS_ERR(st->pwrdown_gpio)) in ad9467_probe()
477 return PTR_ERR(st->pwrdown_gpio); in ad9467_probe()
479 ret = ad9467_reset(&spi->dev); in ad9467_probe()
483 conv->chip_info = &info->axi_adc_info; in ad9467_probe()
490 if (id != conv->chip_info->id) { in ad9467_probe()
491 dev_err(&spi->dev, "Mismatch CHIP_ID, got 0x%X, expected 0x%X\n", in ad9467_probe()
492 id, conv->chip_info->id); in ad9467_probe()
493 return -ENODEV; in ad9467_probe()
496 conv->reg_access = ad9467_reg_access; in ad9467_probe()
497 conv->write_raw = ad9467_write_raw; in ad9467_probe()
498 conv->read_raw = ad9467_read_raw; in ad9467_probe()
499 conv->read_avail = ad9467_read_avail; in ad9467_probe()
500 conv->preenable_setup = ad9467_preenable_setup; in ad9467_probe()
502 st->output_mode = info->default_output_mode | in ad9467_probe()
535 MODULE_DESCRIPTION("Analog Devices AD9467 ADC driver");