Lines Matching +full:adc +full:- +full:chan
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Analog Devices Generic AXI ADC IP core
6 * Copyright 2012-2020 Analog Devices Inc.
9 #include <linux/adi-axi-common.h>
25 #include <linux/iio/buffer-dmaengine.h>
35 /* ADC controls */
64 /* ADC Channel controls */
134 guard(mutex)(&st->lock); in axi_adc_enable()
135 ret = regmap_set_bits(st->regmap, ADI_AXI_REG_RSTN, in axi_adc_enable()
145 ret = regmap_read_poll_timeout(st->regmap, ADI_AXI_ADC_REG_DRP_STATUS, in axi_adc_enable()
151 return regmap_set_bits(st->regmap, ADI_AXI_REG_RSTN, in axi_adc_enable()
159 guard(mutex)(&st->lock); in axi_adc_disable()
160 regmap_write(st->regmap, ADI_AXI_REG_RSTN, 0); in axi_adc_disable()
163 static int axi_adc_data_format_set(struct iio_backend *back, unsigned int chan, in axi_adc_data_format_set() argument
169 if (!data->enable) in axi_adc_data_format_set()
170 return regmap_clear_bits(st->regmap, in axi_adc_data_format_set()
171 ADI_AXI_REG_CHAN_CTRL(chan), in axi_adc_data_format_set()
175 if (data->sign_extend) in axi_adc_data_format_set()
177 if (data->type == IIO_BACKEND_OFFSET_BINARY) in axi_adc_data_format_set()
180 return regmap_update_bits(st->regmap, ADI_AXI_REG_CHAN_CTRL(chan), in axi_adc_data_format_set()
191 return regmap_clear_bits(st->regmap, ADI_AXI_ADC_REG_CTRL, in axi_adc_data_sample_trigger()
194 return regmap_set_bits(st->regmap, ADI_AXI_ADC_REG_CTRL, in axi_adc_data_sample_trigger()
197 return -EINVAL; in axi_adc_data_sample_trigger()
209 return -EINVAL; in axi_adc_iodelays_set()
211 return -EINVAL; in axi_adc_iodelays_set()
213 guard(mutex)(&st->lock); in axi_adc_iodelays_set()
214 ret = regmap_write(st->regmap, ADI_AXI_ADC_REG_DELAY(lane), tap); in axi_adc_iodelays_set()
221 ret = regmap_read(st->regmap, ADI_AXI_ADC_REG_DELAY(lane), &val); in axi_adc_iodelays_set()
225 return -EIO; in axi_adc_iodelays_set()
231 unsigned int chan, in axi_adc_test_pattern_set() argument
241 return regmap_update_bits(st->regmap, ADI_AXI_ADC_REG_CHAN_CTRL_3(chan), in axi_adc_test_pattern_set()
245 return regmap_update_bits(st->regmap, ADI_AXI_ADC_REG_CHAN_CTRL_3(chan), in axi_adc_test_pattern_set()
249 return -EINVAL; in axi_adc_test_pattern_set()
254 unsigned int chan, in axi_adc_oversampling_ratio_set() argument
259 return regmap_update_bits(st->regmap, in axi_adc_oversampling_ratio_set()
260 ADI_AXI_ADC_REG_CHAN_USR_CTRL_2(chan), in axi_adc_oversampling_ratio_set()
266 static int axi_adc_read_chan_status(struct adi_axi_adc_state *st, unsigned int chan, in axi_adc_read_chan_status() argument
271 guard(mutex)(&st->lock); in axi_adc_read_chan_status()
273 ret = regmap_write(st->regmap, ADI_AXI_ADC_REG_CHAN_STATUS(chan), in axi_adc_read_chan_status()
281 return regmap_read(st->regmap, ADI_AXI_ADC_REG_CHAN_STATUS(chan), in axi_adc_read_chan_status()
285 static int axi_adc_chan_status(struct iio_backend *back, unsigned int chan, in axi_adc_chan_status() argument
292 ret = axi_adc_read_chan_status(st, chan, &val); in axi_adc_chan_status()
305 unsigned int chan, char *buf, in axi_adc_debugfs_print_chan_status() argument
312 ret = axi_adc_read_chan_status(st, chan, &val); in axi_adc_debugfs_print_chan_status()
321 return scnprintf(buf, len, "CH%u: Out of Sync.\n", chan); in axi_adc_debugfs_print_chan_status()
323 return scnprintf(buf, len, "CH%u: Spurious Out of Sync.\n", chan); in axi_adc_debugfs_print_chan_status()
325 return scnprintf(buf, len, "CH%u: OK.\n", chan); in axi_adc_debugfs_print_chan_status()
328 static int axi_adc_chan_enable(struct iio_backend *back, unsigned int chan) in axi_adc_chan_enable() argument
332 return regmap_set_bits(st->regmap, ADI_AXI_REG_CHAN_CTRL(chan), in axi_adc_chan_enable()
336 static int axi_adc_chan_disable(struct iio_backend *back, unsigned int chan) in axi_adc_chan_disable() argument
340 return regmap_clear_bits(st->regmap, ADI_AXI_REG_CHAN_CTRL(chan), in axi_adc_chan_disable()
351 ret = regmap_read(st->regmap, ADI_AXI_ADC_REG_CONFIG, &val); in axi_adc_interface_type_get()
372 * 16-bit and a 20-bit variant. in axi_adc_ad485x_data_size_set()
374 * to the 16-bit variant of the IP block. in axi_adc_ad485x_data_size_set()
385 * 20-bit variant of the IP block. Setting this value properly is in axi_adc_ad485x_data_size_set()
386 * ensured by the upper layers of the drivers calling the axi-adc in axi_adc_ad485x_data_size_set()
388 * Also, for 16-bit IP block, the 0x2 (AXI_AD485X_PACKET_FORMAT_32BIT) in axi_adc_ad485x_data_size_set()
389 * value is handled as maximum size available which is 24-bit for this in axi_adc_ad485x_data_size_set()
396 return -EINVAL; in axi_adc_ad485x_data_size_set()
399 return regmap_update_bits(st->regmap, ADI_AXI_ADC_REG_CNTRL_3, in axi_adc_ad485x_data_size_set()
405 unsigned int chan, in axi_adc_ad485x_oversampling_ratio_set() argument
417 return -EINVAL; in axi_adc_ad485x_oversampling_ratio_set()
419 return regmap_clear_bits(st->regmap, ADI_AXI_ADC_REG_CNTRL_3, in axi_adc_ad485x_oversampling_ratio_set()
422 return regmap_set_bits(st->regmap, ADI_AXI_ADC_REG_CNTRL_3, in axi_adc_ad485x_oversampling_ratio_set()
433 return regmap_set_bits(st->regmap, ADI_AXI_ADC_REG_CNTRL_3, in axi_adc_ad408x_filter_type_set()
436 return regmap_clear_bits(st->regmap, ADI_AXI_ADC_REG_CNTRL_3, in axi_adc_ad408x_filter_type_set()
447 ret = regmap_set_bits(st->regmap, ADI_AXI_ADC_REG_CTRL, in axi_adc_ad408x_interface_data_align()
452 return regmap_read_poll_timeout(st->regmap, ADI_AXI_ADC_REG_SYNC_STATUS, in axi_adc_ad408x_interface_data_align()
464 return -EINVAL; in axi_adc_num_lanes_set()
466 return regmap_update_bits(st->regmap, ADI_AXI_ADC_REG_CTRL, in axi_adc_num_lanes_set()
477 if (device_property_read_string(st->dev, "dma-names", &dma_name)) in axi_adc_request_buffer()
480 return iio_dmaengine_buffer_setup(st->dev, indio_dev, dma_name); in axi_adc_request_buffer()
487 regmap_write(st->regmap, ADI_AXI_REG_CONFIG_WR, val); in axi_adc_raw_write()
488 regmap_write(st->regmap, ADI_AXI_REG_CONFIG_CTRL, in axi_adc_raw_write()
491 regmap_write(st->regmap, ADI_AXI_REG_CONFIG_CTRL, 0x00); in axi_adc_raw_write()
501 regmap_write(st->regmap, ADI_AXI_REG_CONFIG_CTRL, in axi_adc_raw_read()
504 regmap_read(st->regmap, ADI_AXI_REG_CONFIG_RD, val); in axi_adc_raw_read()
505 regmap_write(st->regmap, ADI_AXI_REG_CONFIG_CTRL, 0x00); in axi_adc_raw_read()
516 guard(mutex)(&st->lock); in ad7606_bus_reg_read()
528 /* Write 0x0 on the bus to get back to ADC mode */ in ad7606_bus_reg_read()
539 guard(mutex)(&st->lock); in ad7606_bus_reg_write()
548 /* Write 0x0 on the bus to get back to ADC mode */ in ad7606_bus_reg_write()
566 return regmap_read(st->regmap, reg, readval); in axi_adc_reg_access()
568 return regmap_write(st->regmap, reg, writeval); in axi_adc_reg_access()
586 .parent = st->dev, in axi_adc_create_platform_device()
590 .data = st->info->pdata, in axi_adc_create_platform_device()
591 .size_data = st->info->pdata_sz, in axi_adc_create_platform_device()
600 ret = devm_add_action_or_reset(st->dev, axi_adc_child_remove, pdev); in axi_adc_create_platform_device()
626 .name = "axi-adc",
650 .name = "axi-ad485x",
670 .name = "axi-ad408x",
682 st = devm_kzalloc(&pdev->dev, sizeof(*st), GFP_KERNEL); in adi_axi_adc_probe()
684 return -ENOMEM; in adi_axi_adc_probe()
690 st->dev = &pdev->dev; in adi_axi_adc_probe()
691 st->regmap = devm_regmap_init_mmio(&pdev->dev, base, in adi_axi_adc_probe()
693 if (IS_ERR(st->regmap)) in adi_axi_adc_probe()
694 return dev_err_probe(&pdev->dev, PTR_ERR(st->regmap), in adi_axi_adc_probe()
697 st->info = device_get_match_data(&pdev->dev); in adi_axi_adc_probe()
698 if (!st->info) in adi_axi_adc_probe()
699 return -ENODEV; in adi_axi_adc_probe()
701 clk = devm_clk_get_enabled(&pdev->dev, NULL); in adi_axi_adc_probe()
703 return dev_err_probe(&pdev->dev, PTR_ERR(clk), in adi_axi_adc_probe()
710 ret = regmap_write(st->regmap, ADI_AXI_REG_RSTN, 0); in adi_axi_adc_probe()
714 ret = regmap_read(st->regmap, ADI_AXI_REG_VERSION, &ver); in adi_axi_adc_probe()
719 ADI_AXI_PCORE_VER_MAJOR(st->info->version)) { in adi_axi_adc_probe()
720 dev_err(&pdev->dev, in adi_axi_adc_probe()
722 ADI_AXI_PCORE_VER_MAJOR(st->info->version), in adi_axi_adc_probe()
723 ADI_AXI_PCORE_VER_MINOR(st->info->version), in adi_axi_adc_probe()
724 ADI_AXI_PCORE_VER_PATCH(st->info->version), in adi_axi_adc_probe()
728 return -ENODEV; in adi_axi_adc_probe()
731 ret = devm_iio_backend_register(&pdev->dev, st->info->backend_info, st); in adi_axi_adc_probe()
733 return dev_err_probe(&pdev->dev, ret, in adi_axi_adc_probe()
736 device_for_each_child_node_scoped(&pdev->dev, child) { in adi_axi_adc_probe()
739 if (!st->info->has_child_nodes) in adi_axi_adc_probe()
740 return dev_err_probe(&pdev->dev, -EINVAL, in adi_axi_adc_probe()
741 "invalid fdt axi-dac compatible."); in adi_axi_adc_probe()
746 return dev_err_probe(&pdev->dev, ret, in adi_axi_adc_probe()
749 return dev_err_probe(&pdev->dev, -EINVAL, in adi_axi_adc_probe()
754 return dev_err_probe(&pdev->dev, -EINVAL, in adi_axi_adc_probe()
758 dev_info(&pdev->dev, "AXI ADC IP core (%d.%.2d.%c) probed\n", in adi_axi_adc_probe()
796 { .compatible = "adi,axi-adc-10.0.a", .data = &adc_generic },
797 { .compatible = "adi,axi-ad408x", .data = &adi_axi_ad408x },
798 { .compatible = "adi,axi-ad485x", .data = &adi_axi_ad485x },
799 { .compatible = "adi,axi-ad7606x", .data = &adc_ad7606 },
814 MODULE_DESCRIPTION("Analog Devices Generic AXI ADC IP core driver");