All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Nuno Sá" <noname.nuno@gmail.com>
To: ranechita <ramona.nechita@analog.com>, linux-iio@vger.kernel.org
Cc: Jonathan Cameron <jic23@kernel.org>,
	Lars-Peter Clausen <lars@metafoo.de>,
	 Michael Hennerich <Michael.Hennerich@analog.com>,
	Liam Girdwood <lgirdwood@gmail.com>,
	Mark Brown <broonie@kernel.org>,
	 Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Nuno Sa <nuno.sa@analog.com>,
	Marius Cristea <marius.cristea@microchip.com>,
	Marcelo Schmitt <marcelo.schmitt@analog.com>,
	 Maksim Kiselev <bigunclemax@gmail.com>,
	Ivan Mikhaylov <fr0st61te@gmail.com>,
	Marcus Folkesson <marcus.folkesson@gmail.com>,
	Liam Beguin <liambeguin@gmail.com>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] drivers: iio: adc: add support for ad777x family
Date: Wed, 22 May 2024 16:35:34 +0200	[thread overview]
Message-ID: <9c19faf6ee186f144a705f458da83ea25f7a3a34.camel@gmail.com> (raw)
In-Reply-To: <20240522120005.18197-1-ramona.nechita@analog.com>

On Wed, 2024-05-22 at 14:59 +0300, ranechita wrote:
> Added support for ad7770,ad7771,ad7779 ADCs. The
> data is streamed only on the spi-mode, without
> using the data lines.
> 
> Signed-off-by: ranechita <ramona.nechita@analog.com>
> ---
>  drivers/iio/adc/Kconfig  |   11 +
>  drivers/iio/adc/Makefile |    1 +
>  drivers/iio/adc/ad7779.c | 1182 ++++++++++++++++++++++++++++++++++++++
>  3 files changed, 1194 insertions(+)
>  create mode 100644 drivers/iio/adc/ad7779.c
> 
> diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
> index 0d9282fa67f5..3e42cbc365d7 100644
> --- a/drivers/iio/adc/Kconfig
> +++ b/drivers/iio/adc/Kconfig
> @@ -206,6 +206,17 @@ config AD7768_1
>  	  To compile this driver as a module, choose M here: the module will be
>  	  called ad7768-1.
>  
> +config AD7779
> +	tristate "Analog Devices AD7779 ADC driver"
> +	depends on SPI
> +	select IIO_BUFFER
> +	help
> +	  Say yes here to build support for Analog Devices AD7779 SPI
> +	  analog to digital converter (ADC)
> +
> +	  To compile this driver as a module, choose M here: the module will be
> +	  called ad7779.
> +
>  config AD7780
>  	tristate "Analog Devices AD7780 and similar ADCs driver"
>  	depends on SPI
> diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
> index b3c434722364..e25997e926bb 100644
> --- a/drivers/iio/adc/Makefile
> +++ b/drivers/iio/adc/Makefile
> @@ -24,6 +24,7 @@ obj-$(CONFIG_AD7606_IFACE_SPI) += ad7606_spi.o
>  obj-$(CONFIG_AD7606) += ad7606.o
>  obj-$(CONFIG_AD7766) += ad7766.o
>  obj-$(CONFIG_AD7768_1) += ad7768-1.o
> +obj-$(CONFIG_AD7779) += ad7779.o
>  obj-$(CONFIG_AD7780) += ad7780.o
>  obj-$(CONFIG_AD7791) += ad7791.o
>  obj-$(CONFIG_AD7793) += ad7793.o
> diff --git a/drivers/iio/adc/ad7779.c b/drivers/iio/adc/ad7779.c
> new file mode 100644
> index 000000000000..d2c1b14464ff
> --- /dev/null
> +++ b/drivers/iio/adc/ad7779.c
> @@ -0,0 +1,1182 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * AD777X ADC
> + *
> + * Copyright 2023 Analog Devices Inc.
> + */
> +
> +#include <linux/bitfield.h>
> +#include <linux/bitops.h>
> +#include <linux/clk.h>
> +#include <linux/crc8.h>
> +#include <linux/delay.h>
> +#include <linux/err.h>
> +#include <linux/interrupt.h>
> +#include <linux/irq.h>
> +#include <linux/gpio.h>
> +#include <linux/gpio/consumer.h>
> +#include <linux/module.h>
> +#include <linux/regulator/consumer.h>
> +#include <linux/spi/spi.h>
> +#include <linux/string.h>
> +
> +#include <linux/iio/iio.h>
> +#include <linux/iio/buffer.h>
> +#include <linux/iio/kfifo_buf.h>
> +#include <linux/iio/sysfs.h>
> +
> +#include "cf_axi_adc.h"
> +
> +#define AD777X_SPI_READ_CMD			BIT(7)
> +
> +#define AD777X_DISABLE_SD			BIT(7)
> +
> +#define AD777X_REG_CH_DISABLE			0x08
> +#define AD777X_REG_CH_SYNC_OFFSET(ch)		(0x09 + (ch))
> +#define AD777X_REG_CH_CONFIG(ch)		(0x00 + (ch))
> +#define AD777X_REG_GENERAL_USER_CONFIG_1	0x11
> +#define AD777X_REG_GENERAL_USER_CONFIG_2	0x12
> +#define AD777X_REG_GENERAL_USER_CONFIG_3	0x13
> +#define AD777X_REG_DOUT_FORMAT			0x14
> +#define AD777X_REG_ADC_MUX_CONFIG		0x15
> +#define AD777X_REG_GPIO_CONFIG			0x17
> +#define AD777X_REG_BUFFER_CONFIG_1		0x19
> +#define AD777X_REG_GLOBAL_MUX_CONFIG		0x16
> +#define AD777X_REG_BUFFER_CONFIG_2		0x1A
> +#define AD777X_REG_GPIO_DATA			0x18
> +#define AD777X_REG_CH_OFFSET_UPPER_BYTE(ch)	(0x1C + (ch) * 6)
> +#define AD777X_REG_CH_OFFSET_LOWER_BYTE(ch)	(0x1E + (ch) * 6)
> +#define AD777X_REG_CH_GAIN_UPPER_BYTE(ch)	(0x1F + (ch) * 6)
> +#define AD777X_REG_CH_OFFSET_MID_BYTE(ch)	(0x1D + (ch) * 6)
> +#define AD777X_REG_CH_GAIN_MID_BYTE(ch)		(0x20 + (ch) * 6)
> +#define AD777X_REG_CH_ERR_REG(ch)		(0x4C + (ch))
> +#define AD777X_REG_CH0_1_SAT_ERR		0x54
> +#define AD777X_REG_CH_GAIN_LOWER_BYTE(ch)	(0x21 + (ch) * 6)
> +#define AD777X_REG_CH2_3_SAT_ERR		0x55
> +#define AD777X_REG_CH4_5_SAT_ERR		0x56
> +#define AD777X_REG_CH6_7_SAT_ERR		0x57
> +#define AD777X_REG_CHX_ERR_REG_EN		0x58
> +#define AD777X_REG_GEN_ERR_REG_1		0x59
> +#define AD777X_REG_GEN_ERR_REG_1_EN		0x5A
> +#define AD777X_REG_GEN_ERR_REG_2		0x5B
> +#define AD777X_REG_GEN_ERR_REG_2_EN		0x5C
> +#define AD777X_REG_STATUS_REG_1			0x5D
> +#define AD777X_REG_STATUS_REG_2			0x5E
> +#define AD777X_REG_STATUS_REG_3			0x5F
> +#define AD777X_REG_SRC_N_MSB			0x60
> +#define AD777X_REG_SRC_N_LSB			0x61
> +#define AD777X_REG_SRC_IF_MSB			0x62
> +#define AD777X_REG_SRC_IF_LSB			0x63
> +#define AD777X_REG_SRC_UPDATE			0x64
> +
> +#define AD777X_FILTER_MSK			BIT(6)
> +#define AD777X_MOD_POWERMODE_MSK		BIT(6)
> +#define AD777X_MOD_PDB_REFOUT_MSK		BIT(4)
> +#define AD777X_MOD_SPI_EN_MSK			BIT(4)
> +
> +/* AD777X_REG_DOUT_FORMAT */
> +#define AD777X_DOUT_FORMAT_MSK			GENMASK(7, 6)
> +#define AD777X_DOUT_HEADER_FORMAT		BIT(5)
> +#define AD777X_DCLK_CLK_DIV_MSK			GENMASK(3, 1)
> +
> +#define AD777X_REFMUX_CTRL_MSK			GENMASK(7, 6)
> +#define AD777X_SPI_CRC_EN_MSK			BIT(0)
> +
> +#define AD777X_MAXCLK_LOWPOWER			4096000
> +#define AD777X_NUM_CHANNELS			8
> +#define AD777X_RESET_BUF_SIZE			8
> +
> +#define AD777X_LOWPOWER_DIV			512
> +#define AD777X_HIGHPOWER_DIV			2048
> +
> +#define AD777X_SINC3_MAXFREQ			16000
> +#define AD777X_SINC5_MAXFREQ			128000
> +
> +#define AD777X_DEFAULT_SAMPLING_FREQ		8000
> +#define AD777X_DEFAULT_SAMPLING_2LINE		4000
> +#define AD777X_DEFAULT_SAMPLING_1LINE		2000
> +
> +#define AD777X_SPIMODE_MAX_SAMP_FREQ		16000
> +
> +/* AXI CONTROL REGS VALUES FOR DATA LINES */
> +#define AXI_CTRL_4_LINES			0x400
> +#define AXI_CTRL_2_LINES			0x200
> +#define AXI_CTRL_1_LINE				0x100
> +
> +#define DEC3					1000
> +#define DEC6					1000000
> +
> +#define GAIN_REL				0x555555
> +#define AD777X_FREQ_MSB_MSK			GENMASK(15, 8)
> +#define AD777X_FREQ_LSB_MSK			GENMASK(7, 0)
> +#define AD777X_UPPER				GENMASK(23, 16)
> +#define AD777X_MID				GENMASK(15, 8)
> +#define AD777X_LOWER				GENMASK(7, 0)
> +
> +#define AD777X_CRC8_POLY			0x07
> +DECLARE_CRC8_TABLE(ad777x_crc8_table);
> +
> +enum ad777x_data_lines {
> +	AD777x_4LINES,
> +	AD777x_2LINES,
> +	AD777x_1LINE,
> +};
> +
> +enum ad777x_filter {
> +	AD777X_SINC3,
> +	AD777X_SINC5,
> +};
> +
> +enum ad777x_variant {
> +	ad7770,
> +	ad7771,
> +	ad7779,
> +};
> +
> +enum ad777x_power_mode {
> +	AD777X_LOW_POWER,
> +	AD777X_HIGH_POWER,
> +};
> +
> +struct ad777x_chip_info {
> +	const char *name;
> +};
> +
> +struct ad777x_state {
> +	struct spi_device		*spi;
> +	const struct ad777x_chip_info	*chip_info;
> +	struct clk			*mclk;
> +	struct regulator		*vref;
> +	unsigned int			sampling_freq;
> +	enum ad777x_power_mode		power_mode;
> +	enum ad777x_data_lines		data_lines;
> +	enum ad777x_filter		filter_enabled;
> +	unsigned int			active_ch;
> +	unsigned int			spidata_mode;
> +	unsigned int			crc_enabled;
> +
> +	/*
> +	 * DMA (thus cache coherency maintenance) requires the
> +	 * transfer buffers to live in their own cache lines.
> +	 */
> +	u8			reg_rx_buf[3] ____cacheline_aligned;
> +	u8			reg_tx_buf[3];
> +	u8			spidata_rx[32];
> +	u8			spidata_tx[32];
> +	u8			reset_buf[8];
> +};
> +
> +static const char * const ad777x_filter_type[] = {
> +	[AD777X_SINC3] = "sinc3_filter",
> +	[AD777X_SINC5] = "sinc5_filter",
> +};
> +
> +static const char * const ad777x_data_lines_modes[] = {
> +	[AD777x_4LINES] = "4_data_lines",
> +	[AD777x_2LINES] = "2_data_lines",
> +	[AD777x_1LINE]  = "1_data_line",
> +};
> +
> +static bool ad777x_has_axi_adc(struct device *dev)
> +{
> +	return device_property_present(dev, "spibus-connected");
> +}
> +
> +static struct ad777x_state *ad777x_get_data(struct iio_dev *indio_dev)
> +{
> +	struct axiadc_converter *conv;
> +
> +	if (ad777x_has_axi_adc(&indio_dev->dev)) {
> +		conv = iio_device_get_drvdata(indio_dev);
> +		return conv->phy;
> +	}
> +
> +	return iio_priv(indio_dev);
> +}
> +

