[media] smiapp: Clean up smiapp_set_format()
authorSakari Ailus <sakari.ailus@iki.fi>
Fri, 26 Sep 2014 13:12:38 +0000 (10:12 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Tue, 28 Oct 2014 15:43:31 +0000 (13:43 -0200)
smiapp_set_format() has accumulated a fair amount of changes without a
needed refactoring, do the cleanup now. There's also an unlocked version of
v4l2_ctrl_range_changed(), using that fixes a small serialisation issue with
the user space interface.

__v4l2_ctrl_modify_range() is used instead of v4l2_ctrl_modify_range() in
smiapp_set_format_source() since the mutex is now held during the function
call.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/i2c/smiapp/smiapp-core.c

index 926f60c00ba172088d767795610d6827fd1a42f7..416b7bd1142c462f87b0bc98e57755abd2b4ac24 100644 (file)
@@ -1728,51 +1728,64 @@ static const struct smiapp_csi_data_format
        return csi_format;
 }
 
-static int smiapp_set_format(struct v4l2_subdev *subdev,
-                            struct v4l2_subdev_fh *fh,
-                            struct v4l2_subdev_format *fmt)
+static int smiapp_set_format_source(struct v4l2_subdev *subdev,
+                                   struct v4l2_subdev_fh *fh,
+                                   struct v4l2_subdev_format *fmt)
 {
        struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
-       struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
-       struct v4l2_rect *crops[SMIAPP_PADS];
+       const struct smiapp_csi_data_format *csi_format,
+               *old_csi_format = sensor->csi_format;
+       u32 code = fmt->format.code;
+       unsigned int i;
+       int rval;
 
-       mutex_lock(&sensor->mutex);
+       rval = __smiapp_get_format(subdev, fh, fmt);
+       if (rval)
+               return rval;
 
        /*
         * Media bus code is changeable on src subdev's source pad. On
         * other source pads we just get format here.
         */
-       if (fmt->pad == ssd->source_pad) {
-               u32 code = fmt->format.code;
-               int rval = __smiapp_get_format(subdev, fh, fmt);
-               bool range_changed = false;
-               unsigned int i;
-
-               if (!rval && subdev == &sensor->src->sd) {
-                       const struct smiapp_csi_data_format *csi_format =
-                               smiapp_validate_csi_data_format(sensor, code);
+       if (subdev != &sensor->src->sd)
+               return 0;
 
-                       if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
-                               if (csi_format->width !=
-                                   sensor->csi_format->width)
-                                       range_changed = true;
+       csi_format = smiapp_validate_csi_data_format(sensor, code);
 
-                               sensor->csi_format = csi_format;
-                       }
+       fmt->format.code = csi_format->code;
 
-                       fmt->format.code = csi_format->code;
-               }
+       if (fmt->which != V4L2_SUBDEV_FORMAT_ACTIVE)
+               return 0;
 
-               mutex_unlock(&sensor->mutex);
-               if (rval || !range_changed)
-                       return rval;
+       sensor->csi_format = csi_format;
 
+       if (csi_format->width != old_csi_format->width)
                for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++)
-                       v4l2_ctrl_modify_range(
-                               sensor->test_data[i],
-                               0, (1 << sensor->csi_format->width) - 1, 1, 0);
+                       __v4l2_ctrl_modify_range(
+                               sensor->test_data[i], 0,
+                               (1 << csi_format->width) - 1, 1, 0);
 
-               return 0;
+       return 0;
+}
+
+static int smiapp_set_format(struct v4l2_subdev *subdev,
+                            struct v4l2_subdev_fh *fh,
+                            struct v4l2_subdev_format *fmt)
+{
+       struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
+       struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
+       struct v4l2_rect *crops[SMIAPP_PADS];
+
+       mutex_lock(&sensor->mutex);
+
+       if (fmt->pad == ssd->source_pad) {
+               int rval;
+
+               rval = smiapp_set_format_source(subdev, fh, fmt);
+
+               mutex_unlock(&sensor->mutex);
+
+               return rval;
        }
 
        /* Sink pad. Width and height are changeable here. */