[media] soc-camera: Continue the power off sequence if one of the steps fails
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Wed, 18 Jul 2012 13:54:02 +0000 (10:54 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 15 Aug 2012 19:54:53 +0000 (16:54 -0300)
Powering off a device is a "best effort" task: failure to execute one of
the steps should not prevent the next steps to be executed. For
instance, an I2C communication error when putting the chip in stand-by
mode should not prevent the more agressive next step of turning the
chip's power supply off.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/platform/soc_camera.c

index a6d484f38a88a399d18506b8ae0307e119142eb2..3feb43b4f281b073805d9c3ea6f53b3c21808f13 100644 (file)
@@ -89,24 +89,30 @@ static int soc_camera_power_off(struct soc_camera_device *icd,
                                struct soc_camera_link *icl)
 {
        struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
-       int ret = v4l2_subdev_call(sd, core, s_power, 0);
+       int ret = 0;
+       int err;
 
-       if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV)
-               return ret;
+       err = v4l2_subdev_call(sd, core, s_power, 0);
+       if (err < 0 && err != -ENOIOCTLCMD && err != -ENODEV) {
+               dev_err(icd->pdev, "Subdev failed to power-off the camera.\n");
+               ret = err;
+       }
 
        if (icl->power) {
-               ret = icl->power(icd->control, 0);
-               if (ret < 0) {
+               err = icl->power(icd->control, 0);
+               if (err < 0) {
                        dev_err(icd->pdev,
                                "Platform failed to power-off the camera.\n");
-                       return ret;
+                       ret = ret ? : err;
                }
        }
 
-       ret = regulator_bulk_disable(icl->num_regulators,
+       err = regulator_bulk_disable(icl->num_regulators,
                                     icl->regulators);
-       if (ret < 0)
+       if (err < 0) {
                dev_err(icd->pdev, "Cannot disable regulators\n");
+               ret = ret ? : err;
+       }
 
        return ret;
 }