From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0a-00128a01.pphosted.com (mx0a-00128a01.pphosted.com [148.163.135.77]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1DE6E4CA785; Fri, 4 Sep 2026 14:16:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531387; cv=none; b=FZS7OZNrT/5K3hry6T6aG+Zj2c2zDk8Agvz2l0RLwJlQv6tC7x1O4d3xtntNyf73mrFbZJx3jPh30cCfFBagwapqWqZAGAxMNg77Bh246XfFYIuFkmrYCd+j3cocblYpHIVZ2pZWfNZOfXlZHGJKCmo7aeO4CcyqobsjCCDOe7A= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531387; c=relaxed/simple; bh=O3Pe6kC5PTrtLUZ1vosk4IKs3nba35T7fYXfEVNtRmg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=nuADJ8CociE9s8xgmlBQGvnR3Vd7wpC7bj6Ovv7cwOSBaLgCzUdeYHmjwP80Z/Ty+WnFnOlk28rg2y0eNaaGkVMEN3u/W+xXzFo35hgBLwmxw+FUq0LE1JWraFAB3PKgzyuoacWweG3wrX9qb4muLH6mKPiQGaGlG0OCfGmeixc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=0HsKbQt9; arc=none smtp.client-ip=148.163.135.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="0HsKbQt9" Received: from pps.filterd (m0516787.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 684DgXKj332948; Fri, 4 Sep 2026 10:16:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=/RPUB 2hd/v3/MzFjFkWJuA5zOQqjrrHz1HakkLwN8xU=; b=0HsKbQt931xS55o/csRRk BdIT+vOKS2ZzDjySIHEF+y4L8PElrDh1eP+I7cKXVugT12BxMhnmHBjJwcatllEM PwL9l/P4C1JjbpiQH/J/g0ALI5U5z7FdAdDbj8BtydTqkIr9gndIa6xlZk7EoIYq n0usco8TgvbzNuPEMVdFuB2JOYiY5FeDoVUzzNmF30vPp+ryToCsd2gUCUk47T5s 7jPAkLcVDxd0b2mu3cG61L8cn6yqBzXEYcgBNVOFqT8OEbEfR/8/t415UlnKxq/5 ObW8mX75kE6EozpWVAjQHQ4tEDJ/achYaPZFt4G6fKZYn+HBOcmgqGcWIpFuuerY g== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gffkkmfcr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:16:05 -0400 (EDT) Received: from ASHBMBX8.ad.analog.com (ASHBMBX8.ad.analog.com [10.64.17.5]) by nwd2mta4.analog.com (8.14.7/8.14.7) with ESMTP id 684EG4Z2036289 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:16:04 -0400 Received: from ASHBCASHYB5.ad.analog.com (10.64.17.133) by ASHBMBX8.ad.analog.com (10.64.17.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.37; Fri, 4 Sep 2026 10:16:04 -0400 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) by ASHBCASHYB5.ad.analog.com (10.64.17.133) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.37; Fri, 4 Sep 2026 10:16:04 -0400 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server id 15.2.1748.37 via Frontend Transport; Fri, 4 Sep 2026 10:16:03 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 684EF2dF026210; Fri, 4 Sep 2026 10:15:56 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:15:03 +0200 Subject: [PATCH v6 11/17] iio: adc: ad7768: Add per-channel filter controls Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-ID: <20260904-ad7768-driver-v6-11-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , "David Lechner" , Andy Shevchenko , "Rob Herring" , Krzysztof Kozlowski , "Conor Dooley" , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788531302; l=5046; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=O3Pe6kC5PTrtLUZ1vosk4IKs3nba35T7fYXfEVNtRmg=; b=wZ0zmXcEHxN/+w3AOgy2EMUIvr69kGFZTg4o1n4Jv498oO6z130QKwN383IUN+y7G7njoMIj8 Qy8Xsd7URAwBZ/bZhGzydMF+NjJKiJkVpBv1Mz+RZYgdRnp5ka8aGZ3 X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: im6xWZpTZXfm7nz1x7ZDoXe4VCmgrAet X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX1LtnmfKAFGKM NmwRzQ1VIou6L5+2GbHFffgrirWJ4Jixgvx92b3I3zrH5U03xolUPtZcpGcDzk3K2Uy+xbFPKfi fQPEnaZO5XeToBKee6xsnPGEEzx9wLSZ7ubXwvgvcDjsxjBn6geslqoCulBGPLB1N+XcX+PNCnO h8XaLzVvJgeD5HxUb+OdFXHLilovfXnEziDSLQLXfhUL35RQwxU/ji6yFif6k9/B0590KnAx5XA PIk/06YlrBZYqUKQSJm4uGmMXGOwcfeHim7q5mx1dGDf7MUx+SYI/A8ZxvBkvoCl7nhFl+J7+zo Vkp9ss/j0ed+ts/RfTob71P/P6O0evhh8bz1HSHW0kB+ENTbtZQg4AqrD+NVlYJd1R7Dp6jKjBM holZ8DRqvD+O5JX2d0nS+dN2aFgO3eHQmr00NNQKZJD3eppL40laF8lckr05yzlFMPyj0sWadnh Up5DFoH9wlmmwfntM2A== X-Proofpoint-ORIG-GUID: im6xWZpTZXfm7nz1x7ZDoXe4VCmgrAet X-Authority-Analysis: v=2.4 cv=F6NnsKhN c=1 sm=1 tr=0 ts=6a9ad2a5 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=OmVn7CZJonkx5R5zMQLL:22 a=gAnH3GRIAAAA:8 a=u1yhE7RKQyILiklAgKsA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX7Nf10hAiTJeb 0+TBvIjtvl8ARD+/3PgxTofulqoexNxhpatOturSNcAqI6GwagHctssEmT19yGaSc+eH0PysmKu LCQqgbufOoaZu83ekxW2OL5z7/T2BE32iZ+WSFCM9P5p0pchyCjh X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 malwarescore=0 priorityscore=1501 impostorscore=0 spamscore=0 clxscore=1015 adultscore=0 phishscore=0 bulkscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 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 --- 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 d5eaef92cbf2..ac236e5c74c7 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -108,6 +108,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, @@ -168,6 +173,7 @@ struct ad7768_state { int freqs[AD7768_MAX_FREQS]; unsigned int ch_freq[AD7768_MAX_CHANNEL]; unsigned int power_mode_idx; + enum ad7768_filter_type ch_filter[AD7768_MAX_CHANNEL]; struct iio_backend *back; unsigned int vref_uV[2]; @@ -531,12 +537,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; } @@ -546,6 +599,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); @@ -580,13 +634,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); @@ -610,8 +666,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; @@ -867,8 +924,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; } @@ -961,6 +1020,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