[PATCH 3/5] iio: ABI: add sinc4+sinc1+pf1 filter_type

"David Lechner (TI)" <[email protected]>
Newsgroups org.kernel.vger.linux-iio,org.kernel.vger.linux-kernel
Message-ID <20260807-iio-adc-ti-ads112c14-filter-support-v1-3-4d3ba00caf18@baylibre.com>
Document "sinc4+sinc1+pf1" as a valid value for the filter_type
attributes (used by the ti-ads112c14 driver).

Signed-off-by: David Lechner (TI) <[email protected]>
---
 Documentation/ABI/testing/sysfs-bus-iio |   1 +
 drivers/iio/adc/ti-ads112c14.c          | 158 ++++++++++++++++----------------
 2 files changed, 80 insertions(+), 79 deletions(-)

diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio
index a4f5595722ad..a8e1cb8e7490 100644
--- a/Documentation/ABI/testing/sysfs-bus-iio
+++ b/Documentation/ABI/testing/sysfs-bus-iio
@@ -2380,6 +2380,7 @@ Description:
 		* "sinc4+lp" - Sinc4 + Low Pass Filter.
 		* "sinc4+sinc1" - Sinc4 + averaging by 8. Low 1st conversion
 		  time.
+		* "sinc4+sinc1+pf1" - Sinc4 + Sinc1 + device specific Post Filter 1.
 		* "sinc4+rej60" - Sinc4 + 60Hz rejection.
 		* "sinc5" - The digital sinc5 filter. Excellent noise
 		  performance
diff --git a/drivers/iio/adc/ti-ads112c14.c b/drivers/iio/adc/ti-ads112c14.c
index a73c0d6f0f65..ff22d0716abe 100644
--- a/drivers/iio/adc/ti-ads112c14.c
+++ b/drivers/iio/adc/ti-ads112c14.c
@@ -1358,85 +1358,6 @@ static const struct iio_info ads112c14_info = {
 	.read_label = ads112c14_read_label,
 };
 
