On Mon, 20 Aug 2018 17:54:55 +0300 Stefan Popa <stefan.popa@xxxxxxxxxx> wrote: > This patch adds the option for the user to select the filter bandwidth. The > user can also read the available bandwidths which are always adjusted to be > at most half of the sampling frequency. Furthermore, the currently selected > bandwidth can be read via the read_raw function, while the write_raw sets a > new bandwidth value. > > Signed-off-by: Stefan Popa <stefan.popa@xxxxxxxxxx> Applied to the togreg branch of iio.git and pushed out as testing for the autobuilders to play with it. Thanks, Jonathan > --- > drivers/iio/accel/adxl372.c | 38 ++++++++++++++++++++++++++++++++++++-- > 1 file changed, 36 insertions(+), 2 deletions(-) > > diff --git a/drivers/iio/accel/adxl372.c b/drivers/iio/accel/adxl372.c > index 6281e4a..fdaaa58 100644 > --- a/drivers/iio/accel/adxl372.c > +++ b/drivers/iio/accel/adxl372.c > @@ -202,6 +202,10 @@ static const int adxl372_samp_freq_tbl[5] = { > 400, 800, 1600, 3200, 6400, > }; > > +static const int adxl372_bw_freq_tbl[5] = { > + 200, 400, 800, 1600, 3200, > +}; > + > struct adxl372_axis_lookup { > unsigned int bits; > enum adxl372_fifo_format fifo_format; > @@ -224,7 +228,8 @@ static const struct adxl372_axis_lookup adxl372_axis_lookup_table[] = { > .channel2 = IIO_MOD_##axis, \ > .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ > .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ > - BIT(IIO_CHAN_INFO_SAMP_FREQ), \ > + BIT(IIO_CHAN_INFO_SAMP_FREQ) | \ > + BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ > .scan_index = index, \ > .scan_type = { \ > .sign = 's', \ > @@ -648,6 +653,9 @@ static int adxl372_read_raw(struct iio_dev *indio_dev, > case IIO_CHAN_INFO_SAMP_FREQ: > *val = adxl372_samp_freq_tbl[st->odr]; > return IIO_VAL_INT; > + case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: > + *val = adxl372_bw_freq_tbl[st->bw]; > + return IIO_VAL_INT; > } > > return -EINVAL; > @@ -658,7 +666,7 @@ static int adxl372_write_raw(struct iio_dev *indio_dev, > int val, int val2, long info) > { > struct adxl372_state *st = iio_priv(indio_dev); > - int odr_index, ret; > + int odr_index, bw_index, ret; > > switch (info) { > case IIO_CHAN_INFO_SAMP_FREQ: > @@ -690,11 +698,34 @@ static int adxl372_write_raw(struct iio_dev *indio_dev, > ret = adxl372_set_bandwidth(st, odr_index); > > return ret; > + case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: > + bw_index = adxl372_find_closest_match(adxl372_bw_freq_tbl, > + ARRAY_SIZE(adxl372_bw_freq_tbl), > + val); > + return adxl372_set_bandwidth(st, bw_index); > default: > return -EINVAL; > } > } > > +static ssize_t adxl372_show_filter_freq_avail(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct iio_dev *indio_dev = dev_to_iio_dev(dev); > + struct adxl372_state *st = iio_priv(indio_dev); > + int i; > + size_t len = 0; > + > + for (i = 0; i <= st->odr; i++) > + len += scnprintf(buf + len, PAGE_SIZE - len, > + "%d ", adxl372_bw_freq_tbl[i]); > + > + buf[len - 1] = '\n'; > + > + return len; > +} > + > static ssize_t adxl372_get_fifo_enabled(struct device *dev, > struct device_attribute *attr, > char *buf) > @@ -838,9 +869,12 @@ static const struct iio_trigger_ops adxl372_trigger_ops = { > }; > > static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("400 800 1600 3200 6400"); > +static IIO_DEVICE_ATTR(in_accel_filter_low_pass_3db_frequency_available, > + 0444, adxl372_show_filter_freq_avail, NULL, 0); > > static struct attribute *adxl372_attributes[] = { > &iio_const_attr_sampling_frequency_available.dev_attr.attr, > + &iio_dev_attr_in_accel_filter_low_pass_3db_frequency_available.dev_attr.attr, > NULL, > }; >