]> git.karo-electronics.de Git - linux-beck.git/commitdiff
[media] media: platform: pxa_camera: add missing sensor power on
authorRobert Jarzmik <robert.jarzmik@free.fr>
Fri, 23 Sep 2016 18:41:39 +0000 (15:41 -0300)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Mon, 24 Oct 2016 20:08:12 +0000 (18:08 -0200)
During sensors binding, there is a window where the sensor is switched
off, while there is a call it to set a new format, which can end up in
an access to the sensor, especially an I2C based sensor.

Remove this window by activating the sensor.

Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/platform/pxa_camera.c

index bcdac4932fb110a3ae97146546dd9c137f826fd5..929006f65cc794918c7b303813d6d3ff900c5529 100644 (file)
@@ -2125,17 +2125,22 @@ static int pxa_camera_sensor_bound(struct v4l2_async_notifier *notifier,
                                    pix->bytesperline, pix->height);
        pix->pixelformat = pcdev->current_fmt->host_fmt->fourcc;
        v4l2_fill_mbus_format(mf, pix, pcdev->current_fmt->code);
-       err = sensor_call(pcdev, pad, set_fmt, NULL, &format);
+
+       err = sensor_call(pcdev, core, s_power, 1);
        if (err)
                goto out;
 
+       err = sensor_call(pcdev, pad, set_fmt, NULL, &format);
+       if (err)
+               goto out_sensor_poweroff;
+
        v4l2_fill_pix_format(pix, mf);
        pr_info("%s(): colorspace=0x%x pixfmt=0x%x\n",
                __func__, pix->colorspace, pix->pixelformat);
 
        err = pxa_camera_init_videobuf2(pcdev);
        if (err)
-               goto out;
+               goto out_sensor_poweroff;
 
        err = video_register_device(&pcdev->vdev, VFL_TYPE_GRABBER, -1);
        if (err) {
@@ -2146,6 +2151,9 @@ static int pxa_camera_sensor_bound(struct v4l2_async_notifier *notifier,
                         "PXA Camera driver attached to camera %s\n",
                         subdev->name);
        }
+
+out_sensor_poweroff:
+       err = sensor_call(pcdev, core, s_power, 0);
 out:
        mutex_unlock(&pcdev->mlock);
        return err;