mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
[media] v4l2-subdev: replace v4l2_subdev_fh by v4l2_subdev_pad_config
If a subdevice pad op is called from a bridge driver, then there is no v4l2_subdev_fh struct that can be passed to the subdevice. This made it hard to use such subdevs from a bridge driver. This patch replaces the v4l2_subdev_fh pointer by a v4l2_subdev_pad_config pointer in the pad ops. This allows bridge drivers to use the various try_ pad ops by creating a v4l2_subdev_pad_config struct and passing it along to the pad op. The v4l2_subdev_get_try_* macros had to be changed because of this, so I also took the opportunity to use the full name of the v4l2_subdev_get_try_* functions in the __V4L2_SUBDEV_MK_GET_TRY macro arguments: if you now do 'git grep v4l2_subdev_get_try_format' you will actually find the header where it is defined. One remark regarding the drivers/staging/media/davinci_vpfe patches: the *_init_formats() functions assumed that fh could be NULL. However, that's not true for this driver, it's always set. This is almost certainly a copy and paste from the omap3isp driver. I've updated the code to reflect the fact that fh is never NULL. Signed-off-by: Hans Verkuil <[email protected]> Acked-by: Lad, Prabhakar <[email protected]> Tested-by: Lad, Prabhakar <[email protected]> Acked-by: Laurent Pinchart <[email protected]> Acked-by: Sakari Ailus <[email protected]> Acked-by: Sylwester Nawrocki <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]>
This commit is contained in:
parent
3d945be05a
commit
f7234138f1
48 changed files with 813 additions and 797 deletions
|
|
@ -482,6 +482,18 @@ struct v4l2_subdev_ir_ops {
|
|||
struct v4l2_subdev_ir_parameters *params);
|
||||
};
|
||||
|
||||
/*
|
||||
* Used for storing subdev pad information. This structure only needs
|
||||
* to be passed to the pad op if the 'which' field of the main argument
|
||||
* is set to V4L2_SUBDEV_FORMAT_TRY. For V4L2_SUBDEV_FORMAT_ACTIVE it is
|
||||
* safe to pass NULL.
|
||||
*/
|
||||
struct v4l2_subdev_pad_config {
|
||||
struct v4l2_mbus_framefmt try_fmt;
|
||||
struct v4l2_rect try_crop;
|
||||
struct v4l2_rect try_compose;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct v4l2_subdev_pad_ops - v4l2-subdev pad level operations
|
||||
* @get_frame_desc: get the current low level media bus frame parameters.
|
||||
|
|
@ -489,21 +501,26 @@ struct v4l2_subdev_ir_ops {
|
|||
* may be adjusted by the subdev driver to device capabilities.
|
||||
*/
|
||||
struct v4l2_subdev_pad_ops {
|
||||
int (*enum_mbus_code)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
int (*enum_mbus_code)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_mbus_code_enum *code);
|
||||
int (*enum_frame_size)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_frame_size_enum *fse);
|
||||
int (*enum_frame_interval)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_frame_interval_enum *fie);
|
||||
int (*get_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
int (*get_fmt)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_format *format);
|
||||
int (*set_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
int (*set_fmt)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_format *format);
|
||||
int (*get_selection)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
int (*get_selection)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_selection *sel);
|
||||
int (*set_selection)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
int (*set_selection)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_selection *sel);
|
||||
int (*get_edid)(struct v4l2_subdev *sd, struct v4l2_edid *edid);
|
||||
int (*set_edid)(struct v4l2_subdev *sd, struct v4l2_edid *edid);
|
||||
|
|
@ -625,11 +642,7 @@ struct v4l2_subdev {
|
|||
struct v4l2_subdev_fh {
|
||||
struct v4l2_fh vfh;
|
||||
#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
|
||||
struct {
|
||||
struct v4l2_mbus_framefmt try_fmt;
|
||||
struct v4l2_rect try_crop;
|
||||
struct v4l2_rect try_compose;
|
||||
} *pad;
|
||||
struct v4l2_subdev_pad_config *pad;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
@ -639,17 +652,17 @@ struct v4l2_subdev_fh {
|
|||
#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
|
||||
#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) \
|
||||
fun_name(struct v4l2_subdev *sd, \
|
||||
struct v4l2_subdev_pad_config *cfg, \
|
||||
unsigned int pad) \
|
||||
{ \
|
||||
BUG_ON(pad >= vdev_to_v4l2_subdev( \
|
||||
fh->vfh.vdev)->entity.num_pads); \
|
||||
return &fh->pad[pad].field_name; \
|
||||
BUG_ON(pad >= sd->entity.num_pads); \
|
||||
return &cfg[pad].field_name; \
|
||||
}
|
||||
|
||||
__V4L2_SUBDEV_MK_GET_TRY(v4l2_mbus_framefmt, format, try_fmt)
|
||||
__V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, crop, try_crop)
|
||||
__V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, compose, try_compose)
|
||||
__V4L2_SUBDEV_MK_GET_TRY(v4l2_mbus_framefmt, v4l2_subdev_get_try_format, try_fmt)
|
||||
__V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, v4l2_subdev_get_try_crop, try_crop)
|
||||
__V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, v4l2_subdev_get_try_compose, try_compose)
|
||||
#endif
|
||||
|
||||
extern const struct v4l2_file_operations v4l2_subdev_fops;
|
||||
|
|
|
|||
Loading…
Reference in a new issue