diff options
author | Yuval Peress <peress@chromium.org> | 2021-04-15 00:32:57 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-04-16 22:32:26 +0000 |
commit | 7ffc631e080dde6741580ecf217e9565ad791a71 (patch) | |
tree | c59ed3c07ed80d8af65b3d2740f5dc95e309d9ce /driver | |
parent | 1bfa6a7da4017b0c86d21cda2de70fb31d87ffc7 (diff) | |
download | chrome-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.c | 65 | ||||
-rw-r--r-- | driver/accelgyro_icm_common.c | 128 | ||||
-rw-r--r-- | driver/accelgyro_icm_common.h | 5 |
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 |