提交 f00f38d0 编写于 作者: D Dave Stevenson 提交者: Zheng Zengkai

media: bcm2835-unicam: Add support for VIDIOC_[S|G]_SELECTION

raspberrypi inclusion
category: feature
bugzilla: 50432

--------------------------------

Sensors are now reflecting cropping and scaling parameters through
the selection API, therefore Unicam needs to forward the requests
through to the subdev.
Signed-off-by: NDave Stevenson <dave.stevenson@raspberrypi.com>
Signed-off-by: NFang Yafen <yafen@iscas.ac.cn>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 cb8c2f04
...@@ -1898,6 +1898,39 @@ static int unicam_g_edid(struct file *file, void *priv, struct v4l2_edid *edid) ...@@ -1898,6 +1898,39 @@ static int unicam_g_edid(struct file *file, void *priv, struct v4l2_edid *edid)
return v4l2_subdev_call(dev->sensor, pad, get_edid, edid); return v4l2_subdev_call(dev->sensor, pad, get_edid, edid);
} }
static int unicam_s_selection(struct file *file, void *priv,
struct v4l2_selection *sel)
{
struct unicam_node *node = video_drvdata(file);
struct unicam_device *dev = node->dev;
struct v4l2_subdev_selection sdsel = {
.which = V4L2_SUBDEV_FORMAT_ACTIVE,
.target = sel->target,
.flags = sel->flags,
.r = sel->r,
};
return v4l2_subdev_call(dev->sensor, pad, set_selection, NULL, &sdsel);
}
static int unicam_g_selection(struct file *file, void *priv,
struct v4l2_selection *sel)
{
struct unicam_node *node = video_drvdata(file);
struct unicam_device *dev = node->dev;
struct v4l2_subdev_selection sdsel = {
.which = V4L2_SUBDEV_FORMAT_ACTIVE,
.target = sel->target,
};
int ret;
ret = v4l2_subdev_call(dev->sensor, pad, get_selection, NULL, &sdsel);
if (!ret)
sel->r = sdsel.r;
return ret;
}
static int unicam_enum_framesizes(struct file *file, void *priv, static int unicam_enum_framesizes(struct file *file, void *priv,
struct v4l2_frmsizeenum *fsize) struct v4l2_frmsizeenum *fsize)
{ {
...@@ -2218,6 +2251,9 @@ static const struct v4l2_ioctl_ops unicam_ioctl_ops = { ...@@ -2218,6 +2251,9 @@ static const struct v4l2_ioctl_ops unicam_ioctl_ops = {
.vidioc_enum_framesizes = unicam_enum_framesizes, .vidioc_enum_framesizes = unicam_enum_framesizes,
.vidioc_enum_frameintervals = unicam_enum_frameintervals, .vidioc_enum_frameintervals = unicam_enum_frameintervals,
.vidioc_g_selection = unicam_g_selection,
.vidioc_s_selection = unicam_s_selection,
.vidioc_g_parm = unicam_g_parm, .vidioc_g_parm = unicam_g_parm,
.vidioc_s_parm = unicam_s_parm, .vidioc_s_parm = unicam_s_parm,
...@@ -2446,6 +2482,14 @@ static int register_node(struct unicam_device *unicam, struct unicam_node *node, ...@@ -2446,6 +2482,14 @@ static int register_node(struct unicam_device *unicam, struct unicam_node *node,
!v4l2_subdev_has_op(unicam->sensor, pad, enum_frame_size)) !v4l2_subdev_has_op(unicam->sensor, pad, enum_frame_size))
v4l2_disable_ioctl(&node->video_dev, VIDIOC_ENUM_FRAMESIZES); v4l2_disable_ioctl(&node->video_dev, VIDIOC_ENUM_FRAMESIZES);
if (node->pad_id == METADATA_PAD ||
!v4l2_subdev_has_op(unicam->sensor, pad, set_selection))
v4l2_disable_ioctl(&node->video_dev, VIDIOC_S_SELECTION);
if (node->pad_id == METADATA_PAD ||
!v4l2_subdev_has_op(unicam->sensor, pad, get_selection))
v4l2_disable_ioctl(&node->video_dev, VIDIOC_G_SELECTION);
ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1); ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
if (ret) { if (ret) {
unicam_err(unicam, "Unable to register video device.\n"); unicam_err(unicam, "Unable to register video device.\n");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册