diff options
author | Tomasz Michalec <tm@semihalf.com> | 2021-06-09 21:52:27 +0200 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-06-30 08:50:14 +0000 |
commit | 3a344a6f32720b6156c763403cf32941067c3464 (patch) | |
tree | f3f940cbe0105d76cb70dbf2cdd8918979c3884c /driver | |
parent | 93c8503f4ba5fefc7c7a2a2d3db4b46f25a79de7 (diff) | |
download | chrome-ec-3a344a6f32720b6156c763403cf32941067c3464.tar.gz |
driver: Add argument check in BMA2x2 driver
set_range and set_data_rate functions of BMA2x2 driver should check
input values to not set values outside of range supported by device.
BUG=none
BRANCH=none
TEST=makeall
Signed-off-by: Tomasz Michalec <tm@semihalf.com>
Change-Id: Ie9650975e00a99e86a5229ee200dab24be536076
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2953222
Reviewed-by: Jeremy Bettis <jbettis@chromium.org>
Diffstat (limited to 'driver')
-rw-r--r-- | driver/accel_bma2x2.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/driver/accel_bma2x2.c b/driver/accel_bma2x2.c index 68f3251b06..6d2d596bea 100644 --- a/driver/accel_bma2x2.c +++ b/driver/accel_bma2x2.c @@ -47,8 +47,14 @@ static int set_range(struct motion_sensor_t *s, int range, int rnd) { int ret, range_val, reg_val, range_reg_val; + /* Range has to be between 2G-16G */ + if (range < 2) + range = 2; + else if (range > 16) + range = 16; + range_val = BMA2x2_RANGE_TO_REG(range); - if ((BMA2x2_RANGE_TO_REG(range_val) < range) && rnd) + if ((BMA2x2_REG_TO_RANGE(range_val) < range) && rnd) range_val = BMA2x2_RANGE_TO_REG(range * 2); mutex_lock(s->mutex); @@ -83,9 +89,18 @@ static int set_data_rate(const struct motion_sensor_t *s, int rate, int rnd) int ret, odr_val, odr_reg_val, reg_val; struct accelgyro_saved_data_t *data = s->drv_data; - odr_val = BMA2x2_BW_TO_REG(rate); - if ((BMA2x2_REG_TO_BW(odr_val) < rate) && rnd) - odr_val = BMA2x2_BW_TO_REG(rate * 2); + /* Rate has to be between 7.8125Hz - 1000Hz */ + if (rate < 7813) { + rate = 7812; + odr_val = BMA2x2_BW_7_81HZ; + } else if (rate > 1000000) { + rate = 1000000; + odr_val = BMA2x2_BW_1000HZ; + } else { + odr_val = BMA2x2_BW_TO_REG(rate); + if ((BMA2x2_REG_TO_BW(odr_val) < rate) && rnd) + odr_val = BMA2x2_BW_TO_REG(rate * 2); + } mutex_lock(s->mutex); |