]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
iio: filter: admv8818: Support frequencies >= 2^32
authorBrian Pellegrino <bpellegrino@arka.org>
Fri, 28 Mar 2025 17:48:31 +0000 (13:48 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 27 Jun 2025 10:07:16 +0000 (11:07 +0100)
[ Upstream commit 9016776f1301627de78a633bda7c898425a56572 ]

This patch allows writing u64 values to the ADMV8818's high and low-pass
filter frequencies. It includes the following changes:

- Rejects negative frequencies in admv8818_write_raw.
- Adds a write_raw_get_fmt function to admv8818's iio_info, returning
  IIO_VAL_INT_64 for the high and low-pass filter 3dB frequency channels.

Fixes: f34fe888ad05 ("iio:filter:admv8818: add support for ADMV8818")
Signed-off-by: Brian Pellegrino <bpellegrino@arka.org>
Signed-off-by: Sam Winchenbach <swinchenbach@arka.org>
Link: https://patch.msgid.link/20250328174831.227202-7-sam.winchenbach@framepointer.org
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/iio/filter/admv8818.c

index 2dfa92e052af8fcffcdbe9101c61a09b2ed1cdf3..b83d65527432566e54227c963117ba90356664d2 100644 (file)
@@ -400,6 +400,19 @@ static int admv8818_read_lpf_freq(struct admv8818_state *st, u64 *lpf_freq)
        return ret;
 }
 
+static int admv8818_write_raw_get_fmt(struct iio_dev *indio_dev,
+                                                               struct iio_chan_spec const *chan,
+                                                               long mask)
+{
+       switch (mask) {
+       case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
+       case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY:
+               return IIO_VAL_INT_64;
+       default:
+               return -EINVAL;
+       }
+}
+
 static int admv8818_write_raw(struct iio_dev *indio_dev,
                              struct iio_chan_spec const *chan,
                              int val, int val2, long info)
@@ -408,6 +421,9 @@ static int admv8818_write_raw(struct iio_dev *indio_dev,
 
        u64 freq = ((u64)val2 << 32 | (u32)val);
 
+       if ((s64)freq < 0)
+               return -EINVAL;
+
        switch (info) {
        case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
                return admv8818_lpf_select(st, freq);
@@ -524,6 +540,7 @@ static int admv8818_set_mode(struct iio_dev *indio_dev,
 
 static const struct iio_info admv8818_info = {
        .write_raw = admv8818_write_raw,
+       .write_raw_get_fmt = admv8818_write_raw_get_fmt,
        .read_raw = admv8818_read_raw,
        .debugfs_reg_access = &admv8818_reg_access,
 };