• Home
  • Raw
  • Download

Lines Matching +full:axi +full:- +full:adc

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Analog Devices Generic AXI ADC IP core
6 * Copyright 2012-2020 Analog Devices Inc.
22 #include <linux/iio/buffer-dmaengine.h>
24 #include <linux/fpga/adi-axi-common.h>
25 #include <linux/iio/adc/adi-axi-adc.h>
32 /* ADC controls */
39 /* ADC Channel controls */
97 iowrite32(val, st->regs + reg); in adi_axi_adc_write()
103 return ioread32(st->regs + reg); in adi_axi_adc_read()
114 if (device_property_read_string(dev, "dma-names", &dma_name)) in adi_axi_adc_config_dma_buffer()
117 return devm_iio_dmaengine_buffer_setup(indio_dev->dev.parent, in adi_axi_adc_config_dma_buffer()
126 struct adi_axi_adc_conv *conv = &st->client->conv; in adi_axi_adc_read_raw()
128 if (!conv->read_raw) in adi_axi_adc_read_raw()
129 return -EOPNOTSUPP; in adi_axi_adc_read_raw()
131 return conv->read_raw(conv, chan, val, val2, mask); in adi_axi_adc_read_raw()
139 struct adi_axi_adc_conv *conv = &st->client->conv; in adi_axi_adc_write_raw()
141 if (!conv->write_raw) in adi_axi_adc_write_raw()
142 return -EOPNOTSUPP; in adi_axi_adc_write_raw()
144 return conv->write_raw(conv, chan, val, val2, mask); in adi_axi_adc_write_raw()
153 struct adi_axi_adc_conv *conv = &st->client->conv; in adi_axi_adc_read_avail()
155 if (!conv->read_avail) in adi_axi_adc_read_avail()
156 return -EOPNOTSUPP; in adi_axi_adc_read_avail()
158 return conv->read_avail(conv, chan, vals, type, length, mask); in adi_axi_adc_read_avail()
165 struct adi_axi_adc_conv *conv = &st->client->conv; in adi_axi_adc_update_scan_mode()
168 for (i = 0; i < conv->chip_info->num_channels; i++) { in adi_axi_adc_update_scan_mode()
194 return ERR_PTR(-ENOMEM); in adi_axi_adc_conv_register()
198 cl->dev = get_device(dev); in adi_axi_adc_conv_register()
200 list_add_tail(&cl->entry, &registered_clients); in adi_axi_adc_conv_register()
204 return &cl->conv; in adi_axi_adc_conv_register()
213 list_del(&cl->entry); in adi_axi_adc_conv_unregister()
214 put_device(cl->dev); in adi_axi_adc_conv_unregister()
264 return ERR_PTR(-ENODEV); in adi_axi_adc_attach_client()
266 cln = of_parse_phandle(dev->of_node, "adi,adc-dev", 0); in adi_axi_adc_attach_client()
268 dev_err(dev, "No 'adi,adc-dev' node defined\n"); in adi_axi_adc_attach_client()
269 return ERR_PTR(-ENODEV); in adi_axi_adc_attach_client()
275 if (!cl->dev) in adi_axi_adc_attach_client()
278 if (cl->dev->of_node != cln) in adi_axi_adc_attach_client()
281 if (!try_module_get(cl->dev->driver->owner)) { in adi_axi_adc_attach_client()
284 return ERR_PTR(-ENODEV); in adi_axi_adc_attach_client()
287 get_device(cl->dev); in adi_axi_adc_attach_client()
288 cl->info = info; in adi_axi_adc_attach_client()
297 return ERR_PTR(-EPROBE_DEFER); in adi_axi_adc_attach_client()
303 struct adi_axi_adc_conv *conv = &st->client->conv; in adi_axi_adc_setup_channels()
306 if (conv->preenable_setup) { in adi_axi_adc_setup_channels()
307 ret = conv->preenable_setup(conv); in adi_axi_adc_setup_channels()
312 for (i = 0; i < conv->chip_info->num_channels; i++) { in adi_axi_adc_setup_channels()
334 put_device(cl->dev); in adi_axi_adc_cleanup()
335 module_put(cl->dev->driver->owner); in adi_axi_adc_cleanup()
347 cl = adi_axi_adc_attach_client(&pdev->dev); in adi_axi_adc_probe()
351 ret = devm_add_action_or_reset(&pdev->dev, adi_axi_adc_cleanup, cl); in adi_axi_adc_probe()
355 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*st)); in adi_axi_adc_probe()
357 return -ENOMEM; in adi_axi_adc_probe()
360 st->client = cl; in adi_axi_adc_probe()
361 cl->state = st; in adi_axi_adc_probe()
362 mutex_init(&st->lock); in adi_axi_adc_probe()
364 st->regs = devm_platform_ioremap_resource(pdev, 0); in adi_axi_adc_probe()
365 if (IS_ERR(st->regs)) in adi_axi_adc_probe()
366 return PTR_ERR(st->regs); in adi_axi_adc_probe()
368 conv = &st->client->conv; in adi_axi_adc_probe()
374 if (cl->info->version > ver) { in adi_axi_adc_probe()
375 dev_err(&pdev->dev, in adi_axi_adc_probe()
377 ADI_AXI_PCORE_VER_MAJOR(cl->info->version), in adi_axi_adc_probe()
378 ADI_AXI_PCORE_VER_MINOR(cl->info->version), in adi_axi_adc_probe()
379 ADI_AXI_PCORE_VER_PATCH(cl->info->version), in adi_axi_adc_probe()
383 return -ENODEV; in adi_axi_adc_probe()
386 indio_dev->info = &adi_axi_adc_info; in adi_axi_adc_probe()
387 indio_dev->name = "adi-axi-adc"; in adi_axi_adc_probe()
388 indio_dev->modes = INDIO_DIRECT_MODE; in adi_axi_adc_probe()
389 indio_dev->num_channels = conv->chip_info->num_channels; in adi_axi_adc_probe()
390 indio_dev->channels = conv->chip_info->channels; in adi_axi_adc_probe()
392 ret = adi_axi_adc_config_dma_buffer(&pdev->dev, indio_dev); in adi_axi_adc_probe()
396 ret = adi_axi_adc_setup_channels(&pdev->dev, st); in adi_axi_adc_probe()
400 ret = devm_iio_device_register(&pdev->dev, indio_dev); in adi_axi_adc_probe()
404 dev_info(&pdev->dev, "AXI ADC IP core (%d.%.2d.%c) probed\n", in adi_axi_adc_probe()
414 { .compatible = "adi,axi-adc-10.0.a", .data = &adi_axi_adc_10_0_a_info },
429 MODULE_DESCRIPTION("Analog Devices Generic AXI ADC IP core driver");