Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iio: accel: bma180: Fix BMA25x bandwidth register values

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>

authored by

Stephan Gerhold and committed by
Jonathan Cameron
8090d674 93466212

+7 -2
+7 -2
drivers/iio/accel/bma180.c
··· 55 55 56 56 u8 int_reset_reg, int_reset_mask; 57 57 u8 sleep_reg, sleep_mask; 58 - u8 bw_reg, bw_mask; 58 + u8 bw_reg, bw_mask, bw_offset; 59 59 u8 scale_reg, scale_mask; 60 60 u8 power_reg, power_mask, lowpower_val; 61 61 u8 int_enable_reg, int_enable_mask; ··· 127 127 128 128 #define BMA250_RANGE_MASK GENMASK(3, 0) /* Range of accel values */ 129 129 #define BMA250_BW_MASK GENMASK(4, 0) /* Accel bandwidth */ 130 + #define BMA250_BW_OFFSET 8 130 131 #define BMA250_SUSPEND_MASK BIT(7) /* chip will sleep */ 131 132 #define BMA250_LOWPOWER_MASK BIT(6) 132 133 #define BMA250_DATA_INTEN_MASK BIT(4) ··· 144 143 145 144 #define BMA254_RANGE_MASK GENMASK(3, 0) /* Range of accel values */ 146 145 #define BMA254_BW_MASK GENMASK(4, 0) /* Accel bandwidth */ 146 + #define BMA254_BW_OFFSET 8 147 147 #define BMA254_SUSPEND_MASK BIT(7) /* chip will sleep */ 148 148 #define BMA254_LOWPOWER_MASK BIT(6) 149 149 #define BMA254_DATA_INTEN_MASK BIT(4) ··· 289 287 for (i = 0; i < data->part_info->num_bw; ++i) { 290 288 if (data->part_info->bw_table[i] == val) { 291 289 ret = bma180_set_bits(data, data->part_info->bw_reg, 292 - data->part_info->bw_mask, i); 290 + data->part_info->bw_mask, 291 + i + data->part_info->bw_offset); 293 292 if (ret) { 294 293 dev_err(&data->client->dev, 295 294 "failed to set bandwidth\n"); ··· 883 880 .sleep_mask = BMA250_SUSPEND_MASK, 884 881 .bw_reg = BMA250_BW_REG, 885 882 .bw_mask = BMA250_BW_MASK, 883 + .bw_offset = BMA250_BW_OFFSET, 886 884 .scale_reg = BMA250_RANGE_REG, 887 885 .scale_mask = BMA250_RANGE_MASK, 888 886 .power_reg = BMA250_POWER_REG, ··· 913 909 .sleep_mask = BMA254_SUSPEND_MASK, 914 910 .bw_reg = BMA254_BW_REG, 915 911 .bw_mask = BMA254_BW_MASK, 912 + .bw_offset = BMA254_BW_OFFSET, 916 913 .scale_reg = BMA254_RANGE_REG, 917 914 .scale_mask = BMA254_RANGE_MASK, 918 915 .power_reg = BMA254_POWER_REG,