From: Janani Sunil <janani.sunil@analog.com>
To: "Nuno Sá" <nuno.sa@analog.com>,
"Michael Hennerich" <Michael.Hennerich@analog.com>,
"Jonathan Cameron" <jic23@kernel.org>,
"David Lechner" <dlechner@baylibre.com>,
"Andy Shevchenko" <andy@kernel.org>,
"Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Olivier Moysan" <olivier.moysan@foss.st.com>,
"Philipp Zabel" <p.zabel@pengutronix.de>,
"Linus Walleij" <linusw@kernel.org>,
"Bartosz Golaszewski" <brgl@kernel.org>,
"Jonathan Corbet" <corbet@lwn.net>,
"Shuah Khan" <skhan@linuxfoundation.org>,
"Michael Walle" <mwalle@kernel.org>
Cc: linux@analog.com, linux-iio@vger.kernel.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-gpio@vger.kernel.org, linux-doc@vger.kernel.org,
jananisunil.dev@gmail.com,
"Uwe Kleine-König" <u.kleine-koenig@baylibre.com>,
"Janani Sunil" <janani.sunil@analog.com>
Subject: [PATCH v5 11/20] iio: adc: ad7768: Add per-channel filter controls
Date: Fri, 28 Aug 2026 17:30:34 +0200 [thread overview]
Message-ID: <20260828-ad7768-driver-v5-11-e33ca6f841a2@analog.com> (raw)
In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com>
Expose wideband and sinc5 filter selection for each channel. Group
enabled channels by their requested sampling frequency and filter pairs
and program each pair into one of the two hardware mode profiles.
Signed-off-by: Janani Sunil <janani.sunil@analog.com>
---
drivers/iio/adc/ad7768.c | 72 ++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 66 insertions(+), 6 deletions(-)
diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c
index 1245ec94b637..4c67f692861e 100644
--- a/drivers/iio/adc/ad7768.c
+++ b/drivers/iio/adc/ad7768.c
@@ -113,6 +113,11 @@
#define AD7768_MAX_CHANNEL 8
#define AD7768_NUM_CHANNEL_MODES 2
+enum ad7768_filter_type {
+ AD7768_FILTER_TYPE_WIDEBAND,
+ AD7768_FILTER_TYPE_SINC5,
+};
+
enum ad7768_clock_source {
AD7768_CLOCK_SOURCE_MCLK,
AD7768_CLOCK_SOURCE_XTAL,
@@ -173,6 +178,7 @@ struct ad7768_state {
unsigned int n_freqs;
int freqs[AD7768_MAX_FREQS];
unsigned int ch_freq[AD7768_MAX_CHANNEL];
+ enum ad7768_filter_type ch_filter[AD7768_MAX_CHANNEL];
struct iio_backend *back;
unsigned int vref_uV[2];
@@ -527,12 +533,59 @@ static int ad7768_set_sampling_freq(struct iio_dev *indio_dev,
return 0;
}
+static int ad7768_set_filter_mode(struct iio_dev *indio_dev,
+ const struct iio_chan_spec *chan,
+ unsigned int mode)
+{
+ struct ad7768_state *st = iio_priv(indio_dev);
+
+ IIO_DEV_ACQUIRE_DIRECT_MODE(indio_dev, claim);
+ if (IIO_DEV_ACQUIRE_FAILED(claim))
+ return -EBUSY;
+
+ guard(mutex)(&st->lock);
+ st->ch_filter[chan->channel] = mode;
+
+ return 0;
+}
+
+static int ad7768_get_filter_mode(struct iio_dev *indio_dev,
+ const struct iio_chan_spec *chan)
+{
+ struct ad7768_state *st = iio_priv(indio_dev);
+
+ guard(mutex)(&st->lock);
+
+ return st->ch_filter[chan->channel];
+}
+
+static const char *const ad7768_filter_types[] = {
+ [AD7768_FILTER_TYPE_WIDEBAND] = "wideband",
+ [AD7768_FILTER_TYPE_SINC5] = "sinc5",
+};
+
+static const struct iio_enum ad7768_filter_types_enum = {
+ .items = ad7768_filter_types,
+ .num_items = ARRAY_SIZE(ad7768_filter_types),
+ .set = ad7768_set_filter_mode,
+ .get = ad7768_get_filter_mode,
+};
+
+static struct iio_chan_spec_ext_info ad7768_ext_info[] = {
+ IIO_ENUM("filter_type", IIO_SEPARATE, &ad7768_filter_types_enum),
+ IIO_ENUM_AVAILABLE("filter_type", IIO_SEPARATE, &ad7768_filter_types_enum),
+ { }
+};
+
static int ad7768_find_matching_mode(const bool *mode_used,
const unsigned int *mode_freq,
- unsigned int freq)
+ const enum ad7768_filter_type *mode_filter,
+ unsigned int freq,
+ enum ad7768_filter_type filter)
{
for (unsigned int mode = 0; mode < AD7768_NUM_CHANNEL_MODES; mode++) {
- if (!mode_used[mode] || mode_freq[mode] == freq)
+ if (!mode_used[mode] ||
+ (mode_freq[mode] == freq && mode_filter[mode] == filter))
return mode;
}
@@ -542,6 +595,7 @@ static int ad7768_find_matching_mode(const bool *mode_used,
static int ad7768_apply_channel_modes(struct iio_dev *indio_dev,
const unsigned long *scan_mask)
{
+ enum ad7768_filter_type mode_filter[AD7768_NUM_CHANNEL_MODES] = { };
unsigned int mode_freq[AD7768_NUM_CHANNEL_MODES] = { };
bool mode_used[AD7768_NUM_CHANNEL_MODES] = { };
struct ad7768_state *st = iio_priv(indio_dev);
@@ -576,13 +630,15 @@ static int ad7768_apply_channel_modes(struct iio_dev *indio_dev,
int mode;
mode = ad7768_find_matching_mode(mode_used, mode_freq,
- st->ch_freq[c]);
+ mode_filter, st->ch_freq[c],
+ st->ch_filter[c]);
if (mode < 0)
return dev_err_probe(dev, -EINVAL,
"Over %d channel modes required\n",
AD7768_NUM_CHANNEL_MODES);
mode_freq[mode] = st->ch_freq[c];
+ mode_filter[mode] = st->ch_filter[c];
mode_used[mode] = true;
mask = ad7768_channel_mode_mask(st, c);
@@ -605,8 +661,9 @@ static int ad7768_apply_channel_modes(struct iio_dev *indio_dev,
if (ret)
return ret;
- ret = regmap_clear_bits(st->regmap, AD7768_REG_CH_MODE(mode),
- AD7768_CH_MODE_FILTER_TYPE_MSK);
+ ret = regmap_assign_bits(st->regmap, AD7768_REG_CH_MODE(mode),
+ AD7768_CH_MODE_FILTER_TYPE_MSK,
+ mode_filter[mode]);
if (ret)
return ret;
@@ -857,8 +914,10 @@ static int ad7768_init_sampling_freqs(struct ad7768_state *st)
avail_freq = &st->avail_freq[st->power_mode_idx];
default_freq = avail_freq->freq_cfg[avail_freq->n_freqs - 1].freq_hz;
for (unsigned int channel = 0;
- channel < st->chip_info->num_channels; channel++)
+ channel < st->chip_info->num_channels; channel++) {
st->ch_freq[channel] = default_freq;
+ st->ch_filter[channel] = AD7768_FILTER_TYPE_WIDEBAND;
+ }
return 0;
}
@@ -952,6 +1011,7 @@ static int ad7768_parse_config(struct iio_dev *indio_dev,
.realbits = 24,
.storagebits = 32,
},
+ .ext_info = ad7768_ext_info,
};
chan_idx++;
}
--
2.43.0
next prev parent reply other threads:[~2026-08-28 15:31 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-28 15:30 [PATCH v5 00/20] iio: adc: Add AD7768/AD7768-4 ADC driver support Janani Sunil
2026-08-28 15:30 ` [PATCH v5 01/20] iio: adc: adi-axi-adc: Initialize state mutex Janani Sunil
2026-08-28 15:30 ` [PATCH v5 02/20] dt-bindings: iio: adc: Add AD7768 Janani Sunil
2026-08-28 15:30 ` [PATCH v5 03/20] iio: backend: Add support for CRC Janani Sunil
2026-08-28 15:30 ` [PATCH v5 04/20] iio: adc: adi-axi-adc: " Janani Sunil
2026-08-28 15:30 ` [PATCH v5 05/20] iio: adc: Add AD7768 and AD7768-4 core support Janani Sunil
2026-08-28 15:30 ` [PATCH v5 06/20] iio: adc: ad7768: Validate master clock rate Janani Sunil
2026-08-28 15:30 ` [PATCH v5 07/20] iio: adc: ad7768: Add power mode helper Janani Sunil
2026-08-28 15:30 ` [PATCH v5 08/20] iio: adc: ad7768: Derive output data rates Janani Sunil
2026-08-28 15:30 ` [PATCH v5 09/20] iio: adc: ad7768: Configure channel sampling profiles Janani Sunil
2026-08-28 15:30 ` [PATCH v5 10/20] iio: adc: ad7768: Add sampling frequency controls Janani Sunil
2026-08-28 15:30 ` Janani Sunil [this message]
2026-08-28 15:30 ` [PATCH v5 12/20] iio: adc: ad7768: Wait for digital filters to settle Janani Sunil
2026-08-28 15:30 ` [PATCH v5 13/20] iio: adc: ad7768: Add calibration controls Janani Sunil
2026-08-28 15:30 ` [PATCH v5 14/20] iio: adc: ad7768: Add per-channel conversion delay Janani Sunil
2026-08-28 15:30 ` [PATCH v5 15/20] iio: adc: ad7768: Add VCM regulator support Janani Sunil
2026-08-28 15:30 ` [PATCH v5 16/20] iio: adc: ad7768: Register GPIO auxiliary device Janani Sunil
2026-08-28 15:30 ` [PATCH v5 17/20] gpio: regmap: Use regmap_test_bits() for single bit reads Janani Sunil
2026-08-28 15:30 ` [PATCH v5 18/20] gpio: regmap: Add optional runtime PM support Janani Sunil
2026-08-28 15:30 ` [PATCH v5 19/20] gpio: ad7768: Add AD7768 GPIO auxiliary driver Janani Sunil
2026-08-28 15:30 ` [PATCH v5 20/20] Documentation: iio: Add AD7768 Documentation Janani Sunil
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=20260828-ad7768-driver-v5-11-e33ca6f841a2@analog.com \
--to=janani.sunil@analog.com \
--cc=Michael.Hennerich@analog.com \
--cc=andy@kernel.org \
--cc=brgl@kernel.org \
--cc=conor+dt@kernel.org \
--cc=corbet@lwn.net \
--cc=devicetree@vger.kernel.org \
--cc=dlechner@baylibre.com \
--cc=jananisunil.dev@gmail.com \
--cc=jic23@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linusw@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@analog.com \
--cc=mwalle@kernel.org \
--cc=nuno.sa@analog.com \
--cc=olivier.moysan@foss.st.com \
--cc=p.zabel@pengutronix.de \
--cc=robh@kernel.org \
--cc=skhan@linuxfoundation.org \
--cc=u.kleine-koenig@baylibre.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox