iio: accel: bma180: Fix BMA25x bandwidth register values
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: 2017cff24c
("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>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
9efc775c28
commit
8c90ec9965
@@ -55,7 +55,7 @@ struct bma180_part_info {
|
|||||||
|
|
||||||
u8 int_reset_reg, int_reset_mask;
|
u8 int_reset_reg, int_reset_mask;
|
||||||
u8 sleep_reg, sleep_mask;
|
u8 sleep_reg, sleep_mask;
|
||||||
u8 bw_reg, bw_mask;
|
u8 bw_reg, bw_mask, bw_offset;
|
||||||
u8 scale_reg, scale_mask;
|
u8 scale_reg, scale_mask;
|
||||||
u8 power_reg, power_mask, lowpower_val;
|
u8 power_reg, power_mask, lowpower_val;
|
||||||
u8 int_enable_reg, int_enable_mask;
|
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_RANGE_MASK GENMASK(3, 0) /* Range of accel values */
|
||||||
#define BMA250_BW_MASK GENMASK(4, 0) /* Accel bandwidth */
|
#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_SUSPEND_MASK BIT(7) /* chip will sleep */
|
||||||
#define BMA250_LOWPOWER_MASK BIT(6)
|
#define BMA250_LOWPOWER_MASK BIT(6)
|
||||||
#define BMA250_DATA_INTEN_MASK BIT(4)
|
#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_RANGE_MASK GENMASK(3, 0) /* Range of accel values */
|
||||||
#define BMA254_BW_MASK GENMASK(4, 0) /* Accel bandwidth */
|
#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_SUSPEND_MASK BIT(7) /* chip will sleep */
|
||||||
#define BMA254_LOWPOWER_MASK BIT(6)
|
#define BMA254_LOWPOWER_MASK BIT(6)
|
||||||
#define BMA254_DATA_INTEN_MASK BIT(4)
|
#define BMA254_DATA_INTEN_MASK BIT(4)
|
||||||
@@ -283,7 +285,8 @@ static int bma180_set_bw(struct bma180_data *data, int val)
|
|||||||
for (i = 0; i < data->part_info->num_bw; ++i) {
|
for (i = 0; i < data->part_info->num_bw; ++i) {
|
||||||
if (data->part_info->bw_table[i] == val) {
|
if (data->part_info->bw_table[i] == val) {
|
||||||
ret = bma180_set_bits(data, data->part_info->bw_reg,
|
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) {
|
if (ret) {
|
||||||
dev_err(&data->client->dev,
|
dev_err(&data->client->dev,
|
||||||
"failed to set bandwidth\n");
|
"failed to set bandwidth\n");
|
||||||
@@ -876,6 +879,7 @@ static const struct bma180_part_info bma180_part_info[] = {
|
|||||||
.sleep_mask = BMA250_SUSPEND_MASK,
|
.sleep_mask = BMA250_SUSPEND_MASK,
|
||||||
.bw_reg = BMA250_BW_REG,
|
.bw_reg = BMA250_BW_REG,
|
||||||
.bw_mask = BMA250_BW_MASK,
|
.bw_mask = BMA250_BW_MASK,
|
||||||
|
.bw_offset = BMA250_BW_OFFSET,
|
||||||
.scale_reg = BMA250_RANGE_REG,
|
.scale_reg = BMA250_RANGE_REG,
|
||||||
.scale_mask = BMA250_RANGE_MASK,
|
.scale_mask = BMA250_RANGE_MASK,
|
||||||
.power_reg = BMA250_POWER_REG,
|
.power_reg = BMA250_POWER_REG,
|
||||||
@@ -905,6 +909,7 @@ static const struct bma180_part_info bma180_part_info[] = {
|
|||||||
.sleep_mask = BMA254_SUSPEND_MASK,
|
.sleep_mask = BMA254_SUSPEND_MASK,
|
||||||
.bw_reg = BMA254_BW_REG,
|
.bw_reg = BMA254_BW_REG,
|
||||||
.bw_mask = BMA254_BW_MASK,
|
.bw_mask = BMA254_BW_MASK,
|
||||||
|
.bw_offset = BMA254_BW_OFFSET,
|
||||||
.scale_reg = BMA254_RANGE_REG,
|
.scale_reg = BMA254_RANGE_REG,
|
||||||
.scale_mask = BMA254_RANGE_MASK,
|
.scale_mask = BMA254_RANGE_MASK,
|
||||||
.power_reg = BMA254_POWER_REG,
|
.power_reg = BMA254_POWER_REG,
|
||||||
|
Reference in New Issue
Block a user