From: Petre Rodan Date: Sun, 5 Oct 2025 13:12:26 +0000 (+0300) Subject: iio: accel: bma220: add LPF cut-off frequency mapping X-Git-Tag: v6.19-rc1~65^2~58^2~92 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=59a212d3c3d4cf239f4d1c71a19b47c0e72eca2d;p=thirdparty%2Flinux.git iio: accel: bma220: add LPF cut-off frequency mapping Add mapping for the low pass filter cut-off frequency. Make valid values visible for both the cut-off frequency and the scale. Signed-off-by: Petre Rodan Signed-off-by: Jonathan Cameron --- diff --git a/drivers/iio/accel/bma220_core.c b/drivers/iio/accel/bma220_core.c index 08c4dec67d5e1..0ceffc4126647 100644 --- a/drivers/iio/accel/bma220_core.c +++ b/drivers/iio/accel/bma220_core.c @@ -94,13 +94,23 @@ #define BMA220_DEVICE_NAME "bma220" +#define BMA220_COF_1000Hz 0x0 +#define BMA220_COF_500Hz 0x1 +#define BMA220_COF_250Hz 0x2 +#define BMA220_COF_125Hz 0x3 +#define BMA220_COF_64Hz 0x4 +#define BMA220_COF_32Hz 0x5 + #define BMA220_ACCEL_CHANNEL(index, reg, axis) { \ .type = IIO_ACCEL, \ .address = reg, \ .modified = 1, \ .channel2 = IIO_MOD_##axis, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ - .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ + BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ + .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SCALE) |\ + BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ .scan_index = index, \ .scan_type = { \ .sign = 's', \ @@ -124,6 +134,7 @@ static const int bma220_scale_table[][2] = { struct bma220_data { struct regmap *regmap; struct mutex lock; + u8 lpf_3dB_freq_idx; u8 range_idx; struct iio_trigger *trig; struct { @@ -140,6 +151,16 @@ static const struct iio_chan_spec bma220_channels[] = { IIO_CHAN_SOFT_TIMESTAMP(3), }; +/* Available cut-off frequencies of the low pass filter in Hz. */ +static const int bma220_lpf_3dB_freq_Hz_table[] = { + [BMA220_COF_1000Hz] = 1000, + [BMA220_COF_500Hz] = 500, + [BMA220_COF_250Hz] = 250, + [BMA220_COF_125Hz] = 125, + [BMA220_COF_64Hz] = 64, + [BMA220_COF_32Hz] = 32, +}; + static const unsigned long bma220_accel_scan_masks[] = { BIT(AXIS_X) | BIT(AXIS_Y) | BIT(AXIS_Z), 0 @@ -254,6 +275,10 @@ static int bma220_read_raw(struct iio_dev *indio_dev, *val = bma220_scale_table[index][0]; *val2 = bma220_scale_table[index][1]; return IIO_VAL_INT_PLUS_MICRO; + case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: + index = data->lpf_3dB_freq_idx; + *val = bma220_lpf_3dB_freq_Hz_table[index]; + return IIO_VAL_INT; } return -EINVAL; @@ -272,6 +297,18 @@ static int bma220_find_match_2dt(const int (*tbl)[2], const int n, return -EINVAL; } +static int bma220_find_match(const int *arr, const int n, const int val) +{ + int i; + + for (i = 0; i < n; i++) { + if (arr[i] == val) + return i; + } + + return -EINVAL; +} + static int bma220_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask) @@ -297,6 +334,21 @@ static int bma220_write_raw(struct iio_dev *indio_dev, return ret; data->range_idx = index; + return 0; + case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: + index = bma220_find_match(bma220_lpf_3dB_freq_Hz_table, + ARRAY_SIZE(bma220_lpf_3dB_freq_Hz_table), + val); + if (index < 0) + return -EINVAL; + + ret = regmap_update_bits(data->regmap, BMA220_REG_FILTER, + BMA220_FILTER_MASK, + FIELD_PREP(BMA220_FILTER_MASK, index)); + if (ret < 0) + return ret; + data->lpf_3dB_freq_idx = index; + return 0; } @@ -314,6 +366,11 @@ static int bma220_read_avail(struct iio_dev *indio_dev, *type = IIO_VAL_INT_PLUS_MICRO; *length = ARRAY_SIZE(bma220_scale_table) * 2; return IIO_AVAIL_LIST; + case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: + *vals = (const int *)bma220_lpf_3dB_freq_Hz_table; + *type = IIO_VAL_INT; + *length = ARRAY_SIZE(bma220_lpf_3dB_freq_Hz_table); + return IIO_AVAIL_LIST; default: return -EINVAL; }