media: ccs: Ensure control handlers have been set up after probe
authorSakari Ailus <sakari.ailus@linux.intel.com>
Sat, 14 Oct 2023 17:56:00 +0000 (20:56 +0300)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Wed, 22 Nov 2023 09:56:34 +0000 (10:56 +0100)
If the sensor remains powered on after probe when it is needed again and
the runtime PM usage_count is incremented, the control handler setup for
neither control handler is run.

As this is, in most cases, a needless operation in probe, track the status
of sensor power handling after probe and set up control handlers even if
the device was already active right after probe.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/i2c/ccs/ccs-core.c
drivers/media/i2c/ccs/ccs.h

index 12e6f0a26fc817edf3d24e022c81b3351c579a6a..31769ff95d679677437185cf84010880f94d8d0f 100644 (file)
@@ -1878,9 +1878,11 @@ static int ccs_pm_get_init(struct ccs_sensor *sensor)
                goto error;
 
        /* Device was already active, so don't set controls */
-       if (rval == 1)
+       if (rval == 1 && !sensor->handler_setup_needed)
                return 0;
 
+       sensor->handler_setup_needed = false;
+
        /* Restore V4L2 controls to the previously suspended device */
        rval = v4l2_ctrl_handler_setup(&sensor->pixel_array->ctrl_handler);
        if (rval)
@@ -3532,6 +3534,7 @@ static int ccs_probe(struct i2c_client *client)
 
        sensor->streaming = false;
        sensor->dev_init_done = true;
+       sensor->handler_setup_needed = true;
 
        rval = ccs_write_msr_regs(sensor);
        if (rval)
index 9c3587b2fbe7311d77fb1d4895438a36410c05df..2c013d96adcc2bc87a45307c945ff8f3a859c314 100644 (file)
@@ -236,6 +236,7 @@ struct ccs_sensor {
 
        bool streaming;
        bool dev_init_done;
+       bool handler_setup_needed;
        u8 compressed_min_bpp;
 
        struct ccs_module_info minfo;