Lines Matching +full:axi +full:- +full:ad3552r
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Analog Devices Generic AXI DAC IP core
6 * Copyright 2016-2024 Analog Devices Inc.
26 #include <linux/fpga/adi-axi-common.h>
28 #include <linux/iio/buffer-dmaengine.h>
32 #include "ad3552r-hs.h"
126 guard(mutex)(&st->lock); in axi_dac_enable()
127 ret = regmap_set_bits(st->regmap, AXI_DAC_RSTN_REG, in axi_dac_enable()
136 ret = regmap_read_poll_timeout(st->regmap, AXI_DAC_DRP_STATUS_REG, in axi_dac_enable()
143 return regmap_set_bits(st->regmap, AXI_DAC_RSTN_REG, in axi_dac_enable()
151 guard(mutex)(&st->lock); in axi_dac_disable()
152 regmap_write(st->regmap, AXI_DAC_RSTN_REG, 0); in axi_dac_disable()
161 if (device_property_read_string(st->dev, "dma-names", &dma_name)) in axi_dac_request_buffer()
164 return iio_dmaengine_buffer_setup_ext(st->dev, indio_dev, dma_name, in axi_dac_request_buffer()
189 if (!st->dac_clk) { in __axi_dac_frequency_get()
190 dev_err(st->dev, "Sampling rate is 0...\n"); in __axi_dac_frequency_get()
191 return -EINVAL; in __axi_dac_frequency_get()
199 ret = regmap_read(st->regmap, reg, &raw); in __axi_dac_frequency_get()
204 *freq = DIV_ROUND_CLOSEST_ULL(raw * st->dac_clk, BIT(16)); in __axi_dac_frequency_get()
216 scoped_guard(mutex, &st->lock) { in axi_dac_frequency_get()
217 ret = __axi_dac_frequency_get(st, chan->channel, tone_2, &freq); in axi_dac_frequency_get()
234 reg = AXI_DAC_CHAN_CNTRL_3_REG(chan->channel); in axi_dac_scale_get()
236 reg = AXI_DAC_CHAN_CNTRL_1_REG(chan->channel); in axi_dac_scale_get()
238 ret = regmap_read(st->regmap, reg, &raw); in axi_dac_scale_get()
251 vals[0] *= -1; in axi_dac_scale_get()
253 vals[1] *= -1; in axi_dac_scale_get()
268 reg = AXI_DAC_CHAN_CNTRL_4_REG(chan->channel); in axi_dac_phase_get()
270 reg = AXI_DAC_CHAN_CNTRL_2_REG(chan->channel); in axi_dac_phase_get()
272 ret = regmap_read(st->regmap, reg, &raw); in axi_dac_phase_get()
295 dev_err(st->dev, "Invalid frequency(%u) dac_clk(%llu)\n", in __axi_dac_frequency_set()
297 return -EINVAL; in __axi_dac_frequency_set()
307 ret = regmap_update_bits(st->regmap, reg, in __axi_dac_frequency_set()
313 return regmap_set_bits(st->regmap, AXI_DAC_CNTRL_1_REG, in __axi_dac_frequency_set()
328 guard(mutex)(&st->lock); in axi_dac_frequency_set()
329 ret = __axi_dac_frequency_set(st, chan->channel, st->dac_clk, freq, in axi_dac_frequency_set()
350 if (scale <= -2 * (int)MEGA || scale >= 2 * (int)MEGA) in axi_dac_scale_set()
351 return -EINVAL; in axi_dac_scale_set()
356 scale *= -1; in axi_dac_scale_set()
362 reg = AXI_DAC_CHAN_CNTRL_3_REG(chan->channel); in axi_dac_scale_set()
364 reg = AXI_DAC_CHAN_CNTRL_1_REG(chan->channel); in axi_dac_scale_set()
366 guard(mutex)(&st->lock); in axi_dac_scale_set()
367 ret = regmap_write(st->regmap, reg, raw); in axi_dac_scale_set()
372 ret = regmap_set_bits(st->regmap, AXI_DAC_CNTRL_1_REG, in axi_dac_scale_set()
394 return -EINVAL; in axi_dac_phase_set()
399 reg = AXI_DAC_CHAN_CNTRL_4_REG(chan->channel); in axi_dac_phase_set()
401 reg = AXI_DAC_CHAN_CNTRL_2_REG(chan->channel); in axi_dac_phase_set()
403 guard(mutex)(&st->lock); in axi_dac_phase_set()
404 ret = regmap_update_bits(st->regmap, reg, AXI_DAC_CHAN_CNTRL_2_PHASE, in axi_dac_phase_set()
410 ret = regmap_set_bits(st->regmap, AXI_DAC_CNTRL_1_REG, in axi_dac_phase_set()
438 return -EOPNOTSUPP; in axi_dac_ext_info_set()
451 private - AXI_DAC_FREQ_TONE_1); in axi_dac_ext_info_get()
455 private - AXI_DAC_SCALE_TONE_1); in axi_dac_ext_info_get()
459 private - AXI_DAC_PHASE_TONE_1); in axi_dac_ext_info_get()
461 return -EOPNOTSUPP; in axi_dac_ext_info_get()
480 if (chan->type != IIO_ALTVOLTAGE) in axi_dac_extend_chan()
481 return -EINVAL; in axi_dac_extend_chan()
482 if (st->reg_config & AXI_DAC_CONFIG_DDS_DISABLE) in axi_dac_extend_chan()
486 chan->ext_info = axi_dac_ext_info; in axi_dac_extend_chan()
498 return regmap_update_bits(st->regmap, in axi_dac_data_source_set()
503 return regmap_update_bits(st->regmap, in axi_dac_data_source_set()
508 return regmap_update_bits(st->regmap, in axi_dac_data_source_set()
513 return -EINVAL; in axi_dac_data_source_set()
525 return -EINVAL; in axi_dac_set_sample_rate()
526 if (st->reg_config & AXI_DAC_CONFIG_DDS_DISABLE) in axi_dac_set_sample_rate()
530 guard(mutex)(&st->lock); in axi_dac_set_sample_rate()
538 if (!st->dac_clk) { in axi_dac_set_sample_rate()
539 st->dac_clk = sample_rate; in axi_dac_set_sample_rate()
553 st->dac_clk = sample_rate; in axi_dac_set_sample_rate()
564 return regmap_read(st->regmap, reg, readval); in axi_dac_reg_access()
566 return regmap_write(st->regmap, reg, writeval); in axi_dac_reg_access()
573 return regmap_clear_bits(st->regmap, AXI_DAC_CNTRL_2_REG, in axi_dac_ddr_enable()
581 return regmap_set_bits(st->regmap, AXI_DAC_CNTRL_2_REG, in axi_dac_ddr_disable()
589 return regmap_set_bits(st->regmap, AXI_DAC_CUSTOM_CTRL_REG, in axi_dac_data_stream_enable()
597 return regmap_clear_bits(st->regmap, AXI_DAC_CUSTOM_CTRL_REG, in axi_dac_data_stream_disable()
606 return -EINVAL; in axi_dac_data_transfer_addr()
612 return regmap_update_bits(st->regmap, AXI_DAC_CUSTOM_CTRL_REG, in axi_dac_data_transfer_addr()
623 switch (data->type) { in axi_dac_data_format_set()
625 return regmap_clear_bits(st->regmap, AXI_DAC_CNTRL_2_REG, in axi_dac_data_format_set()
628 return -EINVAL; in axi_dac_data_format_set()
651 ret = regmap_write(st->regmap, AXI_DAC_CUSTOM_WR_REG, ival); in __axi_dac_bus_reg_write()
656 ret = regmap_set_bits(st->regmap, AXI_DAC_CNTRL_2_REG, in __axi_dac_bus_reg_write()
659 ret = regmap_clear_bits(st->regmap, AXI_DAC_CNTRL_2_REG, in __axi_dac_bus_reg_write()
664 ret = regmap_update_bits(st->regmap, AXI_DAC_CUSTOM_CTRL_REG, in __axi_dac_bus_reg_write()
670 ret = regmap_update_bits(st->regmap, AXI_DAC_CUSTOM_CTRL_REG, in __axi_dac_bus_reg_write()
676 ret = regmap_read_poll_timeout(st->regmap, in __axi_dac_bus_reg_write()
680 if (ret == -ETIMEDOUT) in __axi_dac_bus_reg_write()
681 dev_err(st->dev, "AXI read timeout\n"); in __axi_dac_bus_reg_write()
684 return regmap_clear_bits(st->regmap, AXI_DAC_CUSTOM_CTRL_REG, in __axi_dac_bus_reg_write()
693 guard(mutex)(&st->lock); in axi_dac_bus_reg_write()
703 guard(mutex)(&st->lock); in axi_dac_bus_reg_read()
706 * SPI, we write with read flag, then we read just at the AXI in axi_dac_bus_reg_read()
714 return regmap_read(st->regmap, AXI_DAC_CUSTOM_RD_REG, val); in axi_dac_bus_reg_read()
728 .bus_sample_data_clock_hz = st->dac_clk_rate, in axi_dac_create_platform_device()
731 .parent = st->dev, in axi_dac_create_platform_device()
744 return devm_add_action_or_reset(st->dev, axi_dac_child_remove, pdev); in axi_dac_create_platform_device()
775 .name = "axi-dac",
780 .name = "axi-ad3552r",
799 st = devm_kzalloc(&pdev->dev, sizeof(*st), GFP_KERNEL); in axi_dac_probe()
801 return -ENOMEM; in axi_dac_probe()
803 st->info = device_get_match_data(&pdev->dev); in axi_dac_probe()
804 if (!st->info) in axi_dac_probe()
805 return -ENODEV; in axi_dac_probe()
806 clk = devm_clk_get_enabled(&pdev->dev, "s_axi_aclk"); in axi_dac_probe()
808 /* Backward compat., old fdt versions without clock-names. */ in axi_dac_probe()
809 clk = devm_clk_get_enabled(&pdev->dev, NULL); in axi_dac_probe()
811 return dev_err_probe(&pdev->dev, PTR_ERR(clk), in axi_dac_probe()
815 if (st->info->has_dac_clk) { in axi_dac_probe()
818 dac_clk = devm_clk_get_enabled(&pdev->dev, "dac_clk"); in axi_dac_probe()
820 return dev_err_probe(&pdev->dev, PTR_ERR(dac_clk), in axi_dac_probe()
824 st->dac_clk_rate = clk_get_rate(dac_clk) / 2; in axi_dac_probe()
831 st->dev = &pdev->dev; in axi_dac_probe()
832 st->regmap = devm_regmap_init_mmio(&pdev->dev, base, in axi_dac_probe()
834 if (IS_ERR(st->regmap)) in axi_dac_probe()
835 return dev_err_probe(&pdev->dev, PTR_ERR(st->regmap), in axi_dac_probe()
842 ret = regmap_write(st->regmap, AXI_DAC_RSTN_REG, 0); in axi_dac_probe()
846 ret = regmap_read(st->regmap, ADI_AXI_REG_VERSION, &ver); in axi_dac_probe()
851 ADI_AXI_PCORE_VER_MAJOR(st->info->version)) { in axi_dac_probe()
852 dev_err(&pdev->dev, in axi_dac_probe()
854 ADI_AXI_PCORE_VER_MAJOR(st->info->version), in axi_dac_probe()
855 ADI_AXI_PCORE_VER_MINOR(st->info->version), in axi_dac_probe()
856 ADI_AXI_PCORE_VER_PATCH(st->info->version), in axi_dac_probe()
860 return -ENODEV; in axi_dac_probe()
864 ret = regmap_read(st->regmap, AXI_DAC_CONFIG_REG, &st->reg_config); in axi_dac_probe()
872 * Multiple-Input and Multiple-Output (MIMO). As most of the times we in axi_dac_probe()
876 ret = regmap_set_bits(st->regmap, AXI_DAC_CNTRL_2_REG, in axi_dac_probe()
881 mutex_init(&st->lock); in axi_dac_probe()
883 ret = devm_iio_backend_register(&pdev->dev, st->info->backend_info, st); in axi_dac_probe()
885 return dev_err_probe(&pdev->dev, ret, in axi_dac_probe()
888 device_for_each_child_node_scoped(&pdev->dev, child) { in axi_dac_probe()
891 if (!st->info->has_child_nodes) in axi_dac_probe()
892 return dev_err_probe(&pdev->dev, -EINVAL, in axi_dac_probe()
893 "invalid fdt axi-dac compatible."); in axi_dac_probe()
898 return dev_err_probe(&pdev->dev, ret, in axi_dac_probe()
901 return dev_err_probe(&pdev->dev, -EINVAL, in axi_dac_probe()
906 return dev_err_probe(&pdev->dev, -EINVAL, in axi_dac_probe()
910 dev_info(&pdev->dev, "AXI DAC IP core (%d.%.2d.%c) probed\n", in axi_dac_probe()
931 { .compatible = "adi,axi-dac-9.1.b", .data = &dac_generic },
932 { .compatible = "adi,axi-ad3552r", .data = &dac_ad3552r },
939 .name = "adi-axi-dac",
947 MODULE_DESCRIPTION("Analog Devices Generic AXI DAC IP core driver");