summaryrefslogtreecommitdiff
path: root/driver/accelgyro_lsm6ds0.c
diff options
context:
space:
mode:
authorAseda Aboagye <aaboagye@google.com>2015-04-15 17:03:22 -0700
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-04-20 18:46:08 +0000
commitd02620a05d071dabdeebe83a1e17091c89748e99 (patch)
tree85c29f99dfa289a3b585772d1ec379c7272c3ec2 /driver/accelgyro_lsm6ds0.c
parenta97af9a8b22c16a8427c960a0ab423c4fdfdf435 (diff)
downloadchrome-ec-d02620a05d071dabdeebe83a1e17091c89748e99.tar.gz
lsm6ds0: Cache ODR and range on EC.
For the driver functions get_range and get_data_rate, each call would end up executing an i2c transaction even if the value had not changed. Therefore, I modified the lsm6ds0 driver to cache the output data rate as well as the range. This prevents unecessary i2c transactions from occuring. BUG=chromium:476226 TEST=Flashed EC on samus and verified that the accelrange and accelrate commands still worked and that the sensors were functional. TEST=Verified Double Tap still worked. TEST=make -j buildall tests BRANCH=none Change-Id: Ie432979266dc4e4892978005de5d1df62cc0654f Signed-off-by: Aseda Aboagye <aaboagye@google.com> Reviewed-on: https://chromium-review.googlesource.com/265933 Reviewed-by: Alec Berg <alecaberg@chromium.org> Commit-Queue: Aseda Aboagye <aaboagye@chromium.org> Tested-by: Aseda Aboagye <aaboagye@chromium.org>
Diffstat (limited to 'driver/accelgyro_lsm6ds0.c')
-rw-r--r--driver/accelgyro_lsm6ds0.c38
1 files changed, 18 insertions, 20 deletions
diff --git a/driver/accelgyro_lsm6ds0.c b/driver/accelgyro_lsm6ds0.c
index bb8f6d8fc9..a93166c1de 100644
--- a/driver/accelgyro_lsm6ds0.c
+++ b/driver/accelgyro_lsm6ds0.c
@@ -169,6 +169,7 @@ static int set_range(const struct motion_sensor_t *s,
int ret, ctrl_val, range_tbl_size;
uint8_t ctrl_reg, reg_val;
const struct accel_param_pair *ranges;
+ struct lsm6ds0_data *data = (struct lsm6ds0_data *)s->drv_data;
ctrl_reg = get_ctrl_reg(s->type);
ranges = get_range_table(s->type, &range_tbl_size);
@@ -188,6 +189,11 @@ static int set_range(const struct motion_sensor_t *s,
ctrl_val = (ctrl_val & ~LSM6DS0_RANGE_MASK) | reg_val;
ret = raw_write8(s->i2c_addr, ctrl_reg, ctrl_val);
+ /* Now that we have set the range, update the driver's value. */
+ if (ret == EC_SUCCESS)
+ data->sensor_range = get_engineering_val(reg_val, ranges,
+ range_tbl_size);
+
accel_cleanup:
mutex_unlock(s->mutex);
return EC_SUCCESS;
@@ -196,15 +202,10 @@ accel_cleanup:
static int get_range(const struct motion_sensor_t *s,
int *range)
{
- int ret, ctrl_val, range_tbl_size;
- uint8_t ctrl_reg;
- const struct accel_param_pair *ranges;
- ranges = get_range_table(s->type, &range_tbl_size);
- ctrl_reg = get_ctrl_reg(s->type);
- ret = raw_read8(s->i2c_addr, ctrl_reg, &ctrl_val);
- *range = get_engineering_val(ctrl_val & LSM6DS0_RANGE_MASK,
- ranges, range_tbl_size);
- return ret;
+ struct lsm6ds0_data *data = (struct lsm6ds0_data *)s->drv_data;
+
+ *range = data->sensor_range;
+ return EC_SUCCESS;
}
static int set_resolution(const struct motion_sensor_t *s,
@@ -229,6 +230,7 @@ static int set_data_rate(const struct motion_sensor_t *s,
int ret, val, odr_tbl_size;
uint8_t ctrl_reg, reg_val;
const struct accel_param_pair *data_rates;
+ struct lsm6ds0_data *data = s->drv_data;
ctrl_reg = get_ctrl_reg(s->type);
data_rates = get_odr_table(s->type, &odr_tbl_size);
@@ -247,6 +249,11 @@ static int set_data_rate(const struct motion_sensor_t *s,
val = (val & ~LSM6DS0_ODR_MASK) | reg_val;
ret = raw_write8(s->i2c_addr, ctrl_reg, val);
+ /* Now that we have set the odr, update the driver's value. */
+ if (ret == EC_SUCCESS)
+ data->sensor_odr = get_engineering_val(reg_val, data_rates,
+ odr_tbl_size);
+
/* CTRL_REG3_G 12h
* [7] low-power mode = 0;
* [6] high pass filter disabled;
@@ -273,18 +280,9 @@ accel_cleanup:
static int get_data_rate(const struct motion_sensor_t *s,
int *rate)
{
- int ret, ctrl_val, odr_tbl_size;
- uint8_t ctrl_reg;
- const struct accel_param_pair *data_rates;
- ctrl_reg = get_ctrl_reg(s->type);
-
- ret = raw_read8(s->i2c_addr, ctrl_reg, &ctrl_val);
- if (ret != EC_SUCCESS)
- return EC_ERROR_UNKNOWN;
+ struct lsm6ds0_data *data = s->drv_data;
- data_rates = get_odr_table(s->type, &odr_tbl_size);
- *rate = get_engineering_val(ctrl_val & LSM6DS0_ODR_MASK,
- data_rates, odr_tbl_size);
+ *rate = data->sensor_odr;
return EC_SUCCESS;
}