Hi Ramona,

Is this even compiling? This is definitely not code to be upstreamed since it relies
on the our out-of-tree/legacy driver for the adi-axi-adc. You need to convert this to
use the IIO backend framework (adding new interfaces if needed).

- Nuno Sá

  parent reply	other threads:[~2024-05-22 14:35 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-22 11:59 [PATCH] drivers: iio: adc: add support for ad777x family ranechita
2024-05-22 14:18 ` Andy Shevchenko
2024-05-29 15:01   ` Nechita, Ramona
2024-05-29 15:11     ` Andy Shevchenko
2024-05-29 15:45       ` Nechita, Ramona
2024-05-30 15:07         ` Andy Shevchenko
2024-05-22 14:35 ` Nuno Sá [this message]
2024-05-22 15:01   ` Nechita, Ramona
2024-05-22 15:07     ` Andy Shevchenko
2024-05-22 22:40 ` kernel test robot
2024-05-24  7:17 ` kernel test robot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9c19faf6ee186f144a705f458da83ea25f7a3a34.camel@gmail.com \
    --to=noname.nuno@gmail.com \
    --cc=Michael.Hennerich@analog.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=bigunclemax@gmail.com \
    --cc=broonie@kernel.org \
    --cc=fr0st61te@gmail.com \
    --cc=jic23@kernel.org \
    --cc=lars@metafoo.de \
    --cc=lgirdwood@gmail.com \
    --cc=liambeguin@gmail.com \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marcelo.schmitt@analog.com \
    --cc=marcus.folkesson@gmail.com \
    --cc=marius.cristea@microchip.com \
    --cc=nuno.sa@analog.com \
    --cc=ramona.nechita@analog.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.