media: atomisp-ov2680: Fix and simplify ov2680_q_exposure()
authorHans de Goede <hdegoede@redhat.com>
Sun, 7 Nov 2021 17:15:46 +0000 (17:15 +0000)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Mon, 15 Nov 2021 08:11:56 +0000 (08:11 +0000)
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: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/staging/media/atomisp/i2c/atomisp-ov2680.c

index 7e49f4e..d6a5f75 100644 (file)
@@ -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;
+               return ret;
 
-       *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)