return ret;
 }
 
+static int ov5640_get_selection(struct v4l2_subdev *sd,
+                               struct v4l2_subdev_state *sd_state,
+                               struct v4l2_subdev_selection *sel)
+{
+       struct ov5640_dev *sensor = to_ov5640_dev(sd);
+       const struct ov5640_mode_info *mode = sensor->current_mode;
+       const struct ov5640_timings *timings;
+
+       switch (sel->target) {
+       case V4L2_SEL_TGT_CROP: {
+               mutex_lock(&sensor->lock);
+               timings = ov5640_timings(sensor, mode);
+               sel->r = timings->analog_crop;
+               mutex_unlock(&sensor->lock);
+
+               return 0;
+       }
+
+       case V4L2_SEL_TGT_NATIVE_SIZE:
+       case V4L2_SEL_TGT_CROP_BOUNDS:
+               sel->r.top = 0;
+               sel->r.left = 0;
+               sel->r.width = OV5640_NATIVE_WIDTH;
+               sel->r.height = OV5640_NATIVE_HEIGHT;
+
+               return 0;
+
+       case V4L2_SEL_TGT_CROP_DEFAULT:
+               sel->r.top = OV5640_PIXEL_ARRAY_TOP;
+               sel->r.left = OV5640_PIXEL_ARRAY_LEFT;
+               sel->r.width = OV5640_PIXEL_ARRAY_WIDTH;
+               sel->r.height = OV5640_PIXEL_ARRAY_HEIGHT;
+
+               return 0;
+       }
+
+       return -EINVAL;
+}
+
 static int ov5640_set_framefmt(struct ov5640_dev *sensor,
                               struct v4l2_mbus_framefmt *format)
 {
 {
        struct v4l2_mbus_framefmt *fmt =
                                v4l2_subdev_get_try_format(sd, state, 0);
+       struct v4l2_rect *crop = v4l2_subdev_get_try_crop(sd, state, 0);
 
        *fmt = ov5640_default_fmt;
 
+       crop->left = OV5640_PIXEL_ARRAY_LEFT;
+       crop->top = OV5640_PIXEL_ARRAY_TOP;
+       crop->width = OV5640_PIXEL_ARRAY_WIDTH;
+       crop->height = OV5640_PIXEL_ARRAY_HEIGHT;
+
        return 0;
 }
 
        .enum_mbus_code = ov5640_enum_mbus_code,
        .get_fmt = ov5640_get_fmt,
        .set_fmt = ov5640_set_fmt,
+       .get_selection = ov5640_get_selection,
        .enum_frame_size = ov5640_enum_frame_size,
        .enum_frame_interval = ov5640_enum_frame_interval,
 };