Commit ac856912 authored by Guillaume Stols's avatar Guillaume Stols Committed by Jonathan Cameron
Browse files

iio: adc: ad7606: add support for writing registers when using backend



Add the logic for effectively enabling the software mode for the
iio-backend, i.e. enabling the software mode channel configuration and
implementing the register writing functions.

Signed-off-by: default avatarGuillaume Stols <gstols@baylibre.com>
Co-developed-by: default avatarAngelo Dureghello <adureghello@baylibre.com>
Signed-off-by: default avatarAngelo Dureghello <adureghello@baylibre.com>
Link: https://patch.msgid.link/20250210-wip-bl-ad7606_add_backend_sw_mode-v4-9-160df18b1da7@baylibre.com


Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 5efb0a3c
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -96,6 +96,21 @@
		BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),  \
		0, 0, 16)

#define AD7606_BI_SW_CHANNEL(num)			\
	AD760X_CHANNEL(num,				\
		/* mask separate */			\
		BIT(IIO_CHAN_INFO_SCALE),		\
		/* mask type */				\
		0,					\
		/* mask all */				\
		BIT(IIO_CHAN_INFO_SAMP_FREQ) |		\
		BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),	\
		/* mask separate available */		\
		BIT(IIO_CHAN_INFO_SCALE),		\
		/* mask all available */		\
		BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),	\
		16)

struct ad7606_state;

typedef int (*ad7606_scale_setup_cb_t)(struct iio_dev *indio_dev,
+48 −4
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <linux/iio/iio.h>

#include "ad7606.h"
#include "ad7606_bus_iface.h"

static const struct iio_chan_spec ad7606b_bi_channels[] = {
	AD7606_BI_CHANNEL(0),
@@ -31,7 +32,19 @@ static const struct iio_chan_spec ad7606b_bi_channels[] = {
	AD7606_BI_CHANNEL(7),
};

static int ad7606_bi_update_scan_mode(struct iio_dev *indio_dev, const unsigned long *scan_mask)
static const struct iio_chan_spec ad7606b_bi_sw_channels[] = {
	AD7606_BI_SW_CHANNEL(0),
	AD7606_BI_SW_CHANNEL(1),
	AD7606_BI_SW_CHANNEL(2),
	AD7606_BI_SW_CHANNEL(3),
	AD7606_BI_SW_CHANNEL(4),
	AD7606_BI_SW_CHANNEL(5),
	AD7606_BI_SW_CHANNEL(6),
	AD7606_BI_SW_CHANNEL(7),
};

static int ad7606_par_bus_update_scan_mode(struct iio_dev *indio_dev,
					   const unsigned long *scan_mask)
{
	struct ad7606_state *st = iio_priv(indio_dev);
	unsigned int c, ret;
@@ -48,7 +61,8 @@ static int ad7606_bi_update_scan_mode(struct iio_dev *indio_dev, const unsigned
	return 0;
}

static int ad7606_bi_setup_iio_backend(struct device *dev, struct iio_dev *indio_dev)
static int ad7606_par_bus_setup_iio_backend(struct device *dev,
					    struct iio_dev *indio_dev)
{
	struct ad7606_state *st = iio_priv(indio_dev);
	unsigned int ret, c;
@@ -86,9 +100,39 @@ static int ad7606_bi_setup_iio_backend(struct device *dev, struct iio_dev *indio
	return 0;
}

static int ad7606_par_bus_reg_read(struct ad7606_state *st, unsigned int addr)
{
	struct ad7606_platform_data *pdata = st->dev->platform_data;
	int val, ret;

	ret = pdata->bus_reg_read(st->back, addr, &val);
	if (ret)
		return ret;

	return val;
}

static int ad7606_par_bus_reg_write(struct ad7606_state *st, unsigned int addr,
				    unsigned int val)
{
	struct ad7606_platform_data *pdata = st->dev->platform_data;

	return pdata->bus_reg_write(st->back, addr, val);
}

static int ad7606_par_bus_sw_mode_config(struct iio_dev *indio_dev)
{
	indio_dev->channels = ad7606b_bi_sw_channels;

	return 0;
}

static const struct ad7606_bus_ops ad7606_bi_bops = {
	.iio_backend_config = ad7606_bi_setup_iio_backend,
	.update_scan_mode = ad7606_bi_update_scan_mode,
	.iio_backend_config = ad7606_par_bus_setup_iio_backend,
	.update_scan_mode = ad7606_par_bus_update_scan_mode,
	.reg_read = ad7606_par_bus_reg_read,
	.reg_write = ad7606_par_bus_reg_write,
	.sw_mode_config = ad7606_par_bus_sw_mode_config,
};

static int ad7606_par16_read_block(struct device *dev,