media: atomisp-ov2680: Save/restore exposure and gain over sensor power-down
authorHans de Goede <hdegoede@redhat.com>
Sun, 7 Nov 2021 17:15:44 +0000 (17:15 +0000)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Mon, 15 Nov 2021 08:11:55 +0000 (08:11 +0000)
Save/restore exposure and gain over sensor power-down and don't write them
to the sensor when ov2680_set_exposure() is called while the sensor is off.

Link: https://lore.kernel.org/linux-media/20211107171549.267583-7-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
drivers/staging/media/atomisp/i2c/ov2680.h

index 83608ba..5b19221 100644 (file)
@@ -359,7 +359,14 @@ static int ov2680_set_exposure(struct v4l2_subdev *sd, int exposure,
        int ret;
 
        mutex_lock(&dev->input_lock);
-       ret = __ov2680_set_exposure(sd, exposure, gain, digitgain);
+
+       dev->exposure = exposure;
+       dev->gain = gain;
+       dev->digitgain = digitgain;
+
+       if (dev->power_on)
+               ret = __ov2680_set_exposure(sd, exposure, gain, digitgain);
+
        mutex_unlock(&dev->input_lock);
 
        return ret;
@@ -748,6 +755,10 @@ static int power_up(struct v4l2_subdev *sd)
        if (ret)
                goto fail_init_registers;
 
+       ret = __ov2680_set_exposure(sd, dev->exposure, dev->gain, dev->digitgain);
+       if (ret)
+               goto fail_init_registers;
+
        dev->power_on = true;
        return 0;
 
@@ -1140,6 +1151,8 @@ static int ov2680_probe(struct i2c_client *client)
        mutex_init(&dev->input_lock);
 
        dev->res = &ov2680_res_preview[0];
+       dev->exposure = dev->res->lines_per_frame - OV2680_INTEGRATION_TIME_MARGIN;
+       dev->gain = 250; /* 0-2047 */
        v4l2_i2c_subdev_init(&dev->sd, client, &ov2680_ops);
 
        pdata = gmin_camera_platform_data(&dev->sd,
index c1998c9..ca20ce5 100644 (file)
@@ -174,6 +174,9 @@ struct ov2680_device {
        struct ov2680_resolution *res;
        struct camera_sensor_platform_data *platform_data;
        bool power_on;
+       u16 exposure;
+       u16 gain;
+       u16 digitgain;
 };
 
 /**