Commit bc53e5bd authored by Hans de Goede's avatar Hans de Goede Committed by Mauro Carvalho Chehab
Browse files

media: atomisp-ov2680: Fix and simplify ov2680_q_exposure()

Switch to ov2680_read_reg() to read all 24 bits in one go;
and the exposure value sits in bits 4-19 of the 24 bit exposure
register, so we need to shift the read value by 4 to report the
correct value.

Link: https://lore.kernel.org/linux-media/20211107171549.267583-9-hdegoede@redhat.com


Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 3aa39a49
Loading
Loading
Loading
Loading
+6 −21
Original line number Diff line number Diff line
@@ -410,32 +410,17 @@ static long ov2680_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
static int ov2680_q_exposure(struct v4l2_subdev *sd, s32 *value)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
	u32 reg_v, reg_v2;
	u32 reg_val;
	int ret;

	/* get exposure */
	ret = ov2680_read_reg(client, 1,
			      OV2680_EXPOSURE_L,
			      &reg_v);
	if (ret)
		goto err;

	ret = ov2680_read_reg(client, 1,
			      OV2680_EXPOSURE_M,
			      &reg_v2);
	ret = ov2680_read_reg(client, 3, OV2680_EXPOSURE_H, &reg_val);
	if (ret)
		goto err;

	reg_v += reg_v2 << 8;
	ret = ov2680_read_reg(client, 1,
			      OV2680_EXPOSURE_H,
			      &reg_v2);
	if (ret)
		goto err;

	*value = reg_v + (reg_v2 << 16);
err:
		return ret;

	/* Lower four bits are not part of the exposure val (always 0) */
	*value = reg_val >> 4;
	return 0;
}

static int ov2680_v_flip(struct v4l2_subdev *sd, s32 value)