-static int ads112c14_get_filter_type_from_state(struct ads112c14_channel_state *channel_state)
-{
-	switch (channel_state->filter_osr) {
-	case ADS112C14_DATA_RATE_CFG_FLTR_OSR_16...ADS112C14_DATA_RATE_CFG_FLTR_OSR_32:
-		return ADS112C14_FILTER_TYPE_SINC4;
-	case ADS112C14_DATA_RATE_CFG_FLTR_OSR_128...ADS112C14_DATA_RATE_CFG_FLTR_OSR_1024:
-		return ADS112C14_FILTER_TYPE_SINC4_SINC1;
-	case ADS112C14_DATA_RATE_CFG_FLTR_OSR_25SPS...ADS112C14_DATA_RATE_CFG_FLTR_OSR_20SPS:
-		return ADS112C14_FILTER_TYPE_SINC4_SINC1_PF1;
-	default:
-		return -EINVAL;
-	}
-}
-
-static int ads112c14_set_filter_type(struct iio_dev *indio_dev,
-				     struct iio_chan_spec const *chan,
-				     unsigned int val)
-{
-	struct ads112c14_data *data = iio_priv(indio_dev);
-	struct ads112c14_channel_state *channel_state;
-	int ret;
-
-	IIO_DEV_ACQUIRE_DIRECT_MODE(indio_dev, claim);
-	if (IIO_DEV_ACQUIRE_FAILED(claim))
-		return -EBUSY;
-
-	guard(mutex)(&data->lock);
-
-	channel_state = &data->channel_states[chan->scan_index];
-
-	ret = ads112c14_get_filter_type_from_state(channel_state);
-	if (ret < 0)
-		return ret;
-
-	/*
-	 * channel_state->filter_osr affects multiple attributes, so don't modify
-	 * it if the filter type is already set to the requested value.
-	 */
-	if (ret == val)
-		return 0;
-
-	/* Otherwise, pick an arbitrary default for each type. */
-	switch (val) {
-	case ADS112C14_FILTER_TYPE_SINC4:
-		channel_state->filter_osr = ADS112C14_DATA_RATE_CFG_FLTR_OSR_16;
-		break;
-	case ADS112C14_FILTER_TYPE_SINC4_SINC1:
-		channel_state->filter_osr = ADS112C14_DATA_RATE_CFG_FLTR_OSR_128;
-		break;
-	case ADS112C14_FILTER_TYPE_SINC4_SINC1_PF1:
-		channel_state->filter_osr = ADS112C14_DATA_RATE_CFG_FLTR_OSR_25SPS;
-		break;
-	default:
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static int ads112c14_get_filter_type(struct iio_dev *indio_dev,
-				     struct iio_chan_spec const *chan)
-{
-	struct ads112c14_data *data = iio_priv(indio_dev);
-	struct ads112c14_channel_state *channel_state;
-
-	guard(mutex)(&data->lock);
-
-	channel_state = &data->channel_states[chan->scan_index];
-
-	return ads112c14_get_filter_type_from_state(channel_state);
-}
-
-static const struct iio_enum ads112c14_filter_type_enum = {
-	.items = ads112c14_filter_type_names,
-	.num_items = ARRAY_SIZE(ads112c14_filter_type_names),
-	.set = ads112c14_set_filter_type,
-	.get = ads112c14_get_filter_type,
-};
-
 static bool ads112c14_using_drdy_trigger(struct iio_dev *indio_dev)
 {
 	struct ads112c14_data *data = iio_priv(indio_dev);
@@ -1584,6 +1505,85 @@ static ssize_t ads112c14_read_burnout_raw(struct iio_dev *indio_dev,
 	return sysfs_emit(buf, "%d\n", val);
 }
 
+static int ads112c14_get_filter_type_from_state(struct ads112c14_channel_state *channel_state)
+{
+	switch (channel_state->filter_osr) {
+	case ADS112C14_DATA_RATE_CFG_FLTR_OSR_16...ADS112C14_DATA_RATE_CFG_FLTR_OSR_32:
+		return ADS112C14_FILTER_TYPE_SINC4;
+	case ADS112C14_DATA_RATE_CFG_FLTR_OSR_128...ADS112C14_DATA_RATE_CFG_FLTR_OSR_1024:
+		return ADS112C14_FILTER_TYPE_SINC4_SINC1;
+	case ADS112C14_DATA_RATE_CFG_FLTR_OSR_25SPS...ADS112C14_DATA_RATE_CFG_FLTR_OSR_20SPS:
+		return ADS112C14_FILTER_TYPE_SINC4_SINC1_PF1;
+	default:
+		return -EINVAL;
+	}
+}
+
+static int ads112c14_set_filter_type(struct iio_dev *indio_dev,
+				     struct iio_chan_spec const *chan,
+				     unsigned int val)
+{
+	struct ads112c14_data *data = iio_priv(indio_dev);
+	struct ads112c14_channel_state *channel_state;
+	int ret;
+
+	IIO_DEV_ACQUIRE_DIRECT_MODE(indio_dev, claim);
+	if (IIO_DEV_ACQUIRE_FAILED(claim))
+		return -EBUSY;
+
+	guard(mutex)(&data->lock);
+
+	channel_state = &data->channel_states[chan->scan_index];
+
+	ret = ads112c14_get_filter_type_from_state(channel_state);
+	if (ret < 0)
+		return ret;
+
+	/*
+	 * channel_state->filter_osr affects multiple attributes, so don't modify
+	 * it if the filter type is already set to the requested value.
+	 */
+	if (ret == val)
+		return 0;
+
+	/* Otherwise, pick an arbitrary default for each type. */
+	switch (val) {
+	case ADS112C14_FILTER_TYPE_SINC4:
+		channel_state->filter_osr = ADS112C14_DATA_RATE_CFG_FLTR_OSR_16;
+		break;
+	case ADS112C14_FILTER_TYPE_SINC4_SINC1:
+		channel_state->filter_osr = ADS112C14_DATA_RATE_CFG_FLTR_OSR_128;
+		break;
+	case ADS112C14_FILTER_TYPE_SINC4_SINC1_PF1:
+		channel_state->filter_osr = ADS112C14_DATA_RATE_CFG_FLTR_OSR_25SPS;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static int ads112c14_get_filter_type(struct iio_dev *indio_dev,
+				     struct iio_chan_spec const *chan)
+{
+	struct ads112c14_data *data = iio_priv(indio_dev);
+	struct ads112c14_channel_state *channel_state;
+
+	guard(mutex)(&data->lock);
+
+	channel_state = &data->channel_states[chan->scan_index];
+
+	return ads112c14_get_filter_type_from_state(channel_state);
+}
+
+static const struct iio_enum ads112c14_filter_type_enum = {
+	.items = ads112c14_filter_type_names,
+	.num_items = ARRAY_SIZE(ads112c14_filter_type_names),
+	.set = ads112c14_set_filter_type,
+	.get = ads112c14_get_filter_type,
+};
+
 static const struct iio_chan_spec_ext_info ads112c14_ext_info[] = {
 	IIO_ENUM("filter_type", IIO_SEPARATE, &ads112c14_filter_type_enum),
 	IIO_ENUM_AVAILABLE("filter_type", IIO_SEPARATE, &ads112c14_filter_type_enum),

-- 
2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.