media: atomisp: Do not turn off sensor when the atomisp-sub-dev does not own it
authorHans de Goede <hdegoede@redhat.com>
Fri, 30 Dec 2022 18:17:13 +0000 (19:17 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Wed, 8 Feb 2023 07:03:55 +0000 (08:03 +0100)
The atomisp driver creates 8 /dev/video# device nodes. 4 nodes (preview /
video / viewfinder / capture) for each of 2 possible streams aka
atomisp-sub-device-s (asd-s).

Both streams start with asd->input_curr set to 0 (to the first sensor),
opening + releasing a file-handle on one of the nodes of an asd,
while streaming from the other asd causes the sensor to get turned off,
leading to the stream failing.

The atomisp-code already tracks which asd "owns" a specific sensor,
use this to only turn the sensor off if it is owned by the asd.

Reviewed-by: Andy Shevchenko <andy@kernel.org>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/staging/media/atomisp/pci/atomisp_fops.c

index 78af97a..833c7aa 100644 (file)
@@ -828,13 +828,17 @@ static int atomisp_release(struct file *file)
 
        atomisp_css_free_stat_buffers(asd);
        atomisp_free_internal_buffers(asd);
-       ret = v4l2_subdev_call(isp->inputs[asd->input_curr].camera,
-                              core, s_power, 0);
-       if (ret)
-               dev_warn(isp->dev, "Failed to power-off sensor\n");
 
-       /* clear the asd field to show this camera is not used */
-       isp->inputs[asd->input_curr].asd = NULL;
+       if (isp->inputs[asd->input_curr].asd == asd) {
+               ret = v4l2_subdev_call(isp->inputs[asd->input_curr].camera,
+                                      core, s_power, 0);
+               if (ret)
+                       dev_warn(isp->dev, "Failed to power-off sensor\n");
+
+               /* clear the asd field to show this camera is not used */
+               isp->inputs[asd->input_curr].asd = NULL;
+       }
+
        spin_lock_irqsave(&isp->lock, flags);
        asd->streaming = ATOMISP_DEVICE_STREAMING_DISABLED;
        spin_unlock_irqrestore(&isp->lock, flags);