1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Analog Devices Generic AXI ADC IP core driver/library
4  * Link: https://wiki.analog.com/resources/fpga/docs/axi_adc_ip
5  *
6  * Copyright 2012-2020 Analog Devices Inc.
7  */
8 #ifndef __ADI_AXI_ADC_H__
9 #define __ADI_AXI_ADC_H__
10 
11 struct device;
12 struct iio_chan_spec;
13 
14 /**
15  * struct adi_axi_adc_chip_info - Chip specific information
16  * @name		Chip name
17  * @id			Chip ID (usually product ID)
18  * @channels		Channel specifications of type @struct iio_chan_spec
19  * @num_channels	Number of @channels
20  * @scale_table		Supported scales by the chip; tuples of 2 ints
21  * @num_scales		Number of scales in the table
22  * @max_rate		Maximum sampling rate supported by the device
23  */
24 struct adi_axi_adc_chip_info {
25 	const char			*name;
26 	unsigned int			id;
27 
28 	const struct iio_chan_spec	*channels;
29 	unsigned int			num_channels;
30 
31 	const unsigned int		(*scale_table)[2];
32 	int				num_scales;
33 
34 	unsigned long			max_rate;
35 };
36 
37 /**
38  * struct adi_axi_adc_conv - data of the ADC attached to the AXI ADC
39  * @chip_info		chip info details for the client ADC
40  * @preenable_setup	op to run in the client before enabling the AXI ADC
41  * @reg_access		IIO debugfs_reg_access hook for the client ADC
42  * @read_raw		IIO read_raw hook for the client ADC
43  * @write_raw		IIO write_raw hook for the client ADC
44  */
45 struct adi_axi_adc_conv {
46 	const struct adi_axi_adc_chip_info		*chip_info;
47 
48 	int (*preenable_setup)(struct adi_axi_adc_conv *conv);
49 	int (*reg_access)(struct adi_axi_adc_conv *conv, unsigned int reg,
50 			  unsigned int writeval, unsigned int *readval);
51 	int (*read_raw)(struct adi_axi_adc_conv *conv,
52 			struct iio_chan_spec const *chan,
53 			int *val, int *val2, long mask);
54 	int (*write_raw)(struct adi_axi_adc_conv *conv,
55 			 struct iio_chan_spec const *chan,
56 			 int val, int val2, long mask);
57 };
58 
59 struct adi_axi_adc_conv *devm_adi_axi_adc_conv_register(struct device *dev,
60 							size_t sizeof_priv);
61 
62 void *adi_axi_adc_conv_priv(struct adi_axi_adc_conv *conv);
63 
64 #endif
65