V4L/DVB (12504): soc-camera: prepare soc_camera_platform.c and its users for conversion
[safe/jmp/linux-2.6] / drivers / media / video / tw9910.c
index 0558b22..aa5065e 100644 (file)
@@ -641,25 +641,12 @@ static int tw9910_set_register(struct soc_camera_device *icd,
 }
 #endif
 
-static int tw9910_set_fmt(struct soc_camera_device *icd, __u32 pixfmt,
-                             struct v4l2_rect *rect)
+static int tw9910_set_crop(struct soc_camera_device *icd,
+                          struct v4l2_rect *rect)
 {
        struct tw9910_priv *priv = container_of(icd, struct tw9910_priv, icd);
        int                 ret  = -EINVAL;
        u8                  val;
-       int                 i;
-
-       /*
-        * check color format
-        */
-       for (i = 0 ; i < ARRAY_SIZE(tw9910_color_fmt) ; i++) {
-               if (pixfmt == tw9910_color_fmt[i].fourcc) {
-                       ret = 0;
-                       break;
-               }
-       }
-       if (ret < 0)
-               goto tw9910_set_fmt_error;
 
        /*
         * select suitable norm
@@ -746,8 +733,33 @@ tw9910_set_fmt_error:
        return ret;
 }
 
+static int tw9910_set_fmt(struct soc_camera_device *icd,
+                         struct v4l2_format *f)
+{
+       struct v4l2_pix_format *pix = &f->fmt.pix;
+       struct v4l2_rect rect = {
+               .left   = icd->x_current,
+               .top    = icd->y_current,
+               .width  = pix->width,
+               .height = pix->height,
+       };
+       int i;
+
+       /*
+        * check color format
+        */
+       for (i = 0; i < ARRAY_SIZE(tw9910_color_fmt); i++)
+               if (pix->pixelformat == tw9910_color_fmt[i].fourcc)
+                       break;
+
+       if (i == ARRAY_SIZE(tw9910_color_fmt))
+               return -EINVAL;
+
+       return tw9910_set_crop(icd, &rect);
+}
+
 static int tw9910_try_fmt(struct soc_camera_device *icd,
-                             struct v4l2_format *f)
+                         struct v4l2_format *f)
 {
        struct v4l2_pix_format *pix = &f->fmt.pix;
        const struct tw9910_scale_ctrl *scale;
@@ -835,6 +847,7 @@ static struct soc_camera_ops tw9910_ops = {
        .release                = tw9910_release,
        .start_capture          = tw9910_start_capture,
        .stop_capture           = tw9910_stop_capture,
+       .set_crop               = tw9910_set_crop,
        .set_fmt                = tw9910_set_fmt,
        .try_fmt                = tw9910_try_fmt,
        .set_bus_param          = tw9910_set_bus_param,
@@ -862,10 +875,12 @@ static int tw9910_probe(struct i2c_client *client,
        const struct tw9910_scale_ctrl *scale;
        int                             i, ret;
 
-       info = client->dev.platform_data;
-       if (!info)
+       if (!client->dev.platform_data)
                return -EINVAL;
 
+       info = container_of(client->dev.platform_data,
+                           struct tw9910_video_info, link);
+
        if (!i2c_check_functionality(to_i2c_adapter(client->dev.parent),
                                     I2C_FUNC_SMBUS_BYTE_DATA)) {
                dev_err(&client->dev,