Lines Matching +full:spi +full:- +full:present +full:- +full:mask

1 // SPDX-License-Identifier: GPL-2.0+
5 * Copyright 2023-2024 Analog Devices Inc.
21 #include <linux/spi/spi.h>
141 struct spi_device *spi; member
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()
224 static int ad7779_spi_write_mask(struct ad7779_state *st, u8 reg, u8 mask, in ad7779_spi_write_mask() argument
234 regval = (data & ~mask) | (val & mask); in ad7779_spi_write_mask()
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()
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()
472 int *val2, long mask) in ad7779_read_raw() argument
477 iio_device_claim_direct_scoped(return -EBUSY, indio_dev) { in ad7779_read_raw()
478 switch (mask) { in ad7779_read_raw()
480 ret = ad7779_get_calibscale(st, chan->channel); in ad7779_read_raw()
487 ret = ad7779_get_calibbias(st, chan->channel); in ad7779_read_raw()
493 *val = st->sampling_freq; in ad7779_read_raw()
495 return -EINVAL; in ad7779_read_raw()
498 return -EINVAL; in ad7779_read_raw()
506 long mask) in ad7779_write_raw() argument
510 iio_device_claim_direct_scoped(return -EBUSY, indio_dev) { in ad7779_write_raw()
511 switch (mask) { in ad7779_write_raw()
513 return ad7779_set_calibscale(st, chan->channel, val2); in ad7779_write_raw()
515 return ad7779_set_calibbias(st, chan->channel, val); in ad7779_write_raw()
519 return -EINVAL; in ad7779_write_raw()
538 * DRDY output cannot be disabled at device level therefore we mask in ad7779_buffer_preenable()
541 enable_irq(st->spi->irq); in ad7779_buffer_preenable()
550 disable_irq(st->spi->irq); in ad7779_buffer_postdisable()
559 struct iio_dev *indio_dev = pf->indio_dev; in ad7779_trigger_handler()
563 .rx_buf = st->data.chans, in ad7779_trigger_handler()
564 .tx_buf = st->spidata_tx, in ad7779_trigger_handler()
568 st->spidata_tx[0] = AD7779_SPI_READ_CMD; in ad7779_trigger_handler()
569 ret = spi_sync_transfer(st->spi, &t, 1); in ad7779_trigger_handler()
571 dev_err(&st->spi->dev, "SPI transfer error in IRQ handler"); in ad7779_trigger_handler()
575 iio_push_to_buffers_with_timestamp(indio_dev, &st->data, pf->timestamp); in ad7779_trigger_handler()
578 iio_trigger_notify_done(indio_dev->trig); in ad7779_trigger_handler()
587 .tx_buf = st->reset_buf, in ad7779_reset()
597 memset(st->reset_buf, 0xff, sizeof(st->reset_buf)); in ad7779_reset()
598 ret = spi_sync_transfer(st->spi, &t, 1); in ad7779_reset()
731 static int ad7779_probe(struct spi_device *spi) in ad7779_probe() argument
736 struct device *dev = &spi->dev; in ad7779_probe()
737 int ret = -EINVAL; in ad7779_probe()
739 if (!spi->irq) in ad7779_probe()
740 return dev_err_probe(dev, ret, "DRDY irq not present\n"); in ad7779_probe()
744 return -ENOMEM; in ad7779_probe()
755 st->mclk = devm_clk_get_enabled(dev, "mclk"); in ad7779_probe()
756 if (IS_ERR(st->mclk)) in ad7779_probe()
757 return PTR_ERR(st->mclk); in ad7779_probe()
768 st->spi = spi; in ad7779_probe()
770 st->chip_info = spi_get_device_match_data(spi); in ad7779_probe()
771 if (!st->chip_info) in ad7779_probe()
772 return -ENODEV; in ad7779_probe()
782 indio_dev->name = st->chip_info->name; in ad7779_probe()
783 indio_dev->info = &ad7779_info; in ad7779_probe()
784 indio_dev->modes = INDIO_DIRECT_MODE; in ad7779_probe()
785 indio_dev->channels = st->chip_info->channels; in ad7779_probe()
786 indio_dev->num_channels = ARRAY_SIZE(ad7779_channels); in ad7779_probe()
788 st->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", indio_dev->name, in ad7779_probe()
790 if (!st->trig) in ad7779_probe()
791 return -ENOMEM; in ad7779_probe()
793 st->trig->ops = &ad7779_trigger_ops; in ad7779_probe()
795 iio_trigger_set_drvdata(st->trig, st); in ad7779_probe()
797 ret = devm_request_irq(dev, spi->irq, iio_trigger_generic_data_rdy_poll, in ad7779_probe()
798 IRQF_ONESHOT | IRQF_NO_AUTOEN, indio_dev->name, in ad7779_probe()
799 st->trig); in ad7779_probe()
802 st->spi->irq); in ad7779_probe()
804 ret = devm_iio_trigger_register(dev, st->trig); in ad7779_probe()
808 indio_dev->trig = iio_trigger_get(st->trig); in ad7779_probe()
810 init_completion(&st->completion); in ad7779_probe()
882 MODULE_DEVICE_TABLE(spi, ad7779_id);