Lines Matching +full:adc +full:- +full:channel +full:- +full:clk +full:- +full:src
1 // SPDX-License-Identifier: GPL-2.0+
3 * AD7770, AD7771, AD7779 ADC
5 * Copyright 2023-2024 Analog Devices Inc.
10 #include <linux/clk.h>
143 struct clk *mclk;
177 .tx_buf = st->reg_tx_buf, in ad7779_spi_read()
178 .rx_buf = st->reg_rx_buf, in ad7779_spi_read()
181 st->reg_tx_buf[0] = AD7779_SPI_READ_CMD | FIELD_GET(AD7779_REG_MSK, reg); in ad7779_spi_read()
182 st->reg_tx_buf[1] = 0; in ad7779_spi_read()
188 st->reg_tx_buf[2] = crc8(ad7779_crc8_table, st->reg_tx_buf, in ad7779_spi_read()
189 t.len - 1, 0); in ad7779_spi_read()
192 ret = spi_sync_transfer(st->spi, &t, 1); in ad7779_spi_read()
197 crc_buf[1] = st->reg_rx_buf[1]; in ad7779_spi_read()
199 if (reg != AD7779_REG_GEN_ERR_REG_1_EN && exp_crc != st->reg_rx_buf[2]) { in ad7779_spi_read()
200 dev_err(&st->spi->dev, "Bad CRC %x, expected %x", in ad7779_spi_read()
201 st->reg_rx_buf[2], exp_crc); in ad7779_spi_read()
202 return -EINVAL; in ad7779_spi_read()
204 *rbuf = st->reg_rx_buf[1]; in ad7779_spi_read()
213 st->reg_tx_buf[0] = FIELD_GET(AD7779_REG_MSK, reg); in ad7779_spi_write()
214 st->reg_tx_buf[1] = val; in ad7779_spi_write()
218 st->reg_tx_buf[2] = crc8(ad7779_crc8_table, st->reg_tx_buf, in ad7779_spi_write()
219 length - 1, 0); in ad7779_spi_write()
221 return spi_write(st->spi, st->reg_tx_buf, length); in ad7779_spi_write()
270 if (st->filter_enabled == AD7779_SINC3 && in ad7779_set_sampling_frequency()
272 return -EINVAL; in ad7779_set_sampling_frequency()
274 if (st->filter_enabled == AD7779_SINC5 && in ad7779_set_sampling_frequency()
276 return -EINVAL; in ad7779_set_sampling_frequency()
279 return -EINVAL; in ad7779_set_sampling_frequency()
303 decimal = ((mult_frac(div, KILO, freq_khz) - dec * KILO) << 16) in ad7779_set_sampling_frequency()
327 /* SRC update settling time */ in ad7779_set_sampling_frequency()
334 /* SRC update settling time */ in ad7779_set_sampling_frequency()
337 st->sampling_freq = sampling_freq; in ad7779_set_sampling_frequency()
370 ret = ad7779_set_sampling_frequency(st, st->sampling_freq); in ad7779_set_filter()
374 st->filter_enabled = mode; in ad7779_set_filter()
379 static int ad7779_get_calibscale(struct ad7779_state *st, int channel) in ad7779_get_calibscale() argument
384 ret = ad7779_spi_read(st, AD7779_REG_CH_GAIN_LOWER_BYTE(channel), in ad7779_get_calibscale()
389 ret = ad7779_spi_read(st, AD7779_REG_CH_GAIN_MID_BYTE(channel), in ad7779_get_calibscale()
394 ret = ad7779_spi_read(st, AD7779_REG_CH_GAIN_UPPER_BYTE(channel), in ad7779_get_calibscale()
402 static int ad7779_set_calibscale(struct ad7779_state *st, int channel, int val) in ad7779_set_calibscale() argument
413 ret = ad7779_spi_write(st, AD7779_REG_CH_GAIN_UPPER_BYTE(channel), in ad7779_set_calibscale()
418 ret = ad7779_spi_write(st, AD7779_REG_CH_GAIN_MID_BYTE(channel), in ad7779_set_calibscale()
423 return ad7779_spi_write(st, AD7779_REG_CH_GAIN_LOWER_BYTE(channel), in ad7779_set_calibscale()
427 static int ad7779_get_calibbias(struct ad7779_state *st, int channel) in ad7779_get_calibbias() argument
432 ret = ad7779_spi_read(st, AD7779_REG_CH_OFFSET_LOWER_BYTE(channel), in ad7779_get_calibbias()
437 ret = ad7779_spi_read(st, AD7779_REG_CH_OFFSET_MID_BYTE(channel), in ad7779_get_calibbias()
442 ret = ad7779_spi_read(st, AD7779_REG_CH_OFFSET_UPPER_BYTE(channel), in ad7779_get_calibbias()
450 static int ad7779_set_calibbias(struct ad7779_state *st, int channel, int val) in ad7779_set_calibbias() argument
456 ret = ad7779_spi_write(st, AD7779_REG_CH_OFFSET_UPPER_BYTE(channel), in ad7779_set_calibbias()
461 ret = ad7779_spi_write(st, AD7779_REG_CH_OFFSET_MID_BYTE(channel), in ad7779_set_calibbias()
466 return ad7779_spi_write(st, AD7779_REG_CH_OFFSET_LOWER_BYTE(channel), in ad7779_set_calibbias()
479 ret = ad7779_get_calibscale(st, chan->channel); in __ad7779_read_raw()
486 ret = ad7779_get_calibbias(st, chan->channel); in __ad7779_read_raw()
492 *val = st->sampling_freq; in __ad7779_read_raw()
494 return -EINVAL; in __ad7779_read_raw()
497 return -EINVAL; in __ad7779_read_raw()
508 return -EBUSY; in ad7779_read_raw()
524 return ad7779_set_calibscale(st, chan->channel, val2); in __ad7779_write_raw()
526 return ad7779_set_calibbias(st, chan->channel, val); in __ad7779_write_raw()
530 return -EINVAL; in __ad7779_write_raw()
541 return -EBUSY; in ad7779_write_raw()
564 enable_irq(st->spi->irq); in ad7779_buffer_preenable()
573 disable_irq(st->spi->irq); in ad7779_buffer_postdisable()
582 struct iio_dev *indio_dev = pf->indio_dev; in ad7779_trigger_handler()
586 .rx_buf = st->data.chans, in ad7779_trigger_handler()
587 .tx_buf = st->spidata_tx, in ad7779_trigger_handler()
591 st->spidata_tx[0] = AD7779_SPI_READ_CMD; in ad7779_trigger_handler()
592 ret = spi_sync_transfer(st->spi, &t, 1); in ad7779_trigger_handler()
594 dev_err(&st->spi->dev, "SPI transfer error in IRQ handler"); in ad7779_trigger_handler()
598 iio_push_to_buffers_with_timestamp(indio_dev, &st->data, pf->timestamp); in ad7779_trigger_handler()
601 iio_trigger_notify_done(indio_dev->trig); in ad7779_trigger_handler()
610 .tx_buf = st->reset_buf, in ad7779_reset()
620 memset(st->reset_buf, 0xff, sizeof(st->reset_buf)); in ad7779_reset()
621 ret = spi_sync_transfer(st->spi, &t, 1); in ad7779_reset()
660 .channel = (index), \
759 struct device *dev = &spi->dev; in ad7779_probe()
760 int ret = -EINVAL; in ad7779_probe()
762 if (!spi->irq) in ad7779_probe()
767 return -ENOMEM; in ad7779_probe()
778 st->mclk = devm_clk_get_enabled(dev, "mclk"); in ad7779_probe()
779 if (IS_ERR(st->mclk)) in ad7779_probe()
780 return PTR_ERR(st->mclk); in ad7779_probe()
791 st->spi = spi; in ad7779_probe()
793 st->chip_info = spi_get_device_match_data(spi); in ad7779_probe()
794 if (!st->chip_info) in ad7779_probe()
795 return -ENODEV; in ad7779_probe()
805 indio_dev->name = st->chip_info->name; in ad7779_probe()
806 indio_dev->info = &ad7779_info; in ad7779_probe()
807 indio_dev->modes = INDIO_DIRECT_MODE; in ad7779_probe()
808 indio_dev->channels = st->chip_info->channels; in ad7779_probe()
809 indio_dev->num_channels = ARRAY_SIZE(ad7779_channels); in ad7779_probe()
811 st->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", indio_dev->name, in ad7779_probe()
813 if (!st->trig) in ad7779_probe()
814 return -ENOMEM; in ad7779_probe()
816 st->trig->ops = &ad7779_trigger_ops; in ad7779_probe()
818 iio_trigger_set_drvdata(st->trig, st); in ad7779_probe()
820 ret = devm_request_irq(dev, spi->irq, iio_trigger_generic_data_rdy_poll, in ad7779_probe()
821 IRQF_ONESHOT | IRQF_NO_AUTOEN, indio_dev->name, in ad7779_probe()
822 st->trig); in ad7779_probe()
825 st->spi->irq); in ad7779_probe()
827 ret = devm_iio_trigger_register(dev, st->trig); in ad7779_probe()
831 indio_dev->trig = iio_trigger_get(st->trig); in ad7779_probe()
833 init_completion(&st->completion); in ad7779_probe()
936 MODULE_DESCRIPTION("Analog Devices AD7779 ADC");