]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - include/media/v4l2-subdev.h
Merge branch 'patches_for_v3.6' into v4l_for_linus
[karo-tx-linux.git] / include / media / v4l2-subdev.h
index f0f3358d1b1bd6d7bee05a2fb20df42e31d050fc..c35a3545e273258bf9afcb7a04fa512f55ef9685 100644 (file)
@@ -307,6 +307,12 @@ struct v4l2_subdev_video_ops {
                        struct v4l2_dv_timings *timings);
        int (*g_dv_timings)(struct v4l2_subdev *sd,
                        struct v4l2_dv_timings *timings);
+       int (*enum_dv_timings)(struct v4l2_subdev *sd,
+                       struct v4l2_enum_dv_timings *timings);
+       int (*query_dv_timings)(struct v4l2_subdev *sd,
+                       struct v4l2_dv_timings *timings);
+       int (*dv_timings_cap)(struct v4l2_subdev *sd,
+                       struct v4l2_dv_timings_cap *cap);
        int (*enum_mbus_fmt)(struct v4l2_subdev *sd, unsigned int index,
                             enum v4l2_mbus_pixelcode *code);
        int (*enum_mbus_fsizes)(struct v4l2_subdev *sd,
@@ -466,6 +472,15 @@ struct v4l2_subdev_pad_ops {
                       struct v4l2_subdev_crop *crop);
        int (*get_crop)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
                       struct v4l2_subdev_crop *crop);
+       int (*get_selection)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
+                            struct v4l2_subdev_selection *sel);
+       int (*set_selection)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
+                            struct v4l2_subdev_selection *sel);
+#ifdef CONFIG_MEDIA_CONTROLLER
+       int (*link_validate)(struct v4l2_subdev *sd, struct media_link *link,
+                            struct v4l2_subdev_format *source_fmt,
+                            struct v4l2_subdev_format *sink_fmt);
+#endif /* CONFIG_MEDIA_CONTROLLER */
 };
 
 struct v4l2_subdev_ops {
@@ -541,7 +556,7 @@ struct v4l2_subdev {
 #define media_entity_to_v4l2_subdev(ent) \
        container_of(ent, struct v4l2_subdev, entity)
 #define vdev_to_v4l2_subdev(vdev) \
-       video_get_drvdata(vdev)
+       ((struct v4l2_subdev *)video_get_drvdata(vdev))
 
 /*
  * Used for storing subdev information per file handle
@@ -549,8 +564,11 @@ struct v4l2_subdev {
 struct v4l2_subdev_fh {
        struct v4l2_fh vfh;
 #if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
-       struct v4l2_mbus_framefmt *try_fmt;
-       struct v4l2_rect *try_crop;
+       struct {
+               struct v4l2_mbus_framefmt try_fmt;
+               struct v4l2_rect try_crop;
+               struct v4l2_rect try_compose;
+       } *pad;
 #endif
 };
 
@@ -558,17 +576,19 @@ struct v4l2_subdev_fh {
        container_of(fh, struct v4l2_subdev_fh, vfh)
 
 #if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
-static inline struct v4l2_mbus_framefmt *
-v4l2_subdev_get_try_format(struct v4l2_subdev_fh *fh, unsigned int pad)
-{
-       return &fh->try_fmt[pad];
-}
-
-static inline struct v4l2_rect *
-v4l2_subdev_get_try_crop(struct v4l2_subdev_fh *fh, unsigned int pad)
-{
-       return &fh->try_crop[pad];
-}
+#define __V4L2_SUBDEV_MK_GET_TRY(rtype, fun_name, field_name)          \
+       static inline struct rtype *                                    \
+       v4l2_subdev_get_try_##fun_name(struct v4l2_subdev_fh *fh,       \
+                                      unsigned int pad)                \
+       {                                                               \
+               BUG_ON(unlikely(pad >= vdev_to_v4l2_subdev(             \
+                                       fh->vfh.vdev)->entity.num_pads)); \
+               return &fh->pad[pad].field_name;                        \
+       }
+
+__V4L2_SUBDEV_MK_GET_TRY(v4l2_mbus_framefmt, format, try_fmt)
+__V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, crop, try_compose)
+__V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, compose, try_compose)
 #endif
 
 extern const struct v4l2_file_operations v4l2_subdev_fops;
@@ -593,6 +613,13 @@ static inline void *v4l2_get_subdev_hostdata(const struct v4l2_subdev *sd)
        return sd->host_priv;
 }
 
+#ifdef CONFIG_MEDIA_CONTROLLER
+int v4l2_subdev_link_validate_default(struct v4l2_subdev *sd,
+                                     struct media_link *link,
+                                     struct v4l2_subdev_format *source_fmt,
+                                     struct v4l2_subdev_format *sink_fmt);
+int v4l2_subdev_link_validate(struct media_link *link);
+#endif /* CONFIG_MEDIA_CONTROLLER */
 void v4l2_subdev_init(struct v4l2_subdev *sd,
                      const struct v4l2_subdev_ops *ops);