diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2015-03-04 04:47:54 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2015-03-23 14:41:36 -0400 |
commit | f7234138f14c2296c5eb6b8224abe00b507faf3f (patch) | |
tree | 947508529c06cf0c3ff36a71071725ffdb83e3b1 /include/media | |
parent | 3d945be05ac1e806af075e9315bc1b3409adae2b (diff) |
[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 <hans.verkuil@cisco.com>
Acked-by: Lad, Prabhakar <prabhakar.csengg@gmail.com>
Tested-by: Lad, Prabhakar <prabhakar.csengg@gmail.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'include/media')
-rw-r--r-- | include/media/v4l2-subdev.h | 53 |
1 files changed, 33 insertions, 20 deletions
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h index 5beeb8744fd1..d9404df80482 100644 --- a/include/media/v4l2-subdev.h +++ b/include/media/v4l2-subdev.h | |||
@@ -482,6 +482,18 @@ struct v4l2_subdev_ir_ops { | |||
482 | struct v4l2_subdev_ir_parameters *params); | 482 | struct v4l2_subdev_ir_parameters *params); |
483 | }; | 483 | }; |
484 | 484 | ||
485 | /* | ||
486 | * Used for storing subdev pad information. This structure only needs | ||
487 | * to be passed to the pad op if the 'which' field of the main argument | ||
488 | * is set to V4L2_SUBDEV_FORMAT_TRY. For V4L2_SUBDEV_FORMAT_ACTIVE it is | ||
489 | * safe to pass NULL. | ||
490 | */ | ||
491 | struct v4l2_subdev_pad_config { | ||
492 | struct v4l2_mbus_framefmt try_fmt; | ||
493 | struct v4l2_rect try_crop; | ||
494 | struct v4l2_rect try_compose; | ||
495 | }; | ||
496 | |||
485 | /** | 497 | /** |
486 | * struct v4l2_subdev_pad_ops - v4l2-subdev pad level operations | 498 | * struct v4l2_subdev_pad_ops - v4l2-subdev pad level operations |
487 | * @get_frame_desc: get the current low level media bus frame parameters. | 499 | * @get_frame_desc: get the current low level media bus frame parameters. |
@@ -489,21 +501,26 @@ struct v4l2_subdev_ir_ops { | |||
489 | * may be adjusted by the subdev driver to device capabilities. | 501 | * may be adjusted by the subdev driver to device capabilities. |
490 | */ | 502 | */ |
491 | struct v4l2_subdev_pad_ops { | 503 | struct v4l2_subdev_pad_ops { |
492 | int (*enum_mbus_code)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, | 504 | int (*enum_mbus_code)(struct v4l2_subdev *sd, |
505 | struct v4l2_subdev_pad_config *cfg, | ||
493 | struct v4l2_subdev_mbus_code_enum *code); | 506 | struct v4l2_subdev_mbus_code_enum *code); |
494 | int (*enum_frame_size)(struct v4l2_subdev *sd, | 507 | int (*enum_frame_size)(struct v4l2_subdev *sd, |
495 | struct v4l2_subdev_fh *fh, | 508 | struct v4l2_subdev_pad_config *cfg, |
496 | struct v4l2_subdev_frame_size_enum *fse); | 509 | struct v4l2_subdev_frame_size_enum *fse); |
497 | int (*enum_frame_interval)(struct v4l2_subdev *sd, | 510 | int (*enum_frame_interval)(struct v4l2_subdev *sd, |
498 | struct v4l2_subdev_fh *fh, | 511 | struct v4l2_subdev_pad_config *cfg, |
499 | struct v4l2_subdev_frame_interval_enum *fie); | 512 | struct v4l2_subdev_frame_interval_enum *fie); |
500 | int (*get_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, | 513 | int (*get_fmt)(struct v4l2_subdev *sd, |
514 | struct v4l2_subdev_pad_config *cfg, | ||
501 | struct v4l2_subdev_format *format); | 515 | struct v4l2_subdev_format *format); |
502 | int (*set_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, | 516 | int (*set_fmt)(struct v4l2_subdev *sd, |
517 | struct v4l2_subdev_pad_config *cfg, | ||
503 | struct v4l2_subdev_format *format); | 518 | struct v4l2_subdev_format *format); |
504 | int (*get_selection)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, | 519 | int (*get_selection)(struct v4l2_subdev *sd, |
520 | struct v4l2_subdev_pad_config *cfg, | ||
505 | struct v4l2_subdev_selection *sel); | 521 | struct v4l2_subdev_selection *sel); |
506 | int (*set_selection)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, | 522 | int (*set_selection)(struct v4l2_subdev *sd, |
523 | struct v4l2_subdev_pad_config *cfg, | ||
507 | struct v4l2_subdev_selection *sel); | 524 | struct v4l2_subdev_selection *sel); |
508 | int (*get_edid)(struct v4l2_subdev *sd, struct v4l2_edid *edid); | 525 | int (*get_edid)(struct v4l2_subdev *sd, struct v4l2_edid *edid); |
509 | int (*set_edid)(struct v4l2_subdev *sd, struct v4l2_edid *edid); | 526 | int (*set_edid)(struct v4l2_subdev *sd, struct v4l2_edid *edid); |
@@ -625,11 +642,7 @@ struct v4l2_subdev { | |||
625 | struct v4l2_subdev_fh { | 642 | struct v4l2_subdev_fh { |
626 | struct v4l2_fh vfh; | 643 | struct v4l2_fh vfh; |
627 | #if defined(CONFIG_VIDEO_V4L2_SUBDEV_API) | 644 | #if defined(CONFIG_VIDEO_V4L2_SUBDEV_API) |
628 | struct { | 645 | struct v4l2_subdev_pad_config *pad; |
629 | struct v4l2_mbus_framefmt try_fmt; | ||
630 | struct v4l2_rect try_crop; | ||
631 | struct v4l2_rect try_compose; | ||
632 | } *pad; | ||
633 | #endif | 646 | #endif |
634 | }; | 647 | }; |
635 | 648 | ||
@@ -639,17 +652,17 @@ struct v4l2_subdev_fh { | |||
639 | #if defined(CONFIG_VIDEO_V4L2_SUBDEV_API) | 652 | #if defined(CONFIG_VIDEO_V4L2_SUBDEV_API) |
640 | #define __V4L2_SUBDEV_MK_GET_TRY(rtype, fun_name, field_name) \ | 653 | #define __V4L2_SUBDEV_MK_GET_TRY(rtype, fun_name, field_name) \ |
641 | static inline struct rtype * \ | 654 | static inline struct rtype * \ |
642 | v4l2_subdev_get_try_##fun_name(struct v4l2_subdev_fh *fh, \ | 655 | fun_name(struct v4l2_subdev *sd, \ |
643 | unsigned int pad) \ | 656 | struct v4l2_subdev_pad_config *cfg, \ |
657 | unsigned int pad) \ | ||
644 | { \ | 658 | { \ |
645 | BUG_ON(pad >= vdev_to_v4l2_subdev( \ | 659 | BUG_ON(pad >= sd->entity.num_pads); \ |
646 | fh->vfh.vdev)->entity.num_pads); \ | 660 | return &cfg[pad].field_name; \ |
647 | return &fh->pad[pad].field_name; \ | ||
648 | } | 661 | } |
649 | 662 | ||
650 | __V4L2_SUBDEV_MK_GET_TRY(v4l2_mbus_framefmt, format, try_fmt) | 663 | __V4L2_SUBDEV_MK_GET_TRY(v4l2_mbus_framefmt, v4l2_subdev_get_try_format, try_fmt) |
651 | __V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, crop, try_crop) | 664 | __V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, v4l2_subdev_get_try_crop, try_crop) |
652 | __V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, compose, try_compose) | 665 | __V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, v4l2_subdev_get_try_compose, try_compose) |
653 | #endif | 666 | #endif |
654 | 667 | ||
655 | extern const struct v4l2_file_operations v4l2_subdev_fops; | 668 | extern const struct v4l2_file_operations v4l2_subdev_fops; |