Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit edddddd9 authored by Jean-Baptiste Maneyrol's avatar Jean-Baptiste Maneyrol Committed by Jonathan Cameron
Browse files

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: default avatarJean-Baptiste Maneyrol <jmaneyrol@invensense.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent c2b82a69
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -88,6 +88,7 @@ static const struct inv_mpu6050_chip_config chip_config_6050 = {
	.gyro_fifo_enable = false,
	.accl_fifo_enable = false,
	.accl_fs = INV_MPU6050_FS_02G,
	.user_ctrl = 0,
};

/* Indexed by enum inv_devices */
@@ -972,15 +973,15 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
	if (result)
		return result;

	if (inv_mpu_bus_setup)
		inv_mpu_bus_setup(indio_dev);

	result = inv_mpu6050_init_config(indio_dev);
	if (result) {
		dev_err(dev, "Could not initialize device.\n");
		return result;
	}

	if (inv_mpu_bus_setup)
		inv_mpu_bus_setup(indio_dev);

	dev_set_drvdata(dev, indio_dev);
	indio_dev->dev.parent = dev;
	/* name will be NULL when enumerated via ACPI */
+1 −0
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@ struct inv_mpu6050_chip_config {
	unsigned int accl_fifo_enable:1;
	unsigned int gyro_fifo_enable:1;
	u16 fifo_rate;
	u8 user_ctrl;
};

/**
+7 −6
Original line number Diff line number Diff line
@@ -51,13 +51,14 @@ int inv_reset_fifo(struct iio_dev *indio_dev)
	if (result)
		goto reset_fifo_fail;
	/* 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)
		goto reset_fifo_fail;

	/* reset FIFO*/
	result = regmap_write(st->map, st->reg->user_ctrl,
			      INV_MPU6050_BIT_FIFO_RST);
	d = st->chip_config.user_ctrl | INV_MPU6050_BIT_FIFO_RST;
	result = regmap_write(st->map, st->reg->user_ctrl, d);
	if (result)
		goto reset_fifo_fail;

@@ -72,9 +73,9 @@ int inv_reset_fifo(struct iio_dev *indio_dev)
		if (result)
			return result;
	}
	/* enable FIFO reading and I2C master interface*/
	result = regmap_write(st->map, st->reg->user_ctrl,
			      INV_MPU6050_BIT_FIFO_EN);
	/* enable FIFO reading */
	d = st->chip_config.user_ctrl | INV_MPU6050_BIT_FIFO_EN;
	result = regmap_write(st->map, st->reg->user_ctrl, d);
	if (result)
		goto reset_fifo_fail;
	/* enable sensor output to FIFO */
+3 −2
Original line number Diff line number Diff line
@@ -31,8 +31,9 @@ static int inv_mpu_i2c_disable(struct iio_dev *indio_dev)
	if (ret)
		return ret;

	ret = regmap_write(st->map, INV_MPU6050_REG_USER_CTRL,
			   INV_MPU6050_BIT_I2C_IF_DIS);
	st->chip_config.user_ctrl |= INV_MPU6050_BIT_I2C_IF_DIS;
	ret = regmap_write(st->map, st->reg->user_ctrl,
			   st->chip_config.user_ctrl);
	if (ret) {
		inv_mpu6050_set_power_itg(st, false);
		return ret;
+2 −1
Original line number Diff line number Diff line
@@ -76,7 +76,8 @@ static int inv_mpu6050_set_enable(struct iio_dev *indio_dev, bool enable)
		if (result)
			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)
			goto error_accl_off;