diff options
-rw-r--r-- | board/cyan/board.c | 5 | ||||
-rw-r--r-- | driver/accel_kionix.c | 71 | ||||
-rw-r--r-- | driver/accel_kionix.h | 8 |
3 files changed, 39 insertions, 45 deletions
diff --git a/board/cyan/board.c b/board/cyan/board.c index cdb2116b50..8eae0ae633 100644 --- a/board/cyan/board.c +++ b/board/cyan/board.c @@ -93,10 +93,7 @@ BUILD_ASSERT(ARRAY_SIZE(thermal_params) == TEMP_SENSOR_COUNT); /* kxcj9 mutex and local/private data*/ static struct mutex g_kxcj9_mutex[2]; -struct kionix_accel_data g_kxcj9_data[2] = { - {.variant = KXCJ9}, - {.variant = KXCJ9}, -}; +struct kionix_accel_data g_kxcj9_data[2]; /* Four Motion sensors */ /* Matrix to rotate accelrator into standard reference frame */ diff --git a/driver/accel_kionix.c b/driver/accel_kionix.c index ecd96c3119..750c8cd808 100644 --- a/driver/accel_kionix.c +++ b/driver/accel_kionix.c @@ -27,11 +27,18 @@ /* Number of times to attempt to enable sensor before giving up. */ #define SENSOR_ENABLE_ATTEMPTS 3 +#if defined(CONFIG_ACCEL_KXCJ9) && !defined(CONFIG_ACCEL_KX022) +#define V(s_) 1 +#elif defined(CONFIG_ACCEL_KX022) && !defined(CONFIG_ACCEL_KXCJ9) +#define V(s_) 0 +#else +#define V(s_) ((s_)->chip == MOTIONSENSE_CHIP_KXCJ9) +#endif /* Index for which table to use. */ #if !defined(CONFIG_ACCEL_KXCJ9) || !defined(CONFIG_ACCEL_KX022) -#define T 0 +#define T(s_) 0 #else -#define T (data->variant) +#define T(s_) V(s_) #endif /* !defined(CONFIG_ACCEL_KXCJ9) || !defined(CONFIG_ACCEL_KX022) */ /* List of range values in +/-G's and their associated register values. */ @@ -202,10 +209,9 @@ static int raw_read_multi(const int port, int addr, uint8_t reg, static int disable_sensor(const struct motion_sensor_t *s, int *reg_val) { int i, ret, reg, pc1_field; - struct kionix_accel_data *data = s->drv_data; - reg = KIONIX_CTRL1_REG(data->variant); - pc1_field = KIONIX_PC1_FIELD(data->variant); + reg = KIONIX_CTRL1_REG(V(s)); + pc1_field = KIONIX_PC1_FIELD(V(s)); /* * Read the current state of the control register @@ -238,10 +244,9 @@ static int disable_sensor(const struct motion_sensor_t *s, int *reg_val) static int enable_sensor(const struct motion_sensor_t *s, int reg_val) { int i, ret, reg, pc1_field; - struct kionix_accel_data *data = s->drv_data; - reg = KIONIX_CTRL1_REG(data->variant); - pc1_field = KIONIX_PC1_FIELD(data->variant); + reg = KIONIX_CTRL1_REG(V(s)); + pc1_field = KIONIX_PC1_FIELD(V(s)); for (i = 0; i < SENSOR_ENABLE_ATTEMPTS; i++) { ret = raw_read8(s->port, s->addr, reg, ®_val); @@ -265,10 +270,11 @@ static int set_range(const struct motion_sensor_t *s, int range, int rnd) struct kionix_accel_data *data = s->drv_data; /* Find index for interface pair matching the specified range. */ - index = find_param_index(range, rnd, ranges[T], ARRAY_SIZE(ranges[T])); - range_field = KIONIX_RANGE_FIELD(data->variant); - reg = KIONIX_CTRL1_REG(data->variant); - range_val = ranges[T][index].reg; + index = find_param_index(range, rnd, ranges[T(s)], + ARRAY_SIZE(ranges[T(s)])); + range_field = KIONIX_RANGE_FIELD(V(s)); + reg = KIONIX_CTRL1_REG(V(s)); + range_val = ranges[T(s)][index].reg; /* Disable the sensor to allow for changing of critical parameters. */ mutex_lock(s->mutex); @@ -299,7 +305,7 @@ static int set_range(const struct motion_sensor_t *s, int range, int rnd) static int get_range(const struct motion_sensor_t *s) { struct kionix_accel_data *data = s->drv_data; - return ranges[T][data->sensor_range].val; + return ranges[T(s)][data->sensor_range].val; } static int set_resolution(const struct motion_sensor_t *s, int res, int rnd) @@ -308,11 +314,11 @@ static int set_resolution(const struct motion_sensor_t *s, int res, int rnd) struct kionix_accel_data *data = s->drv_data; /* Find index for interface pair matching the specified resolution. */ - index = find_param_index(res, rnd, resolutions[T], - ARRAY_SIZE(resolutions[T])); - res_val = resolutions[T][index].reg; - res_field = KIONIX_RES_FIELD(data->variant); - reg = KIONIX_CTRL1_REG(data->variant); + index = find_param_index(res, rnd, resolutions[T(s)], + ARRAY_SIZE(resolutions[T(s)])); + res_val = resolutions[T(s)][index].reg; + res_field = KIONIX_RES_FIELD(V(s)); + reg = KIONIX_CTRL1_REG(V(s)); /* Disable the sensor to allow for changing of critical parameters. */ mutex_lock(s->mutex); @@ -343,7 +349,7 @@ static int set_resolution(const struct motion_sensor_t *s, int res, int rnd) static int get_resolution(const struct motion_sensor_t *s) { struct kionix_accel_data *data = s->drv_data; - return resolutions[T][data->sensor_resolution].val; + return resolutions[T(s)][data->sensor_resolution].val; } static int set_data_rate(const struct motion_sensor_t *s, int rate, int rnd) @@ -353,11 +359,11 @@ static int set_data_rate(const struct motion_sensor_t *s, int rate, int rnd) struct kionix_accel_data *data = s->drv_data; /* Find index for interface pair matching the specified rate. */ - index = find_param_index(rate, rnd, datarates[T], - ARRAY_SIZE(datarates[T])); - odr_val = datarates[T][index].reg; - reg = KIONIX_ODR_REG(data->variant); - odr_field = KIONIX_ODR_FIELD(data->variant); + index = find_param_index(rate, rnd, datarates[T(s)], + ARRAY_SIZE(datarates[T(s)])); + odr_val = datarates[T(s)][index].reg; + reg = KIONIX_ODR_REG(V(s)); + odr_field = KIONIX_ODR_FIELD(V(s)); /* Disable the sensor to allow for changing of critical parameters. */ mutex_lock(s->mutex); @@ -392,7 +398,7 @@ static int set_data_rate(const struct motion_sensor_t *s, int rate, int rnd) static int get_data_rate(const struct motion_sensor_t *s) { struct kionix_accel_data *data = s->drv_data; - return datarates[T][data->sensor_datarate].val; + return datarates[T(s)][data->sensor_datarate].val; } static int set_offset(const struct motion_sensor_t *s, const int16_t *offset, @@ -425,7 +431,7 @@ static int read(const struct motion_sensor_t *s, vector_3_t v) struct kionix_accel_data *data = s->drv_data; /* Read 6 bytes starting at XOUT_L. */ - reg = KIONIX_XOUT_L(data->variant); + reg = KIONIX_XOUT_L(V(s)); mutex_lock(s->mutex); ret = raw_read_multi(s->port, s->addr, reg, acc, 6); mutex_unlock(s->mutex); @@ -448,11 +454,11 @@ static int read(const struct motion_sensor_t *s, vector_3_t v) */ resolution = get_resolution(s); for (i = X; i <= Z; i++) { - if (KXCJ9 == data->variant) { + if (V(s)) { v[i] = (((int8_t)acc[i * 2 + 1]) << 4) | (acc[i * 2] >> 4); v[i] <<= 16 - resolution; - } else if (KX022 == data->variant) { + } else { if (resolution == 8) acc[i * 2] = 0; v[i] = (((int8_t)acc[i * 2 + 1]) << 8) | acc[i * 2]; @@ -472,10 +478,9 @@ static int init(const struct motion_sensor_t *s) { int ret, val, reg, reset_field; uint8_t timeout; - struct kionix_accel_data *data = s->drv_data; - reg = KIONIX_CTRL2_REG(data->variant); - reset_field = KIONIX_RESET_FIELD(data->variant); + reg = KIONIX_CTRL2_REG(V(s)); + reset_field = KIONIX_RESET_FIELD(V(s)); /* Issue a software reset. */ mutex_lock(s->mutex); @@ -527,9 +532,9 @@ static int init(const struct motion_sensor_t *s) if (ret != EC_SUCCESS) return ret; - if (KXCJ9 == data->variant) + if (V(s)) ret = set_resolution(s, 12, 1); - else if (KX022 == data->variant) + else ret = set_resolution(s, 16, 1); if (ret != EC_SUCCESS) return ret; diff --git a/driver/accel_kionix.h b/driver/accel_kionix.h index 3dc7f314a4..6c71cb7918 100644 --- a/driver/accel_kionix.h +++ b/driver/accel_kionix.h @@ -12,12 +12,6 @@ #include "driver/accel_kx022.h" #include "driver/accel_kxcj9.h" -enum kionix_accel { - KX022, - KXCJ9, - SUPPORTED_KIONIX_ACCELS, -}; - /* * Struct for pairing an engineering value with the register value for a * parameter. @@ -28,8 +22,6 @@ struct accel_param_pair { }; struct kionix_accel_data { - /* Variant of Kionix Accelerometer. */ - uint8_t variant; /* Note, the following are indicies into their respective tables. */ /* Current range of accelerometer. */ int sensor_range; |