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á
next prev 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.