media: v4l2-subdev: add subdev-wide state struct
[linux-2.6-microblaze.git] / drivers / media / platform / omap3isp / isppreview.c
index 607b768..53aedec 100644 (file)
@@ -1679,21 +1679,25 @@ static int preview_set_stream(struct v4l2_subdev *sd, int enable)
 }
 
 static struct v4l2_mbus_framefmt *
-__preview_get_format(struct isp_prev_device *prev, struct v4l2_subdev_pad_config *cfg,
+__preview_get_format(struct isp_prev_device *prev,
+                    struct v4l2_subdev_state *sd_state,
                     unsigned int pad, enum v4l2_subdev_format_whence which)
 {
        if (which == V4L2_SUBDEV_FORMAT_TRY)
-               return v4l2_subdev_get_try_format(&prev->subdev, cfg, pad);
+               return v4l2_subdev_get_try_format(&prev->subdev, sd_state,
+                                                 pad);
        else
                return &prev->formats[pad];
 }
 
 static struct v4l2_rect *
-__preview_get_crop(struct isp_prev_device *prev, struct v4l2_subdev_pad_config *cfg,
+__preview_get_crop(struct isp_prev_device *prev,
+                  struct v4l2_subdev_state *sd_state,
                   enum v4l2_subdev_format_whence which)
 {
        if (which == V4L2_SUBDEV_FORMAT_TRY)
-               return v4l2_subdev_get_try_crop(&prev->subdev, cfg, PREV_PAD_SINK);
+               return v4l2_subdev_get_try_crop(&prev->subdev, sd_state,
+                                               PREV_PAD_SINK);
        else
                return &prev->crop;
 }
@@ -1729,7 +1733,8 @@ static const unsigned int preview_output_fmts[] = {
  * engine limits and the format and crop rectangles on other pads.
  */
 static void preview_try_format(struct isp_prev_device *prev,
-                              struct v4l2_subdev_pad_config *cfg, unsigned int pad,
+                              struct v4l2_subdev_state *sd_state,
+                              unsigned int pad,
                               struct v4l2_mbus_framefmt *fmt,
                               enum v4l2_subdev_format_whence which)
 {
@@ -1770,7 +1775,8 @@ static void preview_try_format(struct isp_prev_device *prev,
 
        case PREV_PAD_SOURCE:
                pixelcode = fmt->code;
-               *fmt = *__preview_get_format(prev, cfg, PREV_PAD_SINK, which);
+               *fmt = *__preview_get_format(prev, sd_state, PREV_PAD_SINK,
+                                            which);
 
                switch (pixelcode) {
                case MEDIA_BUS_FMT_YUYV8_1X16:
@@ -1788,7 +1794,7 @@ static void preview_try_format(struct isp_prev_device *prev,
                 * is not supported yet, hardcode the output size to the crop
                 * rectangle size.
                 */
-               crop = __preview_get_crop(prev, cfg, which);
+               crop = __preview_get_crop(prev, sd_state, which);
                fmt->width = crop->width;
                fmt->height = crop->height;
 
@@ -1862,7 +1868,7 @@ static void preview_try_crop(struct isp_prev_device *prev,
  * return -EINVAL or zero on success
  */
 static int preview_enum_mbus_code(struct v4l2_subdev *sd,
-                                 struct v4l2_subdev_pad_config *cfg,
+                                 struct v4l2_subdev_state *sd_state,
                                  struct v4l2_subdev_mbus_code_enum *code)
 {
        switch (code->pad) {
@@ -1886,7 +1892,7 @@ static int preview_enum_mbus_code(struct v4l2_subdev *sd,
 }
 
 static int preview_enum_frame_size(struct v4l2_subdev *sd,
-                                  struct v4l2_subdev_pad_config *cfg,
+                                  struct v4l2_subdev_state *sd_state,
                                   struct v4l2_subdev_frame_size_enum *fse)
 {
        struct isp_prev_device *prev = v4l2_get_subdevdata(sd);
@@ -1898,7 +1904,7 @@ static int preview_enum_frame_size(struct v4l2_subdev *sd,
        format.code = fse->code;
        format.width = 1;
        format.height = 1;
-       preview_try_format(prev, cfg, fse->pad, &format, fse->which);
+       preview_try_format(prev, sd_state, fse->pad, &format, fse->which);
        fse->min_width = format.width;
        fse->min_height = format.height;
 
@@ -1908,7 +1914,7 @@ static int preview_enum_frame_size(struct v4l2_subdev *sd,
        format.code = fse->code;
        format.width = -1;
        format.height = -1;
-       preview_try_format(prev, cfg, fse->pad, &format, fse->which);
+       preview_try_format(prev, sd_state, fse->pad, &format, fse->which);
        fse->max_width = format.width;
        fse->max_height = format.height;
 
@@ -1926,7 +1932,7 @@ static int preview_enum_frame_size(struct v4l2_subdev *sd,
  * Return 0 on success or a negative error code otherwise.
  */
 static int preview_get_selection(struct v4l2_subdev *sd,
-                                struct v4l2_subdev_pad_config *cfg,
+                                struct v4l2_subdev_state *sd_state,
                                 struct v4l2_subdev_selection *sel)
 {
        struct isp_prev_device *prev = v4l2_get_subdevdata(sd);
@@ -1942,13 +1948,13 @@ static int preview_get_selection(struct v4l2_subdev *sd,
                sel->r.width = INT_MAX;
                sel->r.height = INT_MAX;
 
-               format = __preview_get_format(prev, cfg, PREV_PAD_SINK,
+               format = __preview_get_format(prev, sd_state, PREV_PAD_SINK,
                                              sel->which);
                preview_try_crop(prev, format, &sel->r);
                break;
 
        case V4L2_SEL_TGT_CROP:
-               sel->r = *__preview_get_crop(prev, cfg, sel->which);
+               sel->r = *__preview_get_crop(prev, sd_state, sel->which);
                break;
 
        default:
@@ -1969,7 +1975,7 @@ static int preview_get_selection(struct v4l2_subdev *sd,
  * Return 0 on success or a negative error code otherwise.
  */
 static int preview_set_selection(struct v4l2_subdev *sd,
-                                struct v4l2_subdev_pad_config *cfg,
+                                struct v4l2_subdev_state *sd_state,
                                 struct v4l2_subdev_selection *sel)
 {
        struct isp_prev_device *prev = v4l2_get_subdevdata(sd);
@@ -1988,17 +1994,20 @@ static int preview_set_selection(struct v4l2_subdev *sd,
         * rectangle.
         */
        if (sel->flags & V4L2_SEL_FLAG_KEEP_CONFIG) {
-               sel->r = *__preview_get_crop(prev, cfg, sel->which);
+               sel->r = *__preview_get_crop(prev, sd_state, sel->which);
                return 0;
        }
 
-       format = __preview_get_format(prev, cfg, PREV_PAD_SINK, sel->which);
+       format = __preview_get_format(prev, sd_state, PREV_PAD_SINK,
+                                     sel->which);
        preview_try_crop(prev, format, &sel->r);
-       *__preview_get_crop(prev, cfg, sel->which) = sel->r;
+       *__preview_get_crop(prev, sd_state, sel->which) = sel->r;
 
        /* Update the source format. */
-       format = __preview_get_format(prev, cfg, PREV_PAD_SOURCE, sel->which);
-       preview_try_format(prev, cfg, PREV_PAD_SOURCE, format, sel->which);
+       format = __preview_get_format(prev, sd_state, PREV_PAD_SOURCE,
+                                     sel->which);
+       preview_try_format(prev, sd_state, PREV_PAD_SOURCE, format,
+                          sel->which);
 
        return 0;
 }
@@ -2010,13 +2019,14 @@ static int preview_set_selection(struct v4l2_subdev *sd,
  * @fmt: pointer to v4l2 subdev format structure
  * return -EINVAL or zero on success
  */
-static int preview_get_format(struct v4l2_subdev *sd, struct v4l2_subdev_pad_config *cfg,
+static int preview_get_format(struct v4l2_subdev *sd,
+                             struct v4l2_subdev_state *sd_state,
                              struct v4l2_subdev_format *fmt)
 {
        struct isp_prev_device *prev = v4l2_get_subdevdata(sd);
        struct v4l2_mbus_framefmt *format;
 
-       format = __preview_get_format(prev, cfg, fmt->pad, fmt->which);
+       format = __preview_get_format(prev, sd_state, fmt->pad, fmt->which);
        if (format == NULL)
                return -EINVAL;
 
@@ -2031,24 +2041,25 @@ static int preview_get_format(struct v4l2_subdev *sd, struct v4l2_subdev_pad_con
  * @fmt: pointer to v4l2 subdev format structure
  * return -EINVAL or zero on success
  */
-static int preview_set_format(struct v4l2_subdev *sd, struct v4l2_subdev_pad_config *cfg,
+static int preview_set_format(struct v4l2_subdev *sd,
+                             struct v4l2_subdev_state *sd_state,
                              struct v4l2_subdev_format *fmt)
 {
        struct isp_prev_device *prev = v4l2_get_subdevdata(sd);
        struct v4l2_mbus_framefmt *format;
        struct v4l2_rect *crop;
 
-       format = __preview_get_format(prev, cfg, fmt->pad, fmt->which);
+       format = __preview_get_format(prev, sd_state, fmt->pad, fmt->which);
        if (format == NULL)
                return -EINVAL;
 
-       preview_try_format(prev, cfg, fmt->pad, &fmt->format, fmt->which);
+       preview_try_format(prev, sd_state, fmt->pad, &fmt->format, fmt->which);
        *format = fmt->format;
 
        /* Propagate the format from sink to source */
        if (fmt->pad == PREV_PAD_SINK) {
                /* Reset the crop rectangle. */
-               crop = __preview_get_crop(prev, cfg, fmt->which);
+               crop = __preview_get_crop(prev, sd_state, fmt->which);
                crop->left = 0;
                crop->top = 0;
                crop->width = fmt->format.width;
@@ -2057,9 +2068,9 @@ static int preview_set_format(struct v4l2_subdev *sd, struct v4l2_subdev_pad_con
                preview_try_crop(prev, &fmt->format, crop);
 
                /* Update the source format. */
-               format = __preview_get_format(prev, cfg, PREV_PAD_SOURCE,
+               format = __preview_get_format(prev, sd_state, PREV_PAD_SOURCE,
                                              fmt->which);
-               preview_try_format(prev, cfg, PREV_PAD_SOURCE, format,
+               preview_try_format(prev, sd_state, PREV_PAD_SOURCE, format,
                                   fmt->which);
        }
 
@@ -2086,7 +2097,7 @@ static int preview_init_formats(struct v4l2_subdev *sd,
        format.format.code = MEDIA_BUS_FMT_SGRBG10_1X10;
        format.format.width = 4096;
        format.format.height = 4096;
-       preview_set_format(sd, fh ? fh->pad : NULL, &format);
+       preview_set_format(sd, fh ? fh->state : NULL, &format);
 
        return 0;
 }