iio: imu: inv_mpu6050: fix user_ctrl register overwritten

When in spi mode, we are setting i2c disable bit in user_ctrl
register. But the register is overwritten after when turning fifo
on. So save user_ctrl init value and always use it when updating
the register.

Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
Jean-Baptiste Maneyrol 2018-04-30 12:14:11 +02:00 committed by Jonathan Cameron
parent c2b82a690c
commit edddddd98c
5 changed files with 17 additions and 12 deletions

View File

@ -88,6 +88,7 @@ static const struct inv_mpu6050_chip_config chip_config_6050 = {
.gyro_fifo_enable = false, .gyro_fifo_enable = false,
.accl_fifo_enable = false, .accl_fifo_enable = false,
.accl_fs = INV_MPU6050_FS_02G, .accl_fs = INV_MPU6050_FS_02G,
.user_ctrl = 0,
}; };
/* Indexed by enum inv_devices */ /* Indexed by enum inv_devices */
@ -972,15 +973,15 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
if (result) if (result)
return result; return result;
if (inv_mpu_bus_setup)
inv_mpu_bus_setup(indio_dev);
result = inv_mpu6050_init_config(indio_dev); result = inv_mpu6050_init_config(indio_dev);
if (result) { if (result) {
dev_err(dev, "Could not initialize device.\n"); dev_err(dev, "Could not initialize device.\n");
return result; return result;
} }
if (inv_mpu_bus_setup)
inv_mpu_bus_setup(indio_dev);
dev_set_drvdata(dev, indio_dev); dev_set_drvdata(dev, indio_dev);
indio_dev->dev.parent = dev; indio_dev->dev.parent = dev;
/* name will be NULL when enumerated via ACPI */ /* name will be NULL when enumerated via ACPI */

View File

@ -97,6 +97,7 @@ struct inv_mpu6050_chip_config {
unsigned int accl_fifo_enable:1; unsigned int accl_fifo_enable:1;
unsigned int gyro_fifo_enable:1; unsigned int gyro_fifo_enable:1;
u16 fifo_rate; u16 fifo_rate;
u8 user_ctrl;
}; };
/** /**

View File

@ -51,13 +51,14 @@ int inv_reset_fifo(struct iio_dev *indio_dev)
if (result) if (result)
goto reset_fifo_fail; goto reset_fifo_fail;
/* disable fifo reading */ /* disable fifo reading */
result = regmap_write(st->map, st->reg->user_ctrl, 0); result = regmap_write(st->map, st->reg->user_ctrl,
st->chip_config.user_ctrl);
if (result) if (result)
goto reset_fifo_fail; goto reset_fifo_fail;
/* reset FIFO*/ /* reset FIFO*/
result = regmap_write(st->map, st->reg->user_ctrl, d = st->chip_config.user_ctrl | INV_MPU6050_BIT_FIFO_RST;
INV_MPU6050_BIT_FIFO_RST); result = regmap_write(st->map, st->reg->user_ctrl, d);
if (result) if (result)
goto reset_fifo_fail; goto reset_fifo_fail;
@ -72,9 +73,9 @@ int inv_reset_fifo(struct iio_dev *indio_dev)
if (result) if (result)
return result; return result;
} }
/* enable FIFO reading and I2C master interface*/ /* enable FIFO reading */
result = regmap_write(st->map, st->reg->user_ctrl, d = st->chip_config.user_ctrl | INV_MPU6050_BIT_FIFO_EN;
INV_MPU6050_BIT_FIFO_EN); result = regmap_write(st->map, st->reg->user_ctrl, d);
if (result) if (result)
goto reset_fifo_fail; goto reset_fifo_fail;
/* enable sensor output to FIFO */ /* enable sensor output to FIFO */

View File

@ -31,8 +31,9 @@ static int inv_mpu_i2c_disable(struct iio_dev *indio_dev)
if (ret) if (ret)
return ret; return ret;
ret = regmap_write(st->map, INV_MPU6050_REG_USER_CTRL, st->chip_config.user_ctrl |= INV_MPU6050_BIT_I2C_IF_DIS;
INV_MPU6050_BIT_I2C_IF_DIS); ret = regmap_write(st->map, st->reg->user_ctrl,
st->chip_config.user_ctrl);
if (ret) { if (ret) {
inv_mpu6050_set_power_itg(st, false); inv_mpu6050_set_power_itg(st, false);
return ret; return ret;

View File

@ -76,7 +76,8 @@ static int inv_mpu6050_set_enable(struct iio_dev *indio_dev, bool enable)
if (result) if (result)
goto error_accl_off; goto error_accl_off;
result = regmap_write(st->map, st->reg->user_ctrl, 0); result = regmap_write(st->map, st->reg->user_ctrl,
st->chip_config.user_ctrl);
if (result) if (result)
goto error_accl_off; goto error_accl_off;