summaryrefslogtreecommitdiff
path: root/driver/accel_bma2x2.c
diff options
context:
space:
mode:
authorTomasz Michalec <tm@semihalf.com>2021-06-09 21:52:27 +0200
committerCommit Bot <commit-bot@chromium.org>2021-06-30 08:50:14 +0000
commit3a344a6f32720b6156c763403cf32941067c3464 (patch)
treef3f940cbe0105d76cb70dbf2cdd8918979c3884c /driver/accel_bma2x2.c
parent93c8503f4ba5fefc7c7a2a2d3db4b46f25a79de7 (diff)
downloadchrome-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/accel_bma2x2.c')
-rw-r--r--driver/accel_bma2x2.c23
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);