From nobody Tue Oct 7 10:30:58 2025 Received: from mail-oi1-f172.google.com (mail-oi1-f172.google.com [209.85.167.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5452A2BEC57 for ; Thu, 10 Jul 2025 22:40:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752187242; cv=none; b=slb3n5w1wx2xkRxa48u5IygjCbcf0L8DsDWcNJiHdOTCJeEOtoVahGgjBQ2B1QBL/dlXpjZ+1JzEezK7y1URqK+6Op6yl5LWtJ+yio16CcTWIXxfLSuP3ds4cw6tMomYM4bL0uM8lQB/vowvCb6QekpCQHBAMz8Q6vRrnEQ2Z2o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752187242; c=relaxed/simple; bh=5bdT9u7+zUU/EH6ZF4Z6GM0stM6K3nQtPtLbsi1mVEc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TRbqjSsGQGRy+EAiiE8+w1j8iShZkZlIulIIVlptvgBJ5R3s5M7KINnhSV0UEri8nzChHFx9Cu6kX+KFPY0WWfMu8USIy63P7ofe5l2C6hU6cWiS2B1uOXvMNazBA3AcNR1V37hIUgFEMmzgMHBL32LMfb8+0XUAq5nmwuR2LC8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b=L60QcHz7; arc=none smtp.client-ip=209.85.167.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="L60QcHz7" Received: by mail-oi1-f172.google.com with SMTP id 5614622812f47-4067b7d7e52so520080b6e.2 for ; Thu, 10 Jul 2025 15:40:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1752187239; x=1752792039; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=uXgLk8W8QTkOU8+h291ODhZkOTvb9VZJA4vkKvX4D1M=; b=L60QcHz7S2TAh4C2kGz9gAfZW3TaU6Tu0d+hGMPaaLTgZnEWNrkHCXamLQHz3lnG1c WQ8bw5uqwToIPgiwlDFgcOBwrWGQPdgGi5u3QYgqjw8N9lG2WgXTLtldkujE/t2d4oBU P0EAfcIE2J9+i1LsClMh4LvrPfwTEoIdLK8/QWAvZpF3ZeiLLI2Sfwpw8YguxBZrAfkO DEL7lU7gf330aaN9fL5c2ht2H4m/Srp5QntlKSYPSc8fbSzxLTAyiCYodA8049uoQjeX 7GGe0kp1qJKMvI+bX4Mkp3xdEc8KKLM5DLtCKPxo5X7fZcEeOjVAQ+r3DNPBKWaWsdZf ZcMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752187239; x=1752792039; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uXgLk8W8QTkOU8+h291ODhZkOTvb9VZJA4vkKvX4D1M=; b=M2xkJ2KgIexApVcs4R3S8HF46+oO6pWRBHCbeJvXC22rfS3Aqz+t8x/lj54cRPufV6 qU5FaXaXZAOSwToKE08f/fAJfKsvMfcC1ZYaQQLvJVZ4vh1/mgiV+36BylB3IOuCH/2j nD3BBIkrRRTB68or4nYrglLAKnzs8TwkEhWnDb74BQsrPpRLm7NpN9TvLAqyUkutbQPb CI04BRgVbZtBX9IluuS3c+tFWSXRhXnuwL20O2Z9qhG/jO3LTWyebmgkBJ1UAUPtUXio UHOMM6a39YUSFlfjZ69uTyiKX710y3ZG2//AnC6wAlBXzUO51cz0GiRNBySA2cGRYbWU 95Iw== X-Forwarded-Encrypted: i=1; AJvYcCUtAfq44OE8Yn7hg6VePSyjNacvGqFbRtuXwcHR8Ty3Q7ecifZcVnMuwb2hgp+P+SOHRvG7fq7UcB74fhU=@vger.kernel.org X-Gm-Message-State: AOJu0Yw+r9jroHS5SvHC4RFiI2wtPj7mjGP6TGA7NRhgnjmzrqt1+Jit O0jJ2iW1CVxUdM0ri+ZIIINxY3GDLOVjVMmenlcBWur57N8+CojbZovAre6oUqzZE9U= X-Gm-Gg: ASbGnctCGA1fTZpZh1MeUNOhhMbEFRXmufaoLGAakb1ELufP73riNZApRWGDsIqesxL Lz5cTxZMXQIyKWQREzfFn92lUv7V7gW+jyT8/lkA8HGOmvYr4oj5BzKoHYwxHBEqFSQtKEZvpW5 dA7gzmIfl35/YkRclGXnYrTeQ+uWrGn2p/qpq6BVnIBnhdodNtBM4Wh/7l7vz3DMcjsU47Y374V rEOoEM2HBwluhH1IAr2QOgEKBxuUsjq0vet1HL0jrpmYbhHRtCXHcW5KonmmpSLZzhnTUJ3kHTM gOvBMNIz7PaOCNrd4C8ZKeiwUisNnE7CqaGoFD0MHYb7mzv8JTUJ6wc1RDlFGbRf/QYA5y7VxEv 5EKOaDQKYIbCNzwMWYy5F25yDAw== X-Google-Smtp-Source: AGHT+IHYhu4aWzhKsn4ftUrzwF4SZl7WT973TrEde9Vj8ht1ehAqV895s4qxbk73e9QCS3fzjoYBGQ== X-Received: by 2002:a05:6808:1488:b0:401:e69a:8af2 with SMTP id 5614622812f47-4150d64551fmr998815b6e.5.1752187239420; Thu, 10 Jul 2025 15:40:39 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:1d00:891b:7836:c92:869]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-613d9d950f1sm305944eaf.18.2025.07.10.15.40.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Jul 2025 15:40:39 -0700 (PDT) From: David Lechner Date: Thu, 10 Jul 2025 17:39:52 -0500 Subject: [PATCH 3/5] iio: adc: ad7173: support changing filter type Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250710-iio-adc-ad7137-add-filter-support-v1-3-acffe401c4d2@baylibre.com> References: <20250710-iio-adc-ad7137-add-filter-support-v1-0-acffe401c4d2@baylibre.com> In-Reply-To: <20250710-iio-adc-ad7137-add-filter-support-v1-0-acffe401c4d2@baylibre.com> To: Michael Hennerich , Jonathan Cameron , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko Cc: linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, David Lechner X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=12379; i=dlechner@baylibre.com; h=from:subject:message-id; bh=5bdT9u7+zUU/EH6ZF4Z6GM0stM6K3nQtPtLbsi1mVEc=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBocEFNEAX+X26q7B+P90CYdxnJFaVynHrX8WZef eCuxPsl/lGJATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCaHBBTQAKCRDCzCAB/wGP wAXkCACPkbhXlM/+7ffkjgJVDI0J/aqHad7arJqrxpv2Rg/lGqcruNyKkAfczRARRIgTWeroYV+ wPptNLxip5O0NTWbw8h3S/pIKRiQh4WG1hmz7TlXcxIhj2meZ1QXC16sXDmvsgj6RyNuCjF3gha 99xSWVxmVLHzBGvPi7GI1tzorg7dKDMgyb83Xzfh0xG9MMppcHNeg4M7TK95KFC/PNJ/Pz2785N dR6dis3Q4Fc7+F9/Zz3MGR9wdkvN4oCHxoJU6RQ4be4OgkoA9Mws16wNwGgVPxbzSO70h3Mr42E zNtmACOHzH/XlZyJ88zouPimAxZ5gUIOqSWFZ01kXyZaaL7B X-Developer-Key: i=dlechner@baylibre.com; a=openpgp; fpr=8A73D82A6A1F509907F373881F8AF88C82F77C03 Add support for changing the filter type to the ad7173 driver. This family of chips by default uses a sinc5+sinc1 filter. There are also optional post-filters that can be added in this configuration for various 50/60Hz rejection purposes. The sinc3 filter doesn't have any post-filters and handles the output data rate (ODR) a bit differently. Here, we've opted to use SINC3_MAPx to get the maximum possible sampling frequencies with the SINC3 filter. Adding support consists of adding the filter_type and filter_type_available attributes, making the sampling_frequency attribute aware of the filter type, and programming the filter parameters when we configure the channel of the ADC for reading a sample. Signed-off-by: David Lechner --- drivers/iio/adc/ad7173.c | 186 +++++++++++++++++++++++++++++++++++++++++++= ++-- 1 file changed, 181 insertions(+), 5 deletions(-) diff --git a/drivers/iio/adc/ad7173.c b/drivers/iio/adc/ad7173.c index 01d78d531d6c024dd92fff21b8b2afb750092b66..c235096fbad4aeb77a7385001a1= 6bc0ecd603f46 100644 --- a/drivers/iio/adc/ad7173.c +++ b/drivers/iio/adc/ad7173.c @@ -8,6 +8,7 @@ * AD7175-8/AD7176-2/AD7177-2 * * Copyright (C) 2015, 2024 Analog Devices, Inc. + * Copyright (C) 2025 BayLibre, SAS */ =20 #include @@ -149,7 +150,12 @@ (pin2) < st->info->num_voltage_in && \ (pin2) >=3D st->info->num_voltage_in_div) =20 -#define AD7173_FILTER_ODR0_MASK GENMASK(5, 0) +#define AD7173_FILTER_SINC3_MAP BIT(15) +#define AD7173_FILTER_SINC3_MAP_DIV GENMASK(14, 0) +#define AD7173_FILTER_ENHFILTEN BIT(11) +#define AD7173_FILTER_ENHFILT_MASK GENMASK(10, 8) +#define AD7173_FILTER_ORDER BIT(6) +#define AD7173_FILTER_ODR_MASK GENMASK(5, 0) #define AD7173_MAX_CONFIGS 8 #define AD4111_OW_DET_THRSH_MV 300 =20 @@ -190,6 +196,15 @@ struct ad7173_device_info { u8 num_gpios; }; =20 +enum ad7173_filter_type { + AD7173_FILTER_SINC3, + AD7173_FILTER_SINC5_SINC1, + AD7173_FILTER_SINC5_SINC1_PF1, + AD7173_FILTER_SINC5_SINC1_PF2, + AD7173_FILTER_SINC5_SINC1_PF3, + AD7173_FILTER_SINC5_SINC1_PF4, +}; + struct ad7173_channel_config { /* Openwire detection threshold */ unsigned int openwire_thrsh_raw; @@ -205,8 +220,10 @@ struct ad7173_channel_config { struct_group(config_props, bool bipolar; bool input_buf; + u16 sinc3_ord_div; u8 sinc5_odr_index; u8 ref_sel; + enum ad7173_filter_type filter_type; ); }; =20 @@ -266,6 +283,24 @@ static const unsigned int ad7175_sinc5_data_rates[] = =3D { 5000, /* 20 */ }; =20 +/** + * ad7173_sinc3_ord_div_from_odr() - Convert ODR to divider value + * @odr_millihz: ODR (sampling_frequency) in milliHz + * Returns: Divider value for SINC3 filter to pass. + */ +static u16 ad7173_sinc3_ord_div_from_odr(u32 odr_millihz) +{ + /* + * Divider is f_MOD (1 MHz) / 32 / ODR. ODR freq is in milliHz, so + * we need to convert f_MOD to the same units. When SING_CYC=3D1 or + * multiple channels are enabled (currently always the case), there + * is an additional factor of 3. + */ + u32 div =3D DIV_ROUND_CLOSEST(MEGA * MILLI, odr_millihz * 32 * 3); + /* Avoid divide by 0 and limit to register field size. */ + return clamp(div, 1U, AD7173_FILTER_SINC3_MAP_DIV); +} + static unsigned int ad4111_current_channel_config[] =3D { /* Ain sel: pos neg */ 0x1E8, /* 15:IIN0+ 8:IIN0=E2=88=92 */ @@ -369,6 +404,47 @@ static const struct iio_enum ad7173_syscalib_mode_enum= =3D { .get =3D ad7173_get_syscalib_mode }; =20 +static const char * const ad7173_filter_types_str[] =3D { + [AD7173_FILTER_SINC3] =3D "sinc3", + [AD7173_FILTER_SINC5_SINC1] =3D "sinc5+sinc1", + [AD7173_FILTER_SINC5_SINC1_PF1] =3D "sinc5+sinc1+pf1", + [AD7173_FILTER_SINC5_SINC1_PF2] =3D "sinc5+sinc1+pf2", + [AD7173_FILTER_SINC5_SINC1_PF3] =3D "sinc5+sinc1+pf3", + [AD7173_FILTER_SINC5_SINC1_PF4] =3D "sinc5+sinc1+pf4", +}; + +static int ad7173_set_filter_type(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan, + unsigned int val) +{ + struct ad7173_state *st =3D iio_priv(indio_dev); + + if (!iio_device_claim_direct(indio_dev)) + return -EBUSY; + + st->channels[chan->address].cfg.filter_type =3D val; + st->channels[chan->address].cfg.live =3D false; + + iio_device_release_direct(indio_dev); + + return 0; +} + +static int ad7173_get_filter_type(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan) +{ + struct ad7173_state *st =3D iio_priv(indio_dev); + + return st->channels[chan->address].cfg.filter_type; +} + +static const struct iio_enum ad7173_filter_type_enum =3D { + .items =3D ad7173_filter_types_str, + .num_items =3D ARRAY_SIZE(ad7173_filter_types_str), + .set =3D ad7173_set_filter_type, + .get =3D ad7173_get_filter_type, +}; + static const struct iio_chan_spec_ext_info ad7173_chan_spec_ext_info[] =3D= { { .name =3D "sys_calibration", @@ -379,6 +455,16 @@ static const struct iio_chan_spec_ext_info ad7173_chan= _spec_ext_info[] =3D { &ad7173_syscalib_mode_enum), IIO_ENUM_AVAILABLE("sys_calibration_mode", IIO_SHARED_BY_TYPE, &ad7173_syscalib_mode_enum), + IIO_ENUM("filter_type", IIO_SEPARATE, &ad7173_filter_type_enum), + IIO_ENUM_AVAILABLE("filter_type", IIO_SHARED_BY_TYPE, + &ad7173_filter_type_enum), + { } +}; + +static const struct iio_chan_spec_ext_info ad7173_temp_chan_spec_ext_info[= ] =3D { + IIO_ENUM("filter_type", IIO_SEPARATE, &ad7173_filter_type_enum), + IIO_ENUM_AVAILABLE("filter_type", IIO_SHARED_BY_TYPE, + &ad7173_filter_type_enum), { } }; =20 @@ -582,14 +668,18 @@ static bool ad7173_setup_equal(const struct ad7173_ch= annel_config *cfg1, sizeof(struct { bool bipolar; bool input_buf; + u16 sinc3_ord_div; u8 sinc5_odr_index; u8 ref_sel; + enum ad7173_filter_type filter_type; })); =20 return cfg1->bipolar =3D=3D cfg2->bipolar && cfg1->input_buf =3D=3D cfg2->input_buf && + cfg1->sinc3_ord_div =3D=3D cfg2->sinc3_ord_div && cfg1->sinc5_odr_index =3D=3D cfg2->sinc5_odr_index && - cfg1->ref_sel =3D=3D cfg2->ref_sel; + cfg1->ref_sel =3D=3D cfg2->ref_sel && + cfg1->filter_type =3D=3D cfg2->filter_type; } =20 static struct ad7173_channel_config * @@ -630,6 +720,7 @@ static int ad7173_load_config(struct ad7173_state *st, { unsigned int config; int free_cfg_slot, ret; + u8 post_filter_enable, post_filter_select; =20 free_cfg_slot =3D ida_alloc_range(&st->cfg_slots_status, 0, st->info->num_configs - 1, GFP_KERNEL); @@ -649,8 +740,49 @@ static int ad7173_load_config(struct ad7173_state *st, if (ret) return ret; =20 + /* + * When SINC3_MAP flag is enabled, the rest of the register has a + * different meaning. We are using this option to allow the most + * possible sampling frequencies with SINC3 filter. + */ + if (cfg->filter_type =3D=3D AD7173_FILTER_SINC3) + return ad_sd_write_reg(&st->sd, AD7173_REG_FILTER(free_cfg_slot), 2, + FIELD_PREP(AD7173_FILTER_SINC3_MAP, 1) | + FIELD_PREP(AD7173_FILTER_SINC3_MAP_DIV, + cfg->sinc3_ord_div)); + + switch (cfg->filter_type) { + case AD7173_FILTER_SINC5_SINC1_PF1: + post_filter_enable =3D 1; + post_filter_select =3D 2; + break; + case AD7173_FILTER_SINC5_SINC1_PF2: + post_filter_enable =3D 1; + post_filter_select =3D 3; + break; + case AD7173_FILTER_SINC5_SINC1_PF3: + post_filter_enable =3D 1; + post_filter_select =3D 5; + break; + case AD7173_FILTER_SINC5_SINC1_PF4: + post_filter_enable =3D 1; + post_filter_select =3D 6; + break; + default: + post_filter_enable =3D 0; + post_filter_select =3D 0; + break; + } + return ad_sd_write_reg(&st->sd, AD7173_REG_FILTER(free_cfg_slot), 2, - AD7173_FILTER_ODR0_MASK & cfg->sinc5_odr_index); + FIELD_PREP(AD7173_FILTER_SINC3_MAP, 0) | + FIELD_PREP(AD7173_FILTER_ENHFILT_MASK, + post_filter_enable) | + FIELD_PREP(AD7173_FILTER_ENHFILTEN, + post_filter_select) | + FIELD_PREP(AD7173_FILTER_ORDER, 0) | + FIELD_PREP(AD7173_FILTER_ODR_MASK, + cfg->sinc5_odr_index)); } =20 static int ad7173_config_channel(struct ad7173_state *st, int addr) @@ -1183,6 +1315,13 @@ static int ad7173_read_raw(struct iio_dev *indio_dev, return -EINVAL; } case IIO_CHAN_INFO_SAMP_FREQ: + if (st->channels[chan->address].cfg.filter_type =3D=3D AD7173_FILTER_SIN= C3) { + /* Inverse operation of ad7173_sinc3_ord_div_from_odr() */ + *val =3D MEGA; + *val2 =3D 3 * 32 * st->channels[chan->address].cfg.sinc3_ord_div; + return IIO_VAL_FRACTIONAL; + } + reg =3D st->channels[chan->address].cfg.sinc5_odr_index; =20 *val =3D st->info->sinc5_data_rates[reg] / MILLI; @@ -1221,6 +1360,10 @@ static int ad7173_write_raw(struct iio_dev *indio_de= v, * * This will cause the reading of CH1 to be actually done once every * 200.16ms, an effective rate of 4.99sps. + * + * Both the sinc5 and sinc3 rates are set here so that if the filter + * type is changed, the requested rate will still be set (aside from + * rounding differences). */ case IIO_CHAN_INFO_SAMP_FREQ: freq =3D val * MILLI + val2 / MILLI; @@ -1230,6 +1373,7 @@ static int ad7173_write_raw(struct iio_dev *indio_dev, =20 cfg =3D &st->channels[chan->address].cfg; cfg->sinc5_odr_index =3D i; + cfg->sinc3_ord_div =3D ad7173_sinc3_ord_div_from_odr(freq); cfg->live =3D false; break; =20 @@ -1246,17 +1390,40 @@ static int ad7173_update_scan_mode(struct iio_dev *= indio_dev, const unsigned long *scan_mask) { struct ad7173_state *st =3D iio_priv(indio_dev); + u16 sinc3_count =3D 0; + u16 sinc3_div =3D 0; int i, j, k, ret; =20 for (i =3D 0; i < indio_dev->num_channels; i++) { - if (test_bit(i, scan_mask)) + const struct ad7173_channel_config *cfg =3D &st->channels[i].cfg; + + if (test_bit(i, scan_mask)) { + if (cfg->filter_type =3D=3D AD7173_FILTER_SINC3) { + sinc3_count++; + + if (sinc3_div =3D=3D 0) { + sinc3_div =3D cfg->sinc3_ord_div; + } else if (sinc3_div !=3D cfg->sinc3_ord_div) { + dev_err(&st->sd.spi->dev, + "All enabled channels must have the same sampling_frequency for sinc= 3 filter_type\n"); + return -EINVAL; + } + } + ret =3D ad7173_set_channel(&st->sd, i); - else + } else { ret =3D ad_sd_write_reg(&st->sd, AD7173_REG_CH(i), 2, 0); + } if (ret < 0) return ret; } =20 + if (sinc3_count && sinc3_count < bitmap_weight(scan_mask, indio_dev->num_= channels)) { + dev_err(&st->sd.spi->dev, + "All enabled channels must have sinc3 filter_type\n"); + return -EINVAL; + } + /* * On some chips, there are more channels that setups, so if there were * more unique setups requested than the number of available slots, @@ -1415,6 +1582,7 @@ static const struct iio_chan_spec ad7173_temp_iio_cha= nnel_template =3D { .storagebits =3D 32, .endianness =3D IIO_BE, }, + .ext_info =3D ad7173_temp_chan_spec_ext_info, }; =20 static void ad7173_disable_regulators(void *data) @@ -1655,7 +1823,11 @@ static int ad7173_fw_parse_channel_config(struct iio= _dev *indio_dev) chan_st_priv->cfg.bipolar =3D false; chan_st_priv->cfg.input_buf =3D st->info->has_input_buf; chan_st_priv->cfg.ref_sel =3D AD7173_SETUP_REF_SEL_INT_REF; + chan_st_priv->cfg.sinc3_ord_div =3D ad7173_sinc3_ord_div_from_odr( + st->info->sinc5_data_rates[st->info->odr_start_value] + ); chan_st_priv->cfg.sinc5_odr_index =3D st->info->odr_start_value; + chan_st_priv->cfg.filter_type =3D AD7173_FILTER_SINC5_SINC1; chan_st_priv->cfg.openwire_comp_chan =3D -1; st->adc_mode |=3D AD7173_ADC_MODE_REF_EN; if (st->info->data_reg_only_16bit) @@ -1727,7 +1899,11 @@ static int ad7173_fw_parse_channel_config(struct iio= _dev *indio_dev) chan->scan_index =3D chan_index; chan->channel =3D ain[0]; chan_st_priv->cfg.input_buf =3D st->info->has_input_buf; + chan_st_priv->cfg.sinc3_ord_div =3D ad7173_sinc3_ord_div_from_odr( + st->info->sinc5_data_rates[st->info->odr_start_value] + ); chan_st_priv->cfg.sinc5_odr_index =3D st->info->odr_start_value; + chan_st_priv->cfg.filter_type =3D AD7173_FILTER_SINC5_SINC1; chan_st_priv->cfg.openwire_comp_chan =3D -1; =20 chan_st_priv->cfg.bipolar =3D fwnode_property_read_bool(child, "bipolar"= ); --=20 2.43.0