/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Analog Devices Generic AXI ADC IP core driver/library
 * Link: https://wiki.analog.com/resources/fpga/docs/axi_adc_ip
 *
 * Copyright 2012-2020 Analog Devices Inc.
 */
#ifndef __ADI_AXI_ADC_H__
#define __ADI_AXI_ADC_H__

struct device;
struct iio_chan_spec;

/**
 * struct adi_axi_adc_chip_info - Chip specific information
 * @name		Chip name
 * @id			Chip ID (usually product ID)
 * @channels		Channel specifications of type @struct iio_chan_spec
 * @num_channels	Number of @channels
 * @scale_table		Supported scales by the chip; tuples of 2 ints
 * @num_scales		Number of scales in the table
 * @max_rate		Maximum sampling rate supported by the device
 */
struct adi_axi_adc_chip_info {
	const char			*name;
	unsigned int			id;

	const struct iio_chan_spec	*channels;
	unsigned int			num_channels;

	const unsigned int		(*scale_table)[2];
	int				num_scales;

	unsigned long			max_rate;
};

/**
 * struct adi_axi_adc_conv - data of the ADC attached to the AXI ADC
 * @chip_info		chip info details for the client ADC
 * @preenable_setup	op to run in the client before enabling the AXI ADC
 * @reg_access		IIO debugfs_reg_access hook for the client ADC
 * @read_raw		IIO read_raw hook for the client ADC
 * @write_raw		IIO write_raw hook for the client ADC
 * @read_avail		IIO read_avail hook for the client ADC
 */
struct adi_axi_adc_conv {
	const struct adi_axi_adc_chip_info		*chip_info;

	int (*preenable_setup)(struct adi_axi_adc_conv *conv);
	int (*reg_access)(struct adi_axi_adc_conv *conv, unsigned int reg,
			  unsigned int writeval, unsigned int *readval);
	int (*read_raw)(struct adi_axi_adc_conv *conv,
			struct iio_chan_spec const *chan,
			int *val, int *val2, long mask);
	int (*write_raw)(struct adi_axi_adc_conv *conv,
			 struct iio_chan_spec const *chan,
			 int val, int val2, long mask);
	int (*read_avail)(struct adi_axi_adc_conv *conv,
			  struct iio_chan_spec const *chan,
			  const int **val, int *type, int *length, long mask);
};

struct adi_axi_adc_conv *devm_adi_axi_adc_conv_register(struct device *dev,
							size_t sizeof_priv);

void *adi_axi_adc_conv_priv(struct adi_axi_adc_conv *conv);

#endif
