| From 8090d67421ddab0ae932abab5a60200598bf0bbb Mon Sep 17 00:00:00 2001 |
| From: Stephan Gerhold <stephan@gerhold.net> |
| Date: Wed, 26 May 2021 11:44:07 +0200 |
| Subject: iio: accel: bma180: Fix BMA25x bandwidth register values |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Stephan Gerhold <stephan@gerhold.net> |
| |
| commit 8090d67421ddab0ae932abab5a60200598bf0bbb upstream. |
| |
| According to the BMA253 datasheet [1] and BMA250 datasheet [2] the |
| bandwidth value for BMA25x should be set as 01xxx: |
| |
| "Settings 00xxx result in a bandwidth of 7.81 Hz; [...] |
| It is recommended [...] to use the range from ´01000b´ to ´01111b´ |
| only in order to be compatible with future products." |
| |
| However, at the moment the drivers sets bandwidth values from 0 to 6, |
| which is not recommended and always results into 7.81 Hz bandwidth |
| according to the datasheet. |
| |
| Fix this by introducing a bw_offset = 8 = 01000b for BMA25x, |
| so the additional bit is always set for BMA25x. |
| |
| [1]: https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bma253-ds000.pdf |
| [2]: https://datasheet.octopart.com/BMA250-Bosch-datasheet-15540103.pdf |
| |
| Cc: Peter Meerwald <pmeerw@pmeerw.net> |
| Fixes: 2017cff24cc0 ("iio:bma180: Add BMA250 chip support") |
| Signed-off-by: Stephan Gerhold <stephan@gerhold.net> |
| Reviewed-by: Linus Walleij <linus.walleij@linaro.org> |
| Link: https://lore.kernel.org/r/20210526094408.34298-2-stephan@gerhold.net |
| Cc: <Stable@vger.kernel.org> |
| Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/iio/accel/bma180.c | 9 +++++++-- |
| 1 file changed, 7 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/iio/accel/bma180.c |
| +++ b/drivers/iio/accel/bma180.c |
| @@ -55,7 +55,7 @@ struct bma180_part_info { |
| |
| u8 int_reset_reg, int_reset_mask; |
| u8 sleep_reg, sleep_mask; |
| - u8 bw_reg, bw_mask; |
| + u8 bw_reg, bw_mask, bw_offset; |
| u8 scale_reg, scale_mask; |
| u8 power_reg, power_mask, lowpower_val; |
| u8 int_enable_reg, int_enable_mask; |
| @@ -127,6 +127,7 @@ struct bma180_part_info { |
| |
| #define BMA250_RANGE_MASK GENMASK(3, 0) /* Range of accel values */ |
| #define BMA250_BW_MASK GENMASK(4, 0) /* Accel bandwidth */ |
| +#define BMA250_BW_OFFSET 8 |
| #define BMA250_SUSPEND_MASK BIT(7) /* chip will sleep */ |
| #define BMA250_LOWPOWER_MASK BIT(6) |
| #define BMA250_DATA_INTEN_MASK BIT(4) |
| @@ -143,6 +144,7 @@ struct bma180_part_info { |
| |
| #define BMA254_RANGE_MASK GENMASK(3, 0) /* Range of accel values */ |
| #define BMA254_BW_MASK GENMASK(4, 0) /* Accel bandwidth */ |
| +#define BMA254_BW_OFFSET 8 |
| #define BMA254_SUSPEND_MASK BIT(7) /* chip will sleep */ |
| #define BMA254_LOWPOWER_MASK BIT(6) |
| #define BMA254_DATA_INTEN_MASK BIT(4) |
| @@ -283,7 +285,8 @@ static int bma180_set_bw(struct bma180_d |
| for (i = 0; i < data->part_info->num_bw; ++i) { |
| if (data->part_info->bw_table[i] == val) { |
| ret = bma180_set_bits(data, data->part_info->bw_reg, |
| - data->part_info->bw_mask, i); |
| + data->part_info->bw_mask, |
| + i + data->part_info->bw_offset); |
| if (ret) { |
| dev_err(&data->client->dev, |
| "failed to set bandwidth\n"); |
| @@ -876,6 +879,7 @@ static const struct bma180_part_info bma |
| .sleep_mask = BMA250_SUSPEND_MASK, |
| .bw_reg = BMA250_BW_REG, |
| .bw_mask = BMA250_BW_MASK, |
| + .bw_offset = BMA250_BW_OFFSET, |
| .scale_reg = BMA250_RANGE_REG, |
| .scale_mask = BMA250_RANGE_MASK, |
| .power_reg = BMA250_POWER_REG, |
| @@ -905,6 +909,7 @@ static const struct bma180_part_info bma |
| .sleep_mask = BMA254_SUSPEND_MASK, |
| .bw_reg = BMA254_BW_REG, |
| .bw_mask = BMA254_BW_MASK, |
| + .bw_offset = BMA254_BW_OFFSET, |
| .scale_reg = BMA254_RANGE_REG, |
| .scale_mask = BMA254_RANGE_MASK, |
| .power_reg = BMA254_POWER_REG, |