Lines Matching +full:iio +full:- +full:backend
1 // SPDX-License-Identifier: GPL-2.0
19 #include <linux/iio/buffer-dmaengine.h>
20 #include <linux/iio/iio.h>
22 #include <dt-bindings/iio/adc/adi,ad7606.h>
64 dev_err(&spi->dev, "SPI read error\n"); in ad7606_spi_read_block()
102 struct spi_device *spi = to_spi_device(st->dev); in ad7606_spi_reg_read()
105 .tx_buf = &st->d16[0], in ad7606_spi_reg_read()
109 .rx_buf = &st->d16[1], in ad7606_spi_reg_read()
115 st->d16[0] = cpu_to_be16(st->bops->rd_wr_cmd(addr, 0) << 8); in ad7606_spi_reg_read()
121 return be16_to_cpu(st->d16[1]); in ad7606_spi_reg_read()
128 struct spi_device *spi = to_spi_device(st->dev); in ad7606_spi_reg_write()
130 st->d16[0] = cpu_to_be16((st->bops->rd_wr_cmd(addr, 1) << 8) | in ad7606_spi_reg_write()
133 return spi_write(spi, &st->d16[0], sizeof(st->d16[0])); in ad7606_spi_reg_write()
141 return st->bops->reg_write(st, AD7606_CONFIGURATION_REGISTER, in ad7606b_sw_mode_config()
154 struct spi_bus_data *bus_data = st->bus_data; in ad7606_spi_offload_buffer_postenable()
155 struct spi_transfer *xfer = &bus_data->offload_xfer; in ad7606_spi_offload_buffer_postenable()
156 struct spi_device *spi = to_spi_device(st->dev); in ad7606_spi_offload_buffer_postenable()
162 scan_type = &indio_dev->channels[0].scan_type; in ad7606_spi_offload_buffer_postenable()
164 xfer->bits_per_word = scan_type->realbits; in ad7606_spi_offload_buffer_postenable()
165 xfer->offload_flags = SPI_OFFLOAD_XFER_RX_STREAM; in ad7606_spi_offload_buffer_postenable()
167 * Using SPI offload, storagebits are related to the spi-engine in ad7606_spi_offload_buffer_postenable()
171 xfer->len = (scan_type->realbits > 16 ? 4 : 2) * in ad7606_spi_offload_buffer_postenable()
172 st->chip_info->num_adc_channels; in ad7606_spi_offload_buffer_postenable()
174 spi_message_init_with_transfers(&bus_data->offload_msg, xfer, 1); in ad7606_spi_offload_buffer_postenable()
175 bus_data->offload_msg.offload = bus_data->offload; in ad7606_spi_offload_buffer_postenable()
177 ret = spi_optimize_message(spi, &bus_data->offload_msg); in ad7606_spi_offload_buffer_postenable()
179 dev_err(st->dev, "failed to prepare offload, err: %d\n", ret); in ad7606_spi_offload_buffer_postenable()
183 ret = spi_offload_trigger_enable(bus_data->offload, in ad7606_spi_offload_buffer_postenable()
184 bus_data->offload_trigger, in ad7606_spi_offload_buffer_postenable()
196 spi_offload_trigger_disable(bus_data->offload, in ad7606_spi_offload_buffer_postenable()
197 bus_data->offload_trigger); in ad7606_spi_offload_buffer_postenable()
200 spi_unoptimize_message(&bus_data->offload_msg); in ad7606_spi_offload_buffer_postenable()
208 struct spi_bus_data *bus_data = st->bus_data; in ad7606_spi_offload_buffer_predisable()
215 spi_offload_trigger_disable(bus_data->offload, in ad7606_spi_offload_buffer_predisable()
216 bus_data->offload_trigger); in ad7606_spi_offload_buffer_predisable()
217 spi_unoptimize_message(&bus_data->offload_msg); in ad7606_spi_offload_buffer_predisable()
252 return -EINVAL; in ad7606_spi_offload_trigger_request()
261 if (config->type != SPI_OFFLOAD_TRIGGER_DATA_READY) in ad7606_spi_offload_trigger_validate()
262 return -EINVAL; in ad7606_spi_offload_trigger_validate()
289 return -ENOMEM; in ad7606_spi_offload_probe()
290 st->bus_data = bus_data; in ad7606_spi_offload_probe()
292 bus_data->offload = devm_spi_offload_get(dev, spi, in ad7606_spi_offload_probe()
294 ret = PTR_ERR_OR_ZERO(bus_data->offload); in ad7606_spi_offload_probe()
295 if (ret && ret != -ENODEV) in ad7606_spi_offload_probe()
298 if (ret == -ENODEV) in ad7606_spi_offload_probe()
306 bus_data->offload_trigger = devm_spi_offload_trigger_get(dev, in ad7606_spi_offload_probe()
307 bus_data->offload, SPI_OFFLOAD_TRIGGER_DATA_READY); in ad7606_spi_offload_probe()
308 if (IS_ERR(bus_data->offload_trigger)) in ad7606_spi_offload_probe()
309 return dev_err_probe(dev, PTR_ERR(bus_data->offload_trigger), in ad7606_spi_offload_probe()
312 /* TODO: PWM setup should be ok, done for the backend. PWM mutex ? */ in ad7606_spi_offload_probe()
314 bus_data->offload); in ad7606_spi_offload_probe()
326 indio_dev->setup_ops = &ad7606_offload_buffer_setup_ops; in ad7606_spi_offload_probe()
328 st->offload_en = true; in ad7606_spi_offload_probe()
338 if (st->offload_en) { in ad7606_spi_update_scan_mode()
339 unsigned int num_adc_ch = st->chip_info->num_adc_channels; in ad7606_spi_update_scan_mode()
349 return -EINVAL; in ad7606_spi_update_scan_mode()
461 return ad7606_probe(&spi->dev, spi->irq, NULL, in ad7606_spi_probe()
462 bus_info->chip_info, bus_info->bops); in ad7606_spi_probe()
466 { "ad7605-4", (kernel_ulong_t)&ad7605_4_bus_info },
467 { "ad7606-4", (kernel_ulong_t)&ad7606_4_bus_info },
468 { "ad7606-6", (kernel_ulong_t)&ad7606_6_bus_info },
469 { "ad7606-8", (kernel_ulong_t)&ad7606_8_bus_info },
471 { "ad7606c-16", (kernel_ulong_t)&ad7606c_16_bus_info },
472 { "ad7606c-18", (kernel_ulong_t)&ad7606c_18_bus_info },
482 { .compatible = "adi,ad7605-4", .data = &ad7605_4_bus_info },
483 { .compatible = "adi,ad7606-4", .data = &ad7606_4_bus_info },
484 { .compatible = "adi,ad7606-6", .data = &ad7606_6_bus_info },
485 { .compatible = "adi,ad7606-8", .data = &ad7606_8_bus_info },
487 { .compatible = "adi,ad7606c-16", .data = &ad7606c_16_bus_info },
488 { .compatible = "adi,ad7606c-18", .data = &ad7606c_18_bus_info },