diff options
Diffstat (limited to 'driver/accel_kionix.c')
-rw-r--r-- | driver/accel_kionix.c | 161 |
1 files changed, 70 insertions, 91 deletions
diff --git a/driver/accel_kionix.c b/driver/accel_kionix.c index 3b75e33e0b..cc12987f40 100644 --- a/driver/accel_kionix.c +++ b/driver/accel_kionix.c @@ -1,4 +1,4 @@ -/* Copyright 2015 The Chromium OS Authors. All rights reserved. +/* Copyright 2015 The ChromiumOS Authors * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ @@ -23,7 +23,7 @@ #include "util.h" #define CPUTS(outstr) cputs(CC_ACCEL, outstr) -#define CPRINTF(format, args...) cprintf(CC_ACCEL, format, ## args) +#define CPRINTF(format, args...) cprintf(CC_ACCEL, format, ##args) /* Number of times to attempt to enable sensor before giving up. */ #define SENSOR_ENABLE_ATTEMPTS 3 @@ -46,32 +46,28 @@ #define T(s_) V(s_) #endif /* !defined(CONFIG_ACCEL_KXCJ9) || !defined(CONFIG_ACCEL_KX022) */ -STATIC_IF(CONFIG_KX022_ORIENTATION_SENSOR) int check_orientation_locked( - const struct motion_sensor_t *s); +STATIC_IF(CONFIG_KX022_ORIENTATION_SENSOR) +int check_orientation_locked(const struct motion_sensor_t *s); /* List of range values in +/-G's and their associated register values. */ static const struct accel_param_pair ranges[][3] = { #ifdef CONFIG_ACCEL_KX022 - { {2, KX022_GSEL_2G}, - {4, KX022_GSEL_4G}, - {8, KX022_GSEL_8G} }, + { { 2, KX022_GSEL_2G }, { 4, KX022_GSEL_4G }, { 8, KX022_GSEL_8G } }, #endif /* defined(CONFIG_ACCEL_KX022) */ #ifdef CONFIG_ACCEL_KXCJ9 - { {2, KXCJ9_GSEL_2G}, - {4, KXCJ9_GSEL_4G}, - {8, KXCJ9_GSEL_8G_14BIT} }, + { { 2, KXCJ9_GSEL_2G }, + { 4, KXCJ9_GSEL_4G }, + { 8, KXCJ9_GSEL_8G_14BIT } }, #endif /* defined(CONFIG_ACCEL_KXCJ9) */ }; /* List of resolution values in bits and their associated register values. */ static const struct accel_param_pair resolutions[][2] = { #ifdef CONFIG_ACCEL_KX022 - { {8, KX022_RES_8BIT}, - {16, KX022_RES_16BIT} }, + { { 8, KX022_RES_8BIT }, { 16, KX022_RES_16BIT } }, #endif /* defined(CONFIG_ACCEL_KX022) */ #ifdef CONFIG_ACCEL_KXCJ9 - { {8, KXCJ9_RES_8BIT}, - {12, KXCJ9_RES_12BIT} }, + { { 8, KXCJ9_RES_8BIT }, { 12, KXCJ9_RES_12BIT } }, #endif /* defined(CONFIG_ACCEL_KXCJ9) */ }; @@ -79,34 +75,34 @@ static const struct accel_param_pair resolutions[][2] = { static const struct accel_param_pair datarates[][13] = { #ifdef CONFIG_ACCEL_KX022 /* One duplicate because table sizes must match. */ - { {781, KX022_OSA_0_781HZ}, - {781, KX022_OSA_0_781HZ}, - {1563, KX022_OSA_1_563HZ}, - {3125, KX022_OSA_3_125HZ}, - {6250, KX022_OSA_6_250HZ}, - {12500, KX022_OSA_12_50HZ}, - {25000, KX022_OSA_25_00HZ}, - {50000, KX022_OSA_50_00HZ}, - {100000, KX022_OSA_100_0HZ}, - {200000, KX022_OSA_200_0HZ}, - {400000, KX022_OSA_400_0HZ}, - {800000, KX022_OSA_800_0HZ}, - {1600000, KX022_OSA_1600HZ} }, + { { 781, KX022_OSA_0_781HZ }, + { 781, KX022_OSA_0_781HZ }, + { 1563, KX022_OSA_1_563HZ }, + { 3125, KX022_OSA_3_125HZ }, + { 6250, KX022_OSA_6_250HZ }, + { 12500, KX022_OSA_12_50HZ }, + { 25000, KX022_OSA_25_00HZ }, + { 50000, KX022_OSA_50_00HZ }, + { 100000, KX022_OSA_100_0HZ }, + { 200000, KX022_OSA_200_0HZ }, + { 400000, KX022_OSA_400_0HZ }, + { 800000, KX022_OSA_800_0HZ }, + { 1600000, KX022_OSA_1600HZ } }, #endif /* defined(CONFIG_ACCEL_KX022) */ #ifdef CONFIG_ACCEL_KXCJ9 - { {0, KXCJ9_OSA_0_000HZ}, - {781, KXCJ9_OSA_0_781HZ}, - {1563, KXCJ9_OSA_1_563HZ}, - {3125, KXCJ9_OSA_3_125HZ}, - {6250, KXCJ9_OSA_6_250HZ}, - {12500, KXCJ9_OSA_12_50HZ}, - {25000, KXCJ9_OSA_25_00HZ}, - {50000, KXCJ9_OSA_50_00HZ}, - {100000, KXCJ9_OSA_100_0HZ}, - {200000, KXCJ9_OSA_200_0HZ}, - {400000, KXCJ9_OSA_400_0HZ}, - {800000, KXCJ9_OSA_800_0HZ}, - {1600000, KXCJ9_OSA_1600_HZ} }, + { { 0, KXCJ9_OSA_0_000HZ }, + { 781, KXCJ9_OSA_0_781HZ }, + { 1563, KXCJ9_OSA_1_563HZ }, + { 3125, KXCJ9_OSA_3_125HZ }, + { 6250, KXCJ9_OSA_6_250HZ }, + { 12500, KXCJ9_OSA_12_50HZ }, + { 25000, KXCJ9_OSA_25_00HZ }, + { 50000, KXCJ9_OSA_50_00HZ }, + { 100000, KXCJ9_OSA_100_0HZ }, + { 200000, KXCJ9_OSA_200_0HZ }, + { 400000, KXCJ9_OSA_400_0HZ }, + { 800000, KXCJ9_OSA_800_0HZ }, + { 1600000, KXCJ9_OSA_1600_HZ } }, #endif /* defined(CONFIG_ACCEL_KXCJ9) */ }; @@ -127,7 +123,7 @@ static int find_param_index(const int eng_val, const int round_up, if (eng_val <= pairs[i].val) return i; - if (eng_val < pairs[i+1].val) { + if (eng_val < pairs[i + 1].val) { if (round_up) return i + 1; else @@ -141,8 +137,7 @@ static int find_param_index(const int eng_val, const int round_up, /** * Read register from accelerometer. */ -static int raw_read8(const int port, - const uint16_t i2c_spi_addr_flags, +static int raw_read8(const int port, const uint16_t i2c_spi_addr_flags, const int reg, int *data_ptr) { int rv = EC_ERROR_INVAL; @@ -160,8 +155,7 @@ static int raw_read8(const int port, #endif } else { - rv = i2c_read8(port, i2c_spi_addr_flags, - reg, data_ptr); + rv = i2c_read8(port, i2c_spi_addr_flags, reg, data_ptr); } return rv; } @@ -169,8 +163,7 @@ static int raw_read8(const int port, /** * Write register from accelerometer. */ -static int raw_write8(const int port, - const uint16_t i2c_spi_addr_flags, +static int raw_write8(const int port, const uint16_t i2c_spi_addr_flags, const int reg, int data) { int rv = EC_ERROR_INVAL; @@ -184,14 +177,12 @@ static int raw_write8(const int port, cmd, 2, NULL, 0); #endif } else { - rv = i2c_write8(port, i2c_spi_addr_flags, - reg, data); + rv = i2c_write8(port, i2c_spi_addr_flags, reg, data); } return rv; } -static int raw_read_multi(const int port, - const uint16_t i2c_spi_addr_flags, +static int raw_read_multi(const int port, const uint16_t i2c_spi_addr_flags, uint8_t reg, uint8_t *rxdata, int rxlen) { int rv = EC_ERROR_INVAL; @@ -204,8 +195,8 @@ static int raw_read_multi(const int port, ®, 1, rxdata, rxlen); #endif } else { - rv = i2c_read_block(port, i2c_spi_addr_flags, - reg, rxdata, rxlen); + rv = i2c_read_block(port, i2c_spi_addr_flags, reg, rxdata, + rxlen); } return rv; } @@ -233,15 +224,13 @@ static int disable_sensor(const struct motion_sensor_t *s, int *reg_val) * so that we can restore it later. */ for (i = 0; i < SENSOR_ENABLE_ATTEMPTS; i++) { - ret = raw_read8(s->port, s->i2c_spi_addr_flags, - reg, reg_val); + ret = raw_read8(s->port, s->i2c_spi_addr_flags, reg, reg_val); if (ret != EC_SUCCESS) continue; *reg_val &= ~pc1_field; - ret = raw_write8(s->port, s->i2c_spi_addr_flags, - reg, *reg_val); + ret = raw_write8(s->port, s->i2c_spi_addr_flags, reg, *reg_val); if (ret == EC_SUCCESS) return EC_SUCCESS; } @@ -266,20 +255,18 @@ static int enable_sensor(const struct motion_sensor_t *s, int reg_val) pc1_field = KIONIX_PC1_FIELD(V(s)); for (i = 0; i < SENSOR_ENABLE_ATTEMPTS; i++) { - ret = raw_read8(s->port, s->i2c_spi_addr_flags, - reg, ®_val); + ret = raw_read8(s->port, s->i2c_spi_addr_flags, reg, ®_val); if (ret != EC_SUCCESS) continue; /* Enable tilt orientation mode if lid sensor */ if (IS_ENABLED(CONFIG_KX022_ORIENTATION_SENSOR) && - (s->location == MOTIONSENSE_LOC_LID) && - (V(s) == 0)) + (s->location == MOTIONSENSE_LOC_LID) && (V(s) == 0)) reg_val |= KX022_CNTL1_TPE; /* Enable accelerometer based on reg_val value. */ - ret = raw_write8(s->port, s->i2c_spi_addr_flags, - reg, reg_val | pc1_field); + ret = raw_write8(s->port, s->i2c_spi_addr_flags, reg, + reg_val | pc1_field); /* On first success, we are done. */ if (ret == EC_SUCCESS) @@ -313,8 +300,7 @@ static int set_value(const struct motion_sensor_t *s, int reg, int val, /* Determine new value of control reg and attempt to write it. */ reg_val_new = (reg_val & ~field) | val; - ret = raw_write8(s->port, s->i2c_spi_addr_flags, - reg, reg_val_new); + ret = raw_write8(s->port, s->i2c_spi_addr_flags, reg, reg_val_new); /* If successfully written, then save the range. */ if (ret == EC_SUCCESS) @@ -381,7 +367,7 @@ static int set_data_rate(const struct motion_sensor_t *s, int rate, int rnd) ret = set_value(s, reg, odr_val, odr_field); if (ret == EC_SUCCESS) - data->base.odr = datarates[T(s)][index].val; + data->base.odr = datarates[T(s)][index].val; return ret; } @@ -414,9 +400,8 @@ static int get_offset(const struct motion_sensor_t *s, int16_t *offset, return EC_SUCCESS; } -static __maybe_unused enum motionsensor_orientation kx022_convert_orientation( - const struct motion_sensor_t *s, - int orientation) +static __maybe_unused enum motionsensor_orientation +kx022_convert_orientation(const struct motion_sensor_t *s, int orientation) { enum motionsensor_orientation res = MOTIONSENSE_ORIENTATION_UNKNOWN; @@ -447,8 +432,8 @@ static int check_orientation_locked(const struct motion_sensor_t *s) int orientation, raw_orientation; int ret; - ret = raw_read8(s->port, s->i2c_spi_addr_flags, - KX022_TSCP, &raw_orientation); + ret = raw_read8(s->port, s->i2c_spi_addr_flags, KX022_TSCP, + &raw_orientation); if (ret != EC_SUCCESS) return ret; @@ -465,11 +450,11 @@ static int check_orientation_locked(const struct motion_sensor_t *s) bool motion_orientation_changed(const struct motion_sensor_t *s) { return ((struct kionix_accel_data *)s->drv_data)->orientation != - ((struct kionix_accel_data *)s->drv_data)->last_orientation; + ((struct kionix_accel_data *)s->drv_data)->last_orientation; } -enum motionsensor_orientation *motion_orientation_ptr( - const struct motion_sensor_t *s) +enum motionsensor_orientation * +motion_orientation_ptr(const struct motion_sensor_t *s) { return &((struct kionix_accel_data *)s->drv_data)->orientation; } @@ -494,8 +479,7 @@ static int read(const struct motion_sensor_t *s, intv3_t v) mutex_lock(s->mutex); ret = raw_read_multi(s->port, s->i2c_spi_addr_flags, reg, acc, 6); if (IS_ENABLED(CONFIG_KX022_ORIENTATION_SENSOR) && - (s->location == MOTIONSENSE_LOC_LID) && - (V(s) == 0) && + (s->location == MOTIONSENSE_LOC_LID) && (V(s) == 0) && (ret == EC_SUCCESS)) ret = check_orientation_locked(s); mutex_unlock(s->mutex); @@ -520,7 +504,7 @@ static int read(const struct motion_sensor_t *s, intv3_t v) for (i = X; i <= Z; i++) { if (V(s)) { v[i] = (((int8_t)acc[i * 2 + 1]) << 4) | - (acc[i * 2] >> 4); + (acc[i * 2] >> 4); v[i] <<= 16 - resolution; } else { if (resolution == 8) @@ -550,8 +534,8 @@ static int init(struct motion_sensor_t *s) do { msleep(1); /* Read WHO_AM_I to be sure the device has booted */ - ret = raw_read8(s->port, s->i2c_spi_addr_flags, - reg, &val); + ret = raw_read8(s->port, s->i2c_spi_addr_flags, reg, + &val); if (ret == EC_SUCCESS) break; @@ -564,8 +548,7 @@ static int init(struct motion_sensor_t *s) } else { /* Write 0x00 to the internal register for KX022 */ reg = KX022_INTERNAL; - ret = raw_write8(s->port, s->i2c_spi_addr_flags, - reg, 0x0); + ret = raw_write8(s->port, s->i2c_spi_addr_flags, reg, 0x0); if (ret != EC_SUCCESS) { /* * For I2C communication, if ACK was not received @@ -574,11 +557,9 @@ static int init(struct motion_sensor_t *s) */ if (!ACCEL_ADDR_IS_SPI(s->i2c_spi_addr_flags)) { const uint16_t i2c_alt_addr_flags = - I2C_STRIP_FLAGS( - s->i2c_spi_addr_flags) - & ~2; - ret = raw_write8(s->port, - i2c_alt_addr_flags, + I2C_STRIP_FLAGS(s->i2c_spi_addr_flags) & + ~2; + ret = raw_write8(s->port, i2c_alt_addr_flags, reg, 0x0); } } @@ -620,8 +601,8 @@ static int init(struct motion_sensor_t *s) do { msleep(1); - ret = raw_read8(s->port, s->i2c_spi_addr_flags, - reg, &val); + ret = raw_read8(s->port, s->i2c_spi_addr_flags, reg, + &val); /* Reset complete. */ if ((ret == EC_SUCCESS) && !(val & reset_field)) break; @@ -672,9 +653,7 @@ static int probe(const struct motion_sensor_t *s) { int val; - if (i2c_read8(s->port, - s->i2c_spi_addr_flags, - KIONIX_WHO_AM_I(V(s)), + if (i2c_read8(s->port, s->i2c_spi_addr_flags, KIONIX_WHO_AM_I(V(s)), &val) != EC_SUCCESS) return EC_ERROR_HW_INTERNAL; |