summaryrefslogtreecommitdiff
path: root/driver/accel_kionix.c
diff options
context:
space:
mode:
Diffstat (limited to 'driver/accel_kionix.c')
-rw-r--r--driver/accel_kionix.c58
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)],
+ &reg, 1, rxdata, rxlen);
+#endif
+ } else {
+ i2c_lock(port, 1);
+ rv = i2c_xfer(port, addr, &reg, 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, &reg, 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)