diff options
Diffstat (limited to 'driver/accel_kionix.c')
-rw-r--r-- | driver/accel_kionix.c | 58 |
1 files changed, 52 insertions, 6 deletions
diff --git a/driver/accel_kionix.c b/driver/accel_kionix.c index 0a3754b4dd..b715173b7e 100644 --- a/driver/accel_kionix.c +++ b/driver/accel_kionix.c @@ -17,6 +17,7 @@ #include "driver/accel_kxcj9.h" #include "i2c.h" #include "math_util.h" +#include "spi.h" #include "task.h" #include "util.h" @@ -128,7 +129,23 @@ static int find_param_index(const int eng_val, const int round_up, static int raw_read8(const int port, const int addr, const int reg, int *data_ptr) { - return i2c_read8(port, addr, reg, data_ptr); + int rv; + + if (KIONIX_IS_SPI(addr)) { +#ifdef CONFIG_SPI_ACCEL_PORT + uint8_t val; + uint8_t cmd = 0x80 | reg; + + rv = spi_transaction(&spi_devices[KIONIX_SPI_ADDRESS(addr)], + &cmd, 1, &val, 1); + if (rv == EC_SUCCESS) + *data_ptr = val; + +#endif + } else { + rv = i2c_read8(port, addr, reg, data_ptr); + } + return rv; } /** @@ -136,7 +153,39 @@ static int raw_read8(const int port, const int addr, const int reg, */ static int raw_write8(const int port, const int addr, const int reg, int data) { - return i2c_write8(port, addr, reg, data); + int rv; + + if (KIONIX_IS_SPI(addr)) { +#ifdef CONFIG_SPI_ACCEL_PORT + uint8_t cmd[2] = { reg, data }; + + rv = spi_transaction(&spi_devices[KIONIX_SPI_ADDRESS(addr)], + cmd, 2, NULL, 0); +#endif + } else { + rv = i2c_write8(port, addr, reg, data); + } + return rv; +} + +static int raw_read_multi(const int port, int addr, uint8_t reg, + uint8_t *rxdata, int rxlen) +{ + int rv; + + if (KIONIX_IS_SPI(addr)) { +#ifdef CONFIG_SPI_ACCEL_PORT + reg |= 0x80; + rv = spi_transaction(&spi_devices[KIONIX_SPI_ADDRESS(addr)], + ®, 1, rxdata, rxlen); +#endif + } else { + i2c_lock(port, 1); + rv = i2c_xfer(port, addr, ®, 1, rxdata, rxlen, + I2C_XFER_SINGLE); + i2c_lock(port, 0); + } + return rv; } /** @@ -378,10 +427,7 @@ static int read(const struct motion_sensor_t *s, vector_3_t v) /* Read 6 bytes starting at XOUT_L. */ reg = KIONIX_XOUT_L(data->variant); mutex_lock(s->mutex); - i2c_lock(s->port, 1); - ret = i2c_xfer(s->port, s->addr, ®, 1, acc, 6, - I2C_XFER_SINGLE); - i2c_lock(s->port, 0); + ret = raw_read_multi(s->port, s->addr, reg, acc, 6); mutex_unlock(s->mutex); if (ret != EC_SUCCESS) |