summaryrefslogtreecommitdiff
path: root/driver/accelgyro_lsm6dsm.c
diff options
context:
space:
mode:
authorPaul Ma <magf@bitland.corp-partner.google.com>2018-06-19 16:44:04 +0800
committerchrome-bot <chrome-bot@chromium.org>2018-06-22 02:39:43 -0700
commit286faa5e78ef2f6768ae6eb06a7a54024f87e7d5 (patch)
tree952da0a44ce172451fd0f482c44a4a3670b16058 /driver/accelgyro_lsm6dsm.c
parent8032e90ccbceaf799eeabf6709ab66981b6cf720 (diff)
downloadchrome-ec-286faa5e78ef2f6768ae6eb06a7a54024f87e7d5.tar.gz
FIXUP: fix lsm6dsm driver specific data type declaration
accelgyro_lsm6dsm driver use lsm6dsm_data as its driver specific data type rather than stprivate_data. Wrong data type will lead to random corrupted runtime data. Signed-off-by: Paul Ma <magf@bitland.corp-partner.google.com> BRANCH=none BUG=b:110013316 TEST=make buildall -j Change-Id: I50e0da293921c2662e97aa6f47c83519609186b5 Reviewed-on: https://chromium-review.googlesource.com/1105797 Commit-Ready: Paul Ma <magf@bitland.corp-partner.google.com> Tested-by: Paul Ma <magf@bitland.corp-partner.google.com> Reviewed-by: Jett Rink <jettrink@chromium.org>
Diffstat (limited to 'driver/accelgyro_lsm6dsm.c')
-rw-r--r--driver/accelgyro_lsm6dsm.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/driver/accelgyro_lsm6dsm.c b/driver/accelgyro_lsm6dsm.c
index d0ef49b906..683b2ed616 100644
--- a/driver/accelgyro_lsm6dsm.c
+++ b/driver/accelgyro_lsm6dsm.c
@@ -337,6 +337,14 @@ static int set_range(const struct motion_sensor_t *s, int range, int rnd)
{
int err;
uint8_t ctrl_reg, reg_val;
+ /*
+ * Since 'stprivate_data a_data;' is the first member of lsm6dsm_data,
+ * the address of lsm6dsm_data is the same as a_data's. Using this
+ * fact, we can do the following conversion. This conversion is equal
+ * to:
+ * struct lsm6dsm_data *lsm_data = s->drv_data;
+ * struct stprivate_data *data = &lsm_data->a_data;
+ */
struct stprivate_data *data = s->drv_data;
int newrange = range;
@@ -381,6 +389,14 @@ static int set_range(const struct motion_sensor_t *s, int range, int rnd)
*/
static int get_range(const struct motion_sensor_t *s)
{
+ /*
+ * Since 'stprivate_data a_data;' is the first member of lsm6dsm_data,
+ * the address of lsm6dsm_data is the same as a_data's. Using this
+ * fact, we can do the following conversion. This conversion is equal
+ * to:
+ * struct lsm6dsm_data *lsm_data = s->drv_data;
+ * struct stprivate_data *data = &lsm_data->a_data;
+ */
struct stprivate_data *data = s->drv_data;
if (s->type == MOTIONSENSE_TYPE_ACCEL)
@@ -399,6 +415,14 @@ static int get_range(const struct motion_sensor_t *s)
static int set_data_rate(const struct motion_sensor_t *s, int rate, int rnd)
{
int ret, normalized_rate;
+ /*
+ * Since 'stprivate_data a_data;' is the first member of lsm6dsm_data,
+ * the address of lsm6dsm_data is the same as a_data's. Using this
+ * fact, we can do the following conversion. This conversion is equal
+ * to:
+ * struct lsm6dsm_data *lsm_data = s->drv_data;
+ * struct stprivate_data *data = &lsm_data->a_data;
+ */
struct stprivate_data *data = s->drv_data;
uint8_t ctrl_reg, reg_val;
@@ -491,6 +515,14 @@ static int read(const struct motion_sensor_t *s, vector_3_t v)
static int init(const struct motion_sensor_t *s)
{
int ret = 0, tmp;
+ /*
+ * Since 'stprivate_data a_data;' is the first member of lsm6dsm_data,
+ * the address of lsm6dsm_data is the same as a_data's. Using this
+ * fact, we can do the following conversion. This conversion is equal
+ * to:
+ * struct lsm6dsm_data *lsm_data = s->drv_data;
+ * struct stprivate_data *data = &lsm_data->a_data;
+ */
struct stprivate_data *data = s->drv_data;
ret = st_raw_read8(s->port, s->addr, LSM6DSM_WHO_AM_I_REG, &tmp);