summaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
authorYuval Peress <peress@chromium.org>2021-04-15 00:32:57 -0600
committerCommit Bot <commit-bot@chromium.org>2021-04-16 22:32:26 +0000
commit7ffc631e080dde6741580ecf217e9565ad791a71 (patch)
treec59ed3c07ed80d8af65b3d2740f5dc95e309d9ce /driver
parent1bfa6a7da4017b0c86d21cda2de70fb31d87ffc7 (diff)
downloadchrome-ec-7ffc631e080dde6741580ecf217e9565ad791a71.tar.gz
driver: icm: fix use of I2C_PORT_ACCEL
The ICM driver is currently using I2C_PORT_ACCEL incorrectly as a CONFIG_ value. Update the use cases to a new config option that selects between SPI and I2C communication specifically for the chip. To avoid a lot of device.h changes, the value of the config value is automatically inferred if not explicitly set. BRANCH=none BUG=b:185392974, b:146065507 TEST=zmake testall TEST=make buildall Signed-off-by: Yuval Peress <peress@chromium.org> Change-Id: I8b1a507a76031c2bb1aaf4ca7b14b92252a941f8 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2826920 Commit-Queue: Keith Short <keithshort@chromium.org> Reviewed-by: Keith Short <keithshort@chromium.org>
Diffstat (limited to 'driver')
-rw-r--r--driver/accelgyro_icm426xx.c65
-rw-r--r--driver/accelgyro_icm_common.c128
-rw-r--r--driver/accelgyro_icm_common.h5
3 files changed, 79 insertions, 119 deletions
diff --git a/driver/accelgyro_icm426xx.c b/driver/accelgyro_icm426xx.c
index 4476a591bd..5d09c8e4ef 100644
--- a/driver/accelgyro_icm426xx.c
+++ b/driver/accelgyro_icm426xx.c
@@ -822,46 +822,32 @@ static int icm426xx_init_config(const struct motion_sensor_t *s)
* interferences on the bus.
*/
- ret = 0;
- if (SLAVE_IS_SPI(s->i2c_spi_addr_flags)) {
-#ifdef CONFIG_SPI_ACCEL_PORT
- icm_field_update8(s, ICM426XX_REG_INTF_CONFIG6,
- ICM426XX_INTF_CONFIG6_MASK,
- ICM426XX_I3C_EN | ICM426XX_I3C_SDR_EN |
- ICM426XX_I3C_DDR_EN);
- ret = icm_field_update8(s, ICM426XX_REG_INTF_CONFIG4,
- ICM426XX_I3C_BUS_MODE,
- ICM426XX_I3C_BUS_MODE);
+#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
+ icm_field_update8(
+ s, ICM426XX_REG_INTF_CONFIG6, ICM426XX_INTF_CONFIG6_MASK,
+ ICM426XX_I3C_EN | ICM426XX_I3C_SDR_EN | ICM426XX_I3C_DDR_EN);
+ ret = icm_field_update8(s, ICM426XX_REG_INTF_CONFIG4,
+ ICM426XX_I3C_BUS_MODE, ICM426XX_I3C_BUS_MODE);
+#else
+ icm_field_update8(s, ICM426XX_REG_INTF_CONFIG6,
+ ICM426XX_INTF_CONFIG6_MASK, ICM426XX_I3C_EN);
+ ret = icm_field_update8(s, ICM426XX_REG_INTF_CONFIG4,
+ ICM426XX_I3C_BUS_MODE, 0);
#endif
- } else {
-#ifdef I2C_PORT_ACCEL
- icm_field_update8(s, ICM426XX_REG_INTF_CONFIG6,
- ICM426XX_INTF_CONFIG6_MASK,
- ICM426XX_I3C_EN);
- ret = icm_field_update8(s, ICM426XX_REG_INTF_CONFIG4,
- ICM426XX_I3C_BUS_MODE,
- 0);
-#endif
- }
if (ret)
return ret;
- ret = 0;
- if (SLAVE_IS_SPI(s->i2c_spi_addr_flags)) {
-#ifdef CONFIG_SPI_ACCEL_PORT
- ret = icm_field_update8(s, ICM426XX_REG_DRIVE_CONFIG,
- ICM426XX_DRIVE_CONFIG_MASK,
- ICM426XX_I2C_SLEW_RATE(ICM426XX_SLEW_RATE_20NS_60NS) |
+#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
+ ret = icm_field_update8(
+ s, ICM426XX_REG_DRIVE_CONFIG, ICM426XX_DRIVE_CONFIG_MASK,
+ ICM426XX_I2C_SLEW_RATE(ICM426XX_SLEW_RATE_20NS_60NS) |
ICM426XX_SPI_SLEW_RATE(ICM426XX_SLEW_RATE_INF_2NS));
-#endif
- } else {
-#ifdef I2C_PORT_ACCEL
- ret = icm_field_update8(s, ICM426XX_REG_DRIVE_CONFIG,
- ICM426XX_DRIVE_CONFIG_MASK,
- ICM426XX_I2C_SLEW_RATE(ICM426XX_SLEW_RATE_12NS_36NS) |
+#else
+ ret = icm_field_update8(
+ s, ICM426XX_REG_DRIVE_CONFIG, ICM426XX_DRIVE_CONFIG_MASK,
+ ICM426XX_I2C_SLEW_RATE(ICM426XX_SLEW_RATE_12NS_36NS) |
ICM426XX_SPI_SLEW_RATE(ICM426XX_SLEW_RATE_12NS_36NS));
#endif
- }
if (ret)
return ret;
@@ -871,16 +857,11 @@ static int icm426xx_init_config(const struct motion_sensor_t *s)
* Disable unused serial interface.
*/
mask = ICM426XX_DATA_CONF_MASK | ICM426XX_UI_SIFS_CFG_MASK;
- val = 0;
- if (SLAVE_IS_SPI(s->i2c_spi_addr_flags)) {
-#ifdef CONFIG_SPI_ACCEL_PORT
- val |= ICM426XX_UI_SIFS_CFG_I2C_DIS;
-#endif
- } else {
-#ifdef I2C_PORT_ACCEL
- val |= ICM426XX_UI_SIFS_CFG_SPI_DIS;
+#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
+ val = ICM426XX_UI_SIFS_CFG_I2C_DIS;
+#else
+ val = ICM426XX_UI_SIFS_CFG_SPI_DIS;
#endif
- }
ret = icm_field_update8(s, ICM426XX_REG_INTF_CONFIG0, mask, val);
if (ret)
diff --git a/driver/accelgyro_icm_common.c b/driver/accelgyro_icm_common.c
index 77367fd9dc..13dbe9ce11 100644
--- a/driver/accelgyro_icm_common.c
+++ b/driver/accelgyro_icm_common.c
@@ -19,7 +19,7 @@
#define CPRINTF(format, args...) cprintf(CC_ACCEL, format, ## args)
#define CPRINTS(format, args...) cprints(CC_ACCEL, format, ## args)
-#ifdef CONFIG_SPI_ACCEL_PORT
+#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
static int icm_spi_raw_read(const int addr, const uint8_t reg,
uint8_t *data, const int len)
{
@@ -54,19 +54,13 @@ static int icm_bank_sel(const struct motion_sensor_t *s, const int reg)
if (bank == st->bank)
return EC_SUCCESS;
- ret = EC_ERROR_UNIMPLEMENTED;
- if (SLAVE_IS_SPI(s->i2c_spi_addr_flags)) {
-#ifdef CONFIG_SPI_ACCEL_PORT
- ret = icm_spi_raw_write(
- SLAVE_GET_SPI_ADDR(s->i2c_spi_addr_flags),
+#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
+ ret = icm_spi_raw_write(SLAVE_GET_SPI_ADDR(s->i2c_spi_addr_flags),
ICM426XX_REG_BANK_SEL, &bank, 1);
+#else
+ ret = i2c_write8(s->port, s->i2c_spi_addr_flags, ICM426XX_REG_BANK_SEL,
+ bank);
#endif
- } else {
-#ifdef I2C_PORT_ACCEL
- ret = i2c_write8(s->port, s->i2c_spi_addr_flags,
- ICM426XX_REG_BANK_SEL, bank);
-#endif
- }
if (ret == EC_SUCCESS)
st->bank = bank;
@@ -86,22 +80,19 @@ int icm_read8(const struct motion_sensor_t *s, const int reg, int *data_ptr)
if (ret != EC_SUCCESS)
return ret;
- ret = EC_ERROR_UNIMPLEMENTED;
- if (SLAVE_IS_SPI(s->i2c_spi_addr_flags)) {
-#ifdef CONFIG_SPI_ACCEL_PORT
+#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
+ {
uint8_t val;
ret = icm_spi_raw_read(
- SLAVE_GET_SPI_ADDR(s->i2c_spi_addr_flags),
- addr, &val, sizeof(val));
+ SLAVE_GET_SPI_ADDR(s->i2c_spi_addr_flags), addr, &val,
+ sizeof(val));
if (ret == EC_SUCCESS)
*data_ptr = val;
-#endif
- } else {
-#ifdef I2C_PORT_ACCEL
- ret = i2c_read8(s->port, s->i2c_spi_addr_flags, addr, data_ptr);
-#endif
}
+#else
+ ret = i2c_read8(s->port, s->i2c_spi_addr_flags, addr, data_ptr);
+#endif
return ret;
}
@@ -118,20 +109,17 @@ int icm_write8(const struct motion_sensor_t *s, const int reg, int data)
if (ret != EC_SUCCESS)
return ret;
- ret = EC_ERROR_UNIMPLEMENTED;
- if (SLAVE_IS_SPI(s->i2c_spi_addr_flags)) {
-#ifdef CONFIG_SPI_ACCEL_PORT
+#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
+ {
uint8_t val = data;
ret = icm_spi_raw_write(
- SLAVE_GET_SPI_ADDR(s->i2c_spi_addr_flags),
- addr, &val, sizeof(val));
-#endif
- } else {
-#ifdef I2C_PORT_ACCEL
- ret = i2c_write8(s->port, s->i2c_spi_addr_flags, addr, data);
-#endif
+ SLAVE_GET_SPI_ADDR(s->i2c_spi_addr_flags), addr, &val,
+ sizeof(val));
}
+#else
+ ret = i2c_write8(s->port, s->i2c_spi_addr_flags, addr, data);
+#endif
return ret;
}
@@ -148,27 +136,24 @@ int icm_read16(const struct motion_sensor_t *s, const int reg, int *data_ptr)
if (ret != EC_SUCCESS)
return ret;
- ret = EC_ERROR_UNIMPLEMENTED;
- if (SLAVE_IS_SPI(s->i2c_spi_addr_flags)) {
-#ifdef CONFIG_SPI_ACCEL_PORT
+#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
+ {
uint8_t val[2];
ret = icm_spi_raw_read(
- SLAVE_GET_SPI_ADDR(s->i2c_spi_addr_flags),
- addr, val, sizeof(val));
+ SLAVE_GET_SPI_ADDR(s->i2c_spi_addr_flags), addr, val,
+ sizeof(val));
if (ret == EC_SUCCESS) {
if (I2C_IS_BIG_ENDIAN(s->i2c_spi_addr_flags))
*data_ptr = ((int)val[0] << 8) | val[1];
else
*data_ptr = ((int)val[1] << 8) | val[0];
}
-#endif
- } else {
-#ifdef I2C_PORT_ACCEL
- ret = i2c_read16(s->port, s->i2c_spi_addr_flags,
- addr, data_ptr);
-#endif
}
+#else
+ ret = i2c_read16(s->port, s->i2c_spi_addr_flags,
+ addr, data_ptr);
+#endif
return ret;
}
@@ -185,9 +170,8 @@ int icm_write16(const struct motion_sensor_t *s, const int reg, int data)
if (ret != EC_SUCCESS)
return ret;
- ret = EC_ERROR_UNIMPLEMENTED;
- if (SLAVE_IS_SPI(s->i2c_spi_addr_flags)) {
-#ifdef CONFIG_SPI_ACCEL_PORT
+#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
+ {
uint8_t val[2];
if (I2C_IS_BIG_ENDIAN(s->i2c_spi_addr_flags)) {
@@ -198,14 +182,12 @@ int icm_write16(const struct motion_sensor_t *s, const int reg, int data)
val[1] = (data >> 8) & 0xFF;
}
ret = icm_spi_raw_write(
- SLAVE_GET_SPI_ADDR(s->i2c_spi_addr_flags),
- addr, val, sizeof(val));
-#endif
- } else {
-#ifdef I2C_PORT_ACCEL
- ret = i2c_write16(s->port, s->i2c_spi_addr_flags, addr, data);
-#endif
+ SLAVE_GET_SPI_ADDR(s->i2c_spi_addr_flags), addr, val,
+ sizeof(val));
}
+#else
+ ret = i2c_write16(s->port, s->i2c_spi_addr_flags, addr, data);
+#endif
return ret;
}
@@ -223,19 +205,13 @@ int icm_read_n(const struct motion_sensor_t *s, const int reg,
if (ret != EC_SUCCESS)
return ret;
- ret = EC_ERROR_UNIMPLEMENTED;
- if (SLAVE_IS_SPI(s->i2c_spi_addr_flags)) {
-#ifdef CONFIG_SPI_ACCEL_PORT
- ret = icm_spi_raw_read(
- SLAVE_GET_SPI_ADDR(s->i2c_spi_addr_flags),
- addr, data_ptr, len);
-#endif
- } else {
-#ifdef I2C_PORT_ACCEL
- ret = i2c_read_block(s->port, s->i2c_spi_addr_flags, addr,
- data_ptr, len);
+#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
+ ret = icm_spi_raw_read(SLAVE_GET_SPI_ADDR(s->i2c_spi_addr_flags), addr,
+ data_ptr, len);
+#else
+ ret = i2c_read_block(s->port, s->i2c_spi_addr_flags, addr, data_ptr,
+ len);
#endif
- }
return ret;
}
@@ -251,28 +227,26 @@ int icm_field_update8(const struct motion_sensor_t *s, const int reg,
return ret;
ret = EC_ERROR_UNIMPLEMENTED;
- if (SLAVE_IS_SPI(s->i2c_spi_addr_flags)) {
-#ifdef CONFIG_SPI_ACCEL_PORT
+#ifdef CONFIG_ACCELGYRO_ICM_COMM_SPI
+ {
uint8_t val;
ret = icm_spi_raw_read(
- SLAVE_GET_SPI_ADDR(s->i2c_spi_addr_flags),
- addr, &val, sizeof(val));
+ SLAVE_GET_SPI_ADDR(s->i2c_spi_addr_flags), addr, &val,
+ sizeof(val));
if (ret != EC_SUCCESS)
return ret;
val = (val & (~field_mask)) | set_value;
ret = icm_spi_raw_write(
- SLAVE_GET_SPI_ADDR(s->i2c_spi_addr_flags),
- addr, &val, sizeof(val));
-#endif
- } else {
-#ifdef I2C_PORT_ACCEL
- ret = i2c_field_update8(s->port, s->i2c_spi_addr_flags, addr,
- field_mask, set_value);
-#endif
+ SLAVE_GET_SPI_ADDR(s->i2c_spi_addr_flags), addr, &val,
+ sizeof(val));
}
+#else
+ ret = i2c_field_update8(s->port, s->i2c_spi_addr_flags, addr,
+ field_mask, set_value);
+#endif
return ret;
}
diff --git a/driver/accelgyro_icm_common.h b/driver/accelgyro_icm_common.h
index 33a94274fd..8cf3b1e41d 100644
--- a/driver/accelgyro_icm_common.h
+++ b/driver/accelgyro_icm_common.h
@@ -12,6 +12,11 @@
#include "hwtimer.h"
#include "timer.h"
+#if !defined(CONFIG_ACCELGYRO_ICM_COMM_SPI) && \
+ !defined(CONFIG_ACCELGYRO_ICM_COMM_I2C)
+#error "ICM must use either SPI or I2C communication"
+#endif
+
#ifdef CONFIG_ACCEL_FIFO
/* reserve maximum 4 samples of 16 bytes */
#define ICM_FIFO_BUFFER 64